Merge branches 'next/ar7', 'next/ath79', 'next/bcm63xx', 'next/bmips', 'next/cavium...
authorRalf Baechle <ralf@linux-mips.org>
Wed, 11 Jan 2012 14:42:31 +0000 (15:42 +0100)
committerRalf Baechle <ralf@linux-mips.org>
Wed, 11 Jan 2012 14:42:31 +0000 (15:42 +0100)
374 files changed:
arch/mips/Kconfig
arch/mips/Makefile
arch/mips/alchemy/Kconfig
arch/mips/alchemy/Makefile [new file with mode: 0644]
arch/mips/alchemy/Platform
arch/mips/alchemy/board-gpr.c [new file with mode: 0644]
arch/mips/alchemy/board-mtx1.c [new file with mode: 0644]
arch/mips/alchemy/board-xxs1500.c [new file with mode: 0644]
arch/mips/alchemy/common/Makefile
arch/mips/alchemy/common/dbdma.c
arch/mips/alchemy/common/gpiolib.c
arch/mips/alchemy/common/irq.c
arch/mips/alchemy/common/platform.c
arch/mips/alchemy/common/power.c
arch/mips/alchemy/common/sleeper.S
arch/mips/alchemy/common/time.c
arch/mips/alchemy/common/vss.c [new file with mode: 0644]
arch/mips/alchemy/devboards/Makefile
arch/mips/alchemy/devboards/bcsr.c
arch/mips/alchemy/devboards/db1000.c [new file with mode: 0644]
arch/mips/alchemy/devboards/db1200.c [new file with mode: 0644]
arch/mips/alchemy/devboards/db1200/Makefile [deleted file]
arch/mips/alchemy/devboards/db1200/platform.c [deleted file]
arch/mips/alchemy/devboards/db1200/setup.c [deleted file]
arch/mips/alchemy/devboards/db1300.c [new file with mode: 0644]
arch/mips/alchemy/devboards/db1550.c [new file with mode: 0644]
arch/mips/alchemy/devboards/db1x00/Makefile [deleted file]
arch/mips/alchemy/devboards/db1x00/board_setup.c [deleted file]
arch/mips/alchemy/devboards/db1x00/platform.c [deleted file]
arch/mips/alchemy/devboards/pb1000/Makefile [deleted file]
arch/mips/alchemy/devboards/pb1000/board_setup.c [deleted file]
arch/mips/alchemy/devboards/pb1100.c [new file with mode: 0644]
arch/mips/alchemy/devboards/pb1100/Makefile [deleted file]
arch/mips/alchemy/devboards/pb1100/board_setup.c [deleted file]
arch/mips/alchemy/devboards/pb1100/platform.c [deleted file]
arch/mips/alchemy/devboards/pb1200/Makefile [deleted file]
arch/mips/alchemy/devboards/pb1200/board_setup.c [deleted file]
arch/mips/alchemy/devboards/pb1200/platform.c [deleted file]
arch/mips/alchemy/devboards/pb1500.c [new file with mode: 0644]
arch/mips/alchemy/devboards/pb1500/Makefile [deleted file]
arch/mips/alchemy/devboards/pb1500/board_setup.c [deleted file]
arch/mips/alchemy/devboards/pb1500/platform.c [deleted file]
arch/mips/alchemy/devboards/pb1550.c [new file with mode: 0644]
arch/mips/alchemy/devboards/pb1550/Makefile [deleted file]
arch/mips/alchemy/devboards/pb1550/board_setup.c [deleted file]
arch/mips/alchemy/devboards/pb1550/platform.c [deleted file]
arch/mips/alchemy/devboards/platform.c
arch/mips/alchemy/devboards/prom.c
arch/mips/alchemy/gpr/Makefile [deleted file]
arch/mips/alchemy/gpr/board_setup.c [deleted file]
arch/mips/alchemy/gpr/init.c [deleted file]
arch/mips/alchemy/gpr/platform.c [deleted file]
arch/mips/alchemy/mtx-1/Makefile [deleted file]
arch/mips/alchemy/mtx-1/board_setup.c [deleted file]
arch/mips/alchemy/mtx-1/init.c [deleted file]
arch/mips/alchemy/mtx-1/platform.c [deleted file]
arch/mips/alchemy/xxs1500/Makefile [deleted file]
arch/mips/alchemy/xxs1500/board_setup.c [deleted file]
arch/mips/alchemy/xxs1500/init.c [deleted file]
arch/mips/alchemy/xxs1500/platform.c [deleted file]
arch/mips/ar7/gpio.c
arch/mips/ar7/platform.c
arch/mips/ar7/prom.c
arch/mips/ar7/setup.c
arch/mips/ath79/Kconfig
arch/mips/ath79/Makefile
arch/mips/ath79/clock.c
arch/mips/ath79/common.c
arch/mips/ath79/dev-ar913x-wmac.c [deleted file]
arch/mips/ath79/dev-ar913x-wmac.h [deleted file]
arch/mips/ath79/dev-common.c
arch/mips/ath79/dev-usb.c [new file with mode: 0644]
arch/mips/ath79/dev-usb.h [new file with mode: 0644]
arch/mips/ath79/dev-wmac.c [new file with mode: 0644]
arch/mips/ath79/dev-wmac.h [new file with mode: 0644]
arch/mips/ath79/early_printk.c
arch/mips/ath79/gpio.c
arch/mips/ath79/irq.c
arch/mips/ath79/mach-ap121.c [new file with mode: 0644]
arch/mips/ath79/mach-ap81.c
arch/mips/ath79/mach-pb44.c
arch/mips/ath79/mach-ubnt-xm.c [new file with mode: 0644]
arch/mips/ath79/machtypes.h
arch/mips/ath79/setup.c
arch/mips/bcm47xx/setup.c
arch/mips/bcm63xx/Kconfig
arch/mips/bcm63xx/boards/board_bcm963xx.c
arch/mips/bcm63xx/clk.c
arch/mips/bcm63xx/cpu.c
arch/mips/bcm63xx/dev-uart.c
arch/mips/bcm63xx/gpio.c
arch/mips/bcm63xx/irq.c
arch/mips/bcm63xx/prom.c
arch/mips/bcm63xx/setup.c
arch/mips/boot/compressed/uart-alchemy.c
arch/mips/cavium-octeon/Kconfig
arch/mips/cavium-octeon/dma-octeon.c
arch/mips/cavium-octeon/executive/Makefile
arch/mips/cavium-octeon/executive/cvmx-cmd-queue.c [new file with mode: 0644]
arch/mips/cavium-octeon/executive/cvmx-fpa.c [new file with mode: 0644]
arch/mips/cavium-octeon/executive/cvmx-helper-board.c [new file with mode: 0644]
arch/mips/cavium-octeon/executive/cvmx-helper-fpa.c [new file with mode: 0644]
arch/mips/cavium-octeon/executive/cvmx-helper-loop.c [new file with mode: 0644]
arch/mips/cavium-octeon/executive/cvmx-helper-npi.c [new file with mode: 0644]
arch/mips/cavium-octeon/executive/cvmx-helper-rgmii.c [new file with mode: 0644]
arch/mips/cavium-octeon/executive/cvmx-helper-sgmii.c [new file with mode: 0644]
arch/mips/cavium-octeon/executive/cvmx-helper-spi.c [new file with mode: 0644]
arch/mips/cavium-octeon/executive/cvmx-helper-util.c [new file with mode: 0644]
arch/mips/cavium-octeon/executive/cvmx-helper-xaui.c [new file with mode: 0644]
arch/mips/cavium-octeon/executive/cvmx-helper.c [new file with mode: 0644]
arch/mips/cavium-octeon/executive/cvmx-interrupt-decodes.c [new file with mode: 0644]
arch/mips/cavium-octeon/executive/cvmx-interrupt-rsl.c [new file with mode: 0644]
arch/mips/cavium-octeon/executive/cvmx-pko.c [new file with mode: 0644]
arch/mips/cavium-octeon/executive/cvmx-spi.c [new file with mode: 0644]
arch/mips/cavium-octeon/executive/octeon-model.c
arch/mips/cavium-octeon/setup.c
arch/mips/cavium-octeon/smp.c
arch/mips/configs/db1000_defconfig
arch/mips/configs/db1100_defconfig [deleted file]
arch/mips/configs/db1300_defconfig [new file with mode: 0644]
arch/mips/configs/db1500_defconfig [deleted file]
arch/mips/configs/db1550_defconfig
arch/mips/configs/nlm_xlp_defconfig [new file with mode: 0644]
arch/mips/configs/nlm_xlr_defconfig
arch/mips/configs/pb1200_defconfig [deleted file]
arch/mips/include/asm/bmips.h [new file with mode: 0644]
arch/mips/include/asm/branch.h
arch/mips/include/asm/cpu.h
arch/mips/include/asm/hazards.h
arch/mips/include/asm/kprobes.h
arch/mips/include/asm/mach-ath79/ar71xx_regs.h
arch/mips/include/asm/mach-ath79/ar933x_uart.h [new file with mode: 0644]
arch/mips/include/asm/mach-ath79/ar933x_uart_platform.h [new file with mode: 0644]
arch/mips/include/asm/mach-ath79/ath79.h
arch/mips/include/asm/mach-ath79/irq.h
arch/mips/include/asm/mach-ath79/pci-ath724x.h [new file with mode: 0644]
arch/mips/include/asm/mach-au1x00/au1000.h
arch/mips/include/asm/mach-au1x00/au1100_mmc.h
arch/mips/include/asm/mach-au1x00/au1200fb.h [new file with mode: 0644]
arch/mips/include/asm/mach-au1x00/au1550nd.h [new file with mode: 0644]
arch/mips/include/asm/mach-au1x00/au1xxx_dbdma.h
arch/mips/include/asm/mach-au1x00/cpu-feature-overrides.h
arch/mips/include/asm/mach-au1x00/gpio-au1300.h [new file with mode: 0644]
arch/mips/include/asm/mach-au1x00/gpio.h
arch/mips/include/asm/mach-bcm63xx/bcm63xx_cpu.h
arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h
arch/mips/include/asm/mach-bcm63xx/bcm63xx_io.h
arch/mips/include/asm/mach-bcm63xx/bcm63xx_irq.h
arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h
arch/mips/include/asm/mach-bcm63xx/ioremap.h [new file with mode: 0644]
arch/mips/include/asm/mach-bcm63xx/irq.h [new file with mode: 0644]
arch/mips/include/asm/mach-db1x00/bcsr.h
arch/mips/include/asm/mach-db1x00/db1200.h
arch/mips/include/asm/mach-db1x00/db1300.h [new file with mode: 0644]
arch/mips/include/asm/mach-db1x00/db1x00.h [deleted file]
arch/mips/include/asm/mach-db1x00/irq.h [new file with mode: 0644]
arch/mips/include/asm/mach-netlogic/cpu-feature-overrides.h
arch/mips/include/asm/mach-pb1x00/mc146818rtc.h [deleted file]
arch/mips/include/asm/mach-pb1x00/pb1000.h [deleted file]
arch/mips/include/asm/mach-pb1x00/pb1200.h [deleted file]
arch/mips/include/asm/mach-pb1x00/pb1550.h [deleted file]
arch/mips/include/asm/mipsregs.h
arch/mips/include/asm/module.h
arch/mips/include/asm/netlogic/common.h [new file with mode: 0644]
arch/mips/include/asm/netlogic/haldefs.h [new file with mode: 0644]
arch/mips/include/asm/netlogic/xlp-hal/bridge.h [new file with mode: 0644]
arch/mips/include/asm/netlogic/xlp-hal/cpucontrol.h [new file with mode: 0644]
arch/mips/include/asm/netlogic/xlp-hal/iomap.h [new file with mode: 0644]
arch/mips/include/asm/netlogic/xlp-hal/pic.h [new file with mode: 0644]
arch/mips/include/asm/netlogic/xlp-hal/sys.h [new file with mode: 0644]
arch/mips/include/asm/netlogic/xlp-hal/uart.h [new file with mode: 0644]
arch/mips/include/asm/netlogic/xlp-hal/xlp.h [new file with mode: 0644]
arch/mips/include/asm/netlogic/xlr/iomap.h
arch/mips/include/asm/netlogic/xlr/msidef.h [new file with mode: 0644]
arch/mips/include/asm/netlogic/xlr/pic.h
arch/mips/include/asm/netlogic/xlr/xlr.h
arch/mips/include/asm/octeon/cvmx-address.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-asxx-defs.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-bootinfo.h
arch/mips/include/asm/octeon/cvmx-cmd-queue.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-config.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-dbg-defs.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-dpi-defs.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-fau.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-fpa-defs.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-fpa.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-gmxx-defs.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-helper-board.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-helper-fpa.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-helper-loop.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-helper-npi.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-helper-rgmii.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-helper-sgmii.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-helper-spi.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-helper-util.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-helper-xaui.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-helper.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-ipd.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-mdio.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-mio-defs.h
arch/mips/include/asm/octeon/cvmx-npei-defs.h
arch/mips/include/asm/octeon/cvmx-pciercx-defs.h
arch/mips/include/asm/octeon/cvmx-pcsx-defs.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-pcsxx-defs.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-pemx-defs.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-pexp-defs.h
arch/mips/include/asm/octeon/cvmx-pip-defs.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-pip.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-pko-defs.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-pko.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-pow.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-scratch.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-sli-defs.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-spi.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-spxx-defs.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-sriox-defs.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-srxx-defs.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-stxx-defs.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx-wqe.h [new file with mode: 0644]
arch/mips/include/asm/octeon/cvmx.h
arch/mips/include/asm/octeon/octeon-feature.h
arch/mips/include/asm/octeon/octeon-model.h
arch/mips/include/asm/octeon/pci-octeon.h
arch/mips/include/asm/pgtable-32.h
arch/mips/include/asm/tlbmisc.h [new file with mode: 0644]
arch/mips/include/asm/traps.h
arch/mips/jazz/irq.c
arch/mips/jazz/setup.c
arch/mips/jz4740/board-qi_lb60.c
arch/mips/kernel/Makefile
arch/mips/kernel/bmips_vec.S [new file with mode: 0644]
arch/mips/kernel/branch.c
arch/mips/kernel/cpu-probe.c
arch/mips/kernel/kprobes.c
arch/mips/kernel/perf_event_mipsxx.c
arch/mips/kernel/smp-bmips.c [new file with mode: 0644]
arch/mips/kernel/smtc.c
arch/mips/kernel/traps.c
arch/mips/lantiq/clk.c
arch/mips/lantiq/irq.c
arch/mips/lantiq/xway/dma.c
arch/mips/lantiq/xway/ebu.c
arch/mips/lantiq/xway/pmu.c
arch/mips/lantiq/xway/reset.c
arch/mips/lib/Makefile
arch/mips/math-emu/cp1emu.c
arch/mips/mm/Makefile
arch/mips/mm/c-octeon.c
arch/mips/mm/c-r4k.c
arch/mips/mm/tlb-r3k.c
arch/mips/mm/tlb-r4k.c
arch/mips/netlogic/Kconfig
arch/mips/netlogic/Makefile [new file with mode: 0644]
arch/mips/netlogic/Platform
arch/mips/netlogic/common/Makefile [new file with mode: 0644]
arch/mips/netlogic/common/earlycons.c [new file with mode: 0644]
arch/mips/netlogic/common/irq.c [new file with mode: 0644]
arch/mips/netlogic/common/smp.c [new file with mode: 0644]
arch/mips/netlogic/common/smpboot.S [new file with mode: 0644]
arch/mips/netlogic/common/time.c [new file with mode: 0644]
arch/mips/netlogic/xlp/Makefile [new file with mode: 0644]
arch/mips/netlogic/xlp/nlm_hal.c [new file with mode: 0644]
arch/mips/netlogic/xlp/platform.c [new file with mode: 0644]
arch/mips/netlogic/xlp/setup.c [new file with mode: 0644]
arch/mips/netlogic/xlp/wakeup.c [new file with mode: 0644]
arch/mips/netlogic/xlr/Makefile
arch/mips/netlogic/xlr/irq.c [deleted file]
arch/mips/netlogic/xlr/platform.c
arch/mips/netlogic/xlr/setup.c
arch/mips/netlogic/xlr/smp.c [deleted file]
arch/mips/netlogic/xlr/smpboot.S [deleted file]
arch/mips/netlogic/xlr/time.c [deleted file]
arch/mips/netlogic/xlr/wakeup.c [new file with mode: 0644]
arch/mips/netlogic/xlr/xlr_console.c [deleted file]
arch/mips/pci/Makefile
arch/mips/pci/msi-octeon.c
arch/mips/pci/pci-alchemy.c
arch/mips/pci/pci-ath724x.c [new file with mode: 0644]
arch/mips/pci/pci-bcm63xx.c
arch/mips/pci/pci-octeon.c
arch/mips/pci/pci-xlr.c
arch/mips/pci/pcie-octeon.c
arch/mips/pmc-sierra/msp71xx/msp_setup.c
arch/mips/sgi-ip27/ip27-irq.c
drivers/i2c/busses/Kconfig
drivers/mmc/host/au1xmmc.c
drivers/mtd/nand/au1550nd.c
drivers/net/irda/Kconfig
drivers/net/irda/au1000_ircc.h [deleted file]
drivers/net/irda/au1k_ir.c
drivers/pcmcia/Kconfig
drivers/pcmcia/Makefile
drivers/pcmcia/au1000_generic.c [deleted file]
drivers/pcmcia/au1000_generic.h [deleted file]
drivers/pcmcia/au1000_pb1x00.c [deleted file]
drivers/pcmcia/db1xxx_ss.c
drivers/spi/Kconfig
drivers/staging/octeon/Makefile
drivers/staging/octeon/cvmx-address.h [deleted file]
drivers/staging/octeon/cvmx-asxx-defs.h [deleted file]
drivers/staging/octeon/cvmx-cmd-queue.c [deleted file]
drivers/staging/octeon/cvmx-cmd-queue.h [deleted file]
drivers/staging/octeon/cvmx-config.h [deleted file]
drivers/staging/octeon/cvmx-dbg-defs.h [deleted file]
drivers/staging/octeon/cvmx-fau.h [deleted file]
drivers/staging/octeon/cvmx-fpa-defs.h [deleted file]
drivers/staging/octeon/cvmx-fpa.c [deleted file]
drivers/staging/octeon/cvmx-fpa.h [deleted file]
drivers/staging/octeon/cvmx-gmxx-defs.h [deleted file]
drivers/staging/octeon/cvmx-helper-board.c [deleted file]
drivers/staging/octeon/cvmx-helper-board.h [deleted file]
drivers/staging/octeon/cvmx-helper-fpa.c [deleted file]
drivers/staging/octeon/cvmx-helper-fpa.h [deleted file]
drivers/staging/octeon/cvmx-helper-loop.c [deleted file]
drivers/staging/octeon/cvmx-helper-loop.h [deleted file]
drivers/staging/octeon/cvmx-helper-npi.c [deleted file]
drivers/staging/octeon/cvmx-helper-npi.h [deleted file]
drivers/staging/octeon/cvmx-helper-rgmii.c [deleted file]
drivers/staging/octeon/cvmx-helper-rgmii.h [deleted file]
drivers/staging/octeon/cvmx-helper-sgmii.c [deleted file]
drivers/staging/octeon/cvmx-helper-sgmii.h [deleted file]
drivers/staging/octeon/cvmx-helper-spi.c [deleted file]
drivers/staging/octeon/cvmx-helper-spi.h [deleted file]
drivers/staging/octeon/cvmx-helper-util.c [deleted file]
drivers/staging/octeon/cvmx-helper-util.h [deleted file]
drivers/staging/octeon/cvmx-helper-xaui.c [deleted file]
drivers/staging/octeon/cvmx-helper-xaui.h [deleted file]
drivers/staging/octeon/cvmx-helper.c [deleted file]
drivers/staging/octeon/cvmx-helper.h [deleted file]
drivers/staging/octeon/cvmx-interrupt-decodes.c [deleted file]
drivers/staging/octeon/cvmx-interrupt-rsl.c [deleted file]
drivers/staging/octeon/cvmx-ipd.h [deleted file]
drivers/staging/octeon/cvmx-mdio.h [deleted file]
drivers/staging/octeon/cvmx-packet.h [deleted file]
drivers/staging/octeon/cvmx-pcsx-defs.h [deleted file]
drivers/staging/octeon/cvmx-pcsxx-defs.h [deleted file]
drivers/staging/octeon/cvmx-pip-defs.h [deleted file]
drivers/staging/octeon/cvmx-pip.h [deleted file]
drivers/staging/octeon/cvmx-pko-defs.h [deleted file]
drivers/staging/octeon/cvmx-pko.c [deleted file]
drivers/staging/octeon/cvmx-pko.h [deleted file]
drivers/staging/octeon/cvmx-pow.h [deleted file]
drivers/staging/octeon/cvmx-scratch.h [deleted file]
drivers/staging/octeon/cvmx-smix-defs.h [deleted file]
drivers/staging/octeon/cvmx-spi.c [deleted file]
drivers/staging/octeon/cvmx-spi.h [deleted file]
drivers/staging/octeon/cvmx-spxx-defs.h [deleted file]
drivers/staging/octeon/cvmx-srxx-defs.h [deleted file]
drivers/staging/octeon/cvmx-stxx-defs.h [deleted file]
drivers/staging/octeon/cvmx-wqe.h [deleted file]
drivers/staging/octeon/ethernet-defines.h
drivers/staging/octeon/ethernet-mdio.c
drivers/staging/octeon/ethernet-mem.c
drivers/staging/octeon/ethernet-rgmii.c
drivers/staging/octeon/ethernet-rx.c
drivers/staging/octeon/ethernet-rx.h
drivers/staging/octeon/ethernet-sgmii.c
drivers/staging/octeon/ethernet-spi.c
drivers/staging/octeon/ethernet-tx.c
drivers/staging/octeon/ethernet-xaui.c
drivers/staging/octeon/ethernet.c
drivers/tty/serial/Kconfig
drivers/tty/serial/Makefile
drivers/tty/serial/ar933x_uart.c [new file with mode: 0644]
drivers/usb/host/Kconfig
drivers/usb/host/alchemy-common.c
drivers/usb/host/ehci-ath79.c
drivers/usb/host/ohci-au1xxx.c
drivers/video/Kconfig
drivers/video/au1100fb.c
drivers/video/au1200fb.c
include/linux/serial_core.h
sound/soc/au1x/Kconfig
sound/soc/au1x/db1200.c

index d46f1da18a3c4ca587d16db23265b2aa557ceb1b..0c55582a49c3aadef7dfeaaca4fe321980a277e9 100644 (file)
@@ -716,7 +716,6 @@ config CAVIUM_OCTEON_SIMULATOR
        select DMA_COHERENT
        select SYS_SUPPORTS_64BIT_KERNEL
        select SYS_SUPPORTS_BIG_ENDIAN
-       select SYS_SUPPORTS_HIGHMEM
        select SYS_SUPPORTS_HOTPLUG_CPU
        select SYS_HAS_CPU_CAVIUM_OCTEON
        select HOLES_IN_ZONE
@@ -732,7 +731,6 @@ config CAVIUM_OCTEON_REFERENCE_BOARD
        select DMA_COHERENT
        select SYS_SUPPORTS_64BIT_KERNEL
        select SYS_SUPPORTS_BIG_ENDIAN
-       select SYS_SUPPORTS_HIGHMEM
        select SYS_SUPPORTS_HOTPLUG_CPU
        select SYS_HAS_EARLY_PRINTK
        select SYS_HAS_CPU_CAVIUM_OCTEON
@@ -761,7 +759,6 @@ config NLM_XLR_BOARD
        depends on EXPERIMENTAL
        select BOOT_ELF32
        select NLM_COMMON
-       select NLM_XLR
        select SYS_HAS_CPU_XLR
        select SYS_SUPPORTS_SMP
        select HW_HAS_PCI
@@ -776,6 +773,7 @@ config NLM_XLR_BOARD
        select CEVT_R4K
        select CSRC_R4K
        select IRQ_CPU
+       select ARCH_SUPPORTS_MSI
        select ZONE_DMA if 64BIT
        select SYNC_R4K
        select SYS_HAS_EARLY_PRINTK
@@ -783,6 +781,33 @@ config NLM_XLR_BOARD
          Support for systems based on Netlogic XLR and XLS processors.
          Say Y here if you have a XLR or XLS based board.
 
+config NLM_XLP_BOARD
+       bool "Netlogic XLP based systems"
+       depends on EXPERIMENTAL
+       select BOOT_ELF32
+       select NLM_COMMON
+       select SYS_HAS_CPU_XLP
+       select SYS_SUPPORTS_SMP
+       select HW_HAS_PCI
+       select SWAP_IO_SPACE
+       select SYS_SUPPORTS_32BIT_KERNEL
+       select SYS_SUPPORTS_64BIT_KERNEL
+       select 64BIT_PHYS_ADDR
+       select SYS_SUPPORTS_BIG_ENDIAN
+       select SYS_SUPPORTS_LITTLE_ENDIAN
+       select SYS_SUPPORTS_HIGHMEM
+       select DMA_COHERENT
+       select NR_CPUS_DEFAULT_32
+       select CEVT_R4K
+       select CSRC_R4K
+       select IRQ_CPU
+       select ZONE_DMA if 64BIT
+       select SYNC_R4K
+       select SYS_HAS_EARLY_PRINTK
+       help
+         This board is based on Netlogic XLP Processor.
+         Say Y here if you have a XLP based board.
+
 endchoice
 
 source "arch/mips/alchemy/Kconfig"
@@ -1413,51 +1438,36 @@ config CPU_CAVIUM_OCTEON
 config CPU_BMIPS3300
        bool "BMIPS3300"
        depends on SYS_HAS_CPU_BMIPS3300
-       select DMA_NONCOHERENT
-       select IRQ_CPU
-       select SWAP_IO_SPACE
-       select SYS_SUPPORTS_32BIT_KERNEL
-       select WEAK_ORDERING
+       select CPU_BMIPS
        help
          Broadcom BMIPS3300 processors.
 
 config CPU_BMIPS4350
        bool "BMIPS4350"
        depends on SYS_HAS_CPU_BMIPS4350
-       select CPU_SUPPORTS_32BIT_KERNEL
-       select DMA_NONCOHERENT
-       select IRQ_CPU
-       select SWAP_IO_SPACE
+       select CPU_BMIPS
        select SYS_SUPPORTS_SMP
        select SYS_SUPPORTS_HOTPLUG_CPU
-       select WEAK_ORDERING
        help
          Broadcom BMIPS4350 ("VIPER") processors.
 
 config CPU_BMIPS4380
        bool "BMIPS4380"
        depends on SYS_HAS_CPU_BMIPS4380
-       select CPU_SUPPORTS_32BIT_KERNEL
-       select DMA_NONCOHERENT
-       select IRQ_CPU
-       select SWAP_IO_SPACE
+       select CPU_BMIPS
        select SYS_SUPPORTS_SMP
        select SYS_SUPPORTS_HOTPLUG_CPU
-       select WEAK_ORDERING
        help
          Broadcom BMIPS4380 processors.
 
 config CPU_BMIPS5000
        bool "BMIPS5000"
        depends on SYS_HAS_CPU_BMIPS5000
-       select CPU_SUPPORTS_32BIT_KERNEL
+       select CPU_BMIPS
        select CPU_SUPPORTS_HIGHMEM
-       select DMA_NONCOHERENT
-       select IRQ_CPU
-       select SWAP_IO_SPACE
+       select MIPS_CPU_SCACHE
        select SYS_SUPPORTS_SMP
        select SYS_SUPPORTS_HOTPLUG_CPU
-       select WEAK_ORDERING
        help
          Broadcom BMIPS5000 processors.
 
@@ -1472,6 +1482,19 @@ config CPU_XLR
        select CPU_SUPPORTS_HUGEPAGES
        help
          Netlogic Microsystems XLR/XLS processors.
+
+config CPU_XLP
+       bool "Netlogic XLP SoC"
+       depends on SYS_HAS_CPU_XLP
+       select CPU_SUPPORTS_32BIT_KERNEL
+       select CPU_SUPPORTS_64BIT_KERNEL
+       select CPU_SUPPORTS_HIGHMEM
+       select CPU_HAS_LLSC
+       select WEAK_ORDERING
+       select WEAK_REORDERING_BEYOND_LLSC
+       select CPU_HAS_PREFETCH
+       help
+         Netlogic Microsystems XLP processors.
 endchoice
 
 if CPU_LOONGSON2F
@@ -1518,6 +1541,15 @@ config CPU_LOONGSON2
        select CPU_SUPPORTS_64BIT_KERNEL
        select CPU_SUPPORTS_HIGHMEM
 
+config CPU_BMIPS
+       bool
+       select CPU_MIPS32
+       select CPU_SUPPORTS_32BIT_KERNEL
+       select DMA_NONCOHERENT
+       select IRQ_CPU
+       select SWAP_IO_SPACE
+       select WEAK_ORDERING
+
 config SYS_HAS_CPU_LOONGSON2E
        bool
 
@@ -1605,6 +1637,9 @@ config SYS_HAS_CPU_BMIPS5000
 config SYS_HAS_CPU_XLR
        bool
 
+config SYS_HAS_CPU_XLP
+       bool
+
 #
 # CPU may reorder R->R, R->W, W->R, W->W
 # Reordering beyond LL and SC is handled in WEAK_REORDERING_BEYOND_LLSC
@@ -1992,6 +2027,9 @@ config CPU_HAS_SMARTMIPS
 config CPU_HAS_WB
        bool
 
+config XKS01
+       bool
+
 #
 # Vectored interrupt mode is an R2 feature
 #
index 0be318609fc62832c44fa6a47b1c9670c1e9b2b7..4fedf5a51d965ab9cea3798ab1d2ed3c5298a10b 100644 (file)
@@ -157,6 +157,7 @@ ifeq (,$(findstring march=octeon, $(cflags-$(CONFIG_CPU_CAVIUM_OCTEON))))
 cflags-$(CONFIG_CPU_CAVIUM_OCTEON) += -Wa,-march=octeon
 endif
 cflags-$(CONFIG_CAVIUM_CN63XXP1) += -Wa,-mfix-cn63xxp1
+cflags-$(CONFIG_CPU_BMIPS)     += -march=mips32 -Wa,-mips32 -Wa,--trap
 
 cflags-$(CONFIG_CPU_R4000_WORKAROUNDS) += $(call cc-option,-mfix-r4000,)
 cflags-$(CONFIG_CPU_R4400_WORKAROUNDS) += $(call cc-option,-mfix-r4400,)
index 2a68be6a1b97ed953bdfe619d6ab16d5d924d320..0faaab24376e5ca60e78d0405f2534a32b94735d 100644 (file)
@@ -2,6 +2,10 @@
 config ALCHEMY_GPIOINT_AU1000
        bool
 
+# au1300-style GPIO/INT controller
+config ALCHEMY_GPIOINT_AU1300
+       bool
+
 # select this in your board config if you don't want to use the gpio
 # namespace as documented in the manuals.  In this case however you need
 # to create the necessary gpio_* functions in your board code/headers!
@@ -22,43 +26,29 @@ config MIPS_MTX1
        select SYS_SUPPORTS_LITTLE_ENDIAN
        select SYS_HAS_EARLY_PRINTK
 
-config MIPS_BOSPORUS
-       bool "Alchemy Bosporus board"
-       select ALCHEMY_GPIOINT_AU1000
-       select DMA_NONCOHERENT
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-       select SYS_HAS_EARLY_PRINTK
-
 config MIPS_DB1000
-       bool "Alchemy DB1000 board"
+       bool "Alchemy DB1000/DB1500/DB1100 boards"
        select ALCHEMY_GPIOINT_AU1000
        select DMA_NONCOHERENT
        select HW_HAS_PCI
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-       select SYS_HAS_EARLY_PRINTK
-
-config MIPS_DB1100
-       bool "Alchemy DB1100 board"
-       select ALCHEMY_GPIOINT_AU1000
-       select DMA_NONCOHERENT
+       select MIPS_DISABLE_OBSOLETE_IDE
+       select SYS_SUPPORTS_BIG_ENDIAN
        select SYS_SUPPORTS_LITTLE_ENDIAN
        select SYS_HAS_EARLY_PRINTK
 
 config MIPS_DB1200
-       bool "Alchemy DB1200 board"
+       bool "Alchemy DB1200/PB1200 board"
        select ALCHEMY_GPIOINT_AU1000
        select DMA_COHERENT
        select MIPS_DISABLE_OBSOLETE_IDE
        select SYS_SUPPORTS_LITTLE_ENDIAN
        select SYS_HAS_EARLY_PRINTK
 
-config MIPS_DB1500
-       bool "Alchemy DB1500 board"
-       select ALCHEMY_GPIOINT_AU1000
-       select DMA_NONCOHERENT
-       select HW_HAS_PCI
+config MIPS_DB1300
+       bool "NetLogic DB1300 board"
+       select ALCHEMY_GPIOINT_AU1300
+       select DMA_COHERENT
        select MIPS_DISABLE_OBSOLETE_IDE
-       select SYS_SUPPORTS_BIG_ENDIAN
        select SYS_SUPPORTS_LITTLE_ENDIAN
        select SYS_HAS_EARLY_PRINTK
 
@@ -66,27 +56,11 @@ config MIPS_DB1550
        bool "Alchemy DB1550 board"
        select ALCHEMY_GPIOINT_AU1000
        select HW_HAS_PCI
-       select DMA_NONCOHERENT
+       select DMA_COHERENT
        select MIPS_DISABLE_OBSOLETE_IDE
        select SYS_SUPPORTS_LITTLE_ENDIAN
        select SYS_HAS_EARLY_PRINTK
 
-config MIPS_MIRAGE
-       bool "Alchemy Mirage board"
-       select DMA_NONCOHERENT
-       select ALCHEMY_GPIOINT_AU1000
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-       select SYS_HAS_EARLY_PRINTK
-
-config MIPS_PB1000
-       bool "Alchemy PB1000 board"
-       select ALCHEMY_GPIOINT_AU1000
-       select DMA_NONCOHERENT
-       select HW_HAS_PCI
-       select SWAP_IO_SPACE
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-       select SYS_HAS_EARLY_PRINTK
-
 config MIPS_PB1100
        bool "Alchemy PB1100 board"
        select ALCHEMY_GPIOINT_AU1000
@@ -96,14 +70,6 @@ config MIPS_PB1100
        select SYS_SUPPORTS_LITTLE_ENDIAN
        select SYS_HAS_EARLY_PRINTK
 
-config MIPS_PB1200
-       bool "Alchemy PB1200 board"
-       select ALCHEMY_GPIOINT_AU1000
-       select DMA_NONCOHERENT
-       select MIPS_DISABLE_OBSOLETE_IDE
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-       select SYS_HAS_EARLY_PRINTK
-
 config MIPS_PB1500
        bool "Alchemy PB1500 board"
        select ALCHEMY_GPIOINT_AU1000
diff --git a/arch/mips/alchemy/Makefile b/arch/mips/alchemy/Makefile
new file mode 100644 (file)
index 0000000..aac3b17
--- /dev/null
@@ -0,0 +1,3 @@
+obj-$(CONFIG_MIPS_GPR) += board-gpr.o
+obj-$(CONFIG_MIPS_MTX1) += board-mtx1.o
+obj-$(CONFIG_MIPS_XXS1500) += board-xxs1500.o
index 96e9e41f1b2afd4354776d7772eae0d9a9580df1..7956274de15fc0df3ca3af6eb27bf698914bb45d 100644 (file)
@@ -4,62 +4,31 @@
 platform-$(CONFIG_MIPS_ALCHEMY)        += alchemy/common/
 
 
-#
-# AMD Alchemy Pb1000 eval board
-#
-platform-$(CONFIG_MIPS_PB1000) += alchemy/devboards/
-cflags-$(CONFIG_MIPS_PB1000)   += -I$(srctree)/arch/mips/include/asm/mach-pb1x00
-load-$(CONFIG_MIPS_PB1000)     += 0xffffffff80100000
-
 #
 # AMD Alchemy Pb1100 eval board
 #
 platform-$(CONFIG_MIPS_PB1100) += alchemy/devboards/
-cflags-$(CONFIG_MIPS_PB1100)   += -I$(srctree)/arch/mips/include/asm/mach-pb1x00
 load-$(CONFIG_MIPS_PB1100)     += 0xffffffff80100000
 
 #
 # AMD Alchemy Pb1500 eval board
 #
 platform-$(CONFIG_MIPS_PB1500) += alchemy/devboards/
-cflags-$(CONFIG_MIPS_PB1500)   += -I$(srctree)/arch/mips/include/asm/mach-pb1x00
 load-$(CONFIG_MIPS_PB1500)     += 0xffffffff80100000
 
 #
 # AMD Alchemy Pb1550 eval board
 #
 platform-$(CONFIG_MIPS_PB1550) += alchemy/devboards/
-cflags-$(CONFIG_MIPS_PB1550)   += -I$(srctree)/arch/mips/include/asm/mach-pb1x00
 load-$(CONFIG_MIPS_PB1550)     += 0xffffffff80100000
 
 #
-# AMD Alchemy Pb1200 eval board
-#
-platform-$(CONFIG_MIPS_PB1200) += alchemy/devboards/
-cflags-$(CONFIG_MIPS_PB1200)   += -I$(srctree)/arch/mips/include/asm/mach-pb1x00
-load-$(CONFIG_MIPS_PB1200)     += 0xffffffff80100000
-
-#
-# AMD Alchemy Db1000 eval board
+# AMD Alchemy Db1000/Db1500/Db1100 eval boards
 #
 platform-$(CONFIG_MIPS_DB1000) += alchemy/devboards/
 cflags-$(CONFIG_MIPS_DB1000)   += -I$(srctree)/arch/mips/include/asm/mach-db1x00
 load-$(CONFIG_MIPS_DB1000)     += 0xffffffff80100000
 
-#
-# AMD Alchemy Db1100 eval board
-#
-platform-$(CONFIG_MIPS_DB1100) += alchemy/devboards/
-cflags-$(CONFIG_MIPS_DB1100)   += -I$(srctree)/arch/mips/include/asm/mach-db1x00
-load-$(CONFIG_MIPS_DB1100)     += 0xffffffff80100000
-
-#
-# AMD Alchemy Db1500 eval board
-#
-platform-$(CONFIG_MIPS_DB1500) += alchemy/devboards/
-cflags-$(CONFIG_MIPS_DB1500)   += -I$(srctree)/arch/mips/include/asm/mach-db1x00
-load-$(CONFIG_MIPS_DB1500)     += 0xffffffff80100000
-
 #
 # AMD Alchemy Db1550 eval board
 #
@@ -68,42 +37,35 @@ cflags-$(CONFIG_MIPS_DB1550)        += -I$(srctree)/arch/mips/include/asm/mach-db1x00
 load-$(CONFIG_MIPS_DB1550)     += 0xffffffff80100000
 
 #
-# AMD Alchemy Db1200 eval board
+# AMD Alchemy Db1200/Pb1200 eval boards
 #
 platform-$(CONFIG_MIPS_DB1200) += alchemy/devboards/
 cflags-$(CONFIG_MIPS_DB1200)   += -I$(srctree)/arch/mips/include/asm/mach-db1x00
 load-$(CONFIG_MIPS_DB1200)     += 0xffffffff80100000
 
 #
-# AMD Alchemy Bosporus eval board
-#
-platform-$(CONFIG_MIPS_BOSPORUS) += alchemy/devboards/
-cflags-$(CONFIG_MIPS_BOSPORUS)  += -I$(srctree)/arch/mips/include/asm/mach-db1x00
-load-$(CONFIG_MIPS_BOSPORUS)    += 0xffffffff80100000
-
-#
-# AMD Alchemy Mirage eval board
+# NetLogic DBAu1300 development platform
 #
-platform-$(CONFIG_MIPS_MIRAGE) += alchemy/devboards/
-cflags-$(CONFIG_MIPS_MIRAGE)   += -I$(srctree)/arch/mips/include/asm/mach-db1x00
-load-$(CONFIG_MIPS_MIRAGE)     += 0xffffffff80100000
+platform-$(CONFIG_MIPS_DB1300) += alchemy/devboards/
+cflags-$(CONFIG_MIPS_DB1300)   += -I$(srctree)/arch/mips/include/asm/mach-db1x00
+load-$(CONFIG_MIPS_DB1300)     += 0xffffffff80100000
 
 #
-# 4G-Systems eval board
+# 4G-Systems MTX-1 "MeshCube" wireless router
 #
-platform-$(CONFIG_MIPS_MTX1)   += alchemy/mtx-1/
+platform-$(CONFIG_MIPS_MTX1)   += alchemy/
 load-$(CONFIG_MIPS_MTX1)       += 0xffffffff80100000
 
 #
 # MyCable eval board
 #
-platform-$(CONFIG_MIPS_XXS1500)        += alchemy/xxs1500/
+platform-$(CONFIG_MIPS_XXS1500)        += alchemy/
 load-$(CONFIG_MIPS_XXS1500)    += 0xffffffff80100000
 
 #
 # Trapeze ITS GRP board
 #
-platform-$(CONFIG_MIPS_GPR)    += alchemy/gpr/
+platform-$(CONFIG_MIPS_GPR)    += alchemy/
 load-$(CONFIG_MIPS_GPR)                += 0xffffffff80100000
 
 # boards can specify their own <gpio.h> in one of their include dirs.
diff --git a/arch/mips/alchemy/board-gpr.c b/arch/mips/alchemy/board-gpr.c
new file mode 100644 (file)
index 0000000..ba32590
--- /dev/null
@@ -0,0 +1,303 @@
+/*
+ * GPR board platform device registration (Au1550)
+ *
+ * Copyright (C) 2010 Wolfgang Grandegger <wg@denx.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include <linux/delay.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/pm.h>
+#include <linux/mtd/partitions.h>
+#include <linux/mtd/physmap.h>
+#include <linux/leds.h>
+#include <linux/gpio.h>
+#include <linux/i2c.h>
+#include <linux/i2c-gpio.h>
+#include <asm/bootinfo.h>
+#include <asm/reboot.h>
+#include <asm/mach-au1x00/au1000.h>
+#include <prom.h>
+
+const char *get_system_type(void)
+{
+       return "GPR";
+}
+
+void __init prom_init(void)
+{
+       unsigned char *memsize_str;
+       unsigned long memsize;
+
+       prom_argc = fw_arg0;
+       prom_argv = (char **)fw_arg1;
+       prom_envp = (char **)fw_arg2;
+
+       prom_init_cmdline();
+
+       memsize_str = prom_getenv("memsize");
+       if (!memsize_str)
+               memsize = 0x04000000;
+       else
+               strict_strtoul(memsize_str, 0, &memsize);
+       add_memory_region(0, memsize, BOOT_MEM_RAM);
+}
+
+void prom_putchar(unsigned char c)
+{
+       alchemy_uart_putchar(AU1000_UART0_PHYS_ADDR, c);
+}
+
+static void gpr_reset(char *c)
+{
+       /* switch System-LED to orange (red# and green# on) */
+       alchemy_gpio_direction_output(4, 0);
+       alchemy_gpio_direction_output(5, 0);
+
+       /* trigger watchdog to reset board in 200ms */
+       printk(KERN_EMERG "Triggering watchdog soft reset...\n");
+       raw_local_irq_disable();
+       alchemy_gpio_direction_output(1, 0);
+       udelay(1);
+       alchemy_gpio_set_value(1, 1);
+       while (1)
+               cpu_wait();
+}
+
+static void gpr_power_off(void)
+{
+       while (1)
+               cpu_wait();
+}
+
+void __init board_setup(void)
+{
+       printk(KERN_INFO "Trapeze ITS GPR board\n");
+
+       pm_power_off = gpr_power_off;
+       _machine_halt = gpr_power_off;
+       _machine_restart = gpr_reset;
+
+       /* Enable UART1/3 */
+       alchemy_uart_enable(AU1000_UART3_PHYS_ADDR);
+       alchemy_uart_enable(AU1000_UART1_PHYS_ADDR);
+
+       /* Take away Reset of UMTS-card */
+       alchemy_gpio_direction_output(215, 1);
+}
+
+/*
+ * Watchdog
+ */
+static struct resource gpr_wdt_resource[] = {
+       [0] = {
+               .start  = 1,
+               .end    = 1,
+               .name   = "gpr-adm6320-wdt",
+               .flags  = IORESOURCE_IRQ,
+       }
+};
+
+static struct platform_device gpr_wdt_device = {
+       .name = "adm6320-wdt",
+       .id = 0,
+       .num_resources = ARRAY_SIZE(gpr_wdt_resource),
+       .resource = gpr_wdt_resource,
+};
+
+/*
+ * FLASH
+ *
+ * 0x00000000-0x00200000 : "kernel"
+ * 0x00200000-0x00a00000 : "rootfs"
+ * 0x01d00000-0x01f00000 : "config"
+ * 0x01c00000-0x01d00000 : "yamon"
+ * 0x01d00000-0x01d40000 : "yamon env vars"
+ * 0x00000000-0x00a00000 : "kernel+rootfs"
+ */
+static struct mtd_partition gpr_mtd_partitions[] = {
+       {
+               .name   = "kernel",
+               .size   = 0x00200000,
+               .offset = 0,
+       },
+       {
+               .name   = "rootfs",
+               .size   = 0x00800000,
+               .offset = MTDPART_OFS_APPEND,
+               .mask_flags = MTD_WRITEABLE,
+       },
+       {
+               .name   = "config",
+               .size   = 0x00200000,
+               .offset = 0x01d00000,
+       },
+       {
+               .name   = "yamon",
+               .size   = 0x00100000,
+               .offset = 0x01c00000,
+       },
+       {
+               .name   = "yamon env vars",
+               .size   = 0x00040000,
+               .offset = MTDPART_OFS_APPEND,
+       },
+       {
+               .name   = "kernel+rootfs",
+               .size   = 0x00a00000,
+               .offset = 0,
+       },
+};
+
+static struct physmap_flash_data gpr_flash_data = {
+       .width          = 4,
+       .nr_parts       = ARRAY_SIZE(gpr_mtd_partitions),
+       .parts          = gpr_mtd_partitions,
+};
+
+static struct resource gpr_mtd_resource = {
+       .start  = 0x1e000000,
+       .end    = 0x1fffffff,
+       .flags  = IORESOURCE_MEM,
+};
+
+static struct platform_device gpr_mtd_device = {
+       .name           = "physmap-flash",
+       .dev            = {
+               .platform_data  = &gpr_flash_data,
+       },
+       .num_resources  = 1,
+       .resource       = &gpr_mtd_resource,
+};
+
+/*
+ * LEDs
+ */
+static struct gpio_led gpr_gpio_leds[] = {
+       {       /* green */
+               .name                   = "gpr:green",
+               .gpio                   = 4,
+               .active_low             = 1,
+       },
+       {       /* red */
+               .name                   = "gpr:red",
+               .gpio                   = 5,
+               .active_low             = 1,
+       }
+};
+
+static struct gpio_led_platform_data gpr_led_data = {
+       .num_leds = ARRAY_SIZE(gpr_gpio_leds),
+       .leds = gpr_gpio_leds,
+};
+
+static struct platform_device gpr_led_devices = {
+       .name = "leds-gpio",
+       .id = -1,
+       .dev = {
+               .platform_data = &gpr_led_data,
+       }
+};
+
+/*
+ * I2C
+ */
+static struct i2c_gpio_platform_data gpr_i2c_data = {
+       .sda_pin                = 209,
+       .sda_is_open_drain      = 1,
+       .scl_pin                = 210,
+       .scl_is_open_drain      = 1,
+       .udelay                 = 2,            /* ~100 kHz */
+       .timeout                = HZ,
+};
+
+static struct platform_device gpr_i2c_device = {
+       .name                   = "i2c-gpio",
+       .id                     = -1,
+       .dev.platform_data      = &gpr_i2c_data,
+};
+
+static struct i2c_board_info gpr_i2c_info[] __initdata = {
+       {
+               I2C_BOARD_INFO("lm83", 0x18),
+               .type = "lm83"
+       }
+};
+
+
+
+static struct resource alchemy_pci_host_res[] = {
+       [0] = {
+               .start  = AU1500_PCI_PHYS_ADDR,
+               .end    = AU1500_PCI_PHYS_ADDR + 0xfff,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static int gpr_map_pci_irq(const struct pci_dev *d, u8 slot, u8 pin)
+{
+       if ((slot == 0) && (pin == 1))
+               return AU1550_PCI_INTA;
+       else if ((slot == 0) && (pin == 2))
+               return AU1550_PCI_INTB;
+
+       return 0xff;
+}
+
+static struct alchemy_pci_platdata gpr_pci_pd = {
+       .board_map_irq  = gpr_map_pci_irq,
+       .pci_cfg_set    = PCI_CONFIG_AEN | PCI_CONFIG_R2H | PCI_CONFIG_R1H |
+                         PCI_CONFIG_CH |
+#if defined(__MIPSEB__)
+                         PCI_CONFIG_SIC_HWA_DAT | PCI_CONFIG_SM,
+#else
+                         0,
+#endif
+};
+
+static struct platform_device gpr_pci_host_dev = {
+       .dev.platform_data = &gpr_pci_pd,
+       .name           = "alchemy-pci",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(alchemy_pci_host_res),
+       .resource       = alchemy_pci_host_res,
+};
+
+static struct platform_device *gpr_devices[] __initdata = {
+       &gpr_wdt_device,
+       &gpr_mtd_device,
+       &gpr_i2c_device,
+       &gpr_led_devices,
+};
+
+static int __init gpr_pci_init(void)
+{
+       return platform_device_register(&gpr_pci_host_dev);
+}
+/* must be arch_initcall; MIPS PCI scans busses in a subsys_initcall */
+arch_initcall(gpr_pci_init);
+
+
+static int __init gpr_dev_init(void)
+{
+       i2c_register_board_info(0, gpr_i2c_info, ARRAY_SIZE(gpr_i2c_info));
+
+       return platform_add_devices(gpr_devices, ARRAY_SIZE(gpr_devices));
+}
+device_initcall(gpr_dev_init);
diff --git a/arch/mips/alchemy/board-mtx1.c b/arch/mips/alchemy/board-mtx1.c
new file mode 100644 (file)
index 0000000..295f1a9
--- /dev/null
@@ -0,0 +1,313 @@
+/*
+ * MTX-1 platform devices registration (Au1500)
+ *
+ * Copyright (C) 2007-2009, Florian Fainelli <florian@openwrt.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/leds.h>
+#include <linux/gpio.h>
+#include <linux/gpio_keys.h>
+#include <linux/input.h>
+#include <linux/mtd/partitions.h>
+#include <linux/mtd/physmap.h>
+#include <mtd/mtd-abi.h>
+#include <asm/bootinfo.h>
+#include <asm/reboot.h>
+#include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-au1x00/au1xxx_eth.h>
+#include <prom.h>
+
+const char *get_system_type(void)
+{
+       return "MTX-1";
+}
+
+void __init prom_init(void)
+{
+       unsigned char *memsize_str;
+       unsigned long memsize;
+
+       prom_argc = fw_arg0;
+       prom_argv = (char **)fw_arg1;
+       prom_envp = (char **)fw_arg2;
+
+       prom_init_cmdline();
+
+       memsize_str = prom_getenv("memsize");
+       if (!memsize_str)
+               memsize = 0x04000000;
+       else
+               strict_strtoul(memsize_str, 0, &memsize);
+       add_memory_region(0, memsize, BOOT_MEM_RAM);
+}
+
+void prom_putchar(unsigned char c)
+{
+       alchemy_uart_putchar(AU1000_UART0_PHYS_ADDR, c);
+}
+
+static void mtx1_reset(char *c)
+{
+       /* Jump to the reset vector */
+       __asm__ __volatile__("jr\t%0" : : "r"(0xbfc00000));
+}
+
+static void mtx1_power_off(void)
+{
+       while (1)
+               asm volatile (
+               "       .set    mips32                                  \n"
+               "       wait                                            \n"
+               "       .set    mips0                                   \n");
+}
+
+void __init board_setup(void)
+{
+#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
+       /* Enable USB power switch */
+       alchemy_gpio_direction_output(204, 0);
+#endif /* defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) */
+
+       /* Initialize sys_pinfunc */
+       au_writel(SYS_PF_NI2, SYS_PINFUNC);
+
+       /* Initialize GPIO */
+       au_writel(~0, KSEG1ADDR(AU1000_SYS_PHYS_ADDR) + SYS_TRIOUTCLR);
+       alchemy_gpio_direction_output(0, 0);    /* Disable M66EN (PCI 66MHz) */
+       alchemy_gpio_direction_output(3, 1);    /* Disable PCI CLKRUN# */
+       alchemy_gpio_direction_output(1, 1);    /* Enable EXT_IO3 */
+       alchemy_gpio_direction_output(5, 0);    /* Disable eth PHY TX_ER */
+
+       /* Enable LED and set it to green */
+       alchemy_gpio_direction_output(211, 1);  /* green on */
+       alchemy_gpio_direction_output(212, 0);  /* red off */
+
+       pm_power_off = mtx1_power_off;
+       _machine_halt = mtx1_power_off;
+       _machine_restart = mtx1_reset;
+
+       printk(KERN_INFO "4G Systems MTX-1 Board\n");
+}
+
+/******************************************************************************/
+
+static struct gpio_keys_button mtx1_gpio_button[] = {
+       {
+               .gpio = 207,
+               .code = BTN_0,
+               .desc = "System button",
+       }
+};
+
+static struct gpio_keys_platform_data mtx1_buttons_data = {
+       .buttons = mtx1_gpio_button,
+       .nbuttons = ARRAY_SIZE(mtx1_gpio_button),
+};
+
+static struct platform_device mtx1_button = {
+       .name = "gpio-keys",
+       .id = -1,
+       .dev = {
+               .platform_data = &mtx1_buttons_data,
+       }
+};
+
+static struct resource mtx1_wdt_res[] = {
+       [0] = {
+               .start  = 215,
+               .end    = 215,
+               .name   = "mtx1-wdt-gpio",
+               .flags  = IORESOURCE_IRQ,
+       }
+};
+
+static struct platform_device mtx1_wdt = {
+       .name = "mtx1-wdt",
+       .id = 0,
+       .num_resources = ARRAY_SIZE(mtx1_wdt_res),
+       .resource = mtx1_wdt_res,
+};
+
+static struct gpio_led default_leds[] = {
+       {
+               .name   = "mtx1:green",
+               .gpio = 211,
+       }, {
+               .name = "mtx1:red",
+               .gpio = 212,
+       },
+};
+
+static struct gpio_led_platform_data mtx1_led_data = {
+       .num_leds = ARRAY_SIZE(default_leds),
+       .leds = default_leds,
+};
+
+static struct platform_device mtx1_gpio_leds = {
+       .name = "leds-gpio",
+       .id = -1,
+       .dev = {
+               .platform_data = &mtx1_led_data,
+       }
+};
+
+static struct mtd_partition mtx1_mtd_partitions[] = {
+       {
+               .name   = "filesystem",
+               .size   = 0x01C00000,
+               .offset = 0,
+       },
+       {
+               .name   = "yamon",
+               .size   = 0x00100000,
+               .offset = MTDPART_OFS_APPEND,
+               .mask_flags = MTD_WRITEABLE,
+       },
+       {
+               .name   = "kernel",
+               .size   = 0x002c0000,
+               .offset = MTDPART_OFS_APPEND,
+       },
+       {
+               .name   = "yamon env",
+               .size   = 0x00040000,
+               .offset = MTDPART_OFS_APPEND,
+       },
+};
+
+static struct physmap_flash_data mtx1_flash_data = {
+       .width          = 4,
+       .nr_parts       = 4,
+       .parts          = mtx1_mtd_partitions,
+};
+
+static struct resource mtx1_mtd_resource = {
+       .start  = 0x1e000000,
+       .end    = 0x1fffffff,
+       .flags  = IORESOURCE_MEM,
+};
+
+static struct platform_device mtx1_mtd = {
+       .name           = "physmap-flash",
+       .dev            = {
+               .platform_data  = &mtx1_flash_data,
+       },
+       .num_resources  = 1,
+       .resource       = &mtx1_mtd_resource,
+};
+
+static struct resource alchemy_pci_host_res[] = {
+       [0] = {
+               .start  = AU1500_PCI_PHYS_ADDR,
+               .end    = AU1500_PCI_PHYS_ADDR + 0xfff,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static int mtx1_pci_idsel(unsigned int devsel, int assert)
+{
+       /* This function is only necessary to support a proprietary Cardbus
+        * adapter on the mtx-1 "singleboard" variant. It triggers a custom
+        * logic chip connected to EXT_IO3 (GPIO1) to suppress IDSEL signals.
+        */
+       if (assert && devsel != 0)
+               /* Suppress signal to Cardbus */
+               alchemy_gpio_set_value(1, 0);   /* set EXT_IO3 OFF */
+       else
+               alchemy_gpio_set_value(1, 1);   /* set EXT_IO3 ON */
+
+       udelay(1);
+       return 1;
+}
+
+static const char mtx1_irqtab[][5] = {
+       [0] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTA, 0xff, 0xff }, /* IDSEL 00 - AdapterA-Slot0 (top) */
+       [1] = { -1, AU1500_PCI_INTB, AU1500_PCI_INTA, 0xff, 0xff }, /* IDSEL 01 - AdapterA-Slot1 (bottom) */
+       [2] = { -1, AU1500_PCI_INTC, AU1500_PCI_INTD, 0xff, 0xff }, /* IDSEL 02 - AdapterB-Slot0 (top) */
+       [3] = { -1, AU1500_PCI_INTD, AU1500_PCI_INTC, 0xff, 0xff }, /* IDSEL 03 - AdapterB-Slot1 (bottom) */
+       [4] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTB, 0xff, 0xff }, /* IDSEL 04 - AdapterC-Slot0 (top) */
+       [5] = { -1, AU1500_PCI_INTB, AU1500_PCI_INTA, 0xff, 0xff }, /* IDSEL 05 - AdapterC-Slot1 (bottom) */
+       [6] = { -1, AU1500_PCI_INTC, AU1500_PCI_INTD, 0xff, 0xff }, /* IDSEL 06 - AdapterD-Slot0 (top) */
+       [7] = { -1, AU1500_PCI_INTD, AU1500_PCI_INTC, 0xff, 0xff }, /* IDSEL 07 - AdapterD-Slot1 (bottom) */
+};
+
+static int mtx1_map_pci_irq(const struct pci_dev *d, u8 slot, u8 pin)
+{
+       return mtx1_irqtab[slot][pin];
+}
+
+static struct alchemy_pci_platdata mtx1_pci_pd = {
+       .board_map_irq   = mtx1_map_pci_irq,
+       .board_pci_idsel = mtx1_pci_idsel,
+       .pci_cfg_set     = PCI_CONFIG_AEN | PCI_CONFIG_R2H | PCI_CONFIG_R1H |
+                          PCI_CONFIG_CH |
+#if defined(__MIPSEB__)
+                          PCI_CONFIG_SIC_HWA_DAT | PCI_CONFIG_SM,
+#else
+                          0,
+#endif
+};
+
+static struct platform_device mtx1_pci_host = {
+       .dev.platform_data = &mtx1_pci_pd,
+       .name           = "alchemy-pci",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(alchemy_pci_host_res),
+       .resource       = alchemy_pci_host_res,
+};
+
+static struct __initdata platform_device * mtx1_devs[] = {
+       &mtx1_pci_host,
+       &mtx1_gpio_leds,
+       &mtx1_wdt,
+       &mtx1_button,
+       &mtx1_mtd,
+};
+
+static struct au1000_eth_platform_data mtx1_au1000_eth0_pdata = {
+       .phy_search_highest_addr        = 1,
+       .phy1_search_mac0               = 1,
+};
+
+static int __init mtx1_register_devices(void)
+{
+       int rc;
+
+       irq_set_irq_type(AU1500_GPIO204_INT, IRQ_TYPE_LEVEL_HIGH);
+       irq_set_irq_type(AU1500_GPIO201_INT, IRQ_TYPE_LEVEL_LOW);
+       irq_set_irq_type(AU1500_GPIO202_INT, IRQ_TYPE_LEVEL_LOW);
+       irq_set_irq_type(AU1500_GPIO203_INT, IRQ_TYPE_LEVEL_LOW);
+       irq_set_irq_type(AU1500_GPIO205_INT, IRQ_TYPE_LEVEL_LOW);
+
+       au1xxx_override_eth_cfg(0, &mtx1_au1000_eth0_pdata);
+
+       rc = gpio_request(mtx1_gpio_button[0].gpio,
+                                       mtx1_gpio_button[0].desc);
+       if (rc < 0) {
+               printk(KERN_INFO "mtx1: failed to request %d\n",
+                                       mtx1_gpio_button[0].gpio);
+               goto out;
+       }
+       gpio_direction_input(mtx1_gpio_button[0].gpio);
+out:
+       return platform_add_devices(mtx1_devs, ARRAY_SIZE(mtx1_devs));
+}
+arch_initcall(mtx1_register_devices);
diff --git a/arch/mips/alchemy/board-xxs1500.c b/arch/mips/alchemy/board-xxs1500.c
new file mode 100644 (file)
index 0000000..bd55136
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * BRIEF MODULE DESCRIPTION
+ *     MyCable XXS1500 board support
+ *
+ * Copyright 2003, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <linux/gpio.h>
+#include <linux/delay.h>
+#include <linux/pm.h>
+#include <asm/bootinfo.h>
+#include <asm/reboot.h>
+#include <asm/mach-au1x00/au1000.h>
+#include <prom.h>
+
+const char *get_system_type(void)
+{
+       return "XXS1500";
+}
+
+void __init prom_init(void)
+{
+       unsigned char *memsize_str;
+       unsigned long memsize;
+
+       prom_argc = fw_arg0;
+       prom_argv = (char **)fw_arg1;
+       prom_envp = (char **)fw_arg2;
+
+       prom_init_cmdline();
+
+       memsize_str = prom_getenv("memsize");
+       if (!memsize_str || strict_strtoul(memsize_str, 0, &memsize))
+               memsize = 0x04000000;
+
+       add_memory_region(0, memsize, BOOT_MEM_RAM);
+}
+
+void prom_putchar(unsigned char c)
+{
+       alchemy_uart_putchar(AU1000_UART0_PHYS_ADDR, c);
+}
+
+static void xxs1500_reset(char *c)
+{
+       /* Jump to the reset vector */
+       __asm__ __volatile__("jr\t%0" : : "r"(0xbfc00000));
+}
+
+static void xxs1500_power_off(void)
+{
+       while (1)
+               asm volatile (
+               "       .set    mips32                                  \n"
+               "       wait                                            \n"
+               "       .set    mips0                                   \n");
+}
+
+void __init board_setup(void)
+{
+       u32 pin_func;
+
+       pm_power_off = xxs1500_power_off;
+       _machine_halt = xxs1500_power_off;
+       _machine_restart = xxs1500_reset;
+
+       alchemy_gpio1_input_enable();
+       alchemy_gpio2_enable();
+
+       /* Set multiple use pins (UART3/GPIO) to UART (it's used as UART too) */
+       pin_func  = au_readl(SYS_PINFUNC) & ~SYS_PF_UR3;
+       pin_func |= SYS_PF_UR3;
+       au_writel(pin_func, SYS_PINFUNC);
+
+       /* Enable UART */
+       alchemy_uart_enable(AU1000_UART3_PHYS_ADDR);
+       /* Enable DTR (MCR bit 0) = USB power up */
+       __raw_writel(1, (void __iomem *)KSEG1ADDR(AU1000_UART3_PHYS_ADDR + 0x18));
+       wmb();
+}
+
+/******************************************************************************/
+
+static struct resource xxs1500_pcmcia_res[] = {
+       {
+               .name   = "pcmcia-io",
+               .flags  = IORESOURCE_MEM,
+               .start  = AU1000_PCMCIA_IO_PHYS_ADDR,
+               .end    = AU1000_PCMCIA_IO_PHYS_ADDR + 0x000400000 - 1,
+       },
+       {
+               .name   = "pcmcia-attr",
+               .flags  = IORESOURCE_MEM,
+               .start  = AU1000_PCMCIA_ATTR_PHYS_ADDR,
+               .end    = AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1,
+       },
+       {
+               .name   = "pcmcia-mem",
+               .flags  = IORESOURCE_MEM,
+               .start  = AU1000_PCMCIA_MEM_PHYS_ADDR,
+               .end    = AU1000_PCMCIA_MEM_PHYS_ADDR + 0x000400000 - 1,
+       },
+};
+
+static struct platform_device xxs1500_pcmcia_dev = {
+       .name           = "xxs1500_pcmcia",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(xxs1500_pcmcia_res),
+       .resource       = xxs1500_pcmcia_res,
+};
+
+static struct platform_device *xxs1500_devs[] __initdata = {
+       &xxs1500_pcmcia_dev,
+};
+
+static int __init xxs1500_dev_init(void)
+{
+       irq_set_irq_type(AU1500_GPIO204_INT, IRQ_TYPE_LEVEL_HIGH);
+       irq_set_irq_type(AU1500_GPIO201_INT, IRQ_TYPE_LEVEL_LOW);
+       irq_set_irq_type(AU1500_GPIO202_INT, IRQ_TYPE_LEVEL_LOW);
+       irq_set_irq_type(AU1500_GPIO203_INT, IRQ_TYPE_LEVEL_LOW);
+       irq_set_irq_type(AU1500_GPIO205_INT, IRQ_TYPE_LEVEL_LOW);
+       irq_set_irq_type(AU1500_GPIO207_INT, IRQ_TYPE_LEVEL_LOW);
+
+       irq_set_irq_type(AU1500_GPIO0_INT, IRQ_TYPE_LEVEL_LOW);
+       irq_set_irq_type(AU1500_GPIO1_INT, IRQ_TYPE_LEVEL_LOW);
+       irq_set_irq_type(AU1500_GPIO2_INT, IRQ_TYPE_LEVEL_LOW);
+       irq_set_irq_type(AU1500_GPIO3_INT, IRQ_TYPE_LEVEL_LOW);
+       irq_set_irq_type(AU1500_GPIO4_INT, IRQ_TYPE_LEVEL_LOW); /* CF irq */
+       irq_set_irq_type(AU1500_GPIO5_INT, IRQ_TYPE_LEVEL_LOW);
+
+       return platform_add_devices(xxs1500_devs,
+                                   ARRAY_SIZE(xxs1500_devs));
+}
+device_initcall(xxs1500_dev_init);
index 811ece7b22e304fd9d04a8f38c1c6a241267b058..407ebc00e661f974bbaec96a345afcea8f6b6409 100644 (file)
@@ -6,9 +6,7 @@
 #
 
 obj-y += prom.o time.o clocks.o platform.o power.o setup.o \
-       sleeper.o dma.o dbdma.o
-
-obj-$(CONFIG_ALCHEMY_GPIOINT_AU1000) += irq.o
+       sleeper.o dma.o dbdma.o vss.o irq.o
 
 # optional gpiolib support
 ifeq ($(CONFIG_ALCHEMY_GPIO_INDIRECT),)
index 9ba407b4fc975a59fdab1877382d2ba786f05237..cf02d7dc2df0abbc24cd14f6a6de6ebb1800e03c 100644 (file)
@@ -148,6 +148,50 @@ static dbdev_tab_t au1200_dbdev_tab[] __initdata = {
        { DSCR_CMD0_ALWAYS,   DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
 };
 
+static dbdev_tab_t au1300_dbdev_tab[] __initdata = {
+       { AU1300_DSCR_CMD0_UART0_TX, DEV_FLAGS_OUT, 0, 8,  0x10100004, 0, 0 },
+       { AU1300_DSCR_CMD0_UART0_RX, DEV_FLAGS_IN,  0, 8,  0x10100000, 0, 0 },
+       { AU1300_DSCR_CMD0_UART1_TX, DEV_FLAGS_OUT, 0, 8,  0x10101004, 0, 0 },
+       { AU1300_DSCR_CMD0_UART1_RX, DEV_FLAGS_IN,  0, 8,  0x10101000, 0, 0 },
+       { AU1300_DSCR_CMD0_UART2_TX, DEV_FLAGS_OUT, 0, 8,  0x10102004, 0, 0 },
+       { AU1300_DSCR_CMD0_UART2_RX, DEV_FLAGS_IN,  0, 8,  0x10102000, 0, 0 },
+       { AU1300_DSCR_CMD0_UART3_TX, DEV_FLAGS_OUT, 0, 8,  0x10103004, 0, 0 },
+       { AU1300_DSCR_CMD0_UART3_RX, DEV_FLAGS_IN,  0, 8,  0x10103000, 0, 0 },
+
+       { AU1300_DSCR_CMD0_SDMS_TX0, DEV_FLAGS_OUT, 4, 8,  0x10600000, 0, 0 },
+       { AU1300_DSCR_CMD0_SDMS_RX0, DEV_FLAGS_IN,  4, 8,  0x10600004, 0, 0 },
+       { AU1300_DSCR_CMD0_SDMS_TX1, DEV_FLAGS_OUT, 8, 8,  0x10601000, 0, 0 },
+       { AU1300_DSCR_CMD0_SDMS_RX1, DEV_FLAGS_IN,  8, 8,  0x10601004, 0, 0 },
+
+       { AU1300_DSCR_CMD0_AES_RX, DEV_FLAGS_IN ,   4, 32, 0x10300008, 0, 0 },
+       { AU1300_DSCR_CMD0_AES_TX, DEV_FLAGS_OUT,   4, 32, 0x10300004, 0, 0 },
+
+       { AU1300_DSCR_CMD0_PSC0_TX, DEV_FLAGS_OUT,  0, 16, 0x10a0001c, 0, 0 },
+       { AU1300_DSCR_CMD0_PSC0_RX, DEV_FLAGS_IN,   0, 16, 0x10a0001c, 0, 0 },
+       { AU1300_DSCR_CMD0_PSC1_TX, DEV_FLAGS_OUT,  0, 16, 0x10a0101c, 0, 0 },
+       { AU1300_DSCR_CMD0_PSC1_RX, DEV_FLAGS_IN,   0, 16, 0x10a0101c, 0, 0 },
+       { AU1300_DSCR_CMD0_PSC2_TX, DEV_FLAGS_OUT,  0, 16, 0x10a0201c, 0, 0 },
+       { AU1300_DSCR_CMD0_PSC2_RX, DEV_FLAGS_IN,   0, 16, 0x10a0201c, 0, 0 },
+       { AU1300_DSCR_CMD0_PSC3_TX, DEV_FLAGS_OUT,  0, 16, 0x10a0301c, 0, 0 },
+       { AU1300_DSCR_CMD0_PSC3_RX, DEV_FLAGS_IN,   0, 16, 0x10a0301c, 0, 0 },
+
+       { AU1300_DSCR_CMD0_LCD, DEV_FLAGS_ANYUSE,   0, 0,  0x00000000, 0, 0 },
+       { AU1300_DSCR_CMD0_NAND_FLASH, DEV_FLAGS_IN, 0, 0, 0x00000000, 0, 0 },
+
+       { AU1300_DSCR_CMD0_SDMS_TX2, DEV_FLAGS_OUT, 4, 8,  0x10602000, 0, 0 },
+       { AU1300_DSCR_CMD0_SDMS_RX2, DEV_FLAGS_IN,  4, 8,  0x10602004, 0, 0 },
+
+       { AU1300_DSCR_CMD0_CIM_SYNC, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
+
+       { AU1300_DSCR_CMD0_UDMA, DEV_FLAGS_ANYUSE,  0, 32, 0x14001810, 0, 0 },
+
+       { AU1300_DSCR_CMD0_DMA_REQ0, 0, 0, 0, 0x00000000, 0, 0 },
+       { AU1300_DSCR_CMD0_DMA_REQ1, 0, 0, 0, 0x00000000, 0, 0 },
+
+       { DSCR_CMD0_THROTTLE, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
+       { DSCR_CMD0_ALWAYS,   DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
+};
+
 /* 32 predefined plus 32 custom */
 #define DBDEV_TAB_SIZE         64
 
@@ -1037,6 +1081,8 @@ static int __init alchemy_dbdma_init(void)
                return dbdma_setup(AU1550_DDMA_INT, au1550_dbdev_tab);
        case ALCHEMY_CPU_AU1200:
                return dbdma_setup(AU1200_DDMA_INT, au1200_dbdev_tab);
+       case ALCHEMY_CPU_AU1300:
+               return dbdma_setup(AU1300_DDMA_INT, au1300_dbdev_tab);
        }
        return 0;
 }
index 91fb4d9e30fd819e382368f22af586271bb23a5c..f1b50f0c01db470ce008f74c1855532ded04c4be 100644 (file)
@@ -27,6 +27,7 @@
  *      CONFIG_ALCHEMY_GPIO_INDIRECT=n, otherwise compilation will fail!
  *     au1000 SoC have only one GPIO block : GPIO1
  *     Au1100, Au15x0, Au12x0 have a second one : GPIO2
+ *     Au1300 is totally different: 1 block with up to 128 GPIOs
  */
 
 #include <linux/init.h>
@@ -35,6 +36,7 @@
 #include <linux/types.h>
 #include <linux/gpio.h>
 #include <asm/mach-au1x00/gpio-au1000.h>
+#include <asm/mach-au1x00/gpio-au1300.h>
 
 static int gpio2_get(struct gpio_chip *chip, unsigned offset)
 {
@@ -115,6 +117,43 @@ struct gpio_chip alchemy_gpio_chip[] = {
        },
 };
 
+static int alchemy_gpic_get(struct gpio_chip *chip, unsigned int off)
+{
+       return au1300_gpio_get_value(off + AU1300_GPIO_BASE);
+}
+
+static void alchemy_gpic_set(struct gpio_chip *chip, unsigned int off, int v)
+{
+       au1300_gpio_set_value(off + AU1300_GPIO_BASE, v);
+}
+
+static int alchemy_gpic_dir_input(struct gpio_chip *chip, unsigned int off)
+{
+       return au1300_gpio_direction_input(off + AU1300_GPIO_BASE);
+}
+
+static int alchemy_gpic_dir_output(struct gpio_chip *chip, unsigned int off,
+                                  int v)
+{
+       return au1300_gpio_direction_output(off + AU1300_GPIO_BASE, v);
+}
+
+static int alchemy_gpic_gpio_to_irq(struct gpio_chip *chip, unsigned int off)
+{
+       return au1300_gpio_to_irq(off + AU1300_GPIO_BASE);
+}
+
+static struct gpio_chip au1300_gpiochip = {
+       .label                  = "alchemy-gpic",
+       .direction_input        = alchemy_gpic_dir_input,
+       .direction_output       = alchemy_gpic_dir_output,
+       .get                    = alchemy_gpic_get,
+       .set                    = alchemy_gpic_set,
+       .to_irq                 = alchemy_gpic_gpio_to_irq,
+       .base                   = AU1300_GPIO_BASE,
+       .ngpio                  = AU1300_GPIO_NUM,
+};
+
 static int __init alchemy_gpiochip_init(void)
 {
        int ret = 0;
@@ -127,6 +166,9 @@ static int __init alchemy_gpiochip_init(void)
                ret = gpiochip_add(&alchemy_gpio_chip[0]);
                ret |= gpiochip_add(&alchemy_gpio_chip[1]);
                break;
+       case ALCHEMY_CPU_AU1300:
+               ret = gpiochip_add(&au1300_gpiochip);
+               break;
        }
        return ret;
 }
index 8b60ba0675e2f0f47c78b0908c53f93565f68fbb..94fbcd19eb9ca9631425a6cf20c055c3807e72ac 100644 (file)
  *  675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#include <linux/bitops.h>
+#include <linux/export.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
-#include <linux/irq.h>
 #include <linux/slab.h>
 #include <linux/syscore_ops.h>
 
 #include <asm/irq_cpu.h>
-#include <asm/mipsregs.h>
 #include <asm/mach-au1x00/au1000.h>
-#ifdef CONFIG_MIPS_PB1000
-#include <asm/mach-pb1x00/pb1000.h>
-#endif
+#include <asm/mach-au1x00/gpio-au1300.h>
 
 /* Interrupt Controller register offsets */
 #define IC_CFG0RD      0x40
 #define IC_FALLINGCLR  0x7C
 #define IC_TESTBIT     0x80
 
-static int au1x_ic_settype(struct irq_data *d, unsigned int flow_type);
+/* per-processor fixed function irqs */
+struct alchemy_irqmap {
+       int irq;        /* linux IRQ number */
+       int type;       /* IRQ_TYPE_ */
+       int prio;       /* irq priority, 0 highest, 3 lowest */
+       int internal;   /* GPIC: internal source (no ext. pin)? */
+};
+
+static int au1x_ic_settype(struct irq_data *d, unsigned int type);
+static int au1300_gpic_settype(struct irq_data *d, unsigned int type);
+
 
 /* NOTE on interrupt priorities: The original writers of this code said:
  *
@@ -77,176 +83,207 @@ static int au1x_ic_settype(struct irq_data *d, unsigned int flow_type);
  * the USB devices-side packet complete interrupt (USB_DEV_REQ_INT)
  * needs the highest priority.
  */
-
-/* per-processor fixed function irqs */
-struct au1xxx_irqmap {
-       int im_irq;
-       int im_type;
-       int im_request;         /* set 1 to get higher priority */
+struct alchemy_irqmap au1000_irqmap[] __initdata = {
+       { AU1000_UART0_INT,       IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1000_UART1_INT,       IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1000_UART2_INT,       IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1000_UART3_INT,       IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1000_SSI0_INT,        IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1000_SSI1_INT,        IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1000_DMA_INT_BASE,    IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1000_DMA_INT_BASE+1,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1000_DMA_INT_BASE+2,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1000_DMA_INT_BASE+3,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1000_DMA_INT_BASE+4,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1000_DMA_INT_BASE+5,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1000_DMA_INT_BASE+6,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1000_DMA_INT_BASE+7,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1000_TOY_INT,         IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1000_TOY_MATCH0_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1000_TOY_MATCH1_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1000_TOY_MATCH2_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1000_RTC_INT,         IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1000_RTC_MATCH0_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1000_RTC_MATCH1_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1000_RTC_MATCH2_INT,  IRQ_TYPE_EDGE_RISING, 0, 0 },
+       { AU1000_IRDA_TX_INT,     IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1000_IRDA_RX_INT,     IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1000_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH,  0, 0 },
+       { AU1000_USB_DEV_SUS_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1000_USB_HOST_INT,    IRQ_TYPE_LEVEL_LOW,   1, 0 },
+       { AU1000_ACSYNC_INT,      IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1000_MAC0_DMA_INT,    IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1000_MAC1_DMA_INT,    IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1000_AC97C_INT,       IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { -1, },
 };
 
-struct au1xxx_irqmap au1000_irqmap[] __initdata = {
-       { AU1000_UART0_INT,       IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1000_UART1_INT,       IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1000_UART2_INT,       IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1000_UART3_INT,       IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1000_SSI0_INT,        IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1000_SSI1_INT,        IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1000_DMA_INT_BASE,    IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1000_DMA_INT_BASE+1,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1000_DMA_INT_BASE+2,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1000_DMA_INT_BASE+3,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1000_DMA_INT_BASE+4,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1000_DMA_INT_BASE+5,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1000_DMA_INT_BASE+6,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1000_DMA_INT_BASE+7,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1000_TOY_INT,         IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1000_TOY_MATCH0_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1000_TOY_MATCH1_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1000_TOY_MATCH2_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1000_RTC_INT,         IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1000_RTC_MATCH0_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1000_RTC_MATCH1_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1000_RTC_MATCH2_INT,  IRQ_TYPE_EDGE_RISING, 1 },
-       { AU1000_IRDA_TX_INT,     IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1000_IRDA_RX_INT,     IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1000_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH,  1 },
-       { AU1000_USB_DEV_SUS_INT, IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1000_USB_HOST_INT,    IRQ_TYPE_LEVEL_LOW,   0 },
-       { AU1000_ACSYNC_INT,      IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1000_MAC0_DMA_INT,    IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1000_MAC1_DMA_INT,    IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1000_AC97C_INT,       IRQ_TYPE_EDGE_RISING, 0 },
+struct alchemy_irqmap au1500_irqmap[] __initdata = {
+       { AU1500_UART0_INT,       IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1500_PCI_INTA,        IRQ_TYPE_LEVEL_LOW,   1, 0 },
+       { AU1500_PCI_INTB,        IRQ_TYPE_LEVEL_LOW,   1, 0 },
+       { AU1500_UART3_INT,       IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1500_PCI_INTC,        IRQ_TYPE_LEVEL_LOW,   1, 0 },
+       { AU1500_PCI_INTD,        IRQ_TYPE_LEVEL_LOW,   1, 0 },
+       { AU1500_DMA_INT_BASE,    IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1500_DMA_INT_BASE+1,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1500_DMA_INT_BASE+2,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1500_DMA_INT_BASE+3,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1500_DMA_INT_BASE+4,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1500_DMA_INT_BASE+5,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1500_DMA_INT_BASE+6,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1500_DMA_INT_BASE+7,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1500_TOY_INT,         IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1500_TOY_MATCH0_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1500_TOY_MATCH1_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1500_TOY_MATCH2_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1500_RTC_INT,         IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1500_RTC_MATCH0_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1500_RTC_MATCH1_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1500_RTC_MATCH2_INT,  IRQ_TYPE_EDGE_RISING, 0, 0 },
+       { AU1500_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH,  0, 0 },
+       { AU1500_USB_DEV_SUS_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1500_USB_HOST_INT,    IRQ_TYPE_LEVEL_LOW,   1, 0 },
+       { AU1500_ACSYNC_INT,      IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1500_MAC0_DMA_INT,    IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1500_MAC1_DMA_INT,    IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1500_AC97C_INT,       IRQ_TYPE_EDGE_RISING, 1, 0 },
        { -1, },
 };
 
-struct au1xxx_irqmap au1500_irqmap[] __initdata = {
-       { AU1500_UART0_INT,       IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1500_PCI_INTA,        IRQ_TYPE_LEVEL_LOW,   0 },
-       { AU1500_PCI_INTB,        IRQ_TYPE_LEVEL_LOW,   0 },
-       { AU1500_UART3_INT,       IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1500_PCI_INTC,        IRQ_TYPE_LEVEL_LOW,   0 },
-       { AU1500_PCI_INTD,        IRQ_TYPE_LEVEL_LOW,   0 },
-       { AU1500_DMA_INT_BASE,    IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1500_DMA_INT_BASE+1,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1500_DMA_INT_BASE+2,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1500_DMA_INT_BASE+3,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1500_DMA_INT_BASE+4,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1500_DMA_INT_BASE+5,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1500_DMA_INT_BASE+6,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1500_DMA_INT_BASE+7,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1500_TOY_INT,         IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1500_TOY_MATCH0_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1500_TOY_MATCH1_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1500_TOY_MATCH2_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1500_RTC_INT,         IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1500_RTC_MATCH0_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1500_RTC_MATCH1_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1500_RTC_MATCH2_INT,  IRQ_TYPE_EDGE_RISING, 1 },
-       { AU1500_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH,  1 },
-       { AU1500_USB_DEV_SUS_INT, IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1500_USB_HOST_INT,    IRQ_TYPE_LEVEL_LOW,   0 },
-       { AU1500_ACSYNC_INT,      IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1500_MAC0_DMA_INT,    IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1500_MAC1_DMA_INT,    IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1500_AC97C_INT,       IRQ_TYPE_EDGE_RISING, 0 },
+struct alchemy_irqmap au1100_irqmap[] __initdata = {
+       { AU1100_UART0_INT,       IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1100_UART1_INT,       IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1100_SD_INT,          IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1100_UART3_INT,       IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1100_SSI0_INT,        IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1100_SSI1_INT,        IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1100_DMA_INT_BASE,    IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1100_DMA_INT_BASE+1,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1100_DMA_INT_BASE+2,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1100_DMA_INT_BASE+3,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1100_DMA_INT_BASE+4,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1100_DMA_INT_BASE+5,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1100_DMA_INT_BASE+6,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1100_DMA_INT_BASE+7,  IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1100_TOY_INT,         IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1100_TOY_MATCH0_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1100_TOY_MATCH1_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1100_TOY_MATCH2_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1100_RTC_INT,         IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1100_RTC_MATCH0_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1100_RTC_MATCH1_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1100_RTC_MATCH2_INT,  IRQ_TYPE_EDGE_RISING, 0, 0 },
+       { AU1100_IRDA_TX_INT,     IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1100_IRDA_RX_INT,     IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1100_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH,  0, 0 },
+       { AU1100_USB_DEV_SUS_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1100_USB_HOST_INT,    IRQ_TYPE_LEVEL_LOW,   1, 0 },
+       { AU1100_ACSYNC_INT,      IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1100_MAC0_DMA_INT,    IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1100_LCD_INT,         IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1100_AC97C_INT,       IRQ_TYPE_EDGE_RISING, 1, 0 },
        { -1, },
 };
 
-struct au1xxx_irqmap au1100_irqmap[] __initdata = {
-       { AU1100_UART0_INT,       IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1100_UART1_INT,       IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1100_SD_INT,          IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1100_UART3_INT,       IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1100_SSI0_INT,        IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1100_SSI1_INT,        IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1100_DMA_INT_BASE,    IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1100_DMA_INT_BASE+1,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1100_DMA_INT_BASE+2,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1100_DMA_INT_BASE+3,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1100_DMA_INT_BASE+4,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1100_DMA_INT_BASE+5,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1100_DMA_INT_BASE+6,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1100_DMA_INT_BASE+7,  IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1100_TOY_INT,         IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1100_TOY_MATCH0_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1100_TOY_MATCH1_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1100_TOY_MATCH2_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1100_RTC_INT,         IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1100_RTC_MATCH0_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1100_RTC_MATCH1_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1100_RTC_MATCH2_INT,  IRQ_TYPE_EDGE_RISING, 1 },
-       { AU1100_IRDA_TX_INT,     IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1100_IRDA_RX_INT,     IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1100_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH,  1 },
-       { AU1100_USB_DEV_SUS_INT, IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1100_USB_HOST_INT,    IRQ_TYPE_LEVEL_LOW,   0 },
-       { AU1100_ACSYNC_INT,      IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1100_MAC0_DMA_INT,    IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1100_LCD_INT,         IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1100_AC97C_INT,       IRQ_TYPE_EDGE_RISING, 0 },
+struct alchemy_irqmap au1550_irqmap[] __initdata = {
+       { AU1550_UART0_INT,       IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1550_PCI_INTA,        IRQ_TYPE_LEVEL_LOW,   1, 0 },
+       { AU1550_PCI_INTB,        IRQ_TYPE_LEVEL_LOW,   1, 0 },
+       { AU1550_DDMA_INT,        IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1550_CRYPTO_INT,      IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1550_PCI_INTC,        IRQ_TYPE_LEVEL_LOW,   1, 0 },
+       { AU1550_PCI_INTD,        IRQ_TYPE_LEVEL_LOW,   1, 0 },
+       { AU1550_PCI_RST_INT,     IRQ_TYPE_LEVEL_LOW,   1, 0 },
+       { AU1550_UART1_INT,       IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1550_UART3_INT,       IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1550_PSC0_INT,        IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1550_PSC1_INT,        IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1550_PSC2_INT,        IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1550_PSC3_INT,        IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1550_TOY_INT,         IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1550_TOY_MATCH0_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1550_TOY_MATCH1_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1550_TOY_MATCH2_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1550_RTC_INT,         IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1550_RTC_MATCH0_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1550_RTC_MATCH1_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1550_RTC_MATCH2_INT,  IRQ_TYPE_EDGE_RISING, 0, 0 },
+       { AU1550_NAND_INT,        IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1550_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH,  0, 0 },
+       { AU1550_USB_DEV_SUS_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1550_USB_HOST_INT,    IRQ_TYPE_LEVEL_LOW,   1, 0 },
+       { AU1550_MAC0_DMA_INT,    IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1550_MAC1_DMA_INT,    IRQ_TYPE_LEVEL_HIGH,  1, 0 },
        { -1, },
 };
 
-struct au1xxx_irqmap au1550_irqmap[] __initdata = {
-       { AU1550_UART0_INT,       IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1550_PCI_INTA,        IRQ_TYPE_LEVEL_LOW,   0 },
-       { AU1550_PCI_INTB,        IRQ_TYPE_LEVEL_LOW,   0 },
-       { AU1550_DDMA_INT,        IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1550_CRYPTO_INT,      IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1550_PCI_INTC,        IRQ_TYPE_LEVEL_LOW,   0 },
-       { AU1550_PCI_INTD,        IRQ_TYPE_LEVEL_LOW,   0 },
-       { AU1550_PCI_RST_INT,     IRQ_TYPE_LEVEL_LOW,   0 },
-       { AU1550_UART1_INT,       IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1550_UART3_INT,       IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1550_PSC0_INT,        IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1550_PSC1_INT,        IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1550_PSC2_INT,        IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1550_PSC3_INT,        IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1550_TOY_INT,         IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1550_TOY_MATCH0_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1550_TOY_MATCH1_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1550_TOY_MATCH2_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1550_RTC_INT,         IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1550_RTC_MATCH0_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1550_RTC_MATCH1_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1550_RTC_MATCH2_INT,  IRQ_TYPE_EDGE_RISING, 1 },
-       { AU1550_NAND_INT,        IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1550_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH,  1 },
-       { AU1550_USB_DEV_SUS_INT, IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1550_USB_HOST_INT,    IRQ_TYPE_LEVEL_LOW,   0 },
-       { AU1550_MAC0_DMA_INT,    IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1550_MAC1_DMA_INT,    IRQ_TYPE_LEVEL_HIGH,  0 },
+struct alchemy_irqmap au1200_irqmap[] __initdata = {
+       { AU1200_UART0_INT,       IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1200_SWT_INT,         IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1200_SD_INT,          IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1200_DDMA_INT,        IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1200_MAE_BE_INT,      IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1200_UART1_INT,       IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1200_MAE_FE_INT,      IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1200_PSC0_INT,        IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1200_PSC1_INT,        IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1200_AES_INT,         IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1200_CAMERA_INT,      IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1200_TOY_INT,         IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1200_TOY_MATCH0_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1200_TOY_MATCH1_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1200_TOY_MATCH2_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1200_RTC_INT,         IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1200_RTC_MATCH0_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1200_RTC_MATCH1_INT,  IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1200_RTC_MATCH2_INT,  IRQ_TYPE_EDGE_RISING, 0, 0 },
+       { AU1200_NAND_INT,        IRQ_TYPE_EDGE_RISING, 1, 0 },
+       { AU1200_USB_INT,         IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1200_LCD_INT,         IRQ_TYPE_LEVEL_HIGH,  1, 0 },
+       { AU1200_MAE_BOTH_INT,    IRQ_TYPE_LEVEL_HIGH,  1, 0 },
        { -1, },
 };
 
-struct au1xxx_irqmap au1200_irqmap[] __initdata = {
-       { AU1200_UART0_INT,       IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1200_SWT_INT,         IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1200_SD_INT,          IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1200_DDMA_INT,        IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1200_MAE_BE_INT,      IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1200_UART1_INT,       IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1200_MAE_FE_INT,      IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1200_PSC0_INT,        IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1200_PSC1_INT,        IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1200_AES_INT,         IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1200_CAMERA_INT,      IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1200_TOY_INT,         IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1200_TOY_MATCH0_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1200_TOY_MATCH1_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1200_TOY_MATCH2_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1200_RTC_INT,         IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1200_RTC_MATCH0_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1200_RTC_MATCH1_INT,  IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1200_RTC_MATCH2_INT,  IRQ_TYPE_EDGE_RISING, 1 },
-       { AU1200_NAND_INT,        IRQ_TYPE_EDGE_RISING, 0 },
-       { AU1200_USB_INT,         IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1200_LCD_INT,         IRQ_TYPE_LEVEL_HIGH,  0 },
-       { AU1200_MAE_BOTH_INT,    IRQ_TYPE_LEVEL_HIGH,  0 },
-       { -1, },
+static struct alchemy_irqmap au1300_irqmap[] __initdata = {
+       /* multifunction: gpio pin or device */
+       { AU1300_UART1_INT,      IRQ_TYPE_LEVEL_HIGH,   1, 0, },
+       { AU1300_UART2_INT,      IRQ_TYPE_LEVEL_HIGH,   1, 0, },
+       { AU1300_UART3_INT,      IRQ_TYPE_LEVEL_HIGH,   1, 0, },
+       { AU1300_SD1_INT,        IRQ_TYPE_LEVEL_HIGH,   1, 0, },
+       { AU1300_SD2_INT,        IRQ_TYPE_LEVEL_HIGH,   1, 0, },
+       { AU1300_PSC0_INT,       IRQ_TYPE_LEVEL_HIGH,   1, 0, },
+       { AU1300_PSC1_INT,       IRQ_TYPE_LEVEL_HIGH,   1, 0, },
+       { AU1300_PSC2_INT,       IRQ_TYPE_LEVEL_HIGH,   1, 0, },
+       { AU1300_PSC3_INT,       IRQ_TYPE_LEVEL_HIGH,   1, 0, },
+       { AU1300_NAND_INT,       IRQ_TYPE_LEVEL_HIGH,   1, 0, },
+       /* au1300 internal */
+       { AU1300_DDMA_INT,       IRQ_TYPE_LEVEL_HIGH,   1, 1, },
+       { AU1300_MMU_INT,        IRQ_TYPE_LEVEL_HIGH,   1, 1, },
+       { AU1300_MPU_INT,        IRQ_TYPE_LEVEL_HIGH,   1, 1, },
+       { AU1300_GPU_INT,        IRQ_TYPE_LEVEL_HIGH,   1, 1, },
+       { AU1300_UDMA_INT,       IRQ_TYPE_LEVEL_HIGH,   1, 1, },
+       { AU1300_TOY_INT,        IRQ_TYPE_EDGE_RISING,  1, 1, },
+       { AU1300_TOY_MATCH0_INT, IRQ_TYPE_EDGE_RISING,  1, 1, },
+       { AU1300_TOY_MATCH1_INT, IRQ_TYPE_EDGE_RISING,  1, 1, },
+       { AU1300_TOY_MATCH2_INT, IRQ_TYPE_EDGE_RISING,  1, 1, },
+       { AU1300_RTC_INT,        IRQ_TYPE_EDGE_RISING,  1, 1, },
+       { AU1300_RTC_MATCH0_INT, IRQ_TYPE_EDGE_RISING,  1, 1, },
+       { AU1300_RTC_MATCH1_INT, IRQ_TYPE_EDGE_RISING,  1, 1, },
+       { AU1300_RTC_MATCH2_INT, IRQ_TYPE_EDGE_RISING,  0, 1, },
+       { AU1300_UART0_INT,      IRQ_TYPE_LEVEL_HIGH,   1, 1, },
+       { AU1300_SD0_INT,        IRQ_TYPE_LEVEL_HIGH,   1, 1, },
+       { AU1300_USB_INT,        IRQ_TYPE_LEVEL_HIGH,   1, 1, },
+       { AU1300_LCD_INT,        IRQ_TYPE_LEVEL_HIGH,   1, 1, },
+       { AU1300_BSA_INT,        IRQ_TYPE_LEVEL_HIGH,   1, 1, },
+       { AU1300_MPE_INT,        IRQ_TYPE_EDGE_RISING,  1, 1, },
+       { AU1300_ITE_INT,        IRQ_TYPE_LEVEL_HIGH,   1, 1, },
+       { AU1300_AES_INT,        IRQ_TYPE_LEVEL_HIGH,   1, 1, },
+       { AU1300_CIM_INT,        IRQ_TYPE_LEVEL_HIGH,   1, 1, },
+       { -1, },        /* terminator */
 };
 
+/******************************************************************************/
 
 static void au1x_ic0_unmask(struct irq_data *d)
 {
@@ -265,14 +302,6 @@ static void au1x_ic1_unmask(struct irq_data *d)
 
        __raw_writel(1 << bit, base + IC_MASKSET);
        __raw_writel(1 << bit, base + IC_WAKESET);
-
-/* very hacky. does the pb1000 cpld auto-disable this int?
- * nowhere in the current kernel sources is it disabled.       --mlau
- */
-#if defined(CONFIG_MIPS_PB1000)
-       if (d->irq == AU1000_GPIO15_INT)
-               __raw_writel(0x4000, (void __iomem *)PB1000_MDR); /* enable int */
-#endif
        wmb();
 }
 
@@ -470,40 +499,219 @@ static int au1x_ic_settype(struct irq_data *d, unsigned int flow_type)
        return ret;
 }
 
-asmlinkage void plat_irq_dispatch(void)
+/******************************************************************************/
+
+/*
+ * au1300_gpic_chgcfg - change PIN configuration.
+ * @gpio:      pin to change (0-based GPIO number from datasheet).
+ * @clr:       clear all bits set in 'clr'.
+ * @set:       set these bits.
+ *
+ * modifies a pins' configuration register, bits set in @clr will
+ * be cleared in the register, bits in @set will be set.
+ */
+static inline void au1300_gpic_chgcfg(unsigned int gpio,
+                                     unsigned long clr,
+                                     unsigned long set)
+{
+       void __iomem *r = AU1300_GPIC_ADDR;
+       unsigned long l;
+
+       r += gpio * 4;  /* offset into pin config array */
+       l = __raw_readl(r + AU1300_GPIC_PINCFG);
+       l &= ~clr;
+       l |= set;
+       __raw_writel(l, r + AU1300_GPIC_PINCFG);
+       wmb();
+}
+
+/*
+ * au1300_pinfunc_to_gpio - assign a pin as GPIO input (GPIO ctrl).
+ * @pin:       pin (0-based GPIO number from datasheet).
+ *
+ * Assigns a GPIO pin to the GPIO controller, so its level can either
+ * be read or set through the generic GPIO functions.
+ * If you need a GPOUT, use au1300_gpio_set_value(pin, 0/1).
+ * REVISIT: is this function really necessary?
+ */
+void au1300_pinfunc_to_gpio(enum au1300_multifunc_pins gpio)
+{
+       au1300_gpio_direction_input(gpio + AU1300_GPIO_BASE);
+}
+EXPORT_SYMBOL_GPL(au1300_pinfunc_to_gpio);
+
+/*
+ * au1300_pinfunc_to_dev - assign a pin to the device function.
+ * @pin:       pin (0-based GPIO number from datasheet).
+ *
+ * Assigns a GPIO pin to its associated device function; the pin will be
+ * driven by the device and not through GPIO functions.
+ */
+void au1300_pinfunc_to_dev(enum au1300_multifunc_pins gpio)
+{
+       void __iomem *r = AU1300_GPIC_ADDR;
+       unsigned long bit;
+
+       r += GPIC_GPIO_BANKOFF(gpio);
+       bit = GPIC_GPIO_TO_BIT(gpio);
+       __raw_writel(bit, r + AU1300_GPIC_DEVSEL);
+       wmb();
+}
+EXPORT_SYMBOL_GPL(au1300_pinfunc_to_dev);
+
+/*
+ * au1300_set_irq_priority -  set internal priority of IRQ.
+ * @irq:       irq to set priority (linux irq number).
+ * @p:         priority (0 = highest, 3 = lowest).
+ */
+void au1300_set_irq_priority(unsigned int irq, int p)
 {
-       unsigned int pending = read_c0_status() & read_c0_cause();
-       unsigned long s, off;
-
-       if (pending & CAUSEF_IP7) {
-               off = MIPS_CPU_IRQ_BASE + 7;
-               goto handle;
-       } else if (pending & CAUSEF_IP2) {
-               s = KSEG1ADDR(AU1000_IC0_PHYS_ADDR) + IC_REQ0INT;
-               off = AU1000_INTC0_INT_BASE;
-       } else if (pending & CAUSEF_IP3) {
-               s = KSEG1ADDR(AU1000_IC0_PHYS_ADDR) + IC_REQ1INT;
-               off = AU1000_INTC0_INT_BASE;
-       } else if (pending & CAUSEF_IP4) {
-               s = KSEG1ADDR(AU1000_IC1_PHYS_ADDR) + IC_REQ0INT;
-               off = AU1000_INTC1_INT_BASE;
-       } else if (pending & CAUSEF_IP5) {
-               s = KSEG1ADDR(AU1000_IC1_PHYS_ADDR) + IC_REQ1INT;
-               off = AU1000_INTC1_INT_BASE;
-       } else
-               goto spurious;
-
-       s = __raw_readl((void __iomem *)s);
-       if (unlikely(!s)) {
-spurious:
-               spurious_interrupt();
-               return;
+       irq -= ALCHEMY_GPIC_INT_BASE;
+       au1300_gpic_chgcfg(irq, GPIC_CFG_IL_MASK, GPIC_CFG_IL_SET(p));
+}
+EXPORT_SYMBOL_GPL(au1300_set_irq_priority);
+
+/*
+ * au1300_set_dbdma_gpio - assign a gpio to one of the DBDMA triggers.
+ * @dchan:     dbdma trigger select (0, 1).
+ * @gpio:      pin to assign as trigger.
+ *
+ * DBDMA controller has 2 external trigger sources; this function
+ * assigns a GPIO to the selected trigger.
+ */
+void au1300_set_dbdma_gpio(int dchan, unsigned int gpio)
+{
+       unsigned long r;
+
+       if ((dchan >= 0) && (dchan <= 1)) {
+               r = __raw_readl(AU1300_GPIC_ADDR + AU1300_GPIC_DMASEL);
+               r &= ~(0xff << (8 * dchan));
+               r |= (gpio & 0x7f) << (8 * dchan);
+               __raw_writel(r, AU1300_GPIC_ADDR + AU1300_GPIC_DMASEL);
+               wmb();
        }
-       off += __ffs(s);
-handle:
-       do_IRQ(off);
 }
 
+static inline void gpic_pin_set_idlewake(unsigned int gpio, int allow)
+{
+       au1300_gpic_chgcfg(gpio, GPIC_CFG_IDLEWAKE,
+                          allow ? GPIC_CFG_IDLEWAKE : 0);
+}
+
+static void au1300_gpic_mask(struct irq_data *d)
+{
+       void __iomem *r = AU1300_GPIC_ADDR;
+       unsigned long bit, irq = d->irq;
+
+       irq -= ALCHEMY_GPIC_INT_BASE;
+       r += GPIC_GPIO_BANKOFF(irq);
+       bit = GPIC_GPIO_TO_BIT(irq);
+       __raw_writel(bit, r + AU1300_GPIC_IDIS);
+       wmb();
+
+       gpic_pin_set_idlewake(irq, 0);
+}
+
+static void au1300_gpic_unmask(struct irq_data *d)
+{
+       void __iomem *r = AU1300_GPIC_ADDR;
+       unsigned long bit, irq = d->irq;
+
+       irq -= ALCHEMY_GPIC_INT_BASE;
+
+       gpic_pin_set_idlewake(irq, 1);
+
+       r += GPIC_GPIO_BANKOFF(irq);
+       bit = GPIC_GPIO_TO_BIT(irq);
+       __raw_writel(bit, r + AU1300_GPIC_IEN);
+       wmb();
+}
+
+static void au1300_gpic_maskack(struct irq_data *d)
+{
+       void __iomem *r = AU1300_GPIC_ADDR;
+       unsigned long bit, irq = d->irq;
+
+       irq -= ALCHEMY_GPIC_INT_BASE;
+       r += GPIC_GPIO_BANKOFF(irq);
+       bit = GPIC_GPIO_TO_BIT(irq);
+       __raw_writel(bit, r + AU1300_GPIC_IPEND);       /* ack */
+       __raw_writel(bit, r + AU1300_GPIC_IDIS);        /* mask */
+       wmb();
+
+       gpic_pin_set_idlewake(irq, 0);
+}
+
+static void au1300_gpic_ack(struct irq_data *d)
+{
+       void __iomem *r = AU1300_GPIC_ADDR;
+       unsigned long bit, irq = d->irq;
+
+       irq -= ALCHEMY_GPIC_INT_BASE;
+       r += GPIC_GPIO_BANKOFF(irq);
+       bit = GPIC_GPIO_TO_BIT(irq);
+       __raw_writel(bit, r + AU1300_GPIC_IPEND);       /* ack */
+       wmb();
+}
+
+static struct irq_chip au1300_gpic = {
+       .name           = "GPIOINT",
+       .irq_ack        = au1300_gpic_ack,
+       .irq_mask       = au1300_gpic_mask,
+       .irq_mask_ack   = au1300_gpic_maskack,
+       .irq_unmask     = au1300_gpic_unmask,
+       .irq_set_type   = au1300_gpic_settype,
+};
+
+static int au1300_gpic_settype(struct irq_data *d, unsigned int type)
+{
+       unsigned long s;
+       unsigned char *name = NULL;
+       irq_flow_handler_t hdl = NULL;
+
+       switch (type) {
+       case IRQ_TYPE_LEVEL_HIGH:
+               s = GPIC_CFG_IC_LEVEL_HIGH;
+               name = "high";
+               hdl = handle_level_irq;
+               break;
+       case IRQ_TYPE_LEVEL_LOW:
+               s = GPIC_CFG_IC_LEVEL_LOW;
+               name = "low";
+               hdl = handle_level_irq;
+               break;
+       case IRQ_TYPE_EDGE_RISING:
+               s = GPIC_CFG_IC_EDGE_RISE;
+               name = "posedge";
+               hdl = handle_edge_irq;
+               break;
+       case IRQ_TYPE_EDGE_FALLING:
+               s = GPIC_CFG_IC_EDGE_FALL;
+               name = "negedge";
+               hdl = handle_edge_irq;
+               break;
+       case IRQ_TYPE_EDGE_BOTH:
+               s = GPIC_CFG_IC_EDGE_BOTH;
+               name = "bothedge";
+               hdl = handle_edge_irq;
+               break;
+       case IRQ_TYPE_NONE:
+               s = GPIC_CFG_IC_OFF;
+               name = "disabled";
+               hdl = handle_level_irq;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       __irq_set_chip_handler_name_locked(d->irq, &au1300_gpic, hdl, name);
+
+       au1300_gpic_chgcfg(d->irq - ALCHEMY_GPIC_INT_BASE, GPIC_CFG_IC_MASK, s);
+
+       return 0;
+}
+
+/******************************************************************************/
 
 static inline void ic_init(void __iomem *base)
 {
@@ -521,13 +729,159 @@ static inline void ic_init(void __iomem *base)
        wmb();
 }
 
-static void __init au1000_init_irq(struct au1xxx_irqmap *map)
+static unsigned long alchemy_gpic_pmdata[ALCHEMY_GPIC_INT_NUM + 6];
+
+static inline void alchemy_ic_suspend_one(void __iomem *base, unsigned long *d)
+{
+       d[0] = __raw_readl(base + IC_CFG0RD);
+       d[1] = __raw_readl(base + IC_CFG1RD);
+       d[2] = __raw_readl(base + IC_CFG2RD);
+       d[3] = __raw_readl(base + IC_SRCRD);
+       d[4] = __raw_readl(base + IC_ASSIGNRD);
+       d[5] = __raw_readl(base + IC_WAKERD);
+       d[6] = __raw_readl(base + IC_MASKRD);
+       ic_init(base);          /* shut it up too while at it */
+}
+
+static inline void alchemy_ic_resume_one(void __iomem *base, unsigned long *d)
+{
+       ic_init(base);
+
+       __raw_writel(d[0], base + IC_CFG0SET);
+       __raw_writel(d[1], base + IC_CFG1SET);
+       __raw_writel(d[2], base + IC_CFG2SET);
+       __raw_writel(d[3], base + IC_SRCSET);
+       __raw_writel(d[4], base + IC_ASSIGNSET);
+       __raw_writel(d[5], base + IC_WAKESET);
+       wmb();
+
+       __raw_writel(d[6], base + IC_MASKSET);
+       wmb();
+}
+
+static int alchemy_ic_suspend(void)
+{
+       alchemy_ic_suspend_one((void __iomem *)KSEG1ADDR(AU1000_IC0_PHYS_ADDR),
+                              alchemy_gpic_pmdata);
+       alchemy_ic_suspend_one((void __iomem *)KSEG1ADDR(AU1000_IC1_PHYS_ADDR),
+                              &alchemy_gpic_pmdata[7]);
+       return 0;
+}
+
+static void alchemy_ic_resume(void)
+{
+       alchemy_ic_resume_one((void __iomem *)KSEG1ADDR(AU1000_IC1_PHYS_ADDR),
+                             &alchemy_gpic_pmdata[7]);
+       alchemy_ic_resume_one((void __iomem *)KSEG1ADDR(AU1000_IC0_PHYS_ADDR),
+                             alchemy_gpic_pmdata);
+}
+
+static int alchemy_gpic_suspend(void)
+{
+       void __iomem *base = (void __iomem *)KSEG1ADDR(AU1300_GPIC_PHYS_ADDR);
+       int i;
+
+       /* save 4 interrupt mask status registers */
+       alchemy_gpic_pmdata[0] = __raw_readl(base + AU1300_GPIC_IEN + 0x0);
+       alchemy_gpic_pmdata[1] = __raw_readl(base + AU1300_GPIC_IEN + 0x4);
+       alchemy_gpic_pmdata[2] = __raw_readl(base + AU1300_GPIC_IEN + 0x8);
+       alchemy_gpic_pmdata[3] = __raw_readl(base + AU1300_GPIC_IEN + 0xc);
+
+       /* save misc register(s) */
+       alchemy_gpic_pmdata[4] = __raw_readl(base + AU1300_GPIC_DMASEL);
+
+       /* molto silenzioso */
+       __raw_writel(~0UL, base + AU1300_GPIC_IDIS + 0x0);
+       __raw_writel(~0UL, base + AU1300_GPIC_IDIS + 0x4);
+       __raw_writel(~0UL, base + AU1300_GPIC_IDIS + 0x8);
+       __raw_writel(~0UL, base + AU1300_GPIC_IDIS + 0xc);
+       wmb();
+
+       /* save pin/int-type configuration */
+       base += AU1300_GPIC_PINCFG;
+       for (i = 0; i < ALCHEMY_GPIC_INT_NUM; i++)
+               alchemy_gpic_pmdata[i + 5] = __raw_readl(base + (i << 2));
+
+       wmb();
+
+       return 0;
+}
+
+static void alchemy_gpic_resume(void)
+{
+       void __iomem *base = (void __iomem *)KSEG1ADDR(AU1300_GPIC_PHYS_ADDR);
+       int i;
+
+       /* disable all first */
+       __raw_writel(~0UL, base + AU1300_GPIC_IDIS + 0x0);
+       __raw_writel(~0UL, base + AU1300_GPIC_IDIS + 0x4);
+       __raw_writel(~0UL, base + AU1300_GPIC_IDIS + 0x8);
+       __raw_writel(~0UL, base + AU1300_GPIC_IDIS + 0xc);
+       wmb();
+
+       /* restore pin/int-type configurations */
+       base += AU1300_GPIC_PINCFG;
+       for (i = 0; i < ALCHEMY_GPIC_INT_NUM; i++)
+               __raw_writel(alchemy_gpic_pmdata[i + 5], base + (i << 2));
+       wmb();
+
+       /* restore misc register(s) */
+       base = (void __iomem *)KSEG1ADDR(AU1300_GPIC_PHYS_ADDR);
+       __raw_writel(alchemy_gpic_pmdata[4], base + AU1300_GPIC_DMASEL);
+       wmb();
+
+       /* finally restore masks */
+       __raw_writel(alchemy_gpic_pmdata[0], base + AU1300_GPIC_IEN + 0x0);
+       __raw_writel(alchemy_gpic_pmdata[1], base + AU1300_GPIC_IEN + 0x4);
+       __raw_writel(alchemy_gpic_pmdata[2], base + AU1300_GPIC_IEN + 0x8);
+       __raw_writel(alchemy_gpic_pmdata[3], base + AU1300_GPIC_IEN + 0xc);
+       wmb();
+}
+
+static struct syscore_ops alchemy_ic_pmops = {
+       .suspend        = alchemy_ic_suspend,
+       .resume         = alchemy_ic_resume,
+};
+
+static struct syscore_ops alchemy_gpic_pmops = {
+       .suspend        = alchemy_gpic_suspend,
+       .resume         = alchemy_gpic_resume,
+};
+
+/******************************************************************************/
+
+/* create chained handlers for the 4 IC requests to the MIPS IRQ ctrl */
+#define DISP(name, base, addr)                                               \
+static void au1000_##name##_dispatch(unsigned int irq, struct irq_desc *d)    \
+{                                                                            \
+       unsigned long r = __raw_readl((void __iomem *)KSEG1ADDR(addr));       \
+       if (likely(r))                                                        \
+               generic_handle_irq(base + __ffs(r));                          \
+       else                                                                  \
+               spurious_interrupt();                                         \
+}
+
+DISP(ic0r0, AU1000_INTC0_INT_BASE, AU1000_IC0_PHYS_ADDR + IC_REQ0INT)
+DISP(ic0r1, AU1000_INTC0_INT_BASE, AU1000_IC0_PHYS_ADDR + IC_REQ1INT)
+DISP(ic1r0, AU1000_INTC1_INT_BASE, AU1000_IC1_PHYS_ADDR + IC_REQ0INT)
+DISP(ic1r1, AU1000_INTC1_INT_BASE, AU1000_IC1_PHYS_ADDR + IC_REQ1INT)
+
+static void alchemy_gpic_dispatch(unsigned int irq, struct irq_desc *d)
+{
+       int i = __raw_readl(AU1300_GPIC_ADDR + AU1300_GPIC_PRIENC);
+       generic_handle_irq(ALCHEMY_GPIC_INT_BASE + i);
+}
+
+/******************************************************************************/
+
+static void __init au1000_init_irq(struct alchemy_irqmap *map)
 {
        unsigned int bit, irq_nr;
        void __iomem *base;
 
        ic_init((void __iomem *)KSEG1ADDR(AU1000_IC0_PHYS_ADDR));
        ic_init((void __iomem *)KSEG1ADDR(AU1000_IC1_PHYS_ADDR));
+       register_syscore_ops(&alchemy_ic_pmops);
        mips_cpu_irq_init();
 
        /* register all 64 possible IC0+IC1 irq sources as type "none".
@@ -544,8 +898,8 @@ static void __init au1000_init_irq(struct au1xxx_irqmap *map)
        /*
         * Initialize IC0, which is fixed per processor.
         */
-       while (map->im_irq != -1) {
-               irq_nr = map->im_irq;
+       while (map->irq != -1) {
+               irq_nr = map->irq;
 
                if (irq_nr >= AU1000_INTC1_INT_BASE) {
                        bit = irq_nr - AU1000_INTC1_INT_BASE;
@@ -554,16 +908,61 @@ static void __init au1000_init_irq(struct au1xxx_irqmap *map)
                        bit = irq_nr - AU1000_INTC0_INT_BASE;
                        base = (void __iomem *)KSEG1ADDR(AU1000_IC0_PHYS_ADDR);
                }
-               if (map->im_request)
+               if (map->prio == 0)
                        __raw_writel(1 << bit, base + IC_ASSIGNSET);
 
-               au1x_ic_settype(irq_get_irq_data(irq_nr), map->im_type);
+               au1x_ic_settype(irq_get_irq_data(irq_nr), map->type);
                ++map;
        }
 
-       set_c0_status(IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | IE_IRQ3);
+       irq_set_chained_handler(MIPS_CPU_IRQ_BASE + 2, au1000_ic0r0_dispatch);
+       irq_set_chained_handler(MIPS_CPU_IRQ_BASE + 3, au1000_ic0r1_dispatch);
+       irq_set_chained_handler(MIPS_CPU_IRQ_BASE + 4, au1000_ic1r0_dispatch);
+       irq_set_chained_handler(MIPS_CPU_IRQ_BASE + 5, au1000_ic1r1_dispatch);
+}
+
+static void __init alchemy_gpic_init_irq(const struct alchemy_irqmap *dints)
+{
+       int i;
+       void __iomem *bank_base;
+
+       register_syscore_ops(&alchemy_gpic_pmops);
+       mips_cpu_irq_init();
+
+       /* disable & ack all possible interrupt sources */
+       for (i = 0; i < 4; i++) {
+               bank_base = AU1300_GPIC_ADDR + (i * 4);
+               __raw_writel(~0UL, bank_base + AU1300_GPIC_IDIS);
+               wmb();
+               __raw_writel(~0UL, bank_base + AU1300_GPIC_IPEND);
+               wmb();
+       }
+
+       /* register an irq_chip for them, with 2nd highest priority */
+       for (i = ALCHEMY_GPIC_INT_BASE; i <= ALCHEMY_GPIC_INT_LAST; i++) {
+               au1300_set_irq_priority(i, 1);
+               au1300_gpic_settype(irq_get_irq_data(i), IRQ_TYPE_NONE);
+       }
+
+       /* setup known on-chip sources */
+       while ((i = dints->irq) != -1) {
+               au1300_gpic_settype(irq_get_irq_data(i), dints->type);
+               au1300_set_irq_priority(i, dints->prio);
+
+               if (dints->internal)
+                       au1300_pinfunc_to_dev(i - ALCHEMY_GPIC_INT_BASE);
+
+               dints++;
+       }
+
+       irq_set_chained_handler(MIPS_CPU_IRQ_BASE + 2, alchemy_gpic_dispatch);
+       irq_set_chained_handler(MIPS_CPU_IRQ_BASE + 3, alchemy_gpic_dispatch);
+       irq_set_chained_handler(MIPS_CPU_IRQ_BASE + 4, alchemy_gpic_dispatch);
+       irq_set_chained_handler(MIPS_CPU_IRQ_BASE + 5, alchemy_gpic_dispatch);
 }
 
+/******************************************************************************/
+
 void __init arch_init_irq(void)
 {
        switch (alchemy_get_cputype()) {
@@ -582,65 +981,17 @@ void __init arch_init_irq(void)
        case ALCHEMY_CPU_AU1200:
                au1000_init_irq(au1200_irqmap);
                break;
+       case ALCHEMY_CPU_AU1300:
+               alchemy_gpic_init_irq(au1300_irqmap);
+               break;
+       default:
+               pr_err("unknown Alchemy IRQ core\n");
+               break;
        }
 }
 
-
-static unsigned long alchemy_ic_pmdata[7 * 2];
-
-static inline void alchemy_ic_suspend_one(void __iomem *base, unsigned long *d)
-{
-       d[0] = __raw_readl(base + IC_CFG0RD);
-       d[1] = __raw_readl(base + IC_CFG1RD);
-       d[2] = __raw_readl(base + IC_CFG2RD);
-       d[3] = __raw_readl(base + IC_SRCRD);
-       d[4] = __raw_readl(base + IC_ASSIGNRD);
-       d[5] = __raw_readl(base + IC_WAKERD);
-       d[6] = __raw_readl(base + IC_MASKRD);
-       ic_init(base);          /* shut it up too while at it */
-}
-
-static inline void alchemy_ic_resume_one(void __iomem *base, unsigned long *d)
-{
-       ic_init(base);
-
-       __raw_writel(d[0], base + IC_CFG0SET);
-       __raw_writel(d[1], base + IC_CFG1SET);
-       __raw_writel(d[2], base + IC_CFG2SET);
-       __raw_writel(d[3], base + IC_SRCSET);
-       __raw_writel(d[4], base + IC_ASSIGNSET);
-       __raw_writel(d[5], base + IC_WAKESET);
-       wmb();
-
-       __raw_writel(d[6], base + IC_MASKSET);
-       wmb();
-}
-
-static int alchemy_ic_suspend(void)
-{
-       alchemy_ic_suspend_one((void __iomem *)KSEG1ADDR(AU1000_IC0_PHYS_ADDR),
-                              alchemy_ic_pmdata);
-       alchemy_ic_suspend_one((void __iomem *)KSEG1ADDR(AU1000_IC1_PHYS_ADDR),
-                              &alchemy_ic_pmdata[7]);
-       return 0;
-}
-
-static void alchemy_ic_resume(void)
-{
-       alchemy_ic_resume_one((void __iomem *)KSEG1ADDR(AU1000_IC1_PHYS_ADDR),
-                             &alchemy_ic_pmdata[7]);
-       alchemy_ic_resume_one((void __iomem *)KSEG1ADDR(AU1000_IC0_PHYS_ADDR),
-                             alchemy_ic_pmdata);
-}
-
-static struct syscore_ops alchemy_ic_syscore_ops = {
-       .suspend        = alchemy_ic_suspend,
-       .resume         = alchemy_ic_resume,
-};
-
-static int __init alchemy_ic_pm_init(void)
+asmlinkage void plat_irq_dispatch(void)
 {
-       register_syscore_ops(&alchemy_ic_syscore_ops);
-       return 0;
+       unsigned long r = (read_c0_status() & read_c0_cause()) >> 8;
+       do_IRQ(MIPS_CPU_IRQ_BASE + __ffs(r & 0xff));
 }
-device_initcall(alchemy_ic_pm_init);
index c8e5d72a582684ff79e022a0c0b9b3313a700034..95cb9113b12c8302ee9ea60e56e86af8c36da067 100644 (file)
@@ -82,6 +82,12 @@ static struct plat_serial8250_port au1x00_uart_data[][4] __initdata = {
                PORT(AU1000_UART0_PHYS_ADDR, AU1200_UART0_INT),
                PORT(AU1000_UART1_PHYS_ADDR, AU1200_UART1_INT),
        },
+       [ALCHEMY_CPU_AU1300] = {
+               PORT(AU1300_UART0_PHYS_ADDR, AU1300_UART0_INT),
+               PORT(AU1300_UART1_PHYS_ADDR, AU1300_UART1_INT),
+               PORT(AU1300_UART2_PHYS_ADDR, AU1300_UART2_INT),
+               PORT(AU1300_UART3_PHYS_ADDR, AU1300_UART3_INT),
+       },
 };
 
 static struct platform_device au1xx0_uart_device = {
@@ -122,10 +128,12 @@ static unsigned long alchemy_ohci_data[][2] __initdata = {
        [ALCHEMY_CPU_AU1100] = { AU1000_USB_OHCI_PHYS_ADDR, AU1100_USB_HOST_INT },
        [ALCHEMY_CPU_AU1550] = { AU1550_USB_OHCI_PHYS_ADDR, AU1550_USB_HOST_INT },
        [ALCHEMY_CPU_AU1200] = { AU1200_USB_OHCI_PHYS_ADDR, AU1200_USB_INT },
+       [ALCHEMY_CPU_AU1300] = { AU1300_USB_OHCI0_PHYS_ADDR, AU1300_USB_INT },
 };
 
 static unsigned long alchemy_ehci_data[][2] __initdata = {
        [ALCHEMY_CPU_AU1200] = { AU1200_USB_EHCI_PHYS_ADDR, AU1200_USB_INT },
+       [ALCHEMY_CPU_AU1300] = { AU1300_USB_EHCI_PHYS_ADDR, AU1300_USB_INT },
 };
 
 static int __init _new_usbres(struct resource **r, struct platform_device **d)
@@ -169,8 +177,8 @@ static void __init alchemy_setup_usb(int ctype)
                printk(KERN_INFO "Alchemy USB: cannot add OHCI0\n");
 
 
-       /* setup EHCI0: Au1200 */
-       if (ctype == ALCHEMY_CPU_AU1200) {
+       /* setup EHCI0: Au1200/Au1300 */
+       if ((ctype == ALCHEMY_CPU_AU1200) || (ctype == ALCHEMY_CPU_AU1300)) {
                if (_new_usbres(&res, &pdev))
                        return;
 
@@ -187,6 +195,25 @@ static void __init alchemy_setup_usb(int ctype)
                if (platform_device_register(pdev))
                        printk(KERN_INFO "Alchemy USB: cannot add EHCI0\n");
        }
+
+       /* Au1300: OHCI1 */
+       if (ctype == ALCHEMY_CPU_AU1300) {
+               if (_new_usbres(&res, &pdev))
+                       return;
+
+               res[0].start = AU1300_USB_OHCI1_PHYS_ADDR;
+               res[0].end = res[0].start + 0x100 - 1;
+               res[0].flags = IORESOURCE_MEM;
+               res[1].start = AU1300_USB_INT;
+               res[1].end = res[1].start;
+               res[1].flags = IORESOURCE_IRQ;
+               pdev->name = "au1xxx-ohci";
+               pdev->id = 1;
+               pdev->dev.dma_mask = &alchemy_ohci_dmamask;
+
+               if (platform_device_register(pdev))
+                       printk(KERN_INFO "Alchemy USB: cannot add OHCI1\n");
+       }
 }
 
 /* Macro to help defining the Ethernet MAC resources */
index bdd6651e9a4f3d4f0f7fc59f5f38be6e79b1a738..0c7fce2a3c12f0e6d4f7bea9cedf1a17fe0ea271 100644 (file)
@@ -126,6 +126,9 @@ void au_sleep(void)
        case ALCHEMY_CPU_AU1200:
                alchemy_sleep_au1550();
                break;
+       case ALCHEMY_CPU_AU1300:
+               alchemy_sleep_au1300();
+               break;
        }
 
        restore_core_regs();
index 77f3c743b716428c106066042c4f926ef900f7af..c7bcc7e5c822bb571164e27fcfa284838cc92c38 100644 (file)
@@ -153,6 +153,79 @@ LEAF(alchemy_sleep_au1550)
 
 END(alchemy_sleep_au1550)
 
+/* sleepcode for Au1300 memory controller type */
+LEAF(alchemy_sleep_au1300)
+
+       SETUP_SLEEP
+
+       /* cache following instructions, as memory gets put to sleep */
+       la      t0, 2f
+       la      t1, 4f
+       subu    t2, t1, t0
+
+       .set    mips3
+
+1:     cache   0x14, 0(t0)
+       subu    t2, t2, 32
+       bgez    t2, 1b
+        addu   t0, t0, 32
+
+       .set    mips0
+
+2:     lui     a0, 0xb400              /* mem_xxx */
+
+       /* disable all ports in mem_sdportcfga */
+       sw      zero, 0x868(a0)         /* mem_sdportcfga */
+       sync
+
+       /* disable ODT */
+       li      t0, 0x03010000
+       sw      t0, 0x08d8(a0)          /* mem_sdcmd0 */
+       sw      t0, 0x08dc(a0)          /* mem_sdcmd1 */
+       sync
+
+       /* precharge */
+       li      t0, 0x23000400
+       sw      t0, 0x08dc(a0)          /* mem_sdcmd1 */
+       sw      t0, 0x08d8(a0)          /* mem_sdcmd0 */
+       sync
+
+       /* auto refresh */
+       sw      zero, 0x08c8(a0)        /* mem_sdautoref */
+       sync
+
+       /* block access to the DDR */
+       lw      t0, 0x0848(a0)          /* mem_sdconfigb */
+       li      t1, (1 << 7 | 0x3F)
+       or      t0, t0, t1
+       sw      t0, 0x0848(a0)          /* mem_sdconfigb */
+       sync
+
+       /* issue the Self Refresh command */
+       li      t0, 0x10000000
+       sw      t0, 0x08dc(a0)          /* mem_sdcmd1 */
+       sw      t0, 0x08d8(a0)          /* mem_sdcmd0 */
+       sync
+
+       /* wait for sdram to enter self-refresh mode */
+       lui     t0, 0x0300
+3:     lw      t1, 0x0850(a0)          /* mem_sdstat */
+       and     t2, t1, t0
+       bne     t2, t0, 3b
+        nop
+
+       /* disable SDRAM clocks */
+       li      t0, ~(3<<28)
+       lw      t1, 0x0840(a0)          /* mem_sdconfiga */
+       and     t1, t1, t0              /* clear CE[1:0] */
+       sw      t1, 0x0840(a0)          /* mem_sdconfiga */
+       sync
+
+       DO_SLEEP
+4:
+
+END(alchemy_sleep_au1300)
+
 
        /* This is where we return upon wakeup.
         * Reload all of the registers and return.
index 146a5fa803609c7ec1d85890025b88d0c23b0a52..7da4d0081487b73f341cd4a51f6ef5efe33141ae 100644 (file)
@@ -178,6 +178,7 @@ static int alchemy_m2inttab[] __initdata = {
        AU1100_RTC_MATCH2_INT,
        AU1550_RTC_MATCH2_INT,
        AU1200_RTC_MATCH2_INT,
+       AU1300_RTC_MATCH2_INT,
 };
 
 void __init plat_time_init(void)
diff --git a/arch/mips/alchemy/common/vss.c b/arch/mips/alchemy/common/vss.c
new file mode 100644 (file)
index 0000000..d23b144
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Au1300 media block power gating (VSS)
+ *
+ * This is a stop-gap solution until I have the clock framework integration
+ * ready. This stuff here really must be handled transparently when clocks
+ * for various media blocks are enabled/disabled.
+ */
+
+#include <linux/module.h>
+#include <linux/spinlock.h>
+#include <asm/mach-au1x00/au1000.h>
+
+#define VSS_GATE       0x00    /* gate wait timers */
+#define VSS_CLKRST     0x04    /* clock/block control */
+#define VSS_FTR                0x08    /* footers */
+
+#define VSS_ADDR(blk)  (KSEG1ADDR(AU1300_VSS_PHYS_ADDR) + (blk * 0x0c))
+
+static DEFINE_SPINLOCK(au1300_vss_lock);
+
+/* enable a block as outlined in the databook */
+static inline void __enable_block(int block)
+{
+       void __iomem *base = (void __iomem *)VSS_ADDR(block);
+
+       __raw_writel(3, base + VSS_CLKRST);     /* enable clock, assert reset */
+       wmb();
+
+       __raw_writel(0x01fffffe, base + VSS_GATE); /* maximum setup time */
+       wmb();
+
+       /* enable footers in sequence */
+       __raw_writel(0x01, base + VSS_FTR);
+       wmb();
+       __raw_writel(0x03, base + VSS_FTR);
+       wmb();
+       __raw_writel(0x07, base + VSS_FTR);
+       wmb();
+       __raw_writel(0x0f, base + VSS_FTR);
+       wmb();
+
+       __raw_writel(0x01ffffff, base + VSS_GATE); /* start FSM too */
+       wmb();
+
+       __raw_writel(2, base + VSS_CLKRST);     /* deassert reset */
+       wmb();
+
+       __raw_writel(0x1f, base + VSS_FTR);     /* enable isolation cells */
+       wmb();
+}
+
+/* disable a block as outlined in the databook */
+static inline void __disable_block(int block)
+{
+       void __iomem *base = (void __iomem *)VSS_ADDR(block);
+
+       __raw_writel(0x0f, base + VSS_FTR);     /* disable isolation cells */
+       wmb();
+       __raw_writel(0, base + VSS_GATE);       /* disable FSM */
+       wmb();
+       __raw_writel(3, base + VSS_CLKRST);     /* assert reset */
+       wmb();
+       __raw_writel(1, base + VSS_CLKRST);     /* disable clock */
+       wmb();
+       __raw_writel(0, base + VSS_FTR);        /* disable all footers */
+       wmb();
+}
+
+void au1300_vss_block_control(int block, int enable)
+{
+       unsigned long flags;
+
+       if (alchemy_get_cputype() != ALCHEMY_CPU_AU1300)
+               return;
+
+       /* only one block at a time */
+       spin_lock_irqsave(&au1300_vss_lock, flags);
+       if (enable)
+               __enable_block(block);
+       else
+               __disable_block(block);
+       spin_unlock_irqrestore(&au1300_vss_lock, flags);
+}
+EXPORT_SYMBOL_GPL(au1300_vss_block_control);
index 826449c817c3acef53919a17b4d73b60e449f8d3..3c37fb3033640e05eb39fa21496a938634e2c38c 100644 (file)
@@ -4,15 +4,10 @@
 
 obj-y += prom.o bcsr.o platform.o
 obj-$(CONFIG_PM)               += pm.o
-obj-$(CONFIG_MIPS_PB1000)      += pb1000/
-obj-$(CONFIG_MIPS_PB1100)      += pb1100/
-obj-$(CONFIG_MIPS_PB1200)      += pb1200/
-obj-$(CONFIG_MIPS_PB1500)      += pb1500/
-obj-$(CONFIG_MIPS_PB1550)      += pb1550/
-obj-$(CONFIG_MIPS_DB1000)      += db1x00/
-obj-$(CONFIG_MIPS_DB1100)      += db1x00/
-obj-$(CONFIG_MIPS_DB1200)      += db1200/
-obj-$(CONFIG_MIPS_DB1500)      += db1x00/
-obj-$(CONFIG_MIPS_DB1550)      += db1x00/
-obj-$(CONFIG_MIPS_BOSPORUS)    += db1x00/
-obj-$(CONFIG_MIPS_MIRAGE)      += db1x00/
+obj-$(CONFIG_MIPS_PB1100)      += pb1100.o
+obj-$(CONFIG_MIPS_PB1500)      += pb1500.o
+obj-$(CONFIG_MIPS_PB1550)      += pb1550.o
+obj-$(CONFIG_MIPS_DB1000)      += db1000.o
+obj-$(CONFIG_MIPS_DB1200)      += db1200.o
+obj-$(CONFIG_MIPS_DB1300)      += db1300.o
+obj-$(CONFIG_MIPS_DB1550)      += db1550.o
index 463d2c4d9441f9592ce6abf85d27b1e8c38694af..1e83ce2e1147fb4e71bc893630849ee147530198 100644 (file)
@@ -97,14 +97,9 @@ static void bcsr_csc_handler(unsigned int irq, struct irq_desc *d)
        enable_irq(irq);
 }
 
-/* NOTE: both the enable and mask bits must be cleared, otherwise the
- * CPLD generates tons of spurious interrupts (at least on my DB1200).
- *     -- mlau
- */
 static void bcsr_irq_mask(struct irq_data *d)
 {
        unsigned short v = 1 << (d->irq - bcsr_csc_base);
-       __raw_writew(v, bcsr_virt + BCSR_REG_INTCLR);
        __raw_writew(v, bcsr_virt + BCSR_REG_MASKCLR);
        wmb();
 }
@@ -112,7 +107,6 @@ static void bcsr_irq_mask(struct irq_data *d)
 static void bcsr_irq_maskack(struct irq_data *d)
 {
        unsigned short v = 1 << (d->irq - bcsr_csc_base);
-       __raw_writew(v, bcsr_virt + BCSR_REG_INTCLR);
        __raw_writew(v, bcsr_virt + BCSR_REG_MASKCLR);
        __raw_writew(v, bcsr_virt + BCSR_REG_INTSTAT);  /* ack */
        wmb();
@@ -121,7 +115,6 @@ static void bcsr_irq_maskack(struct irq_data *d)
 static void bcsr_irq_unmask(struct irq_data *d)
 {
        unsigned short v = 1 << (d->irq - bcsr_csc_base);
-       __raw_writew(v, bcsr_virt + BCSR_REG_INTSET);
        __raw_writew(v, bcsr_virt + BCSR_REG_MASKSET);
        wmb();
 }
@@ -137,9 +130,9 @@ void __init bcsr_init_irq(int csc_start, int csc_end, int hook_irq)
 {
        unsigned int irq;
 
-       /* mask & disable & ack all */
-       __raw_writew(0xffff, bcsr_virt + BCSR_REG_INTCLR);
+       /* mask & enable & ack all */
        __raw_writew(0xffff, bcsr_virt + BCSR_REG_MASKCLR);
+       __raw_writew(0xffff, bcsr_virt + BCSR_REG_INTSET);
        __raw_writew(0xffff, bcsr_virt + BCSR_REG_INTSTAT);
        wmb();
 
diff --git a/arch/mips/alchemy/devboards/db1000.c b/arch/mips/alchemy/devboards/db1000.c
new file mode 100644 (file)
index 0000000..1b81dbf
--- /dev/null
@@ -0,0 +1,565 @@
+/*
+ * DBAu1000/1500/1100 board support
+ *
+ * Copyright 2000, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include <linux/dma-mapping.h>
+#include <linux/gpio.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/leds.h>
+#include <linux/mmc/host.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/pm.h>
+#include <linux/spi/spi.h>
+#include <linux/spi/spi_gpio.h>
+#include <linux/spi/ads7846.h>
+#include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-au1x00/au1000_dma.h>
+#include <asm/mach-au1x00/au1100_mmc.h>
+#include <asm/mach-db1x00/bcsr.h>
+#include <asm/reboot.h>
+#include <prom.h>
+#include "platform.h"
+
+#define F_SWAPPED (bcsr_read(BCSR_STATUS) & BCSR_STATUS_DB1000_SWAPBOOT)
+
+struct pci_dev;
+
+static const char *board_type_str(void)
+{
+       switch (BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI))) {
+       case BCSR_WHOAMI_DB1000:
+               return "DB1000";
+       case BCSR_WHOAMI_DB1500:
+               return "DB1500";
+       case BCSR_WHOAMI_DB1100:
+               return "DB1100";
+       default:
+               return "(unknown)";
+       }
+}
+
+const char *get_system_type(void)
+{
+       return board_type_str();
+}
+
+void __init board_setup(void)
+{
+       /* initialize board register space */
+       bcsr_init(DB1000_BCSR_PHYS_ADDR,
+                 DB1000_BCSR_PHYS_ADDR + DB1000_BCSR_HEXLED_OFS);
+
+       printk(KERN_INFO "AMD Alchemy %s Board\n", board_type_str());
+}
+
+
+static int db1500_map_pci_irq(const struct pci_dev *d, u8 slot, u8 pin)
+{
+       if ((slot < 12) || (slot > 13) || pin == 0)
+               return -1;
+       if (slot == 12)
+               return (pin == 1) ? AU1500_PCI_INTA : 0xff;
+       if (slot == 13) {
+               switch (pin) {
+               case 1: return AU1500_PCI_INTA;
+               case 2: return AU1500_PCI_INTB;
+               case 3: return AU1500_PCI_INTC;
+               case 4: return AU1500_PCI_INTD;
+               }
+       }
+       return -1;
+}
+
+static struct resource alchemy_pci_host_res[] = {
+       [0] = {
+               .start  = AU1500_PCI_PHYS_ADDR,
+               .end    = AU1500_PCI_PHYS_ADDR + 0xfff,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct alchemy_pci_platdata db1500_pci_pd = {
+       .board_map_irq  = db1500_map_pci_irq,
+};
+
+static struct platform_device db1500_pci_host_dev = {
+       .dev.platform_data = &db1500_pci_pd,
+       .name           = "alchemy-pci",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(alchemy_pci_host_res),
+       .resource       = alchemy_pci_host_res,
+};
+
+static int __init db1500_pci_init(void)
+{
+       if (BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI)) == BCSR_WHOAMI_DB1500)
+               return platform_device_register(&db1500_pci_host_dev);
+       return 0;
+}
+/* must be arch_initcall; MIPS PCI scans busses in a subsys_initcall */
+arch_initcall(db1500_pci_init);
+
+
+static struct resource au1100_lcd_resources[] = {
+       [0] = {
+               .start  = AU1100_LCD_PHYS_ADDR,
+               .end    = AU1100_LCD_PHYS_ADDR + 0x800 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1100_LCD_INT,
+               .end    = AU1100_LCD_INT,
+               .flags  = IORESOURCE_IRQ,
+       }
+};
+
+static u64 au1100_lcd_dmamask = DMA_BIT_MASK(32);
+
+static struct platform_device au1100_lcd_device = {
+       .name           = "au1100-lcd",
+       .id             = 0,
+       .dev = {
+               .dma_mask               = &au1100_lcd_dmamask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+       },
+       .num_resources  = ARRAY_SIZE(au1100_lcd_resources),
+       .resource       = au1100_lcd_resources,
+};
+
+static struct resource alchemy_ac97c_res[] = {
+       [0] = {
+               .start  = AU1000_AC97_PHYS_ADDR,
+               .end    = AU1000_AC97_PHYS_ADDR + 0xfff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = DMA_ID_AC97C_TX,
+               .end    = DMA_ID_AC97C_TX,
+               .flags  = IORESOURCE_DMA,
+       },
+       [2] = {
+               .start  = DMA_ID_AC97C_RX,
+               .end    = DMA_ID_AC97C_RX,
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+static struct platform_device alchemy_ac97c_dev = {
+       .name           = "alchemy-ac97c",
+       .id             = -1,
+       .resource       = alchemy_ac97c_res,
+       .num_resources  = ARRAY_SIZE(alchemy_ac97c_res),
+};
+
+static struct platform_device alchemy_ac97c_dma_dev = {
+       .name           = "alchemy-pcm-dma",
+       .id             = 0,
+};
+
+static struct platform_device db1x00_codec_dev = {
+       .name           = "ac97-codec",
+       .id             = -1,
+};
+
+static struct platform_device db1x00_audio_dev = {
+       .name           = "db1000-audio",
+};
+
+/******************************************************************************/
+
+static irqreturn_t db1100_mmc_cd(int irq, void *ptr)
+{
+       void (*mmc_cd)(struct mmc_host *, unsigned long);
+       /* link against CONFIG_MMC=m */
+       mmc_cd = symbol_get(mmc_detect_change);
+       mmc_cd(ptr, msecs_to_jiffies(500));
+       symbol_put(mmc_detect_change);
+
+       return IRQ_HANDLED;
+}
+
+static int db1100_mmc_cd_setup(void *mmc_host, int en)
+{
+       int ret = 0;
+
+       if (en) {
+               irq_set_irq_type(AU1100_GPIO19_INT, IRQ_TYPE_EDGE_BOTH);
+               ret = request_irq(AU1100_GPIO19_INT, db1100_mmc_cd, 0,
+                                 "sd0_cd", mmc_host);
+       } else
+               free_irq(AU1100_GPIO19_INT, mmc_host);
+       return ret;
+}
+
+static int db1100_mmc1_cd_setup(void *mmc_host, int en)
+{
+       int ret = 0;
+
+       if (en) {
+               irq_set_irq_type(AU1100_GPIO20_INT, IRQ_TYPE_EDGE_BOTH);
+               ret = request_irq(AU1100_GPIO20_INT, db1100_mmc_cd, 0,
+                                 "sd1_cd", mmc_host);
+       } else
+               free_irq(AU1100_GPIO20_INT, mmc_host);
+       return ret;
+}
+
+static int db1100_mmc_card_readonly(void *mmc_host)
+{
+       /* testing suggests that this bit is inverted */
+       return (bcsr_read(BCSR_STATUS) & BCSR_STATUS_SD0WP) ? 0 : 1;
+}
+
+static int db1100_mmc_card_inserted(void *mmc_host)
+{
+       return !alchemy_gpio_get_value(19);
+}
+
+static void db1100_mmc_set_power(void *mmc_host, int state)
+{
+       if (state) {
+               bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_SD0PWR);
+               msleep(400);    /* stabilization time */
+       } else
+               bcsr_mod(BCSR_BOARD, BCSR_BOARD_SD0PWR, 0);
+}
+
+static void db1100_mmcled_set(struct led_classdev *led, enum led_brightness b)
+{
+       if (b != LED_OFF)
+               bcsr_mod(BCSR_LEDS, BCSR_LEDS_LED0, 0);
+       else
+               bcsr_mod(BCSR_LEDS, 0, BCSR_LEDS_LED0);
+}
+
+static struct led_classdev db1100_mmc_led = {
+       .brightness_set = db1100_mmcled_set,
+};
+
+static int db1100_mmc1_card_readonly(void *mmc_host)
+{
+       return (bcsr_read(BCSR_BOARD) & BCSR_BOARD_SD1WP) ? 1 : 0;
+}
+
+static int db1100_mmc1_card_inserted(void *mmc_host)
+{
+       return !alchemy_gpio_get_value(20);
+}
+
+static void db1100_mmc1_set_power(void *mmc_host, int state)
+{
+       if (state) {
+               bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_SD1PWR);
+               msleep(400);    /* stabilization time */
+       } else
+               bcsr_mod(BCSR_BOARD, BCSR_BOARD_SD1PWR, 0);
+}
+
+static void db1100_mmc1led_set(struct led_classdev *led, enum led_brightness b)
+{
+       if (b != LED_OFF)
+               bcsr_mod(BCSR_LEDS, BCSR_LEDS_LED1, 0);
+       else
+               bcsr_mod(BCSR_LEDS, 0, BCSR_LEDS_LED1);
+}
+
+static struct led_classdev db1100_mmc1_led = {
+       .brightness_set = db1100_mmc1led_set,
+};
+
+static struct au1xmmc_platform_data db1100_mmc_platdata[2] = {
+       [0] = {
+               .cd_setup       = db1100_mmc_cd_setup,
+               .set_power      = db1100_mmc_set_power,
+               .card_inserted  = db1100_mmc_card_inserted,
+               .card_readonly  = db1100_mmc_card_readonly,
+               .led            = &db1100_mmc_led,
+       },
+       [1] = {
+               .cd_setup       = db1100_mmc1_cd_setup,
+               .set_power      = db1100_mmc1_set_power,
+               .card_inserted  = db1100_mmc1_card_inserted,
+               .card_readonly  = db1100_mmc1_card_readonly,
+               .led            = &db1100_mmc1_led,
+       },
+};
+
+static struct resource au1100_mmc0_resources[] = {
+       [0] = {
+               .start  = AU1100_SD0_PHYS_ADDR,
+               .end    = AU1100_SD0_PHYS_ADDR + 0xfff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1100_SD_INT,
+               .end    = AU1100_SD_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = DMA_ID_SD0_TX,
+               .end    = DMA_ID_SD0_TX,
+               .flags  = IORESOURCE_DMA,
+       },
+       [3] = {
+               .start  = DMA_ID_SD0_RX,
+               .end    = DMA_ID_SD0_RX,
+               .flags  = IORESOURCE_DMA,
+       }
+};
+
+static u64 au1xxx_mmc_dmamask =  DMA_BIT_MASK(32);
+
+static struct platform_device db1100_mmc0_dev = {
+       .name           = "au1xxx-mmc",
+       .id             = 0,
+       .dev = {
+               .dma_mask               = &au1xxx_mmc_dmamask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+               .platform_data          = &db1100_mmc_platdata[0],
+       },
+       .num_resources  = ARRAY_SIZE(au1100_mmc0_resources),
+       .resource       = au1100_mmc0_resources,
+};
+
+static struct resource au1100_mmc1_res[] = {
+       [0] = {
+               .start  = AU1100_SD1_PHYS_ADDR,
+               .end    = AU1100_SD1_PHYS_ADDR + 0xfff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1100_SD_INT,
+               .end    = AU1100_SD_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = DMA_ID_SD1_TX,
+               .end    = DMA_ID_SD1_TX,
+               .flags  = IORESOURCE_DMA,
+       },
+       [3] = {
+               .start  = DMA_ID_SD1_RX,
+               .end    = DMA_ID_SD1_RX,
+               .flags  = IORESOURCE_DMA,
+       }
+};
+
+static struct platform_device db1100_mmc1_dev = {
+       .name           = "au1xxx-mmc",
+       .id             = 1,
+       .dev = {
+               .dma_mask               = &au1xxx_mmc_dmamask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+               .platform_data          = &db1100_mmc_platdata[1],
+       },
+       .num_resources  = ARRAY_SIZE(au1100_mmc1_res),
+       .resource       = au1100_mmc1_res,
+};
+
+/******************************************************************************/
+
+static void db1000_irda_set_phy_mode(int mode)
+{
+       unsigned short mask = BCSR_RESETS_IRDA_MODE_MASK | BCSR_RESETS_FIR_SEL;
+
+       switch (mode) {
+       case AU1000_IRDA_PHY_MODE_OFF:
+               bcsr_mod(BCSR_RESETS, mask, BCSR_RESETS_IRDA_MODE_OFF);
+               break;
+       case AU1000_IRDA_PHY_MODE_SIR:
+               bcsr_mod(BCSR_RESETS, mask, BCSR_RESETS_IRDA_MODE_FULL);
+               break;
+       case AU1000_IRDA_PHY_MODE_FIR:
+               bcsr_mod(BCSR_RESETS, mask, BCSR_RESETS_IRDA_MODE_FULL |
+                                           BCSR_RESETS_FIR_SEL);
+               break;
+       }
+}
+
+static struct au1k_irda_platform_data db1000_irda_platdata = {
+       .set_phy_mode   = db1000_irda_set_phy_mode,
+};
+
+static struct resource au1000_irda_res[] = {
+       [0] = {
+               .start  = AU1000_IRDA_PHYS_ADDR,
+               .end    = AU1000_IRDA_PHYS_ADDR + 0x0fff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1000_IRDA_TX_INT,
+               .end    = AU1000_IRDA_TX_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = AU1000_IRDA_RX_INT,
+               .end    = AU1000_IRDA_RX_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device db1000_irda_dev = {
+       .name   = "au1000-irda",
+       .id     = -1,
+       .dev    = {
+               .platform_data = &db1000_irda_platdata,
+       },
+       .resource       = au1000_irda_res,
+       .num_resources  = ARRAY_SIZE(au1000_irda_res),
+};
+
+/******************************************************************************/
+
+static struct ads7846_platform_data db1100_touch_pd = {
+       .model          = 7846,
+       .vref_mv        = 3300,
+       .gpio_pendown   = 21,
+};
+
+static struct spi_gpio_platform_data db1100_spictl_pd = {
+       .sck            = 209,
+       .mosi           = 208,
+       .miso           = 207,
+       .num_chipselect = 1,
+};
+
+static struct spi_board_info db1100_spi_info[] __initdata = {
+       [0] = {
+               .modalias        = "ads7846",
+               .max_speed_hz    = 3250000,
+               .bus_num         = 0,
+               .chip_select     = 0,
+               .mode            = 0,
+               .irq             = AU1100_GPIO21_INT,
+               .platform_data   = &db1100_touch_pd,
+               .controller_data = (void *)210, /* for spi_gpio: CS# GPIO210 */
+       },
+};
+
+static struct platform_device db1100_spi_dev = {
+       .name           = "spi_gpio",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &db1100_spictl_pd,
+       },
+};
+
+
+static struct platform_device *db1x00_devs[] = {
+       &db1x00_codec_dev,
+       &alchemy_ac97c_dma_dev,
+       &alchemy_ac97c_dev,
+       &db1x00_audio_dev,
+};
+
+static struct platform_device *db1000_devs[] = {
+       &db1000_irda_dev,
+};
+
+static struct platform_device *db1100_devs[] = {
+       &au1100_lcd_device,
+       &db1100_mmc0_dev,
+       &db1100_mmc1_dev,
+       &db1000_irda_dev,
+       &db1100_spi_dev,
+};
+
+static int __init db1000_dev_init(void)
+{
+       int board = BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI));
+       int c0, c1, d0, d1, s0, s1;
+       unsigned long pfc;
+
+       if (board == BCSR_WHOAMI_DB1500) {
+               c0 = AU1500_GPIO2_INT;
+               c1 = AU1500_GPIO5_INT;
+               d0 = AU1500_GPIO0_INT;
+               d1 = AU1500_GPIO3_INT;
+               s0 = AU1500_GPIO1_INT;
+               s1 = AU1500_GPIO4_INT;
+       } else if (board == BCSR_WHOAMI_DB1100) {
+               c0 = AU1100_GPIO2_INT;
+               c1 = AU1100_GPIO5_INT;
+               d0 = AU1100_GPIO0_INT;
+               d1 = AU1100_GPIO3_INT;
+               s0 = AU1100_GPIO1_INT;
+               s1 = AU1100_GPIO4_INT;
+
+               gpio_direction_input(19);       /* sd0 cd# */
+               gpio_direction_input(20);       /* sd1 cd# */
+               gpio_direction_input(21);       /* touch pendown# */
+               gpio_direction_input(207);      /* SPI MISO */
+               gpio_direction_output(208, 0);  /* SPI MOSI */
+               gpio_direction_output(209, 1);  /* SPI SCK */
+               gpio_direction_output(210, 1);  /* SPI CS# */
+
+               /* spi_gpio on SSI0 pins */
+               pfc = __raw_readl((void __iomem *)SYS_PINFUNC);
+               pfc |= (1 << 0);        /* SSI0 pins as GPIOs */
+               __raw_writel(pfc, (void __iomem *)SYS_PINFUNC);
+               wmb();
+
+               spi_register_board_info(db1100_spi_info,
+                                       ARRAY_SIZE(db1100_spi_info));
+
+               platform_add_devices(db1100_devs, ARRAY_SIZE(db1100_devs));
+       } else if (board == BCSR_WHOAMI_DB1000) {
+               c0 = AU1000_GPIO2_INT;
+               c1 = AU1000_GPIO5_INT;
+               d0 = AU1000_GPIO0_INT;
+               d1 = AU1000_GPIO3_INT;
+               s0 = AU1000_GPIO1_INT;
+               s1 = AU1000_GPIO4_INT;
+               platform_add_devices(db1000_devs, ARRAY_SIZE(db1000_devs));
+       } else
+               return 0; /* unknown board, no further dev setup to do */
+
+       irq_set_irq_type(d0, IRQ_TYPE_EDGE_BOTH);
+       irq_set_irq_type(d1, IRQ_TYPE_EDGE_BOTH);
+       irq_set_irq_type(c0, IRQ_TYPE_LEVEL_LOW);
+       irq_set_irq_type(c1, IRQ_TYPE_LEVEL_LOW);
+       irq_set_irq_type(s0, IRQ_TYPE_LEVEL_LOW);
+       irq_set_irq_type(s1, IRQ_TYPE_LEVEL_LOW);
+
+       db1x_register_pcmcia_socket(
+               AU1000_PCMCIA_ATTR_PHYS_ADDR,
+               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1,
+               AU1000_PCMCIA_MEM_PHYS_ADDR,
+               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x000400000 - 1,
+               AU1000_PCMCIA_IO_PHYS_ADDR,
+               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x000010000 - 1,
+               c0, d0, /*s0*/0, 0, 0);
+
+       db1x_register_pcmcia_socket(
+               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x004000000,
+               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x004400000 - 1,
+               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x004000000,
+               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x004400000 - 1,
+               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x004000000,
+               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x004010000 - 1,
+               c1, d1, /*s1*/0, 0, 1);
+
+       platform_add_devices(db1x00_devs, ARRAY_SIZE(db1x00_devs));
+       db1x_register_norflash(32 << 20, 4 /* 32bit */, F_SWAPPED);
+       return 0;
+}
+device_initcall(db1000_dev_init);
diff --git a/arch/mips/alchemy/devboards/db1200.c b/arch/mips/alchemy/devboards/db1200.c
new file mode 100644 (file)
index 0000000..a83302b
--- /dev/null
@@ -0,0 +1,927 @@
+/*
+ * DBAu1200/PBAu1200 board platform device registration
+ *
+ * Copyright (C) 2008-2011 Manuel Lauss
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include <linux/dma-mapping.h>
+#include <linux/gpio.h>
+#include <linux/i2c.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/leds.h>
+#include <linux/mmc/host.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/nand.h>
+#include <linux/mtd/partitions.h>
+#include <linux/platform_device.h>
+#include <linux/serial_8250.h>
+#include <linux/spi/spi.h>
+#include <linux/spi/flash.h>
+#include <linux/smc91x.h>
+#include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-au1x00/au1100_mmc.h>
+#include <asm/mach-au1x00/au1xxx_dbdma.h>
+#include <asm/mach-au1x00/au1200fb.h>
+#include <asm/mach-au1x00/au1550_spi.h>
+#include <asm/mach-db1x00/bcsr.h>
+#include <asm/mach-db1x00/db1200.h>
+
+#include "platform.h"
+
+static const char *board_type_str(void)
+{
+       switch (BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI))) {
+       case BCSR_WHOAMI_PB1200_DDR1:
+       case BCSR_WHOAMI_PB1200_DDR2:
+               return "PB1200";
+       case BCSR_WHOAMI_DB1200:
+               return "DB1200";
+       default:
+               return "(unknown)";
+       }
+}
+
+const char *get_system_type(void)
+{
+       return board_type_str();
+}
+
+static int __init detect_board(void)
+{
+       int bid;
+
+       /* try the DB1200 first */
+       bcsr_init(DB1200_BCSR_PHYS_ADDR,
+                 DB1200_BCSR_PHYS_ADDR + DB1200_BCSR_HEXLED_OFS);
+       if (BCSR_WHOAMI_DB1200 == BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI))) {
+               unsigned short t = bcsr_read(BCSR_HEXLEDS);
+               bcsr_write(BCSR_HEXLEDS, ~t);
+               if (bcsr_read(BCSR_HEXLEDS) != t) {
+                       bcsr_write(BCSR_HEXLEDS, t);
+                       return 0;
+               }
+       }
+
+       /* okay, try the PB1200 then */
+       bcsr_init(PB1200_BCSR_PHYS_ADDR,
+                 PB1200_BCSR_PHYS_ADDR + PB1200_BCSR_HEXLED_OFS);
+       bid = BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI));
+       if ((bid == BCSR_WHOAMI_PB1200_DDR1) ||
+           (bid == BCSR_WHOAMI_PB1200_DDR2)) {
+               unsigned short t = bcsr_read(BCSR_HEXLEDS);
+               bcsr_write(BCSR_HEXLEDS, ~t);
+               if (bcsr_read(BCSR_HEXLEDS) != t) {
+                       bcsr_write(BCSR_HEXLEDS, t);
+                       return 0;
+               }
+       }
+
+       return 1;       /* it's neither */
+}
+
+void __init board_setup(void)
+{
+       unsigned long freq0, clksrc, div, pfc;
+       unsigned short whoami;
+
+       if (detect_board()) {
+               printk(KERN_ERR "NOT running on a DB1200/PB1200 board!\n");
+               return;
+       }
+
+       whoami = bcsr_read(BCSR_WHOAMI);
+       printk(KERN_INFO "Alchemy/AMD/RMI %s Board, CPLD Rev %d"
+               "  Board-ID %d  Daughtercard ID %d\n", board_type_str(),
+               (whoami >> 4) & 0xf, (whoami >> 8) & 0xf, whoami & 0xf);
+
+       /* SMBus/SPI on PSC0, Audio on PSC1 */
+       pfc = __raw_readl((void __iomem *)SYS_PINFUNC);
+       pfc &= ~(SYS_PINFUNC_P0A | SYS_PINFUNC_P0B);
+       pfc &= ~(SYS_PINFUNC_P1A | SYS_PINFUNC_P1B | SYS_PINFUNC_FS3);
+       pfc |= SYS_PINFUNC_P1C; /* SPI is configured later */
+       __raw_writel(pfc, (void __iomem *)SYS_PINFUNC);
+       wmb();
+
+       /* Clock configurations: PSC0: ~50MHz via Clkgen0, derived from
+        * CPU clock; all other clock generators off/unused.
+        */
+       div = (get_au1x00_speed() + 25000000) / 50000000;
+       if (div & 1)
+               div++;
+       div = ((div >> 1) - 1) & 0xff;
+
+       freq0 = div << SYS_FC_FRDIV0_BIT;
+       __raw_writel(freq0, (void __iomem *)SYS_FREQCTRL0);
+       wmb();
+       freq0 |= SYS_FC_FE0;    /* enable F0 */
+       __raw_writel(freq0, (void __iomem *)SYS_FREQCTRL0);
+       wmb();
+
+       /* psc0_intclk comes 1:1 from F0 */
+       clksrc = SYS_CS_MUX_FQ0 << SYS_CS_ME0_BIT;
+       __raw_writel(clksrc, (void __iomem *)SYS_CLKSRC);
+       wmb();
+}
+
+/******************************************************************************/
+
+static struct mtd_partition db1200_spiflash_parts[] = {
+       {
+               .name   = "spi_flash",
+               .offset = 0,
+               .size   = MTDPART_SIZ_FULL,
+       },
+};
+
+static struct flash_platform_data db1200_spiflash_data = {
+       .name           = "s25fl001",
+       .parts          = db1200_spiflash_parts,
+       .nr_parts       = ARRAY_SIZE(db1200_spiflash_parts),
+       .type           = "m25p10",
+};
+
+static struct spi_board_info db1200_spi_devs[] __initdata = {
+       {
+               /* TI TMP121AIDBVR temp sensor */
+               .modalias       = "tmp121",
+               .max_speed_hz   = 2000000,
+               .bus_num        = 0,
+               .chip_select    = 0,
+               .mode           = 0,
+       },
+       {
+               /* Spansion S25FL001D0FMA SPI flash */
+               .modalias       = "m25p80",
+               .max_speed_hz   = 50000000,
+               .bus_num        = 0,
+               .chip_select    = 1,
+               .mode           = 0,
+               .platform_data  = &db1200_spiflash_data,
+       },
+};
+
+static struct i2c_board_info db1200_i2c_devs[] __initdata = {
+       { I2C_BOARD_INFO("24c04", 0x52),  }, /* AT24C04-10 I2C eeprom */
+       { I2C_BOARD_INFO("ne1619", 0x2d), }, /* adm1025-compat hwmon */
+       { I2C_BOARD_INFO("wm8731", 0x1b), }, /* I2S audio codec WM8731 */
+};
+
+/**********************************************************************/
+
+static void au1200_nand_cmd_ctrl(struct mtd_info *mtd, int cmd,
+                                unsigned int ctrl)
+{
+       struct nand_chip *this = mtd->priv;
+       unsigned long ioaddr = (unsigned long)this->IO_ADDR_W;
+
+       ioaddr &= 0xffffff00;
+
+       if (ctrl & NAND_CLE) {
+               ioaddr += MEM_STNAND_CMD;
+       } else if (ctrl & NAND_ALE) {
+               ioaddr += MEM_STNAND_ADDR;
+       } else {
+               /* assume we want to r/w real data  by default */
+               ioaddr += MEM_STNAND_DATA;
+       }
+       this->IO_ADDR_R = this->IO_ADDR_W = (void __iomem *)ioaddr;
+       if (cmd != NAND_CMD_NONE) {
+               __raw_writeb(cmd, this->IO_ADDR_W);
+               wmb();
+       }
+}
+
+static int au1200_nand_device_ready(struct mtd_info *mtd)
+{
+       return __raw_readl((void __iomem *)MEM_STSTAT) & 1;
+}
+
+static const char *db1200_part_probes[] = { "cmdlinepart", NULL };
+
+static struct mtd_partition db1200_nand_parts[] = {
+       {
+               .name   = "NAND FS 0",
+               .offset = 0,
+               .size   = 8 * 1024 * 1024,
+       },
+       {
+               .name   = "NAND FS 1",
+               .offset = MTDPART_OFS_APPEND,
+               .size   = MTDPART_SIZ_FULL
+       },
+};
+
+struct platform_nand_data db1200_nand_platdata = {
+       .chip = {
+               .nr_chips       = 1,
+               .chip_offset    = 0,
+               .nr_partitions  = ARRAY_SIZE(db1200_nand_parts),
+               .partitions     = db1200_nand_parts,
+               .chip_delay     = 20,
+               .part_probe_types = db1200_part_probes,
+       },
+       .ctrl = {
+               .dev_ready      = au1200_nand_device_ready,
+               .cmd_ctrl       = au1200_nand_cmd_ctrl,
+       },
+};
+
+static struct resource db1200_nand_res[] = {
+       [0] = {
+               .start  = DB1200_NAND_PHYS_ADDR,
+               .end    = DB1200_NAND_PHYS_ADDR + 0xff,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device db1200_nand_dev = {
+       .name           = "gen_nand",
+       .num_resources  = ARRAY_SIZE(db1200_nand_res),
+       .resource       = db1200_nand_res,
+       .id             = -1,
+       .dev            = {
+               .platform_data = &db1200_nand_platdata,
+       }
+};
+
+/**********************************************************************/
+
+static struct smc91x_platdata db1200_eth_data = {
+       .flags  = SMC91X_NOWAIT | SMC91X_USE_16BIT,
+       .leda   = RPC_LED_100_10,
+       .ledb   = RPC_LED_TX_RX,
+};
+
+static struct resource db1200_eth_res[] = {
+       [0] = {
+               .start  = DB1200_ETH_PHYS_ADDR,
+               .end    = DB1200_ETH_PHYS_ADDR + 0xf,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = DB1200_ETH_INT,
+               .end    = DB1200_ETH_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device db1200_eth_dev = {
+       .dev    = {
+               .platform_data  = &db1200_eth_data,
+       },
+       .name           = "smc91x",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(db1200_eth_res),
+       .resource       = db1200_eth_res,
+};
+
+/**********************************************************************/
+
+static struct resource db1200_ide_res[] = {
+       [0] = {
+               .start  = DB1200_IDE_PHYS_ADDR,
+               .end    = DB1200_IDE_PHYS_ADDR + DB1200_IDE_PHYS_LEN - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = DB1200_IDE_INT,
+               .end    = DB1200_IDE_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = AU1200_DSCR_CMD0_DMA_REQ1,
+               .end    = AU1200_DSCR_CMD0_DMA_REQ1,
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+static u64 au1200_ide_dmamask = DMA_BIT_MASK(32);
+
+static struct platform_device db1200_ide_dev = {
+       .name           = "au1200-ide",
+       .id             = 0,
+       .dev = {
+               .dma_mask               = &au1200_ide_dmamask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+       },
+       .num_resources  = ARRAY_SIZE(db1200_ide_res),
+       .resource       = db1200_ide_res,
+};
+
+/**********************************************************************/
+
+/* SD carddetects:  they're supposed to be edge-triggered, but ack
+ * doesn't seem to work (CPLD Rev 2).  Instead, the screaming one
+ * is disabled and its counterpart enabled.  The 500ms timeout is
+ * because the carddetect isn't debounced in hardware.
+ */
+static irqreturn_t db1200_mmc_cd(int irq, void *ptr)
+{
+       void(*mmc_cd)(struct mmc_host *, unsigned long);
+
+       if (irq == DB1200_SD0_INSERT_INT) {
+               disable_irq_nosync(DB1200_SD0_INSERT_INT);
+               enable_irq(DB1200_SD0_EJECT_INT);
+       } else {
+               disable_irq_nosync(DB1200_SD0_EJECT_INT);
+               enable_irq(DB1200_SD0_INSERT_INT);
+       }
+
+       /* link against CONFIG_MMC=m */
+       mmc_cd = symbol_get(mmc_detect_change);
+       if (mmc_cd) {
+               mmc_cd(ptr, msecs_to_jiffies(500));
+               symbol_put(mmc_detect_change);
+       }
+
+       return IRQ_HANDLED;
+}
+
+static int db1200_mmc_cd_setup(void *mmc_host, int en)
+{
+       int ret;
+
+       if (en) {
+               ret = request_irq(DB1200_SD0_INSERT_INT, db1200_mmc_cd,
+                                 0, "sd_insert", mmc_host);
+               if (ret)
+                       goto out;
+
+               ret = request_irq(DB1200_SD0_EJECT_INT, db1200_mmc_cd,
+                                 0, "sd_eject", mmc_host);
+               if (ret) {
+                       free_irq(DB1200_SD0_INSERT_INT, mmc_host);
+                       goto out;
+               }
+
+               if (bcsr_read(BCSR_SIGSTAT) & BCSR_INT_SD0INSERT)
+                       enable_irq(DB1200_SD0_EJECT_INT);
+               else
+                       enable_irq(DB1200_SD0_INSERT_INT);
+
+       } else {
+               free_irq(DB1200_SD0_INSERT_INT, mmc_host);
+               free_irq(DB1200_SD0_EJECT_INT, mmc_host);
+       }
+       ret = 0;
+out:
+       return ret;
+}
+
+static void db1200_mmc_set_power(void *mmc_host, int state)
+{
+       if (state) {
+               bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_SD0PWR);
+               msleep(400);    /* stabilization time */
+       } else
+               bcsr_mod(BCSR_BOARD, BCSR_BOARD_SD0PWR, 0);
+}
+
+static int db1200_mmc_card_readonly(void *mmc_host)
+{
+       return (bcsr_read(BCSR_STATUS) & BCSR_STATUS_SD0WP) ? 1 : 0;
+}
+
+static int db1200_mmc_card_inserted(void *mmc_host)
+{
+       return (bcsr_read(BCSR_SIGSTAT) & BCSR_INT_SD0INSERT) ? 1 : 0;
+}
+
+static void db1200_mmcled_set(struct led_classdev *led,
+                             enum led_brightness brightness)
+{
+       if (brightness != LED_OFF)
+               bcsr_mod(BCSR_LEDS, BCSR_LEDS_LED0, 0);
+       else
+               bcsr_mod(BCSR_LEDS, 0, BCSR_LEDS_LED0);
+}
+
+static struct led_classdev db1200_mmc_led = {
+       .brightness_set = db1200_mmcled_set,
+};
+
+/* -- */
+
+static irqreturn_t pb1200_mmc1_cd(int irq, void *ptr)
+{
+       void(*mmc_cd)(struct mmc_host *, unsigned long);
+
+       if (irq == PB1200_SD1_INSERT_INT) {
+               disable_irq_nosync(PB1200_SD1_INSERT_INT);
+               enable_irq(PB1200_SD1_EJECT_INT);
+       } else {
+               disable_irq_nosync(PB1200_SD1_EJECT_INT);
+               enable_irq(PB1200_SD1_INSERT_INT);
+       }
+
+       /* link against CONFIG_MMC=m */
+       mmc_cd = symbol_get(mmc_detect_change);
+       if (mmc_cd) {
+               mmc_cd(ptr, msecs_to_jiffies(500));
+               symbol_put(mmc_detect_change);
+       }
+
+       return IRQ_HANDLED;
+}
+
+static int pb1200_mmc1_cd_setup(void *mmc_host, int en)
+{
+       int ret;
+
+       if (en) {
+               ret = request_irq(PB1200_SD1_INSERT_INT, pb1200_mmc1_cd, 0,
+                                 "sd1_insert", mmc_host);
+               if (ret)
+                       goto out;
+
+               ret = request_irq(PB1200_SD1_EJECT_INT, pb1200_mmc1_cd, 0,
+                                 "sd1_eject", mmc_host);
+               if (ret) {
+                       free_irq(PB1200_SD1_INSERT_INT, mmc_host);
+                       goto out;
+               }
+
+               if (bcsr_read(BCSR_SIGSTAT) & BCSR_INT_SD1INSERT)
+                       enable_irq(PB1200_SD1_EJECT_INT);
+               else
+                       enable_irq(PB1200_SD1_INSERT_INT);
+
+       } else {
+               free_irq(PB1200_SD1_INSERT_INT, mmc_host);
+               free_irq(PB1200_SD1_EJECT_INT, mmc_host);
+       }
+       ret = 0;
+out:
+       return ret;
+}
+
+static void pb1200_mmc1led_set(struct led_classdev *led,
+                       enum led_brightness brightness)
+{
+       if (brightness != LED_OFF)
+                       bcsr_mod(BCSR_LEDS, BCSR_LEDS_LED1, 0);
+       else
+                       bcsr_mod(BCSR_LEDS, 0, BCSR_LEDS_LED1);
+}
+
+static struct led_classdev pb1200_mmc1_led = {
+       .brightness_set = pb1200_mmc1led_set,
+};
+
+static void pb1200_mmc1_set_power(void *mmc_host, int state)
+{
+       if (state) {
+               bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_SD1PWR);
+               msleep(400);    /* stabilization time */
+       } else
+               bcsr_mod(BCSR_BOARD, BCSR_BOARD_SD1PWR, 0);
+}
+
+static int pb1200_mmc1_card_readonly(void *mmc_host)
+{
+       return (bcsr_read(BCSR_STATUS) & BCSR_STATUS_SD1WP) ? 1 : 0;
+}
+
+static int pb1200_mmc1_card_inserted(void *mmc_host)
+{
+       return (bcsr_read(BCSR_SIGSTAT) & BCSR_INT_SD1INSERT) ? 1 : 0;
+}
+
+
+static struct au1xmmc_platform_data db1200_mmc_platdata[2] = {
+       [0] = {
+               .cd_setup       = db1200_mmc_cd_setup,
+               .set_power      = db1200_mmc_set_power,
+               .card_inserted  = db1200_mmc_card_inserted,
+               .card_readonly  = db1200_mmc_card_readonly,
+               .led            = &db1200_mmc_led,
+       },
+       [1] = {
+               .cd_setup       = pb1200_mmc1_cd_setup,
+               .set_power      = pb1200_mmc1_set_power,
+               .card_inserted  = pb1200_mmc1_card_inserted,
+               .card_readonly  = pb1200_mmc1_card_readonly,
+               .led            = &pb1200_mmc1_led,
+       },
+};
+
+static struct resource au1200_mmc0_resources[] = {
+       [0] = {
+               .start  = AU1100_SD0_PHYS_ADDR,
+               .end    = AU1100_SD0_PHYS_ADDR + 0xfff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1200_SD_INT,
+               .end    = AU1200_SD_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = AU1200_DSCR_CMD0_SDMS_TX0,
+               .end    = AU1200_DSCR_CMD0_SDMS_TX0,
+               .flags  = IORESOURCE_DMA,
+       },
+       [3] = {
+               .start  = AU1200_DSCR_CMD0_SDMS_RX0,
+               .end    = AU1200_DSCR_CMD0_SDMS_RX0,
+               .flags  = IORESOURCE_DMA,
+       }
+};
+
+static u64 au1xxx_mmc_dmamask =  DMA_BIT_MASK(32);
+
+static struct platform_device db1200_mmc0_dev = {
+       .name           = "au1xxx-mmc",
+       .id             = 0,
+       .dev = {
+               .dma_mask               = &au1xxx_mmc_dmamask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+               .platform_data          = &db1200_mmc_platdata[0],
+       },
+       .num_resources  = ARRAY_SIZE(au1200_mmc0_resources),
+       .resource       = au1200_mmc0_resources,
+};
+
+static struct resource au1200_mmc1_res[] = {
+       [0] = {
+               .start  = AU1100_SD1_PHYS_ADDR,
+               .end    = AU1100_SD1_PHYS_ADDR + 0xfff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1200_SD_INT,
+               .end    = AU1200_SD_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = AU1200_DSCR_CMD0_SDMS_TX1,
+               .end    = AU1200_DSCR_CMD0_SDMS_TX1,
+               .flags  = IORESOURCE_DMA,
+       },
+       [3] = {
+               .start  = AU1200_DSCR_CMD0_SDMS_RX1,
+               .end    = AU1200_DSCR_CMD0_SDMS_RX1,
+               .flags  = IORESOURCE_DMA,
+       }
+};
+
+static struct platform_device pb1200_mmc1_dev = {
+       .name           = "au1xxx-mmc",
+       .id             = 1,
+       .dev = {
+               .dma_mask               = &au1xxx_mmc_dmamask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+               .platform_data          = &db1200_mmc_platdata[1],
+       },
+       .num_resources  = ARRAY_SIZE(au1200_mmc1_res),
+       .resource       = au1200_mmc1_res,
+};
+
+/**********************************************************************/
+
+static int db1200fb_panel_index(void)
+{
+       return (bcsr_read(BCSR_SWITCHES) >> 8) & 0x0f;
+}
+
+static int db1200fb_panel_init(void)
+{
+       /* Apply power */
+       bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD |
+                               BCSR_BOARD_LCDBL);
+       return 0;
+}
+
+static int db1200fb_panel_shutdown(void)
+{
+       /* Remove power */
+       bcsr_mod(BCSR_BOARD, BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD |
+                            BCSR_BOARD_LCDBL, 0);
+       return 0;
+}
+
+static struct au1200fb_platdata db1200fb_pd = {
+       .panel_index    = db1200fb_panel_index,
+       .panel_init     = db1200fb_panel_init,
+       .panel_shutdown = db1200fb_panel_shutdown,
+};
+
+static struct resource au1200_lcd_res[] = {
+       [0] = {
+               .start  = AU1200_LCD_PHYS_ADDR,
+               .end    = AU1200_LCD_PHYS_ADDR + 0x800 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1200_LCD_INT,
+               .end    = AU1200_LCD_INT,
+               .flags  = IORESOURCE_IRQ,
+       }
+};
+
+static u64 au1200_lcd_dmamask = DMA_BIT_MASK(32);
+
+static struct platform_device au1200_lcd_dev = {
+       .name           = "au1200-lcd",
+       .id             = 0,
+       .dev = {
+               .dma_mask               = &au1200_lcd_dmamask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+               .platform_data          = &db1200fb_pd,
+       },
+       .num_resources  = ARRAY_SIZE(au1200_lcd_res),
+       .resource       = au1200_lcd_res,
+};
+
+/**********************************************************************/
+
+static struct resource au1200_psc0_res[] = {
+       [0] = {
+               .start  = AU1550_PSC0_PHYS_ADDR,
+               .end    = AU1550_PSC0_PHYS_ADDR + 0xfff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1200_PSC0_INT,
+               .end    = AU1200_PSC0_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = AU1200_DSCR_CMD0_PSC0_TX,
+               .end    = AU1200_DSCR_CMD0_PSC0_TX,
+               .flags  = IORESOURCE_DMA,
+       },
+       [3] = {
+               .start  = AU1200_DSCR_CMD0_PSC0_RX,
+               .end    = AU1200_DSCR_CMD0_PSC0_RX,
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+static struct platform_device db1200_i2c_dev = {
+       .name           = "au1xpsc_smbus",
+       .id             = 0,    /* bus number */
+       .num_resources  = ARRAY_SIZE(au1200_psc0_res),
+       .resource       = au1200_psc0_res,
+};
+
+static void db1200_spi_cs_en(struct au1550_spi_info *spi, int cs, int pol)
+{
+       if (cs)
+               bcsr_mod(BCSR_RESETS, 0, BCSR_RESETS_SPISEL);
+       else
+               bcsr_mod(BCSR_RESETS, BCSR_RESETS_SPISEL, 0);
+}
+
+static struct au1550_spi_info db1200_spi_platdata = {
+       .mainclk_hz     = 50000000,     /* PSC0 clock */
+       .num_chipselect = 2,
+       .activate_cs    = db1200_spi_cs_en,
+};
+
+static u64 spi_dmamask = DMA_BIT_MASK(32);
+
+static struct platform_device db1200_spi_dev = {
+       .dev    = {
+               .dma_mask               = &spi_dmamask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+               .platform_data          = &db1200_spi_platdata,
+       },
+       .name           = "au1550-spi",
+       .id             = 0,    /* bus number */
+       .num_resources  = ARRAY_SIZE(au1200_psc0_res),
+       .resource       = au1200_psc0_res,
+};
+
+static struct resource au1200_psc1_res[] = {
+       [0] = {
+               .start  = AU1550_PSC1_PHYS_ADDR,
+               .end    = AU1550_PSC1_PHYS_ADDR + 0xfff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1200_PSC1_INT,
+               .end    = AU1200_PSC1_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = AU1200_DSCR_CMD0_PSC1_TX,
+               .end    = AU1200_DSCR_CMD0_PSC1_TX,
+               .flags  = IORESOURCE_DMA,
+       },
+       [3] = {
+               .start  = AU1200_DSCR_CMD0_PSC1_RX,
+               .end    = AU1200_DSCR_CMD0_PSC1_RX,
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+/* AC97 or I2S device */
+static struct platform_device db1200_audio_dev = {
+       /* name assigned later based on switch setting */
+       .id             = 1,    /* PSC ID */
+       .num_resources  = ARRAY_SIZE(au1200_psc1_res),
+       .resource       = au1200_psc1_res,
+};
+
+/* DB1200 ASoC card device */
+static struct platform_device db1200_sound_dev = {
+       /* name assigned later based on switch setting */
+       .id             = 1,    /* PSC ID */
+};
+
+static struct platform_device db1200_stac_dev = {
+       .name           = "ac97-codec",
+       .id             = 1,    /* on PSC1 */
+};
+
+static struct platform_device db1200_audiodma_dev = {
+       .name           = "au1xpsc-pcm",
+       .id             = 1,    /* PSC ID */
+};
+
+static struct platform_device *db1200_devs[] __initdata = {
+       NULL,           /* PSC0, selected by S6.8 */
+       &db1200_ide_dev,
+       &db1200_mmc0_dev,
+       &au1200_lcd_dev,
+       &db1200_eth_dev,
+       &db1200_nand_dev,
+       &db1200_audiodma_dev,
+       &db1200_audio_dev,
+       &db1200_stac_dev,
+       &db1200_sound_dev,
+};
+
+static struct platform_device *pb1200_devs[] __initdata = {
+       &pb1200_mmc1_dev,
+};
+
+/* Some peripheral base addresses differ on the PB1200 */
+static int __init pb1200_res_fixup(void)
+{
+       /* CPLD Revs earlier than 4 cause problems */
+       if (BCSR_WHOAMI_CPLD(bcsr_read(BCSR_WHOAMI)) <= 3) {
+               printk(KERN_ERR "WARNING!!!\n");
+               printk(KERN_ERR "WARNING!!!\n");
+               printk(KERN_ERR "PB1200 must be at CPLD rev 4. Please have\n");
+               printk(KERN_ERR "the board updated to latest revisions.\n");
+               printk(KERN_ERR "This software will not work reliably\n");
+               printk(KERN_ERR "on anything older than CPLD rev 4.!\n");
+               printk(KERN_ERR "WARNING!!!\n");
+               printk(KERN_ERR "WARNING!!!\n");
+               return 1;
+       }
+
+       db1200_nand_res[0].start = PB1200_NAND_PHYS_ADDR;
+       db1200_nand_res[0].end   = PB1200_NAND_PHYS_ADDR + 0xff;
+       db1200_ide_res[0].start = PB1200_IDE_PHYS_ADDR;
+       db1200_ide_res[0].end   = PB1200_IDE_PHYS_ADDR + DB1200_IDE_PHYS_LEN - 1;
+       db1200_eth_res[0].start = PB1200_ETH_PHYS_ADDR;
+       db1200_eth_res[0].end   = PB1200_ETH_PHYS_ADDR + 0xff;
+       return 0;
+}
+
+static int __init db1200_dev_init(void)
+{
+       unsigned long pfc;
+       unsigned short sw;
+       int swapped, bid;
+
+       bid = BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI));
+       if ((bid == BCSR_WHOAMI_PB1200_DDR1) ||
+           (bid == BCSR_WHOAMI_PB1200_DDR2)) {
+               if (pb1200_res_fixup())
+                       return -ENODEV;
+       }
+
+       /* GPIO7 is low-level triggered CPLD cascade */
+       irq_set_irq_type(AU1200_GPIO7_INT, IRQ_TYPE_LEVEL_LOW);
+       bcsr_init_irq(DB1200_INT_BEGIN, DB1200_INT_END, AU1200_GPIO7_INT);
+
+       /* insert/eject pairs: one of both is always screaming.  To avoid
+        * issues they must not be automatically enabled when initially
+        * requested.
+        */
+       irq_set_status_flags(DB1200_SD0_INSERT_INT, IRQ_NOAUTOEN);
+       irq_set_status_flags(DB1200_SD0_EJECT_INT, IRQ_NOAUTOEN);
+       irq_set_status_flags(DB1200_PC0_INSERT_INT, IRQ_NOAUTOEN);
+       irq_set_status_flags(DB1200_PC0_EJECT_INT, IRQ_NOAUTOEN);
+       irq_set_status_flags(DB1200_PC1_INSERT_INT, IRQ_NOAUTOEN);
+       irq_set_status_flags(DB1200_PC1_EJECT_INT, IRQ_NOAUTOEN);
+
+       i2c_register_board_info(0, db1200_i2c_devs,
+                               ARRAY_SIZE(db1200_i2c_devs));
+       spi_register_board_info(db1200_spi_devs,
+                               ARRAY_SIZE(db1200_i2c_devs));
+
+       /* SWITCHES:    S6.8 I2C/SPI selector  (OFF=I2C  ON=SPI)
+        *              S6.7 AC97/I2S selector (OFF=AC97 ON=I2S)
+        *              or S12 on the PB1200.
+        */
+
+       /* NOTE: GPIO215 controls OTG VBUS supply.  In SPI mode however
+        * this pin is claimed by PSC0 (unused though, but pinmux doesn't
+        * allow to free it without crippling the SPI interface).
+        * As a result, in SPI mode, OTG simply won't work (PSC0 uses
+        * it as an input pin which is pulled high on the boards).
+        */
+       pfc = __raw_readl((void __iomem *)SYS_PINFUNC) & ~SYS_PINFUNC_P0A;
+
+       /* switch off OTG VBUS supply */
+       gpio_request(215, "otg-vbus");
+       gpio_direction_output(215, 1);
+
+       printk(KERN_INFO "%s device configuration:\n", board_type_str());
+
+       sw = bcsr_read(BCSR_SWITCHES);
+       if (sw & BCSR_SWITCHES_DIP_8) {
+               db1200_devs[0] = &db1200_i2c_dev;
+               bcsr_mod(BCSR_RESETS, BCSR_RESETS_PSC0MUX, 0);
+
+               pfc |= (2 << 17);       /* GPIO2 block owns GPIO215 */
+
+               printk(KERN_INFO " S6.8 OFF: PSC0 mode I2C\n");
+               printk(KERN_INFO "   OTG port VBUS supply available!\n");
+       } else {
+               db1200_devs[0] = &db1200_spi_dev;
+               bcsr_mod(BCSR_RESETS, 0, BCSR_RESETS_PSC0MUX);
+
+               pfc |= (1 << 17);       /* PSC0 owns GPIO215 */
+
+               printk(KERN_INFO " S6.8 ON : PSC0 mode SPI\n");
+               printk(KERN_INFO "   OTG port VBUS supply disabled\n");
+       }
+       __raw_writel(pfc, (void __iomem *)SYS_PINFUNC);
+       wmb();
+
+       /* Audio: DIP7 selects I2S(0)/AC97(1), but need I2C for I2S!
+        * so: DIP7=1 || DIP8=0 => AC97, DIP7=0 && DIP8=1 => I2S
+        */
+       sw &= BCSR_SWITCHES_DIP_8 | BCSR_SWITCHES_DIP_7;
+       if (sw == BCSR_SWITCHES_DIP_8) {
+               bcsr_mod(BCSR_RESETS, 0, BCSR_RESETS_PSC1MUX);
+               db1200_audio_dev.name = "au1xpsc_i2s";
+               db1200_sound_dev.name = "db1200-i2s";
+               printk(KERN_INFO " S6.7 ON : PSC1 mode I2S\n");
+       } else {
+               bcsr_mod(BCSR_RESETS, BCSR_RESETS_PSC1MUX, 0);
+               db1200_audio_dev.name = "au1xpsc_ac97";
+               db1200_sound_dev.name = "db1200-ac97";
+               printk(KERN_INFO " S6.7 OFF: PSC1 mode AC97\n");
+       }
+
+       /* Audio PSC clock is supplied externally. (FIXME: platdata!!) */
+       __raw_writel(PSC_SEL_CLK_SERCLK,
+           (void __iomem *)KSEG1ADDR(AU1550_PSC1_PHYS_ADDR) + PSC_SEL_OFFSET);
+       wmb();
+
+       db1x_register_pcmcia_socket(
+               AU1000_PCMCIA_ATTR_PHYS_ADDR,
+               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1,
+               AU1000_PCMCIA_MEM_PHYS_ADDR,
+               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x000400000 - 1,
+               AU1000_PCMCIA_IO_PHYS_ADDR,
+               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x000010000 - 1,
+               DB1200_PC0_INT, DB1200_PC0_INSERT_INT,
+               /*DB1200_PC0_STSCHG_INT*/0, DB1200_PC0_EJECT_INT, 0);
+
+       db1x_register_pcmcia_socket(
+               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x004000000,
+               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x004400000 - 1,
+               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x004000000,
+               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x004400000 - 1,
+               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x004000000,
+               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x004010000 - 1,
+               DB1200_PC1_INT, DB1200_PC1_INSERT_INT,
+               /*DB1200_PC1_STSCHG_INT*/0, DB1200_PC1_EJECT_INT, 1);
+
+       swapped = bcsr_read(BCSR_STATUS) & BCSR_STATUS_DB1200_SWAPBOOT;
+       db1x_register_norflash(64 << 20, 2, swapped);
+
+       platform_add_devices(db1200_devs, ARRAY_SIZE(db1200_devs));
+
+       /* PB1200 is a DB1200 with a 2nd MMC and Camera connector */
+       if ((bid == BCSR_WHOAMI_PB1200_DDR1) ||
+           (bid == BCSR_WHOAMI_PB1200_DDR2))
+               platform_add_devices(pb1200_devs, ARRAY_SIZE(pb1200_devs));
+
+       return 0;
+}
+device_initcall(db1200_dev_init);
diff --git a/arch/mips/alchemy/devboards/db1200/Makefile b/arch/mips/alchemy/devboards/db1200/Makefile
deleted file mode 100644 (file)
index 17840a5..0000000
+++ /dev/null
@@ -1 +0,0 @@
-obj-y += setup.o platform.o
diff --git a/arch/mips/alchemy/devboards/db1200/platform.c b/arch/mips/alchemy/devboards/db1200/platform.c
deleted file mode 100644 (file)
index 78459c1..0000000
+++ /dev/null
@@ -1,648 +0,0 @@
-/*
- * DBAu1200 board platform device registration
- *
- * Copyright (C) 2008-2009 Manuel Lauss
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include <linux/dma-mapping.h>
-#include <linux/gpio.h>
-#include <linux/i2c.h>
-#include <linux/init.h>
-#include <linux/io.h>
-#include <linux/leds.h>
-#include <linux/mmc/host.h>
-#include <linux/mtd/mtd.h>
-#include <linux/mtd/nand.h>
-#include <linux/mtd/partitions.h>
-#include <linux/platform_device.h>
-#include <linux/serial_8250.h>
-#include <linux/spi/spi.h>
-#include <linux/spi/flash.h>
-#include <linux/smc91x.h>
-
-#include <asm/mach-au1x00/au1100_mmc.h>
-#include <asm/mach-au1x00/au1xxx_dbdma.h>
-#include <asm/mach-au1x00/au1550_spi.h>
-#include <asm/mach-db1x00/bcsr.h>
-#include <asm/mach-db1x00/db1200.h>
-
-#include "../platform.h"
-
-static struct mtd_partition db1200_spiflash_parts[] = {
-       {
-               .name   = "DB1200 SPI flash",
-               .offset = 0,
-               .size   = MTDPART_SIZ_FULL,
-       },
-};
-
-static struct flash_platform_data db1200_spiflash_data = {
-       .name           = "s25fl001",
-       .parts          = db1200_spiflash_parts,
-       .nr_parts       = ARRAY_SIZE(db1200_spiflash_parts),
-       .type           = "m25p10",
-};
-
-static struct spi_board_info db1200_spi_devs[] __initdata = {
-       {
-               /* TI TMP121AIDBVR temp sensor */
-               .modalias       = "tmp121",
-               .max_speed_hz   = 2000000,
-               .bus_num        = 0,
-               .chip_select    = 0,
-               .mode           = 0,
-       },
-       {
-               /* Spansion S25FL001D0FMA SPI flash */
-               .modalias       = "m25p80",
-               .max_speed_hz   = 50000000,
-               .bus_num        = 0,
-               .chip_select    = 1,
-               .mode           = 0,
-               .platform_data  = &db1200_spiflash_data,
-       },
-};
-
-static struct i2c_board_info db1200_i2c_devs[] __initdata = {
-       {
-               /* AT24C04-10 I2C eeprom */
-               I2C_BOARD_INFO("24c04", 0x52),
-       },
-       {
-               /* Philips NE1619 temp/voltage sensor (adm1025 drv) */
-               I2C_BOARD_INFO("ne1619", 0x2d),
-       },
-       {
-               /* I2S audio codec WM8731 */
-               I2C_BOARD_INFO("wm8731", 0x1b),
-       },
-};
-
-/**********************************************************************/
-
-static void au1200_nand_cmd_ctrl(struct mtd_info *mtd, int cmd,
-                                unsigned int ctrl)
-{
-       struct nand_chip *this = mtd->priv;
-       unsigned long ioaddr = (unsigned long)this->IO_ADDR_W;
-
-       ioaddr &= 0xffffff00;
-
-       if (ctrl & NAND_CLE) {
-               ioaddr += MEM_STNAND_CMD;
-       } else if (ctrl & NAND_ALE) {
-               ioaddr += MEM_STNAND_ADDR;
-       } else {
-               /* assume we want to r/w real data  by default */
-               ioaddr += MEM_STNAND_DATA;
-       }
-       this->IO_ADDR_R = this->IO_ADDR_W = (void __iomem *)ioaddr;
-       if (cmd != NAND_CMD_NONE) {
-               __raw_writeb(cmd, this->IO_ADDR_W);
-               wmb();
-       }
-}
-
-static int au1200_nand_device_ready(struct mtd_info *mtd)
-{
-       return __raw_readl((void __iomem *)MEM_STSTAT) & 1;
-}
-
-static const char *db1200_part_probes[] = { "cmdlinepart", NULL };
-
-static struct mtd_partition db1200_nand_parts[] = {
-       {
-               .name   = "NAND FS 0",
-               .offset = 0,
-               .size   = 8 * 1024 * 1024,
-       },
-       {
-               .name   = "NAND FS 1",
-               .offset = MTDPART_OFS_APPEND,
-               .size   = MTDPART_SIZ_FULL
-       },
-};
-
-struct platform_nand_data db1200_nand_platdata = {
-       .chip = {
-               .nr_chips       = 1,
-               .chip_offset    = 0,
-               .nr_partitions  = ARRAY_SIZE(db1200_nand_parts),
-               .partitions     = db1200_nand_parts,
-               .chip_delay     = 20,
-               .part_probe_types = db1200_part_probes,
-       },
-       .ctrl = {
-               .dev_ready      = au1200_nand_device_ready,
-               .cmd_ctrl       = au1200_nand_cmd_ctrl,
-       },
-};
-
-static struct resource db1200_nand_res[] = {
-       [0] = {
-               .start  = DB1200_NAND_PHYS_ADDR,
-               .end    = DB1200_NAND_PHYS_ADDR + 0xff,
-               .flags  = IORESOURCE_MEM,
-       },
-};
-
-static struct platform_device db1200_nand_dev = {
-       .name           = "gen_nand",
-       .num_resources  = ARRAY_SIZE(db1200_nand_res),
-       .resource       = db1200_nand_res,
-       .id             = -1,
-       .dev            = {
-               .platform_data = &db1200_nand_platdata,
-       }
-};
-
-/**********************************************************************/
-
-static struct smc91x_platdata db1200_eth_data = {
-       .flags  = SMC91X_NOWAIT | SMC91X_USE_16BIT,
-       .leda   = RPC_LED_100_10,
-       .ledb   = RPC_LED_TX_RX,
-};
-
-static struct resource db1200_eth_res[] = {
-       [0] = {
-               .start  = DB1200_ETH_PHYS_ADDR,
-               .end    = DB1200_ETH_PHYS_ADDR + 0xf,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = DB1200_ETH_INT,
-               .end    = DB1200_ETH_INT,
-               .flags  = IORESOURCE_IRQ,
-       },
-};
-
-static struct platform_device db1200_eth_dev = {
-       .dev    = {
-               .platform_data  = &db1200_eth_data,
-       },
-       .name           = "smc91x",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(db1200_eth_res),
-       .resource       = db1200_eth_res,
-};
-
-/**********************************************************************/
-
-static struct resource db1200_ide_res[] = {
-       [0] = {
-               .start  = DB1200_IDE_PHYS_ADDR,
-               .end    = DB1200_IDE_PHYS_ADDR + DB1200_IDE_PHYS_LEN - 1,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = DB1200_IDE_INT,
-               .end    = DB1200_IDE_INT,
-               .flags  = IORESOURCE_IRQ,
-       },
-       [2] = {
-               .start  = AU1200_DSCR_CMD0_DMA_REQ1,
-               .end    = AU1200_DSCR_CMD0_DMA_REQ1,
-               .flags  = IORESOURCE_DMA,
-       },
-};
-
-static u64 ide_dmamask = DMA_BIT_MASK(32);
-
-static struct platform_device db1200_ide_dev = {
-       .name           = "au1200-ide",
-       .id             = 0,
-       .dev = {
-               .dma_mask               = &ide_dmamask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-       },
-       .num_resources  = ARRAY_SIZE(db1200_ide_res),
-       .resource       = db1200_ide_res,
-};
-
-/**********************************************************************/
-
-static struct platform_device db1200_rtc_dev = {
-       .name   = "rtc-au1xxx",
-       .id     = -1,
-};
-
-/**********************************************************************/
-
-/* SD carddetects:  they're supposed to be edge-triggered, but ack
- * doesn't seem to work (CPLD Rev 2).  Instead, the screaming one
- * is disabled and its counterpart enabled.  The 500ms timeout is
- * because the carddetect isn't debounced in hardware.
- */
-static irqreturn_t db1200_mmc_cd(int irq, void *ptr)
-{
-       void(*mmc_cd)(struct mmc_host *, unsigned long);
-
-       if (irq == DB1200_SD0_INSERT_INT) {
-               disable_irq_nosync(DB1200_SD0_INSERT_INT);
-               enable_irq(DB1200_SD0_EJECT_INT);
-       } else {
-               disable_irq_nosync(DB1200_SD0_EJECT_INT);
-               enable_irq(DB1200_SD0_INSERT_INT);
-       }
-
-       /* link against CONFIG_MMC=m */
-       mmc_cd = symbol_get(mmc_detect_change);
-       if (mmc_cd) {
-               mmc_cd(ptr, msecs_to_jiffies(500));
-               symbol_put(mmc_detect_change);
-       }
-
-       return IRQ_HANDLED;
-}
-
-static int db1200_mmc_cd_setup(void *mmc_host, int en)
-{
-       int ret;
-
-       if (en) {
-               ret = request_irq(DB1200_SD0_INSERT_INT, db1200_mmc_cd,
-                                 0, "sd_insert", mmc_host);
-               if (ret)
-                       goto out;
-
-               ret = request_irq(DB1200_SD0_EJECT_INT, db1200_mmc_cd,
-                                 0, "sd_eject", mmc_host);
-               if (ret) {
-                       free_irq(DB1200_SD0_INSERT_INT, mmc_host);
-                       goto out;
-               }
-
-               if (bcsr_read(BCSR_SIGSTAT) & BCSR_INT_SD0INSERT)
-                       enable_irq(DB1200_SD0_EJECT_INT);
-               else
-                       enable_irq(DB1200_SD0_INSERT_INT);
-
-       } else {
-               free_irq(DB1200_SD0_INSERT_INT, mmc_host);
-               free_irq(DB1200_SD0_EJECT_INT, mmc_host);
-       }
-       ret = 0;
-out:
-       return ret;
-}
-
-static void db1200_mmc_set_power(void *mmc_host, int state)
-{
-       if (state) {
-               bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_SD0PWR);
-               msleep(400);    /* stabilization time */
-       } else
-               bcsr_mod(BCSR_BOARD, BCSR_BOARD_SD0PWR, 0);
-}
-
-static int db1200_mmc_card_readonly(void *mmc_host)
-{
-       return (bcsr_read(BCSR_STATUS) & BCSR_STATUS_SD0WP) ? 1 : 0;
-}
-
-static int db1200_mmc_card_inserted(void *mmc_host)
-{
-       return (bcsr_read(BCSR_SIGSTAT) & BCSR_INT_SD0INSERT) ? 1 : 0;
-}
-
-static void db1200_mmcled_set(struct led_classdev *led,
-                             enum led_brightness brightness)
-{
-       if (brightness != LED_OFF)
-               bcsr_mod(BCSR_LEDS, BCSR_LEDS_LED0, 0);
-       else
-               bcsr_mod(BCSR_LEDS, 0, BCSR_LEDS_LED0);
-}
-
-static struct led_classdev db1200_mmc_led = {
-       .brightness_set = db1200_mmcled_set,
-};
-
-static struct au1xmmc_platform_data db1200mmc_platdata = {
-       .cd_setup       = db1200_mmc_cd_setup,
-       .set_power      = db1200_mmc_set_power,
-       .card_inserted  = db1200_mmc_card_inserted,
-       .card_readonly  = db1200_mmc_card_readonly,
-       .led            = &db1200_mmc_led,
-};
-
-static struct resource au1200_mmc0_resources[] = {
-       [0] = {
-               .start  = AU1100_SD0_PHYS_ADDR,
-               .end    = AU1100_SD0_PHYS_ADDR + 0xfff,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = AU1200_SD_INT,
-               .end    = AU1200_SD_INT,
-               .flags  = IORESOURCE_IRQ,
-       },
-       [2] = {
-               .start  = AU1200_DSCR_CMD0_SDMS_TX0,
-               .end    = AU1200_DSCR_CMD0_SDMS_TX0,
-               .flags  = IORESOURCE_DMA,
-       },
-       [3] = {
-               .start  = AU1200_DSCR_CMD0_SDMS_RX0,
-               .end    = AU1200_DSCR_CMD0_SDMS_RX0,
-               .flags  = IORESOURCE_DMA,
-       }
-};
-
-static u64 au1xxx_mmc_dmamask =  DMA_BIT_MASK(32);
-
-static struct platform_device db1200_mmc0_dev = {
-       .name           = "au1xxx-mmc",
-       .id             = 0,
-       .dev = {
-               .dma_mask               = &au1xxx_mmc_dmamask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-               .platform_data          = &db1200mmc_platdata,
-       },
-       .num_resources  = ARRAY_SIZE(au1200_mmc0_resources),
-       .resource       = au1200_mmc0_resources,
-};
-
-/**********************************************************************/
-
-static struct resource au1200_lcd_res[] = {
-       [0] = {
-               .start  = AU1200_LCD_PHYS_ADDR,
-               .end    = AU1200_LCD_PHYS_ADDR + 0x800 - 1,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = AU1200_LCD_INT,
-               .end    = AU1200_LCD_INT,
-               .flags  = IORESOURCE_IRQ,
-       }
-};
-
-static u64 au1200_lcd_dmamask = DMA_BIT_MASK(32);
-
-static struct platform_device au1200_lcd_dev = {
-       .name           = "au1200-lcd",
-       .id             = 0,
-       .dev = {
-               .dma_mask               = &au1200_lcd_dmamask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-       },
-       .num_resources  = ARRAY_SIZE(au1200_lcd_res),
-       .resource       = au1200_lcd_res,
-};
-
-/**********************************************************************/
-
-static struct resource au1200_psc0_res[] = {
-       [0] = {
-               .start  = AU1550_PSC0_PHYS_ADDR,
-               .end    = AU1550_PSC0_PHYS_ADDR + 0xfff,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = AU1200_PSC0_INT,
-               .end    = AU1200_PSC0_INT,
-               .flags  = IORESOURCE_IRQ,
-       },
-       [2] = {
-               .start  = AU1200_DSCR_CMD0_PSC0_TX,
-               .end    = AU1200_DSCR_CMD0_PSC0_TX,
-               .flags  = IORESOURCE_DMA,
-       },
-       [3] = {
-               .start  = AU1200_DSCR_CMD0_PSC0_RX,
-               .end    = AU1200_DSCR_CMD0_PSC0_RX,
-               .flags  = IORESOURCE_DMA,
-       },
-};
-
-static struct platform_device db1200_i2c_dev = {
-       .name           = "au1xpsc_smbus",
-       .id             = 0,    /* bus number */
-       .num_resources  = ARRAY_SIZE(au1200_psc0_res),
-       .resource       = au1200_psc0_res,
-};
-
-static void db1200_spi_cs_en(struct au1550_spi_info *spi, int cs, int pol)
-{
-       if (cs)
-               bcsr_mod(BCSR_RESETS, 0, BCSR_RESETS_SPISEL);
-       else
-               bcsr_mod(BCSR_RESETS, BCSR_RESETS_SPISEL, 0);
-}
-
-static struct au1550_spi_info db1200_spi_platdata = {
-       .mainclk_hz     = 50000000,     /* PSC0 clock */
-       .num_chipselect = 2,
-       .activate_cs    = db1200_spi_cs_en,
-};
-
-static u64 spi_dmamask = DMA_BIT_MASK(32);
-
-static struct platform_device db1200_spi_dev = {
-       .dev    = {
-               .dma_mask               = &spi_dmamask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-               .platform_data          = &db1200_spi_platdata,
-       },
-       .name           = "au1550-spi",
-       .id             = 0,    /* bus number */
-       .num_resources  = ARRAY_SIZE(au1200_psc0_res),
-       .resource       = au1200_psc0_res,
-};
-
-static struct resource au1200_psc1_res[] = {
-       [0] = {
-               .start  = AU1550_PSC1_PHYS_ADDR,
-               .end    = AU1550_PSC1_PHYS_ADDR + 0xfff,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = AU1200_PSC1_INT,
-               .end    = AU1200_PSC1_INT,
-               .flags  = IORESOURCE_IRQ,
-       },
-       [2] = {
-               .start  = AU1200_DSCR_CMD0_PSC1_TX,
-               .end    = AU1200_DSCR_CMD0_PSC1_TX,
-               .flags  = IORESOURCE_DMA,
-       },
-       [3] = {
-               .start  = AU1200_DSCR_CMD0_PSC1_RX,
-               .end    = AU1200_DSCR_CMD0_PSC1_RX,
-               .flags  = IORESOURCE_DMA,
-       },
-};
-
-/* AC97 or I2S device */
-static struct platform_device db1200_audio_dev = {
-       /* name assigned later based on switch setting */
-       .id             = 1,    /* PSC ID */
-       .num_resources  = ARRAY_SIZE(au1200_psc1_res),
-       .resource       = au1200_psc1_res,
-};
-
-/* DB1200 ASoC card device */
-static struct platform_device db1200_sound_dev = {
-       /* name assigned later based on switch setting */
-       .id             = 1,    /* PSC ID */
-};
-
-static struct platform_device db1200_stac_dev = {
-       .name           = "ac97-codec",
-       .id             = 1,    /* on PSC1 */
-};
-
-static struct platform_device db1200_audiodma_dev = {
-       .name           = "au1xpsc-pcm",
-       .id             = 1,    /* PSC ID */
-};
-
-static struct platform_device *db1200_devs[] __initdata = {
-       NULL,           /* PSC0, selected by S6.8 */
-       &db1200_ide_dev,
-       &db1200_mmc0_dev,
-       &au1200_lcd_dev,
-       &db1200_eth_dev,
-       &db1200_rtc_dev,
-       &db1200_nand_dev,
-       &db1200_audiodma_dev,
-       &db1200_audio_dev,
-       &db1200_stac_dev,
-       &db1200_sound_dev,
-};
-
-static int __init db1200_dev_init(void)
-{
-       unsigned long pfc;
-       unsigned short sw;
-       int swapped;
-
-       i2c_register_board_info(0, db1200_i2c_devs,
-                               ARRAY_SIZE(db1200_i2c_devs));
-       spi_register_board_info(db1200_spi_devs,
-                               ARRAY_SIZE(db1200_i2c_devs));
-
-       /* SWITCHES:    S6.8 I2C/SPI selector  (OFF=I2C  ON=SPI)
-        *              S6.7 AC97/I2S selector (OFF=AC97 ON=I2S)
-        */
-
-       /* NOTE: GPIO215 controls OTG VBUS supply.  In SPI mode however
-        * this pin is claimed by PSC0 (unused though, but pinmux doesn't
-        * allow to free it without crippling the SPI interface).
-        * As a result, in SPI mode, OTG simply won't work (PSC0 uses
-        * it as an input pin which is pulled high on the boards).
-        */
-       pfc = __raw_readl((void __iomem *)SYS_PINFUNC) & ~SYS_PINFUNC_P0A;
-
-       /* switch off OTG VBUS supply */
-       gpio_request(215, "otg-vbus");
-       gpio_direction_output(215, 1);
-
-       printk(KERN_INFO "DB1200 device configuration:\n");
-
-       sw = bcsr_read(BCSR_SWITCHES);
-       if (sw & BCSR_SWITCHES_DIP_8) {
-               db1200_devs[0] = &db1200_i2c_dev;
-               bcsr_mod(BCSR_RESETS, BCSR_RESETS_PSC0MUX, 0);
-
-               pfc |= (2 << 17);       /* GPIO2 block owns GPIO215 */
-
-               printk(KERN_INFO " S6.8 OFF: PSC0 mode I2C\n");
-               printk(KERN_INFO "   OTG port VBUS supply available!\n");
-       } else {
-               db1200_devs[0] = &db1200_spi_dev;
-               bcsr_mod(BCSR_RESETS, 0, BCSR_RESETS_PSC0MUX);
-
-               pfc |= (1 << 17);       /* PSC0 owns GPIO215 */
-
-               printk(KERN_INFO " S6.8 ON : PSC0 mode SPI\n");
-               printk(KERN_INFO "   OTG port VBUS supply disabled\n");
-       }
-       __raw_writel(pfc, (void __iomem *)SYS_PINFUNC);
-       wmb();
-
-       /* Audio: DIP7 selects I2S(0)/AC97(1), but need I2C for I2S!
-        * so: DIP7=1 || DIP8=0 => AC97, DIP7=0 && DIP8=1 => I2S
-        */
-       sw &= BCSR_SWITCHES_DIP_8 | BCSR_SWITCHES_DIP_7;
-       if (sw == BCSR_SWITCHES_DIP_8) {
-               bcsr_mod(BCSR_RESETS, 0, BCSR_RESETS_PSC1MUX);
-               db1200_audio_dev.name = "au1xpsc_i2s";
-               db1200_sound_dev.name = "db1200-i2s";
-               printk(KERN_INFO " S6.7 ON : PSC1 mode I2S\n");
-       } else {
-               bcsr_mod(BCSR_RESETS, BCSR_RESETS_PSC1MUX, 0);
-               db1200_audio_dev.name = "au1xpsc_ac97";
-               db1200_sound_dev.name = "db1200-ac97";
-               printk(KERN_INFO " S6.7 OFF: PSC1 mode AC97\n");
-       }
-
-       /* Audio PSC clock is supplied externally. (FIXME: platdata!!) */
-       __raw_writel(PSC_SEL_CLK_SERCLK,
-               (void __iomem *)KSEG1ADDR(AU1550_PSC1_PHYS_ADDR) + PSC_SEL_OFFSET);
-       wmb();
-
-       db1x_register_pcmcia_socket(
-               AU1000_PCMCIA_ATTR_PHYS_ADDR,
-               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1,
-               AU1000_PCMCIA_MEM_PHYS_ADDR,
-               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x000400000 - 1,
-               AU1000_PCMCIA_IO_PHYS_ADDR,
-               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x000010000 - 1,
-               DB1200_PC0_INT, DB1200_PC0_INSERT_INT,
-               /*DB1200_PC0_STSCHG_INT*/0, DB1200_PC0_EJECT_INT, 0);
-
-       db1x_register_pcmcia_socket(
-               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x004000000,
-               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x004400000 - 1,
-               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x004000000,
-               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x004400000 - 1,
-               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x004000000,
-               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x004010000 - 1,
-               DB1200_PC1_INT, DB1200_PC1_INSERT_INT,
-               /*DB1200_PC1_STSCHG_INT*/0, DB1200_PC1_EJECT_INT, 1);
-
-       swapped = bcsr_read(BCSR_STATUS) & BCSR_STATUS_DB1200_SWAPBOOT;
-       db1x_register_norflash(64 << 20, 2, swapped);
-
-       return platform_add_devices(db1200_devs, ARRAY_SIZE(db1200_devs));
-}
-device_initcall(db1200_dev_init);
-
-/* au1200fb calls these: STERBT EINEN TRAGISCHEN TOD!!! */
-int board_au1200fb_panel(void)
-{
-       return (bcsr_read(BCSR_SWITCHES) >> 8) & 0x0f;
-}
-
-int board_au1200fb_panel_init(void)
-{
-       /* Apply power */
-       bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD |
-                               BCSR_BOARD_LCDBL);
-       return 0;
-}
-
-int board_au1200fb_panel_shutdown(void)
-{
-       /* Remove power */
-       bcsr_mod(BCSR_BOARD, BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD |
-                            BCSR_BOARD_LCDBL, 0);
-       return 0;
-}
diff --git a/arch/mips/alchemy/devboards/db1200/setup.c b/arch/mips/alchemy/devboards/db1200/setup.c
deleted file mode 100644 (file)
index 4a89800..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Alchemy/AMD/RMI DB1200 board setup.
- *
- * Licensed under the terms outlined in the file COPYING in the root of
- * this source archive.
- */
-
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/io.h>
-#include <linux/kernel.h>
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-db1x00/bcsr.h>
-#include <asm/mach-db1x00/db1200.h>
-
-const char *get_system_type(void)
-{
-       return "Alchemy Db1200";
-}
-
-void __init board_setup(void)
-{
-       unsigned long freq0, clksrc, div, pfc;
-       unsigned short whoami;
-
-       bcsr_init(DB1200_BCSR_PHYS_ADDR,
-                 DB1200_BCSR_PHYS_ADDR + DB1200_BCSR_HEXLED_OFS);
-
-       whoami = bcsr_read(BCSR_WHOAMI);
-       printk(KERN_INFO "Alchemy/AMD/RMI DB1200 Board, CPLD Rev %d"
-               "  Board-ID %d  Daughtercard ID %d\n",
-               (whoami >> 4) & 0xf, (whoami >> 8) & 0xf, whoami & 0xf);
-
-       /* SMBus/SPI on PSC0, Audio on PSC1 */
-       pfc = __raw_readl((void __iomem *)SYS_PINFUNC);
-       pfc &= ~(SYS_PINFUNC_P0A | SYS_PINFUNC_P0B);
-       pfc &= ~(SYS_PINFUNC_P1A | SYS_PINFUNC_P1B | SYS_PINFUNC_FS3);
-       pfc |= SYS_PINFUNC_P1C; /* SPI is configured later */
-       __raw_writel(pfc, (void __iomem *)SYS_PINFUNC);
-       wmb();
-
-       /* Clock configurations: PSC0: ~50MHz via Clkgen0, derived from
-        * CPU clock; all other clock generators off/unused.
-        */
-       div = (get_au1x00_speed() + 25000000) / 50000000;
-       if (div & 1)
-               div++;
-       div = ((div >> 1) - 1) & 0xff;
-
-       freq0 = div << SYS_FC_FRDIV0_BIT;
-       __raw_writel(freq0, (void __iomem *)SYS_FREQCTRL0);
-       wmb();
-       freq0 |= SYS_FC_FE0;    /* enable F0 */
-       __raw_writel(freq0, (void __iomem *)SYS_FREQCTRL0);
-       wmb();
-
-       /* psc0_intclk comes 1:1 from F0 */
-       clksrc = SYS_CS_MUX_FQ0 << SYS_CS_ME0_BIT;
-       __raw_writel(clksrc, (void __iomem *)SYS_CLKSRC);
-       wmb();
-}
-
-static int __init db1200_arch_init(void)
-{
-       /* GPIO7 is low-level triggered CPLD cascade */
-       irq_set_irq_type(AU1200_GPIO7_INT, IRQF_TRIGGER_LOW);
-       bcsr_init_irq(DB1200_INT_BEGIN, DB1200_INT_END, AU1200_GPIO7_INT);
-
-       /* insert/eject pairs: one of both is always screaming.  To avoid
-        * issues they must not be automatically enabled when initially
-        * requested.
-        */
-       irq_set_status_flags(DB1200_SD0_INSERT_INT, IRQ_NOAUTOEN);
-       irq_set_status_flags(DB1200_SD0_EJECT_INT, IRQ_NOAUTOEN);
-       irq_set_status_flags(DB1200_PC0_INSERT_INT, IRQ_NOAUTOEN);
-       irq_set_status_flags(DB1200_PC0_EJECT_INT, IRQ_NOAUTOEN);
-       irq_set_status_flags(DB1200_PC1_INSERT_INT, IRQ_NOAUTOEN);
-       irq_set_status_flags(DB1200_PC1_EJECT_INT, IRQ_NOAUTOEN);
-       return 0;
-}
-arch_initcall(db1200_arch_init);
diff --git a/arch/mips/alchemy/devboards/db1300.c b/arch/mips/alchemy/devboards/db1300.c
new file mode 100644 (file)
index 0000000..0893f2a
--- /dev/null
@@ -0,0 +1,785 @@
+/*
+ * DBAu1300 init and platform device setup.
+ *
+ * (c) 2009 Manuel Lauss <manuel.lauss@googlemail.com>
+ */
+
+#include <linux/dma-mapping.h>
+#include <linux/gpio.h>
+#include <linux/gpio_keys.h>
+#include <linux/init.h>
+#include <linux/input.h>       /* KEY_* codes */
+#include <linux/i2c.h>
+#include <linux/io.h>
+#include <linux/leds.h>
+#include <linux/ata_platform.h>
+#include <linux/mmc/host.h>
+#include <linux/module.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/nand.h>
+#include <linux/mtd/partitions.h>
+#include <linux/platform_device.h>
+#include <linux/smsc911x.h>
+
+#include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-au1x00/au1100_mmc.h>
+#include <asm/mach-au1x00/au1200fb.h>
+#include <asm/mach-au1x00/au1xxx_dbdma.h>
+#include <asm/mach-au1x00/au1xxx_psc.h>
+#include <asm/mach-db1x00/db1300.h>
+#include <asm/mach-db1x00/bcsr.h>
+#include <asm/mach-au1x00/prom.h>
+
+#include "platform.h"
+
+static struct i2c_board_info db1300_i2c_devs[] __initdata = {
+       { I2C_BOARD_INFO("wm8731", 0x1b), },    /* I2S audio codec */
+       { I2C_BOARD_INFO("ne1619", 0x2d), },    /* adm1025-compat hwmon */
+};
+
+/* multifunction pins to assign to GPIO controller */
+static int db1300_gpio_pins[] __initdata = {
+       AU1300_PIN_LCDPWM0, AU1300_PIN_PSC2SYNC1, AU1300_PIN_WAKE1,
+       AU1300_PIN_WAKE2, AU1300_PIN_WAKE3, AU1300_PIN_FG3AUX,
+       AU1300_PIN_EXTCLK1,
+       -1,     /* terminator */
+};
+
+/* multifunction pins to assign to device functions */
+static int db1300_dev_pins[] __initdata = {
+       /* wake-from-str pins 0-3 */
+       AU1300_PIN_WAKE0,
+       /* external clock sources for PSC0 */
+       AU1300_PIN_EXTCLK0,
+       /* 8bit MMC interface on SD0: 6-9 */
+       AU1300_PIN_SD0DAT4, AU1300_PIN_SD0DAT5, AU1300_PIN_SD0DAT6,
+       AU1300_PIN_SD0DAT7,
+       /* UART1 pins: 11-18 */
+       AU1300_PIN_U1RI, AU1300_PIN_U1DCD, AU1300_PIN_U1DSR,
+       AU1300_PIN_U1CTS, AU1300_PIN_U1RTS, AU1300_PIN_U1DTR,
+       AU1300_PIN_U1RX, AU1300_PIN_U1TX,
+       /* UART0 pins: 19-24 */
+       AU1300_PIN_U0RI, AU1300_PIN_U0DCD, AU1300_PIN_U0DSR,
+       AU1300_PIN_U0CTS, AU1300_PIN_U0RTS, AU1300_PIN_U0DTR,
+       /* UART2: 25-26 */
+       AU1300_PIN_U2RX, AU1300_PIN_U2TX,
+       /* UART3: 27-28 */
+       AU1300_PIN_U3RX, AU1300_PIN_U3TX,
+       /* LCD controller PWMs, ext pixclock: 30-31 */
+       AU1300_PIN_LCDPWM1, AU1300_PIN_LCDCLKIN,
+       /* SD1 interface: 32-37 */
+       AU1300_PIN_SD1DAT0, AU1300_PIN_SD1DAT1, AU1300_PIN_SD1DAT2,
+       AU1300_PIN_SD1DAT3, AU1300_PIN_SD1CMD, AU1300_PIN_SD1CLK,
+       /* SD2 interface: 38-43 */
+       AU1300_PIN_SD2DAT0, AU1300_PIN_SD2DAT1, AU1300_PIN_SD2DAT2,
+       AU1300_PIN_SD2DAT3, AU1300_PIN_SD2CMD, AU1300_PIN_SD2CLK,
+       /* PSC0/1 clocks: 44-45 */
+       AU1300_PIN_PSC0CLK, AU1300_PIN_PSC1CLK,
+       /* PSCs: 46-49/50-53/54-57/58-61 */
+       AU1300_PIN_PSC0SYNC0, AU1300_PIN_PSC0SYNC1, AU1300_PIN_PSC0D0,
+       AU1300_PIN_PSC0D1,
+       AU1300_PIN_PSC1SYNC0, AU1300_PIN_PSC1SYNC1, AU1300_PIN_PSC1D0,
+       AU1300_PIN_PSC1D1,
+       AU1300_PIN_PSC2SYNC0,                       AU1300_PIN_PSC2D0,
+       AU1300_PIN_PSC2D1,
+       AU1300_PIN_PSC3SYNC0, AU1300_PIN_PSC3SYNC1, AU1300_PIN_PSC3D0,
+       AU1300_PIN_PSC3D1,
+       /* PCMCIA interface: 62-70 */
+       AU1300_PIN_PCE2, AU1300_PIN_PCE1, AU1300_PIN_PIOS16,
+       AU1300_PIN_PIOR, AU1300_PIN_PWE, AU1300_PIN_PWAIT,
+       AU1300_PIN_PREG, AU1300_PIN_POE, AU1300_PIN_PIOW,
+       /* camera interface H/V sync inputs: 71-72 */
+       AU1300_PIN_CIMLS, AU1300_PIN_CIMFS,
+       /* PSC2/3 clocks: 73-74 */
+       AU1300_PIN_PSC2CLK, AU1300_PIN_PSC3CLK,
+       -1,     /* terminator */
+};
+
+static void __init db1300_gpio_config(void)
+{
+       int *i;
+
+       i = &db1300_dev_pins[0];
+       while (*i != -1)
+               au1300_pinfunc_to_dev(*i++);
+
+       i = &db1300_gpio_pins[0];
+       while (*i != -1)
+               au1300_gpio_direction_input(*i++);/* implies pin_to_gpio */
+
+       au1300_set_dbdma_gpio(1, AU1300_PIN_FG3AUX);
+}
+
+char *get_system_type(void)
+{
+       return "DB1300";
+}
+
+/**********************************************************************/
+
+static void au1300_nand_cmd_ctrl(struct mtd_info *mtd, int cmd,
+                                unsigned int ctrl)
+{
+       struct nand_chip *this = mtd->priv;
+       unsigned long ioaddr = (unsigned long)this->IO_ADDR_W;
+
+       ioaddr &= 0xffffff00;
+
+       if (ctrl & NAND_CLE) {
+               ioaddr += MEM_STNAND_CMD;
+       } else if (ctrl & NAND_ALE) {
+               ioaddr += MEM_STNAND_ADDR;
+       } else {
+               /* assume we want to r/w real data  by default */
+               ioaddr += MEM_STNAND_DATA;
+       }
+       this->IO_ADDR_R = this->IO_ADDR_W = (void __iomem *)ioaddr;
+       if (cmd != NAND_CMD_NONE) {
+               __raw_writeb(cmd, this->IO_ADDR_W);
+               wmb();
+       }
+}
+
+static int au1300_nand_device_ready(struct mtd_info *mtd)
+{
+       return __raw_readl((void __iomem *)MEM_STSTAT) & 1;
+}
+
+static const char *db1300_part_probes[] = { "cmdlinepart", NULL };
+
+static struct mtd_partition db1300_nand_parts[] = {
+       {
+               .name   = "NAND FS 0",
+               .offset = 0,
+               .size   = 8 * 1024 * 1024,
+       },
+       {
+               .name   = "NAND FS 1",
+               .offset = MTDPART_OFS_APPEND,
+               .size   = MTDPART_SIZ_FULL
+       },
+};
+
+struct platform_nand_data db1300_nand_platdata = {
+       .chip = {
+               .nr_chips       = 1,
+               .chip_offset    = 0,
+               .nr_partitions  = ARRAY_SIZE(db1300_nand_parts),
+               .partitions     = db1300_nand_parts,
+               .chip_delay     = 20,
+               .part_probe_types = db1300_part_probes,
+       },
+       .ctrl = {
+               .dev_ready      = au1300_nand_device_ready,
+               .cmd_ctrl       = au1300_nand_cmd_ctrl,
+       },
+};
+
+static struct resource db1300_nand_res[] = {
+       [0] = {
+               .start  = DB1300_NAND_PHYS_ADDR,
+               .end    = DB1300_NAND_PHYS_ADDR + 0xff,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device db1300_nand_dev = {
+       .name           = "gen_nand",
+       .num_resources  = ARRAY_SIZE(db1300_nand_res),
+       .resource       = db1300_nand_res,
+       .id             = -1,
+       .dev            = {
+               .platform_data = &db1300_nand_platdata,
+       }
+};
+
+/**********************************************************************/
+
+static struct resource db1300_eth_res[] = {
+       [0] = {
+               .start          = DB1300_ETH_PHYS_ADDR,
+               .end            = DB1300_ETH_PHYS_END,
+               .flags          = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start          = DB1300_ETH_INT,
+               .end            = DB1300_ETH_INT,
+               .flags          = IORESOURCE_IRQ,
+       },
+};
+
+static struct smsc911x_platform_config db1300_eth_config = {
+       .phy_interface          = PHY_INTERFACE_MODE_MII,
+       .irq_polarity           = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
+       .irq_type               = SMSC911X_IRQ_TYPE_PUSH_PULL,
+       .flags                  = SMSC911X_USE_32BIT,
+};
+
+static struct platform_device db1300_eth_dev = {
+       .name                   = "smsc911x",
+       .id                     = -1,
+       .num_resources          = ARRAY_SIZE(db1300_eth_res),
+       .resource               = db1300_eth_res,
+       .dev = {
+               .platform_data  = &db1300_eth_config,
+       },
+};
+
+/**********************************************************************/
+
+static struct resource au1300_psc1_res[] = {
+       [0] = {
+               .start  = AU1300_PSC1_PHYS_ADDR,
+               .end    = AU1300_PSC1_PHYS_ADDR + 0x0fff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1300_PSC1_INT,
+               .end    = AU1300_PSC1_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = AU1300_DSCR_CMD0_PSC1_TX,
+               .end    = AU1300_DSCR_CMD0_PSC1_TX,
+               .flags  = IORESOURCE_DMA,
+       },
+       [3] = {
+               .start  = AU1300_DSCR_CMD0_PSC1_RX,
+               .end    = AU1300_DSCR_CMD0_PSC1_RX,
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+static struct platform_device db1300_ac97_dev = {
+       .name           = "au1xpsc_ac97",
+       .id             = 1,    /* PSC ID. match with AC97 codec ID! */
+       .num_resources  = ARRAY_SIZE(au1300_psc1_res),
+       .resource       = au1300_psc1_res,
+};
+
+/**********************************************************************/
+
+static struct resource au1300_psc2_res[] = {
+       [0] = {
+               .start  = AU1300_PSC2_PHYS_ADDR,
+               .end    = AU1300_PSC2_PHYS_ADDR + 0x0fff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1300_PSC2_INT,
+               .end    = AU1300_PSC2_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = AU1300_DSCR_CMD0_PSC2_TX,
+               .end    = AU1300_DSCR_CMD0_PSC2_TX,
+               .flags  = IORESOURCE_DMA,
+       },
+       [3] = {
+               .start  = AU1300_DSCR_CMD0_PSC2_RX,
+               .end    = AU1300_DSCR_CMD0_PSC2_RX,
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+static struct platform_device db1300_i2s_dev = {
+       .name           = "au1xpsc_i2s",
+       .id             = 2,    /* PSC ID */
+       .num_resources  = ARRAY_SIZE(au1300_psc2_res),
+       .resource       = au1300_psc2_res,
+};
+
+/**********************************************************************/
+
+static struct resource au1300_psc3_res[] = {
+       [0] = {
+               .start  = AU1300_PSC3_PHYS_ADDR,
+               .end    = AU1300_PSC3_PHYS_ADDR + 0x0fff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1300_PSC3_INT,
+               .end    = AU1300_PSC3_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = AU1300_DSCR_CMD0_PSC3_TX,
+               .end    = AU1300_DSCR_CMD0_PSC3_TX,
+               .flags  = IORESOURCE_DMA,
+       },
+       [3] = {
+               .start  = AU1300_DSCR_CMD0_PSC3_RX,
+               .end    = AU1300_DSCR_CMD0_PSC3_RX,
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+static struct platform_device db1300_i2c_dev = {
+       .name           = "au1xpsc_smbus",
+       .id             = 0,    /* bus number */
+       .num_resources  = ARRAY_SIZE(au1300_psc3_res),
+       .resource       = au1300_psc3_res,
+};
+
+/**********************************************************************/
+
+/* proper key assignments when facing the LCD panel.  For key assignments
+ * according to the schematics swap up with down and left with right.
+ * I chose to use it to emulate the arrow keys of a keyboard.
+ */
+static struct gpio_keys_button db1300_5waysw_arrowkeys[] = {
+       {
+               .code                   = KEY_DOWN,
+               .gpio                   = AU1300_PIN_LCDPWM0,
+               .type                   = EV_KEY,
+               .debounce_interval      = 1,
+               .active_low             = 1,
+               .desc                   = "5waysw-down",
+       },
+       {
+               .code                   = KEY_UP,
+               .gpio                   = AU1300_PIN_PSC2SYNC1,
+               .type                   = EV_KEY,
+               .debounce_interval      = 1,
+               .active_low             = 1,
+               .desc                   = "5waysw-up",
+       },
+       {
+               .code                   = KEY_RIGHT,
+               .gpio                   = AU1300_PIN_WAKE3,
+               .type                   = EV_KEY,
+               .debounce_interval      = 1,
+               .active_low             = 1,
+               .desc                   = "5waysw-right",
+       },
+       {
+               .code                   = KEY_LEFT,
+               .gpio                   = AU1300_PIN_WAKE2,
+               .type                   = EV_KEY,
+               .debounce_interval      = 1,
+               .active_low             = 1,
+               .desc                   = "5waysw-left",
+       },
+       {
+               .code                   = KEY_ENTER,
+               .gpio                   = AU1300_PIN_WAKE1,
+               .type                   = EV_KEY,
+               .debounce_interval      = 1,
+               .active_low             = 1,
+               .desc                   = "5waysw-push",
+       },
+};
+
+static struct gpio_keys_platform_data db1300_5waysw_data = {
+       .buttons        = db1300_5waysw_arrowkeys,
+       .nbuttons       = ARRAY_SIZE(db1300_5waysw_arrowkeys),
+       .rep            = 1,
+       .name           = "db1300-5wayswitch",
+};
+
+static struct platform_device db1300_5waysw_dev = {
+       .name           = "gpio-keys",
+       .dev    = {
+               .platform_data  = &db1300_5waysw_data,
+       },
+};
+
+/**********************************************************************/
+
+static struct pata_platform_info db1300_ide_info = {
+       .ioport_shift   = DB1300_IDE_REG_SHIFT,
+};
+
+#define IDE_ALT_START  (14 << DB1300_IDE_REG_SHIFT)
+static struct resource db1300_ide_res[] = {
+       [0] = {
+               .start  = DB1300_IDE_PHYS_ADDR,
+               .end    = DB1300_IDE_PHYS_ADDR + IDE_ALT_START - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = DB1300_IDE_PHYS_ADDR + IDE_ALT_START,
+               .end    = DB1300_IDE_PHYS_ADDR + DB1300_IDE_PHYS_LEN - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [2] = {
+               .start  = DB1300_IDE_INT,
+               .end    = DB1300_IDE_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device db1300_ide_dev = {
+       .dev    = {
+               .platform_data  = &db1300_ide_info,
+       },
+       .name           = "pata_platform",
+       .resource       = db1300_ide_res,
+       .num_resources  = ARRAY_SIZE(db1300_ide_res),
+};
+
+/**********************************************************************/
+
+static irqreturn_t db1300_mmc_cd(int irq, void *ptr)
+{
+       void(*mmc_cd)(struct mmc_host *, unsigned long);
+
+       /* disable the one currently screaming. No other way to shut it up */
+       if (irq == DB1300_SD1_INSERT_INT) {
+               disable_irq_nosync(DB1300_SD1_INSERT_INT);
+               enable_irq(DB1300_SD1_EJECT_INT);
+       } else {
+               disable_irq_nosync(DB1300_SD1_EJECT_INT);
+               enable_irq(DB1300_SD1_INSERT_INT);
+       }
+
+       /* link against CONFIG_MMC=m.  We can only be called once MMC core has
+        * initialized the controller, so symbol_get() should always succeed.
+        */
+       mmc_cd = symbol_get(mmc_detect_change);
+       mmc_cd(ptr, msecs_to_jiffies(500));
+       symbol_put(mmc_detect_change);
+
+       return IRQ_HANDLED;
+}
+
+static int db1300_mmc_card_readonly(void *mmc_host)
+{
+       /* it uses SD1 interface, but the DB1200's SD0 bit in the CPLD */
+       return bcsr_read(BCSR_STATUS) & BCSR_STATUS_SD0WP;
+}
+
+static int db1300_mmc_card_inserted(void *mmc_host)
+{
+       return bcsr_read(BCSR_SIGSTAT) & (1 << 12); /* insertion irq signal */
+}
+
+static int db1300_mmc_cd_setup(void *mmc_host, int en)
+{
+       int ret;
+
+       if (en) {
+               ret = request_irq(DB1300_SD1_INSERT_INT, db1300_mmc_cd, 0,
+                                 "sd_insert", mmc_host);
+               if (ret)
+                       goto out;
+
+               ret = request_irq(DB1300_SD1_EJECT_INT, db1300_mmc_cd, 0,
+                                 "sd_eject", mmc_host);
+               if (ret) {
+                       free_irq(DB1300_SD1_INSERT_INT, mmc_host);
+                       goto out;
+               }
+
+               if (db1300_mmc_card_inserted(mmc_host))
+                       enable_irq(DB1300_SD1_EJECT_INT);
+               else
+                       enable_irq(DB1300_SD1_INSERT_INT);
+
+       } else {
+               free_irq(DB1300_SD1_INSERT_INT, mmc_host);
+               free_irq(DB1300_SD1_EJECT_INT, mmc_host);
+       }
+       ret = 0;
+out:
+       return ret;
+}
+
+static void db1300_mmcled_set(struct led_classdev *led,
+                             enum led_brightness brightness)
+{
+       if (brightness != LED_OFF)
+               bcsr_mod(BCSR_LEDS, BCSR_LEDS_LED0, 0);
+       else
+               bcsr_mod(BCSR_LEDS, 0, BCSR_LEDS_LED0);
+}
+
+static struct led_classdev db1300_mmc_led = {
+       .brightness_set = db1300_mmcled_set,
+};
+
+struct au1xmmc_platform_data db1300_sd1_platdata = {
+       .cd_setup       = db1300_mmc_cd_setup,
+       .card_inserted  = db1300_mmc_card_inserted,
+       .card_readonly  = db1300_mmc_card_readonly,
+       .led            = &db1300_mmc_led,
+};
+
+static struct resource au1300_sd1_res[] = {
+       [0] = {
+               .start  = AU1300_SD1_PHYS_ADDR,
+               .end    = AU1300_SD1_PHYS_ADDR,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1300_SD1_INT,
+               .end    = AU1300_SD1_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = AU1300_DSCR_CMD0_SDMS_TX1,
+               .end    = AU1300_DSCR_CMD0_SDMS_TX1,
+               .flags  = IORESOURCE_DMA,
+       },
+       [3] = {
+               .start  = AU1300_DSCR_CMD0_SDMS_RX1,
+               .end    = AU1300_DSCR_CMD0_SDMS_RX1,
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+static struct platform_device db1300_sd1_dev = {
+       .dev = {
+               .platform_data  = &db1300_sd1_platdata,
+       },
+       .name           = "au1xxx-mmc",
+       .id             = 1,
+       .resource       = au1300_sd1_res,
+       .num_resources  = ARRAY_SIZE(au1300_sd1_res),
+};
+
+/**********************************************************************/
+
+static int db1300_movinand_inserted(void *mmc_host)
+{
+       return 0; /* disable for now, it doesn't work yet */
+}
+
+static int db1300_movinand_readonly(void *mmc_host)
+{
+       return 0;
+}
+
+static void db1300_movinand_led_set(struct led_classdev *led,
+                                   enum led_brightness brightness)
+{
+       if (brightness != LED_OFF)
+               bcsr_mod(BCSR_LEDS, BCSR_LEDS_LED1, 0);
+       else
+               bcsr_mod(BCSR_LEDS, 0, BCSR_LEDS_LED1);
+}
+
+static struct led_classdev db1300_movinand_led = {
+       .brightness_set         = db1300_movinand_led_set,
+};
+
+struct au1xmmc_platform_data db1300_sd0_platdata = {
+       .card_inserted          = db1300_movinand_inserted,
+       .card_readonly          = db1300_movinand_readonly,
+       .led                    = &db1300_movinand_led,
+       .mask_host_caps         = MMC_CAP_NEEDS_POLL,
+};
+
+static struct resource au1300_sd0_res[] = {
+       [0] = {
+               .start  = AU1100_SD0_PHYS_ADDR,
+               .end    = AU1100_SD0_PHYS_ADDR,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1300_SD0_INT,
+               .end    = AU1300_SD0_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = AU1300_DSCR_CMD0_SDMS_TX0,
+               .end    = AU1300_DSCR_CMD0_SDMS_TX0,
+               .flags  = IORESOURCE_DMA,
+       },
+       [3] = {
+               .start  = AU1300_DSCR_CMD0_SDMS_RX0,
+               .end    = AU1300_DSCR_CMD0_SDMS_RX0,
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+static struct platform_device db1300_sd0_dev = {
+       .dev = {
+               .platform_data  = &db1300_sd0_platdata,
+       },
+       .name           = "au1xxx-mmc",
+       .id             = 0,
+       .resource       = au1300_sd0_res,
+       .num_resources  = ARRAY_SIZE(au1300_sd0_res),
+};
+
+/**********************************************************************/
+
+static struct platform_device db1300_wm9715_dev = {
+       .name           = "wm9712-codec",
+       .id             = 1,    /* ID of PSC for AC97 audio, see asoc glue! */
+};
+
+static struct platform_device db1300_ac97dma_dev = {
+       .name           = "au1xpsc-pcm",
+       .id             = 1,    /* PSC ID */
+};
+
+static struct platform_device db1300_i2sdma_dev = {
+       .name           = "au1xpsc-pcm",
+       .id             = 2,    /* PSC ID */
+};
+
+static struct platform_device db1300_sndac97_dev = {
+       .name           = "db1300-ac97",
+};
+
+static struct platform_device db1300_sndi2s_dev = {
+       .name           = "db1300-i2s",
+};
+
+/**********************************************************************/
+
+static int db1300fb_panel_index(void)
+{
+       return 9;       /* DB1300_800x480 */
+}
+
+static int db1300fb_panel_init(void)
+{
+       /* Apply power (Vee/Vdd logic is inverted on Panel DB1300_800x480) */
+       bcsr_mod(BCSR_BOARD, BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD,
+                            BCSR_BOARD_LCDBL);
+       return 0;
+}
+
+static int db1300fb_panel_shutdown(void)
+{
+       /* Remove power (Vee/Vdd logic is inverted on Panel DB1300_800x480) */
+       bcsr_mod(BCSR_BOARD, BCSR_BOARD_LCDBL,
+                            BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD);
+       return 0;
+}
+
+static struct au1200fb_platdata db1300fb_pd = {
+       .panel_index    = db1300fb_panel_index,
+       .panel_init     = db1300fb_panel_init,
+       .panel_shutdown = db1300fb_panel_shutdown,
+};
+
+static struct resource au1300_lcd_res[] = {
+       [0] = {
+               .start  = AU1200_LCD_PHYS_ADDR,
+               .end    = AU1200_LCD_PHYS_ADDR + 0x800 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1300_LCD_INT,
+               .end    = AU1300_LCD_INT,
+               .flags  = IORESOURCE_IRQ,
+       }
+};
+
+static u64 au1300_lcd_dmamask = DMA_BIT_MASK(32);
+
+static struct platform_device db1300_lcd_dev = {
+       .name           = "au1200-lcd",
+       .id             = 0,
+       .dev = {
+               .dma_mask               = &au1300_lcd_dmamask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+               .platform_data          = &db1300fb_pd,
+       },
+       .num_resources  = ARRAY_SIZE(au1300_lcd_res),
+       .resource       = au1300_lcd_res,
+};
+
+/**********************************************************************/
+
+static struct platform_device *db1300_dev[] __initdata = {
+       &db1300_eth_dev,
+       &db1300_i2c_dev,
+       &db1300_5waysw_dev,
+       &db1300_nand_dev,
+       &db1300_ide_dev,
+       &db1300_sd0_dev,
+       &db1300_sd1_dev,
+       &db1300_lcd_dev,
+       &db1300_ac97_dev,
+       &db1300_i2s_dev,
+       &db1300_wm9715_dev,
+       &db1300_ac97dma_dev,
+       &db1300_i2sdma_dev,
+       &db1300_sndac97_dev,
+       &db1300_sndi2s_dev,
+};
+
+static int __init db1300_device_init(void)
+{
+       int swapped, cpldirq;
+
+       /* setup CPLD IRQ muxer */
+       cpldirq = au1300_gpio_to_irq(AU1300_PIN_EXTCLK1);
+       irq_set_irq_type(cpldirq, IRQ_TYPE_LEVEL_HIGH);
+       bcsr_init_irq(DB1300_FIRST_INT, DB1300_LAST_INT, cpldirq);
+
+       /* insert/eject IRQs: one always triggers so don't enable them
+        * when doing request_irq() on them.  DB1200 has this bug too.
+        */
+       irq_set_status_flags(DB1300_SD1_INSERT_INT, IRQ_NOAUTOEN);
+       irq_set_status_flags(DB1300_SD1_EJECT_INT, IRQ_NOAUTOEN);
+       irq_set_status_flags(DB1300_CF_INSERT_INT, IRQ_NOAUTOEN);
+       irq_set_status_flags(DB1300_CF_EJECT_INT, IRQ_NOAUTOEN);
+
+       /*
+        * setup board
+        */
+       prom_get_ethernet_addr(&db1300_eth_config.mac[0]);
+
+       i2c_register_board_info(0, db1300_i2c_devs,
+                               ARRAY_SIZE(db1300_i2c_devs));
+
+       /* Audio PSC clock is supplied by codecs (PSC1, 2) */
+       __raw_writel(PSC_SEL_CLK_SERCLK,
+           (void __iomem *)KSEG1ADDR(AU1300_PSC1_PHYS_ADDR) + PSC_SEL_OFFSET);
+       wmb();
+       __raw_writel(PSC_SEL_CLK_SERCLK,
+           (void __iomem *)KSEG1ADDR(AU1300_PSC2_PHYS_ADDR) + PSC_SEL_OFFSET);
+       wmb();
+       /* I2C uses internal 48MHz EXTCLK1 */
+       __raw_writel(PSC_SEL_CLK_INTCLK,
+           (void __iomem *)KSEG1ADDR(AU1300_PSC3_PHYS_ADDR) + PSC_SEL_OFFSET);
+       wmb();
+
+       /* enable power to USB ports */
+       bcsr_mod(BCSR_RESETS, 0, BCSR_RESETS_USBHPWR | BCSR_RESETS_OTGPWR);
+
+       /* although it is socket #0, it uses the CPLD bits which previous boards
+        * have used for socket #1.
+        */
+       db1x_register_pcmcia_socket(
+               AU1000_PCMCIA_ATTR_PHYS_ADDR,
+               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x00400000 - 1,
+               AU1000_PCMCIA_MEM_PHYS_ADDR,
+               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x00400000 - 1,
+               AU1000_PCMCIA_IO_PHYS_ADDR,
+               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x00010000 - 1,
+               DB1300_CF_INT, DB1300_CF_INSERT_INT, 0, DB1300_CF_EJECT_INT, 1);
+
+       swapped = bcsr_read(BCSR_STATUS) & BCSR_STATUS_DB1200_SWAPBOOT;
+       db1x_register_norflash(64 << 20, 2, swapped);
+
+       return platform_add_devices(db1300_dev, ARRAY_SIZE(db1300_dev));
+}
+device_initcall(db1300_device_init);
+
+
+void __init board_setup(void)
+{
+       unsigned short whoami;
+
+       db1300_gpio_config();
+       bcsr_init(DB1300_BCSR_PHYS_ADDR,
+                 DB1300_BCSR_PHYS_ADDR + DB1300_BCSR_HEXLED_OFS);
+
+       whoami = bcsr_read(BCSR_WHOAMI);
+       printk(KERN_INFO "NetLogic DBAu1300 Development Platform.\n\t"
+               "BoardID %d   CPLD Rev %d   DaughtercardID %d\n",
+               BCSR_WHOAMI_BOARD(whoami), BCSR_WHOAMI_CPLD(whoami),
+               BCSR_WHOAMI_DCID(whoami));
+
+       /* enable UARTs, YAMON only enables #2 */
+       alchemy_uart_enable(AU1300_UART0_PHYS_ADDR);
+       alchemy_uart_enable(AU1300_UART1_PHYS_ADDR);
+       alchemy_uart_enable(AU1300_UART3_PHYS_ADDR);
+}
diff --git a/arch/mips/alchemy/devboards/db1550.c b/arch/mips/alchemy/devboards/db1550.c
new file mode 100644 (file)
index 0000000..6815d07
--- /dev/null
@@ -0,0 +1,498 @@
+/*
+ * Alchemy Db1550 board support
+ *
+ * (c) 2011 Manuel Lauss <manuel.lauss@googlemail.com>
+ */
+
+#include <linux/dma-mapping.h>
+#include <linux/gpio.h>
+#include <linux/i2c.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/interrupt.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/nand.h>
+#include <linux/mtd/partitions.h>
+#include <linux/platform_device.h>
+#include <linux/pm.h>
+#include <linux/spi/spi.h>
+#include <linux/spi/flash.h>
+#include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-au1x00/au1xxx_eth.h>
+#include <asm/mach-au1x00/au1xxx_dbdma.h>
+#include <asm/mach-au1x00/au1xxx_psc.h>
+#include <asm/mach-au1x00/au1550_spi.h>
+#include <asm/mach-db1x00/bcsr.h>
+#include <prom.h>
+#include "platform.h"
+
+
+const char *get_system_type(void)
+{
+       return "DB1550";
+}
+
+static void __init db1550_hw_setup(void)
+{
+       void __iomem *base;
+
+       alchemy_gpio_direction_output(203, 0);  /* red led on */
+
+       /* complete SPI setup: link psc0_intclk to a 48MHz source,
+        * and assign GPIO16 to PSC0_SYNC1 (SPI cs# line)
+        */
+       base = (void __iomem *)SYS_CLKSRC;
+       __raw_writel(__raw_readl(base) | 0x000001e0, base);
+       base = (void __iomem *)SYS_PINFUNC;
+       __raw_writel(__raw_readl(base) | 1, base);
+       wmb();
+
+       /* reset the AC97 codec now, the reset time in the psc-ac97 driver
+        * is apparently too short although it's ridiculous as it is.
+        */
+       base = (void __iomem *)KSEG1ADDR(AU1550_PSC1_PHYS_ADDR);
+       __raw_writel(PSC_SEL_CLK_SERCLK | PSC_SEL_PS_AC97MODE,
+                    base + PSC_SEL_OFFSET);
+       __raw_writel(PSC_CTRL_DISABLE, base + PSC_CTRL_OFFSET);
+       wmb();
+       __raw_writel(PSC_AC97RST_RST, base + PSC_AC97RST_OFFSET);
+       wmb();
+
+       alchemy_gpio_direction_output(202, 0);  /* green led on */
+}
+
+void __init board_setup(void)
+{
+       unsigned short whoami;
+
+       bcsr_init(DB1550_BCSR_PHYS_ADDR,
+                 DB1550_BCSR_PHYS_ADDR + DB1550_BCSR_HEXLED_OFS);
+
+       whoami = bcsr_read(BCSR_WHOAMI);
+       printk(KERN_INFO "Alchemy/AMD DB1550 Board, CPLD Rev %d"
+               "  Board-ID %d  Daughtercard ID %d\n",
+               (whoami >> 4) & 0xf, (whoami >> 8) & 0xf, whoami & 0xf);
+
+       db1550_hw_setup();
+}
+
+/*****************************************************************************/
+
+static struct mtd_partition db1550_spiflash_parts[] = {
+       {
+               .name   = "spi_flash",
+               .offset = 0,
+               .size   = MTDPART_SIZ_FULL,
+       },
+};
+
+static struct flash_platform_data db1550_spiflash_data = {
+       .name           = "s25fl010",
+       .parts          = db1550_spiflash_parts,
+       .nr_parts       = ARRAY_SIZE(db1550_spiflash_parts),
+       .type           = "m25p10",
+};
+
+static struct spi_board_info db1550_spi_devs[] __initdata = {
+       {
+               /* TI TMP121AIDBVR temp sensor */
+               .modalias       = "tmp121",
+               .max_speed_hz   = 2400000,
+               .bus_num        = 0,
+               .chip_select    = 0,
+               .mode           = SPI_MODE_0,
+       },
+       {
+               /* Spansion S25FL001D0FMA SPI flash */
+               .modalias       = "m25p80",
+               .max_speed_hz   = 2400000,
+               .bus_num        = 0,
+               .chip_select    = 1,
+               .mode           = SPI_MODE_0,
+               .platform_data  = &db1550_spiflash_data,
+       },
+};
+
+static struct i2c_board_info db1550_i2c_devs[] __initdata = {
+       { I2C_BOARD_INFO("24c04",  0x52),}, /* AT24C04-10 I2C eeprom */
+       { I2C_BOARD_INFO("ne1619", 0x2d),}, /* adm1025-compat hwmon */
+       { I2C_BOARD_INFO("wm8731", 0x1b),}, /* I2S audio codec WM8731 */
+};
+
+/**********************************************************************/
+
+static void au1550_nand_cmd_ctrl(struct mtd_info *mtd, int cmd,
+                                unsigned int ctrl)
+{
+       struct nand_chip *this = mtd->priv;
+       unsigned long ioaddr = (unsigned long)this->IO_ADDR_W;
+
+       ioaddr &= 0xffffff00;
+
+       if (ctrl & NAND_CLE) {
+               ioaddr += MEM_STNAND_CMD;
+       } else if (ctrl & NAND_ALE) {
+               ioaddr += MEM_STNAND_ADDR;
+       } else {
+               /* assume we want to r/w real data  by default */
+               ioaddr += MEM_STNAND_DATA;
+       }
+       this->IO_ADDR_R = this->IO_ADDR_W = (void __iomem *)ioaddr;
+       if (cmd != NAND_CMD_NONE) {
+               __raw_writeb(cmd, this->IO_ADDR_W);
+               wmb();
+       }
+}
+
+static int au1550_nand_device_ready(struct mtd_info *mtd)
+{
+       return __raw_readl((void __iomem *)MEM_STSTAT) & 1;
+}
+
+static const char *db1550_part_probes[] = { "cmdlinepart", NULL };
+
+static struct mtd_partition db1550_nand_parts[] = {
+       {
+               .name   = "NAND FS 0",
+               .offset = 0,
+               .size   = 8 * 1024 * 1024,
+       },
+       {
+               .name   = "NAND FS 1",
+               .offset = MTDPART_OFS_APPEND,
+               .size   = MTDPART_SIZ_FULL
+       },
+};
+
+struct platform_nand_data db1550_nand_platdata = {
+       .chip = {
+               .nr_chips       = 1,
+               .chip_offset    = 0,
+               .nr_partitions  = ARRAY_SIZE(db1550_nand_parts),
+               .partitions     = db1550_nand_parts,
+               .chip_delay     = 20,
+               .part_probe_types = db1550_part_probes,
+       },
+       .ctrl = {
+               .dev_ready      = au1550_nand_device_ready,
+               .cmd_ctrl       = au1550_nand_cmd_ctrl,
+       },
+};
+
+static struct resource db1550_nand_res[] = {
+       [0] = {
+               .start  = 0x20000000,
+               .end    = 0x200000ff,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device db1550_nand_dev = {
+       .name           = "gen_nand",
+       .num_resources  = ARRAY_SIZE(db1550_nand_res),
+       .resource       = db1550_nand_res,
+       .id             = -1,
+       .dev            = {
+               .platform_data = &db1550_nand_platdata,
+       }
+};
+
+/**********************************************************************/
+
+static struct resource au1550_psc0_res[] = {
+       [0] = {
+               .start  = AU1550_PSC0_PHYS_ADDR,
+               .end    = AU1550_PSC0_PHYS_ADDR + 0xfff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1550_PSC0_INT,
+               .end    = AU1550_PSC0_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = AU1550_DSCR_CMD0_PSC0_TX,
+               .end    = AU1550_DSCR_CMD0_PSC0_TX,
+               .flags  = IORESOURCE_DMA,
+       },
+       [3] = {
+               .start  = AU1550_DSCR_CMD0_PSC0_RX,
+               .end    = AU1550_DSCR_CMD0_PSC0_RX,
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+static void db1550_spi_cs_en(struct au1550_spi_info *spi, int cs, int pol)
+{
+       if (cs)
+               bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_SPISEL);
+       else
+               bcsr_mod(BCSR_BOARD, BCSR_BOARD_SPISEL, 0);
+}
+
+static struct au1550_spi_info db1550_spi_platdata = {
+       .mainclk_hz     = 48000000,     /* PSC0 clock: max. 2.4MHz SPI clk */
+       .num_chipselect = 2,
+       .activate_cs    = db1550_spi_cs_en,
+};
+
+static u64 spi_dmamask = DMA_BIT_MASK(32);
+
+static struct platform_device db1550_spi_dev = {
+       .dev    = {
+               .dma_mask               = &spi_dmamask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+               .platform_data          = &db1550_spi_platdata,
+       },
+       .name           = "au1550-spi",
+       .id             = 0,    /* bus number */
+       .num_resources  = ARRAY_SIZE(au1550_psc0_res),
+       .resource       = au1550_psc0_res,
+};
+
+/**********************************************************************/
+
+static struct resource au1550_psc1_res[] = {
+       [0] = {
+               .start  = AU1550_PSC1_PHYS_ADDR,
+               .end    = AU1550_PSC1_PHYS_ADDR + 0xfff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1550_PSC1_INT,
+               .end    = AU1550_PSC1_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = AU1550_DSCR_CMD0_PSC1_TX,
+               .end    = AU1550_DSCR_CMD0_PSC1_TX,
+               .flags  = IORESOURCE_DMA,
+       },
+       [3] = {
+               .start  = AU1550_DSCR_CMD0_PSC1_RX,
+               .end    = AU1550_DSCR_CMD0_PSC1_RX,
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+static struct platform_device db1550_ac97_dev = {
+       .name           = "au1xpsc_ac97",
+       .id             = 1,    /* PSC ID */
+       .num_resources  = ARRAY_SIZE(au1550_psc1_res),
+       .resource       = au1550_psc1_res,
+};
+
+
+static struct resource au1550_psc2_res[] = {
+       [0] = {
+               .start  = AU1550_PSC2_PHYS_ADDR,
+               .end    = AU1550_PSC2_PHYS_ADDR + 0xfff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1550_PSC2_INT,
+               .end    = AU1550_PSC2_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = AU1550_DSCR_CMD0_PSC2_TX,
+               .end    = AU1550_DSCR_CMD0_PSC2_TX,
+               .flags  = IORESOURCE_DMA,
+       },
+       [3] = {
+               .start  = AU1550_DSCR_CMD0_PSC2_RX,
+               .end    = AU1550_DSCR_CMD0_PSC2_RX,
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+static struct platform_device db1550_i2c_dev = {
+       .name           = "au1xpsc_smbus",
+       .id             = 0,    /* bus number */
+       .num_resources  = ARRAY_SIZE(au1550_psc2_res),
+       .resource       = au1550_psc2_res,
+};
+
+/**********************************************************************/
+
+static struct resource au1550_psc3_res[] = {
+       [0] = {
+               .start  = AU1550_PSC3_PHYS_ADDR,
+               .end    = AU1550_PSC3_PHYS_ADDR + 0xfff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1550_PSC3_INT,
+               .end    = AU1550_PSC3_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = AU1550_DSCR_CMD0_PSC3_TX,
+               .end    = AU1550_DSCR_CMD0_PSC3_TX,
+               .flags  = IORESOURCE_DMA,
+       },
+       [3] = {
+               .start  = AU1550_DSCR_CMD0_PSC3_RX,
+               .end    = AU1550_DSCR_CMD0_PSC3_RX,
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+static struct platform_device db1550_i2s_dev = {
+       .name           = "au1xpsc_i2s",
+       .id             = 3,    /* PSC ID */
+       .num_resources  = ARRAY_SIZE(au1550_psc3_res),
+       .resource       = au1550_psc3_res,
+};
+
+/**********************************************************************/
+
+static struct platform_device db1550_stac_dev = {
+       .name           = "ac97-codec",
+       .id             = 1,    /* on PSC1 */
+};
+
+static struct platform_device db1550_ac97dma_dev = {
+       .name           = "au1xpsc-pcm",
+       .id             = 1,    /* on PSC3 */
+};
+
+static struct platform_device db1550_i2sdma_dev = {
+       .name           = "au1xpsc-pcm",
+       .id             = 3,    /* on PSC3 */
+};
+
+static struct platform_device db1550_sndac97_dev = {
+       .name           = "db1550-ac97",
+};
+
+static struct platform_device db1550_sndi2s_dev = {
+       .name           = "db1550-i2s",
+};
+
+/**********************************************************************/
+
+static int db1550_map_pci_irq(const struct pci_dev *d, u8 slot, u8 pin)
+{
+       if ((slot < 11) || (slot > 13) || pin == 0)
+               return -1;
+       if (slot == 11)
+               return (pin == 1) ? AU1550_PCI_INTC : 0xff;
+       if (slot == 12) {
+               switch (pin) {
+               case 1: return AU1550_PCI_INTB;
+               case 2: return AU1550_PCI_INTC;
+               case 3: return AU1550_PCI_INTD;
+               case 4: return AU1550_PCI_INTA;
+               }
+       }
+       if (slot == 13) {
+               switch (pin) {
+               case 1: return AU1550_PCI_INTA;
+               case 2: return AU1550_PCI_INTB;
+               case 3: return AU1550_PCI_INTC;
+               case 4: return AU1550_PCI_INTD;
+               }
+       }
+       return -1;
+}
+
+static struct resource alchemy_pci_host_res[] = {
+       [0] = {
+               .start  = AU1500_PCI_PHYS_ADDR,
+               .end    = AU1500_PCI_PHYS_ADDR + 0xfff,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct alchemy_pci_platdata db1550_pci_pd = {
+       .board_map_irq  = db1550_map_pci_irq,
+};
+
+static struct platform_device db1550_pci_host_dev = {
+       .dev.platform_data = &db1550_pci_pd,
+       .name           = "alchemy-pci",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(alchemy_pci_host_res),
+       .resource       = alchemy_pci_host_res,
+};
+
+/**********************************************************************/
+
+static struct platform_device *db1550_devs[] __initdata = {
+       &db1550_nand_dev,
+       &db1550_i2c_dev,
+       &db1550_ac97_dev,
+       &db1550_spi_dev,
+       &db1550_i2s_dev,
+       &db1550_stac_dev,
+       &db1550_ac97dma_dev,
+       &db1550_i2sdma_dev,
+       &db1550_sndac97_dev,
+       &db1550_sndi2s_dev,
+};
+
+/* must be arch_initcall; MIPS PCI scans busses in a subsys_initcall */
+static int __init db1550_pci_init(void)
+{
+       return platform_device_register(&db1550_pci_host_dev);
+}
+arch_initcall(db1550_pci_init);
+
+static int __init db1550_dev_init(void)
+{
+       int swapped;
+
+       irq_set_irq_type(AU1550_GPIO0_INT, IRQ_TYPE_EDGE_BOTH);  /* CD0# */
+       irq_set_irq_type(AU1550_GPIO1_INT, IRQ_TYPE_EDGE_BOTH);  /* CD1# */
+       irq_set_irq_type(AU1550_GPIO3_INT, IRQ_TYPE_LEVEL_LOW);  /* CARD0# */
+       irq_set_irq_type(AU1550_GPIO5_INT, IRQ_TYPE_LEVEL_LOW);  /* CARD1# */
+       irq_set_irq_type(AU1550_GPIO21_INT, IRQ_TYPE_LEVEL_LOW); /* STSCHG0# */
+       irq_set_irq_type(AU1550_GPIO22_INT, IRQ_TYPE_LEVEL_LOW); /* STSCHG1# */
+
+       i2c_register_board_info(0, db1550_i2c_devs,
+                               ARRAY_SIZE(db1550_i2c_devs));
+       spi_register_board_info(db1550_spi_devs,
+                               ARRAY_SIZE(db1550_i2c_devs));
+
+       /* Audio PSC clock is supplied by codecs (PSC1, 3) FIXME: platdata!! */
+       __raw_writel(PSC_SEL_CLK_SERCLK,
+           (void __iomem *)KSEG1ADDR(AU1550_PSC1_PHYS_ADDR) + PSC_SEL_OFFSET);
+       wmb();
+       __raw_writel(PSC_SEL_CLK_SERCLK,
+           (void __iomem *)KSEG1ADDR(AU1550_PSC3_PHYS_ADDR) + PSC_SEL_OFFSET);
+       wmb();
+       /* SPI/I2C use internally supplied 50MHz source */
+       __raw_writel(PSC_SEL_CLK_INTCLK,
+           (void __iomem *)KSEG1ADDR(AU1550_PSC0_PHYS_ADDR) + PSC_SEL_OFFSET);
+       wmb();
+       __raw_writel(PSC_SEL_CLK_INTCLK,
+           (void __iomem *)KSEG1ADDR(AU1550_PSC2_PHYS_ADDR) + PSC_SEL_OFFSET);
+       wmb();
+
+       db1x_register_pcmcia_socket(
+               AU1000_PCMCIA_ATTR_PHYS_ADDR,
+               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1,
+               AU1000_PCMCIA_MEM_PHYS_ADDR,
+               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x000400000 - 1,
+               AU1000_PCMCIA_IO_PHYS_ADDR,
+               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x000010000 - 1,
+               AU1550_GPIO3_INT, AU1550_GPIO0_INT,
+               /*AU1550_GPIO21_INT*/0, 0, 0);
+
+       db1x_register_pcmcia_socket(
+               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x004000000,
+               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x004400000 - 1,
+               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x004000000,
+               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x004400000 - 1,
+               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x004000000,
+               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x004010000 - 1,
+               AU1550_GPIO5_INT, AU1550_GPIO1_INT,
+               /*AU1550_GPIO22_INT*/0, 0, 1);
+
+       swapped = bcsr_read(BCSR_STATUS) & BCSR_STATUS_DB1000_SWAPBOOT;
+       db1x_register_norflash(128 << 20, 4, swapped);
+
+       return platform_add_devices(db1550_devs, ARRAY_SIZE(db1550_devs));
+}
+device_initcall(db1550_dev_init);
diff --git a/arch/mips/alchemy/devboards/db1x00/Makefile b/arch/mips/alchemy/devboards/db1x00/Makefile
deleted file mode 100644 (file)
index 613c0c0..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-#  Copyright 2000, 2008 MontaVista Software Inc.
-#  Author: MontaVista Software, Inc. <source@mvista.com>
-#
-# Makefile for the Alchemy Semiconductor DBAu1xx0 boards.
-#
-
-obj-y := board_setup.o platform.o
diff --git a/arch/mips/alchemy/devboards/db1x00/board_setup.c b/arch/mips/alchemy/devboards/db1x00/board_setup.c
deleted file mode 100644 (file)
index 7cd36e6..0000000
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     Alchemy Db1x00 board setup.
- *
- * Copyright 2000, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/gpio.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/pm.h>
-
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-au1x00/au1xxx_eth.h>
-#include <asm/mach-db1x00/db1x00.h>
-#include <asm/mach-db1x00/bcsr.h>
-#include <asm/reboot.h>
-
-#include <prom.h>
-
-#ifdef CONFIG_MIPS_BOSPORUS
-char irq_tab_alchemy[][5] __initdata = {
-       [11] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTB, 0xff, 0xff }, /* IDSEL 11 - miniPCI  */
-       [12] = { -1, AU1500_PCI_INTA, 0xff, 0xff, 0xff }, /* IDSEL 12 - SN1741   */
-       [13] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTB, AU1500_PCI_INTC, AU1500_PCI_INTD }, /* IDSEL 13 - PCI slot */
-};
-
-/*
- * Micrel/Kendin 5 port switch attached to MAC0,
- * MAC0 is associated with PHY address 5 (== WAN port)
- * MAC1 is not associated with any PHY, since it's connected directly
- * to the switch.
- * no interrupts are used
- */
-static struct au1000_eth_platform_data eth0_pdata = {
-       .phy_static_config      = 1,
-       .phy_addr               = 5,
-};
-
-static void bosporus_power_off(void)
-{
-       while (1)
-               asm volatile (".set mips3 ; wait ; .set mips0");
-}
-
-const char *get_system_type(void)
-{
-       return "Alchemy Bosporus Gateway Reference";
-}
-#endif
-
-
-#ifdef CONFIG_MIPS_MIRAGE
-static void mirage_power_off(void)
-{
-       alchemy_gpio_direction_output(210, 1);
-}
-
-const char *get_system_type(void)
-{
-       return "Alchemy Mirage";
-}
-#endif
-
-
-#if defined(CONFIG_MIPS_BOSPORUS) || defined(CONFIG_MIPS_MIRAGE)
-static void mips_softreset(void)
-{
-       asm volatile ("jr\t%0" : : "r"(0xbfc00000));
-}
-
-#else
-
-const char *get_system_type(void)
-{
-       return "Alchemy Db1x00";
-}
-#endif
-
-
-void __init board_setup(void)
-{
-       unsigned long bcsr1, bcsr2;
-
-       bcsr1 = DB1000_BCSR_PHYS_ADDR;
-       bcsr2 = DB1000_BCSR_PHYS_ADDR + DB1000_BCSR_HEXLED_OFS;
-
-#ifdef CONFIG_MIPS_DB1000
-       printk(KERN_INFO "AMD Alchemy Au1000/Db1000 Board\n");
-#endif
-#ifdef CONFIG_MIPS_DB1500
-       printk(KERN_INFO "AMD Alchemy Au1500/Db1500 Board\n");
-#endif
-#ifdef CONFIG_MIPS_DB1100
-       printk(KERN_INFO "AMD Alchemy Au1100/Db1100 Board\n");
-#endif
-#ifdef CONFIG_MIPS_BOSPORUS
-       au1xxx_override_eth_cfg(0, &eth0_pdata);
-
-       printk(KERN_INFO "AMD Alchemy Bosporus Board\n");
-#endif
-#ifdef CONFIG_MIPS_MIRAGE
-       printk(KERN_INFO "AMD Alchemy Mirage Board\n");
-#endif
-#ifdef CONFIG_MIPS_DB1550
-       printk(KERN_INFO "AMD Alchemy Au1550/Db1550 Board\n");
-
-       bcsr1 = DB1550_BCSR_PHYS_ADDR;
-       bcsr2 = DB1550_BCSR_PHYS_ADDR + DB1550_BCSR_HEXLED_OFS;
-#endif
-
-       /* initialize board register space */
-       bcsr_init(bcsr1, bcsr2);
-
-#if defined(CONFIG_IRDA) && defined(CONFIG_AU1000_FIR)
-       {
-               u32 pin_func;
-
-               /* Set IRFIRSEL instead of GPIO15 */
-               pin_func = au_readl(SYS_PINFUNC) | SYS_PF_IRF;
-               au_writel(pin_func, SYS_PINFUNC);
-               /* Power off until the driver is in use */
-               bcsr_mod(BCSR_RESETS, BCSR_RESETS_IRDA_MODE_MASK,
-                        BCSR_RESETS_IRDA_MODE_OFF);
-       }
-#endif
-       bcsr_write(BCSR_PCMCIA, 0);     /* turn off PCMCIA power */
-
-       /* Enable GPIO[31:0] inputs */
-       alchemy_gpio1_input_enable();
-
-#ifdef CONFIG_MIPS_MIRAGE
-       {
-               u32 pin_func;
-
-               /* GPIO[20] is output */
-               alchemy_gpio_direction_output(20, 0);
-
-               /* Set GPIO[210:208] instead of SSI_0 */
-               pin_func = au_readl(SYS_PINFUNC) | SYS_PF_S0;
-
-               /* Set GPIO[215:211] for LEDs */
-               pin_func |= 5 << 2;
-
-               /* Set GPIO[214:213] for more LEDs */
-               pin_func |= 5 << 12;
-
-               /* Set GPIO[207:200] instead of PCMCIA/LCD */
-               pin_func |= SYS_PF_LCD | SYS_PF_PC;
-               au_writel(pin_func, SYS_PINFUNC);
-
-               /*
-                * Enable speaker amplifier.  This should
-                * be part of the audio driver.
-                */
-               alchemy_gpio_direction_output(209, 1);
-
-               pm_power_off = mirage_power_off;
-               _machine_halt = mirage_power_off;
-               _machine_restart = (void(*)(char *))mips_softreset;
-       }
-#endif
-
-#ifdef CONFIG_MIPS_BOSPORUS
-       pm_power_off = bosporus_power_off;
-       _machine_halt = bosporus_power_off;
-       _machine_restart = (void(*)(char *))mips_softreset;
-#endif
-       au_sync();
-}
-
-static int __init db1x00_init_irq(void)
-{
-#if defined(CONFIG_MIPS_MIRAGE)
-       irq_set_irq_type(AU1500_GPIO7_INT, IRQF_TRIGGER_RISING); /* TS pendown */
-#elif defined(CONFIG_MIPS_DB1550)
-       irq_set_irq_type(AU1550_GPIO0_INT, IRQF_TRIGGER_LOW);  /* CD0# */
-       irq_set_irq_type(AU1550_GPIO1_INT, IRQF_TRIGGER_LOW);  /* CD1# */
-       irq_set_irq_type(AU1550_GPIO3_INT, IRQF_TRIGGER_LOW);  /* CARD0# */
-       irq_set_irq_type(AU1550_GPIO5_INT, IRQF_TRIGGER_LOW);  /* CARD1# */
-       irq_set_irq_type(AU1550_GPIO21_INT, IRQF_TRIGGER_LOW); /* STSCHG0# */
-       irq_set_irq_type(AU1550_GPIO22_INT, IRQF_TRIGGER_LOW); /* STSCHG1# */
-#elif defined(CONFIG_MIPS_DB1500)
-       irq_set_irq_type(AU1500_GPIO0_INT, IRQF_TRIGGER_LOW); /* CD0# */
-       irq_set_irq_type(AU1500_GPIO3_INT, IRQF_TRIGGER_LOW); /* CD1# */
-       irq_set_irq_type(AU1500_GPIO2_INT, IRQF_TRIGGER_LOW); /* CARD0# */
-       irq_set_irq_type(AU1500_GPIO5_INT, IRQF_TRIGGER_LOW); /* CARD1# */
-       irq_set_irq_type(AU1500_GPIO1_INT, IRQF_TRIGGER_LOW); /* STSCHG0# */
-       irq_set_irq_type(AU1500_GPIO4_INT, IRQF_TRIGGER_LOW); /* STSCHG1# */
-#elif defined(CONFIG_MIPS_DB1100)
-       irq_set_irq_type(AU1100_GPIO0_INT, IRQF_TRIGGER_LOW); /* CD0# */
-       irq_set_irq_type(AU1100_GPIO3_INT, IRQF_TRIGGER_LOW); /* CD1# */
-       irq_set_irq_type(AU1100_GPIO2_INT, IRQF_TRIGGER_LOW); /* CARD0# */
-       irq_set_irq_type(AU1100_GPIO5_INT, IRQF_TRIGGER_LOW); /* CARD1# */
-       irq_set_irq_type(AU1100_GPIO1_INT, IRQF_TRIGGER_LOW); /* STSCHG0# */
-       irq_set_irq_type(AU1100_GPIO4_INT, IRQF_TRIGGER_LOW); /* STSCHG1# */
-#elif defined(CONFIG_MIPS_DB1000)
-       irq_set_irq_type(AU1000_GPIO0_INT, IRQF_TRIGGER_LOW); /* CD0# */
-       irq_set_irq_type(AU1000_GPIO3_INT, IRQF_TRIGGER_LOW); /* CD1# */
-       irq_set_irq_type(AU1000_GPIO2_INT, IRQF_TRIGGER_LOW); /* CARD0# */
-       irq_set_irq_type(AU1000_GPIO5_INT, IRQF_TRIGGER_LOW); /* CARD1# */
-       irq_set_irq_type(AU1000_GPIO1_INT, IRQF_TRIGGER_LOW); /* STSCHG0# */
-       irq_set_irq_type(AU1000_GPIO4_INT, IRQF_TRIGGER_LOW); /* STSCHG1# */
-#endif
-       return 0;
-}
-arch_initcall(db1x00_init_irq);
diff --git a/arch/mips/alchemy/devboards/db1x00/platform.c b/arch/mips/alchemy/devboards/db1x00/platform.c
deleted file mode 100644 (file)
index 9e6b3d4..0000000
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * DBAu1xxx board platform device registration
- *
- * Copyright (C) 2009 Manuel Lauss
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/dma-mapping.h>
-#include <linux/platform_device.h>
-
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-au1x00/au1000_dma.h>
-#include <asm/mach-db1x00/bcsr.h>
-#include "../platform.h"
-
-struct pci_dev;
-
-/* DB1xxx PCMCIA interrupt sources:
- * CD0/1       GPIO0/3
- * STSCHG0/1   GPIO1/4
- * CARD0/1     GPIO2/5
- * Db1550:     0/1, 21/22, 3/5
- */
-
-#define DB1XXX_HAS_PCMCIA
-#define F_SWAPPED (bcsr_read(BCSR_STATUS) & BCSR_STATUS_DB1000_SWAPBOOT)
-
-#if defined(CONFIG_MIPS_DB1000)
-#define DB1XXX_PCMCIA_CD0      AU1000_GPIO0_INT
-#define DB1XXX_PCMCIA_STSCHG0  AU1000_GPIO1_INT
-#define DB1XXX_PCMCIA_CARD0    AU1000_GPIO2_INT
-#define DB1XXX_PCMCIA_CD1      AU1000_GPIO3_INT
-#define DB1XXX_PCMCIA_STSCHG1  AU1000_GPIO4_INT
-#define DB1XXX_PCMCIA_CARD1    AU1000_GPIO5_INT
-#define BOARD_FLASH_SIZE       0x02000000 /* 32MB */
-#define BOARD_FLASH_WIDTH      4 /* 32-bits */
-#elif defined(CONFIG_MIPS_DB1100)
-#define DB1XXX_PCMCIA_CD0      AU1100_GPIO0_INT
-#define DB1XXX_PCMCIA_STSCHG0  AU1100_GPIO1_INT
-#define DB1XXX_PCMCIA_CARD0    AU1100_GPIO2_INT
-#define DB1XXX_PCMCIA_CD1      AU1100_GPIO3_INT
-#define DB1XXX_PCMCIA_STSCHG1  AU1100_GPIO4_INT
-#define DB1XXX_PCMCIA_CARD1    AU1100_GPIO5_INT
-#define BOARD_FLASH_SIZE       0x02000000 /* 32MB */
-#define BOARD_FLASH_WIDTH      4 /* 32-bits */
-#elif defined(CONFIG_MIPS_DB1500)
-#define DB1XXX_PCMCIA_CD0      AU1500_GPIO0_INT
-#define DB1XXX_PCMCIA_STSCHG0  AU1500_GPIO1_INT
-#define DB1XXX_PCMCIA_CARD0    AU1500_GPIO2_INT
-#define DB1XXX_PCMCIA_CD1      AU1500_GPIO3_INT
-#define DB1XXX_PCMCIA_STSCHG1  AU1500_GPIO4_INT
-#define DB1XXX_PCMCIA_CARD1    AU1500_GPIO5_INT
-#define BOARD_FLASH_SIZE       0x02000000 /* 32MB */
-#define BOARD_FLASH_WIDTH      4 /* 32-bits */
-#elif defined(CONFIG_MIPS_DB1550)
-#define DB1XXX_PCMCIA_CD0      AU1550_GPIO0_INT
-#define DB1XXX_PCMCIA_STSCHG0  AU1550_GPIO21_INT
-#define DB1XXX_PCMCIA_CARD0    AU1550_GPIO3_INT
-#define DB1XXX_PCMCIA_CD1      AU1550_GPIO1_INT
-#define DB1XXX_PCMCIA_STSCHG1  AU1550_GPIO22_INT
-#define DB1XXX_PCMCIA_CARD1    AU1550_GPIO5_INT
-#define BOARD_FLASH_SIZE       0x08000000 /* 128MB */
-#define BOARD_FLASH_WIDTH      4 /* 32-bits */
-#else
-/* other board: no PCMCIA */
-#undef DB1XXX_HAS_PCMCIA
-#undef F_SWAPPED
-#define F_SWAPPED 0
-#if defined(CONFIG_MIPS_BOSPORUS)
-#define BOARD_FLASH_SIZE       0x01000000 /* 16MB */
-#define BOARD_FLASH_WIDTH      2 /* 16-bits */
-#elif defined(CONFIG_MIPS_MIRAGE)
-#define BOARD_FLASH_SIZE       0x04000000 /* 64MB */
-#define BOARD_FLASH_WIDTH      4 /* 32-bits */
-#endif
-#endif
-
-#ifdef CONFIG_PCI
-#ifdef CONFIG_MIPS_DB1500
-static int db1xxx_map_pci_irq(const struct pci_dev *d, u8 slot, u8 pin)
-{
-       if ((slot < 12) || (slot > 13) || pin == 0)
-               return -1;
-       if (slot == 12)
-               return (pin == 1) ? AU1500_PCI_INTA : 0xff;
-       if (slot == 13) {
-               switch (pin) {
-               case 1: return AU1500_PCI_INTA;
-               case 2: return AU1500_PCI_INTB;
-               case 3: return AU1500_PCI_INTC;
-               case 4: return AU1500_PCI_INTD;
-               }
-       }
-       return -1;
-}
-#endif
-
-#ifdef CONFIG_MIPS_DB1550
-static int db1xxx_map_pci_irq(const struct pci_dev *d, u8 slot, u8 pin)
-{
-       if ((slot < 11) || (slot > 13) || pin == 0)
-               return -1;
-       if (slot == 11)
-               return (pin == 1) ? AU1550_PCI_INTC : 0xff;
-       if (slot == 12) {
-               switch (pin) {
-               case 1: return AU1550_PCI_INTB;
-               case 2: return AU1550_PCI_INTC;
-               case 3: return AU1550_PCI_INTD;
-               case 4: return AU1550_PCI_INTA;
-               }
-       }
-       if (slot == 13) {
-               switch (pin) {
-               case 1: return AU1550_PCI_INTA;
-               case 2: return AU1550_PCI_INTB;
-               case 3: return AU1550_PCI_INTC;
-               case 4: return AU1550_PCI_INTD;
-               }
-       }
-       return -1;
-}
-#endif
-
-#ifdef CONFIG_MIPS_BOSPORUS
-static int db1xxx_map_pci_irq(const struct pci_dev *d, u8 slot, u8 pin)
-{
-       if ((slot < 11) || (slot > 13) || pin == 0)
-               return -1;
-       if (slot == 12)
-               return (pin == 1) ? AU1500_PCI_INTA : 0xff;
-       if (slot == 11) {
-               switch (pin) {
-               case 1: return AU1500_PCI_INTA;
-               case 2: return AU1500_PCI_INTB;
-               default: return 0xff;
-               }
-       }
-       if (slot == 13) {
-               switch (pin) {
-               case 1: return AU1500_PCI_INTA;
-               case 2: return AU1500_PCI_INTB;
-               case 3: return AU1500_PCI_INTC;
-               case 4: return AU1500_PCI_INTD;
-               }
-       }
-       return -1;
-}
-#endif
-
-#ifdef CONFIG_MIPS_MIRAGE
-static int db1xxx_map_pci_irq(const struct pci_dev *d, u8 slot, u8 pin)
-{
-       if ((slot < 11) || (slot > 13) || pin == 0)
-               return -1;
-       if (slot == 11)
-               return (pin == 1) ? AU1500_PCI_INTD : 0xff;
-       if (slot == 12)
-               return (pin == 3) ? AU1500_PCI_INTC : 0xff;
-       if (slot == 13) {
-               switch (pin) {
-               case 1: return AU1500_PCI_INTA;
-               case 2: return AU1500_PCI_INTB;
-               default: return 0xff;
-               }
-       }
-       return -1;
-}
-#endif
-
-static struct resource alchemy_pci_host_res[] = {
-       [0] = {
-               .start  = AU1500_PCI_PHYS_ADDR,
-               .end    = AU1500_PCI_PHYS_ADDR + 0xfff,
-               .flags  = IORESOURCE_MEM,
-       },
-};
-
-static struct alchemy_pci_platdata db1xxx_pci_pd = {
-       .board_map_irq  = db1xxx_map_pci_irq,
-};
-
-static struct platform_device db1xxx_pci_host_dev = {
-       .dev.platform_data = &db1xxx_pci_pd,
-       .name           = "alchemy-pci",
-       .id             = 0,
-       .num_resources  = ARRAY_SIZE(alchemy_pci_host_res),
-       .resource       = alchemy_pci_host_res,
-};
-
-static int __init db15x0_pci_init(void)
-{
-       return platform_device_register(&db1xxx_pci_host_dev);
-}
-/* must be arch_initcall; MIPS PCI scans busses in a subsys_initcall */
-arch_initcall(db15x0_pci_init);
-#endif
-
-#ifdef CONFIG_MIPS_DB1100
-static struct resource au1100_lcd_resources[] = {
-       [0] = {
-               .start  = AU1100_LCD_PHYS_ADDR,
-               .end    = AU1100_LCD_PHYS_ADDR + 0x800 - 1,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = AU1100_LCD_INT,
-               .end    = AU1100_LCD_INT,
-               .flags  = IORESOURCE_IRQ,
-       }
-};
-
-static u64 au1100_lcd_dmamask = DMA_BIT_MASK(32);
-
-static struct platform_device au1100_lcd_device = {
-       .name           = "au1100-lcd",
-       .id             = 0,
-       .dev = {
-               .dma_mask               = &au1100_lcd_dmamask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-       },
-       .num_resources  = ARRAY_SIZE(au1100_lcd_resources),
-       .resource       = au1100_lcd_resources,
-};
-#endif
-
-static struct resource alchemy_ac97c_res[] = {
-       [0] = {
-               .start  = AU1000_AC97_PHYS_ADDR,
-               .end    = AU1000_AC97_PHYS_ADDR + 0xfff,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = DMA_ID_AC97C_TX,
-               .end    = DMA_ID_AC97C_TX,
-               .flags  = IORESOURCE_DMA,
-       },
-       [2] = {
-               .start  = DMA_ID_AC97C_RX,
-               .end    = DMA_ID_AC97C_RX,
-               .flags  = IORESOURCE_DMA,
-       },
-};
-
-static struct platform_device alchemy_ac97c_dev = {
-       .name           = "alchemy-ac97c",
-       .id             = -1,
-       .resource       = alchemy_ac97c_res,
-       .num_resources  = ARRAY_SIZE(alchemy_ac97c_res),
-};
-
-static struct platform_device alchemy_ac97c_dma_dev = {
-       .name           = "alchemy-pcm-dma",
-       .id             = 0,
-};
-
-static struct platform_device db1x00_codec_dev = {
-       .name           = "ac97-codec",
-       .id             = -1,
-};
-
-static struct platform_device db1x00_audio_dev = {
-       .name           = "db1000-audio",
-};
-
-static int __init db1xxx_dev_init(void)
-{
-#ifdef DB1XXX_HAS_PCMCIA
-       db1x_register_pcmcia_socket(
-               AU1000_PCMCIA_ATTR_PHYS_ADDR,
-               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1,
-               AU1000_PCMCIA_MEM_PHYS_ADDR,
-               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x000400000 - 1,
-               AU1000_PCMCIA_IO_PHYS_ADDR,
-               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x000010000 - 1,
-               DB1XXX_PCMCIA_CARD0, DB1XXX_PCMCIA_CD0,
-               /*DB1XXX_PCMCIA_STSCHG0*/0, 0, 0);
-
-       db1x_register_pcmcia_socket(
-               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x004000000,
-               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x004400000 - 1,
-               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x004000000,
-               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x004400000 - 1,
-               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x004000000,
-               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x004010000 - 1,
-               DB1XXX_PCMCIA_CARD1, DB1XXX_PCMCIA_CD1,
-               /*DB1XXX_PCMCIA_STSCHG1*/0, 0, 1);
-#endif
-#ifdef CONFIG_MIPS_DB1100
-       platform_device_register(&au1100_lcd_device);
-#endif
-       db1x_register_norflash(BOARD_FLASH_SIZE, BOARD_FLASH_WIDTH, F_SWAPPED);
-
-       platform_device_register(&db1x00_codec_dev);
-       platform_device_register(&alchemy_ac97c_dma_dev);
-       platform_device_register(&alchemy_ac97c_dev);
-       platform_device_register(&db1x00_audio_dev);
-
-       return 0;
-}
-device_initcall(db1xxx_dev_init);
diff --git a/arch/mips/alchemy/devboards/pb1000/Makefile b/arch/mips/alchemy/devboards/pb1000/Makefile
deleted file mode 100644 (file)
index 97c6615..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-#  Copyright 2000, 2008 MontaVista Software Inc.
-#  Author: MontaVista Software, Inc. <source@mvista.com>
-#
-# Makefile for the Alchemy Semiconductor Pb1000 board.
-#
-
-obj-y := board_setup.o
diff --git a/arch/mips/alchemy/devboards/pb1000/board_setup.c b/arch/mips/alchemy/devboards/pb1000/board_setup.c
deleted file mode 100644 (file)
index e64fdcb..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright 2000, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/delay.h>
-#include <linux/gpio.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/pm.h>
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-pb1x00/pb1000.h>
-#include <asm/reboot.h>
-#include <prom.h>
-
-#include "../platform.h"
-
-const char *get_system_type(void)
-{
-       return "Alchemy Pb1000";
-}
-
-static void board_reset(char *c)
-{
-       asm volatile ("jr %0" : : "r" (0xbfc00000));
-}
-
-static void board_power_off(void)
-{
-       while (1)
-               asm volatile (
-               "       .set    mips32                                  \n"
-               "       wait                                            \n"
-               "       .set    mips0                                   \n");
-}
-
-void __init board_setup(void)
-{
-       u32 pin_func, static_cfg0;
-       u32 sys_freqctrl, sys_clksrc;
-       u32 prid = read_c0_prid();
-
-       sys_freqctrl = 0;
-       sys_clksrc = 0;
-
-       /* Set AUX clock to 12 MHz * 8 = 96 MHz */
-       au_writel(8, SYS_AUXPLL);
-       alchemy_gpio1_input_enable();
-       udelay(100);
-
-#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
-       /* Zero and disable FREQ2 */
-       sys_freqctrl = au_readl(SYS_FREQCTRL0);
-       sys_freqctrl &= ~0xFFF00000;
-       au_writel(sys_freqctrl, SYS_FREQCTRL0);
-
-       /* Zero and disable USBH/USBD clocks */
-       sys_clksrc = au_readl(SYS_CLKSRC);
-       sys_clksrc &= ~(SYS_CS_CUD | SYS_CS_DUD | SYS_CS_MUD_MASK |
-                       SYS_CS_CUH | SYS_CS_DUH | SYS_CS_MUH_MASK);
-       au_writel(sys_clksrc, SYS_CLKSRC);
-
-       sys_freqctrl = au_readl(SYS_FREQCTRL0);
-       sys_freqctrl &= ~0xFFF00000;
-
-       sys_clksrc = au_readl(SYS_CLKSRC);
-       sys_clksrc &= ~(SYS_CS_CUD | SYS_CS_DUD | SYS_CS_MUD_MASK |
-                       SYS_CS_CUH | SYS_CS_DUH | SYS_CS_MUH_MASK);
-
-       switch (prid & 0x000000FF) {
-       case 0x00: /* DA */
-       case 0x01: /* HA */
-       case 0x02: /* HB */
-               /* CPU core freq to 48 MHz to slow it way down... */
-               au_writel(4, SYS_CPUPLL);
-
-               /*
-                * Setup 48 MHz FREQ2 from CPUPLL for USB Host
-                * FRDIV2 = 3 -> div by 8 of 384 MHz -> 48 MHz
-                */
-               sys_freqctrl |= (3 << SYS_FC_FRDIV2_BIT) | SYS_FC_FE2;
-               au_writel(sys_freqctrl, SYS_FREQCTRL0);
-
-               /* CPU core freq to 384 MHz */
-               au_writel(0x20, SYS_CPUPLL);
-
-               printk(KERN_INFO "Au1000: 48 MHz OHCI workaround enabled\n");
-               break;
-
-       default: /* HC and newer */
-               /* FREQ2 = aux / 2 = 48 MHz */
-               sys_freqctrl |= (0 << SYS_FC_FRDIV2_BIT) |
-                                SYS_FC_FE2 | SYS_FC_FS2;
-               au_writel(sys_freqctrl, SYS_FREQCTRL0);
-               break;
-       }
-
-       /*
-        * Route 48 MHz FREQ2 into USB Host and/or Device
-        */
-       sys_clksrc |= SYS_CS_MUX_FQ2 << SYS_CS_MUH_BIT;
-       au_writel(sys_clksrc, SYS_CLKSRC);
-
-       /* Configure pins GPIO[14:9] as GPIO */
-       pin_func = au_readl(SYS_PINFUNC) & ~(SYS_PF_UR3 | SYS_PF_USB);
-
-       /* 2nd USB port is USB host */
-       pin_func |= SYS_PF_USB;
-
-       au_writel(pin_func, SYS_PINFUNC);
-
-       alchemy_gpio_direction_input(11);
-       alchemy_gpio_direction_input(13);
-       alchemy_gpio_direction_output(4, 0);
-       alchemy_gpio_direction_output(5, 0);
-#endif /* defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) */
-
-       /* Make GPIO 15 an input (for interrupt line) */
-       pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_IRF;
-       /* We don't need I2S, so make it available for GPIO[31:29] */
-       pin_func |= SYS_PF_I2S;
-       au_writel(pin_func, SYS_PINFUNC);
-
-       alchemy_gpio_direction_input(15);
-
-       static_cfg0 = au_readl(MEM_STCFG0) & ~0xc00;
-       au_writel(static_cfg0, MEM_STCFG0);
-
-       /* configure RCE2* for LCD */
-       au_writel(0x00000004, MEM_STCFG2);
-
-       /* MEM_STTIME2 */
-       au_writel(0x09000000, MEM_STTIME2);
-
-       /* Set 32-bit base address decoding for RCE2* */
-       au_writel(0x10003ff0, MEM_STADDR2);
-
-       /*
-        * PCI CPLD setup
-        * Expand CE0 to cover PCI
-        */
-       au_writel(0x11803e40, MEM_STADDR1);
-
-       /* Burst visibility on */
-       au_writel(au_readl(MEM_STCFG0) | 0x1000, MEM_STCFG0);
-
-       au_writel(0x83, MEM_STCFG1);         /* ewait enabled, flash timing */
-       au_writel(0x33030a10, MEM_STTIME1);  /* slower timing for FPGA */
-
-       /* Setup the static bus controller */
-       au_writel(0x00000002, MEM_STCFG3);  /* type = PCMCIA */
-       au_writel(0x280E3D07, MEM_STTIME3); /* 250ns cycle time */
-       au_writel(0x10000000, MEM_STADDR3); /* any PCMCIA select */
-
-       /*
-        * Enable Au1000 BCLK switching - note: sed1356 must not use
-        * its BCLK (Au1000 LCLK) for any timings
-        */
-       switch (prid & 0x000000FF) {
-       case 0x00: /* DA */
-       case 0x01: /* HA */
-       case 0x02: /* HB */
-               break;
-       default:  /* HC and newer */
-               /*
-                * Enable sys bus clock divider when IDLE state or no bus
-                * activity.
-                */
-               au_writel(au_readl(SYS_POWERCTRL) | (0x3 << 5), SYS_POWERCTRL);
-               break;
-       }
-
-       pm_power_off = board_power_off;
-       _machine_halt = board_power_off;
-       _machine_restart = board_reset;
-}
-
-static int __init pb1000_init_irq(void)
-{
-       irq_set_irq_type(AU1000_GPIO15_INT, IRQF_TRIGGER_LOW);
-       return 0;
-}
-arch_initcall(pb1000_init_irq);
-
-static int __init pb1000_device_init(void)
-{
-       return db1x_register_norflash(8 * 1024 * 1024, 4, 0);
-}
-device_initcall(pb1000_device_init);
diff --git a/arch/mips/alchemy/devboards/pb1100.c b/arch/mips/alchemy/devboards/pb1100.c
new file mode 100644 (file)
index 0000000..cff50d0
--- /dev/null
@@ -0,0 +1,167 @@
+/*
+ * Pb1100 board platform device registration
+ *
+ * Copyright (C) 2009 Manuel Lauss
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include <linux/delay.h>
+#include <linux/gpio.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/dma-mapping.h>
+#include <linux/platform_device.h>
+#include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-db1x00/bcsr.h>
+#include <prom.h>
+#include "platform.h"
+
+const char *get_system_type(void)
+{
+       return "PB1100";
+}
+
+void __init board_setup(void)
+{
+       volatile void __iomem *base = (volatile void __iomem *)0xac000000UL;
+
+       bcsr_init(DB1000_BCSR_PHYS_ADDR,
+                 DB1000_BCSR_PHYS_ADDR + DB1000_BCSR_HEXLED_OFS);
+
+       /* Set AUX clock to 12 MHz * 8 = 96 MHz */
+       au_writel(8, SYS_AUXPLL);
+       alchemy_gpio1_input_enable();
+       udelay(100);
+
+#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
+       {
+               u32 pin_func, sys_freqctrl, sys_clksrc;
+
+               /* Configure pins GPIO[14:9] as GPIO */
+               pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_UR3;
+
+               /* Zero and disable FREQ2 */
+               sys_freqctrl = au_readl(SYS_FREQCTRL0);
+               sys_freqctrl &= ~0xFFF00000;
+               au_writel(sys_freqctrl, SYS_FREQCTRL0);
+
+               /* Zero and disable USBH/USBD/IrDA clock */
+               sys_clksrc = au_readl(SYS_CLKSRC);
+               sys_clksrc &= ~(SYS_CS_CIR | SYS_CS_DIR | SYS_CS_MIR_MASK);
+               au_writel(sys_clksrc, SYS_CLKSRC);
+
+               sys_freqctrl = au_readl(SYS_FREQCTRL0);
+               sys_freqctrl &= ~0xFFF00000;
+
+               sys_clksrc = au_readl(SYS_CLKSRC);
+               sys_clksrc &= ~(SYS_CS_CIR | SYS_CS_DIR | SYS_CS_MIR_MASK);
+
+               /* FREQ2 = aux / 2 = 48 MHz */
+               sys_freqctrl |= (0 << SYS_FC_FRDIV2_BIT) |
+                               SYS_FC_FE2 | SYS_FC_FS2;
+               au_writel(sys_freqctrl, SYS_FREQCTRL0);
+
+               /*
+                * Route 48 MHz FREQ2 into USBH/USBD/IrDA
+                */
+               sys_clksrc |= SYS_CS_MUX_FQ2 << SYS_CS_MIR_BIT;
+               au_writel(sys_clksrc, SYS_CLKSRC);
+
+               /* Setup the static bus controller */
+               au_writel(0x00000002, MEM_STCFG3);  /* type = PCMCIA */
+               au_writel(0x280E3D07, MEM_STTIME3); /* 250ns cycle time */
+               au_writel(0x10000000, MEM_STADDR3); /* any PCMCIA select */
+
+               /*
+                * Get USB Functionality pin state (device vs host drive pins).
+                */
+               pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_USB;
+               /* 2nd USB port is USB host. */
+               pin_func |= SYS_PF_USB;
+               au_writel(pin_func, SYS_PINFUNC);
+       }
+#endif /* defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) */
+
+       /* Enable sys bus clock divider when IDLE state or no bus activity. */
+       au_writel(au_readl(SYS_POWERCTRL) | (0x3 << 5), SYS_POWERCTRL);
+
+       /* Enable the RTC if not already enabled. */
+       if (!(readb(base + 0x28) & 0x20)) {
+               writeb(readb(base + 0x28) | 0x20, base + 0x28);
+               au_sync();
+       }
+       /* Put the clock in BCD mode. */
+       if (readb(base + 0x2C) & 0x4) { /* reg B */
+               writeb(readb(base + 0x2c) & ~0x4, base + 0x2c);
+               au_sync();
+       }
+}
+
+/******************************************************************************/
+
+static struct resource au1100_lcd_resources[] = {
+       [0] = {
+               .start  = AU1100_LCD_PHYS_ADDR,
+               .end    = AU1100_LCD_PHYS_ADDR + 0x800 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1100_LCD_INT,
+               .end    = AU1100_LCD_INT,
+               .flags  = IORESOURCE_IRQ,
+       }
+};
+
+static u64 au1100_lcd_dmamask = DMA_BIT_MASK(32);
+
+static struct platform_device au1100_lcd_device = {
+       .name           = "au1100-lcd",
+       .id             = 0,
+       .dev = {
+               .dma_mask               = &au1100_lcd_dmamask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+       },
+       .num_resources  = ARRAY_SIZE(au1100_lcd_resources),
+       .resource       = au1100_lcd_resources,
+};
+
+static int __init pb1100_dev_init(void)
+{
+       int swapped;
+
+       irq_set_irq_type(AU1100_GPIO9_INT, IRQF_TRIGGER_LOW); /* PCCD# */
+       irq_set_irq_type(AU1100_GPIO10_INT, IRQF_TRIGGER_LOW); /* PCSTSCHG# */
+       irq_set_irq_type(AU1100_GPIO11_INT, IRQF_TRIGGER_LOW); /* PCCard# */
+       irq_set_irq_type(AU1100_GPIO13_INT, IRQF_TRIGGER_LOW); /* DC_IRQ# */
+
+       /* PCMCIA. single socket, identical to Pb1500 */
+       db1x_register_pcmcia_socket(
+               AU1000_PCMCIA_ATTR_PHYS_ADDR,
+               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1,
+               AU1000_PCMCIA_MEM_PHYS_ADDR,
+               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x000400000 - 1,
+               AU1000_PCMCIA_IO_PHYS_ADDR,
+               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x000010000 - 1,
+               AU1100_GPIO11_INT, AU1100_GPIO9_INT,     /* card / insert */
+               /*AU1100_GPIO10_INT*/0, 0, 0); /* stschg / eject / id */
+
+       swapped = bcsr_read(BCSR_STATUS) &  BCSR_STATUS_DB1000_SWAPBOOT;
+       db1x_register_norflash(64 * 1024 * 1024, 4, swapped);
+       platform_device_register(&au1100_lcd_device);
+
+       return 0;
+}
+device_initcall(pb1100_dev_init);
diff --git a/arch/mips/alchemy/devboards/pb1100/Makefile b/arch/mips/alchemy/devboards/pb1100/Makefile
deleted file mode 100644 (file)
index 7e3756c..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-#  Copyright 2000, 2001, 2008 MontaVista Software Inc.
-#  Author: MontaVista Software, Inc. <source@mvista.com>
-#
-# Makefile for the Alchemy Semiconductor Pb1100 board.
-#
-
-obj-y := board_setup.o platform.o
diff --git a/arch/mips/alchemy/devboards/pb1100/board_setup.c b/arch/mips/alchemy/devboards/pb1100/board_setup.c
deleted file mode 100644 (file)
index d108fd5..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright 2002, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/gpio.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/interrupt.h>
-
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-db1x00/bcsr.h>
-
-#include <prom.h>
-
-
-const char *get_system_type(void)
-{
-       return "Alchemy Pb1100";
-}
-
-void __init board_setup(void)
-{
-       volatile void __iomem *base = (volatile void __iomem *)0xac000000UL;
-
-       bcsr_init(DB1000_BCSR_PHYS_ADDR,
-                 DB1000_BCSR_PHYS_ADDR + DB1000_BCSR_HEXLED_OFS);
-
-       /* Set AUX clock to 12 MHz * 8 = 96 MHz */
-       au_writel(8, SYS_AUXPLL);
-       alchemy_gpio1_input_enable();
-       udelay(100);
-
-#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
-       {
-               u32 pin_func, sys_freqctrl, sys_clksrc;
-
-               /* Configure pins GPIO[14:9] as GPIO */
-               pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_UR3;
-
-               /* Zero and disable FREQ2 */
-               sys_freqctrl = au_readl(SYS_FREQCTRL0);
-               sys_freqctrl &= ~0xFFF00000;
-               au_writel(sys_freqctrl, SYS_FREQCTRL0);
-
-               /* Zero and disable USBH/USBD/IrDA clock */
-               sys_clksrc = au_readl(SYS_CLKSRC);
-               sys_clksrc &= ~(SYS_CS_CIR | SYS_CS_DIR | SYS_CS_MIR_MASK);
-               au_writel(sys_clksrc, SYS_CLKSRC);
-
-               sys_freqctrl = au_readl(SYS_FREQCTRL0);
-               sys_freqctrl &= ~0xFFF00000;
-
-               sys_clksrc = au_readl(SYS_CLKSRC);
-               sys_clksrc &= ~(SYS_CS_CIR | SYS_CS_DIR | SYS_CS_MIR_MASK);
-
-               /* FREQ2 = aux / 2 = 48 MHz */
-               sys_freqctrl |= (0 << SYS_FC_FRDIV2_BIT) |
-                               SYS_FC_FE2 | SYS_FC_FS2;
-               au_writel(sys_freqctrl, SYS_FREQCTRL0);
-
-               /*
-                * Route 48 MHz FREQ2 into USBH/USBD/IrDA
-                */
-               sys_clksrc |= SYS_CS_MUX_FQ2 << SYS_CS_MIR_BIT;
-               au_writel(sys_clksrc, SYS_CLKSRC);
-
-               /* Setup the static bus controller */
-               au_writel(0x00000002, MEM_STCFG3);  /* type = PCMCIA */
-               au_writel(0x280E3D07, MEM_STTIME3); /* 250ns cycle time */
-               au_writel(0x10000000, MEM_STADDR3); /* any PCMCIA select */
-
-               /*
-                * Get USB Functionality pin state (device vs host drive pins).
-                */
-               pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_USB;
-               /* 2nd USB port is USB host. */
-               pin_func |= SYS_PF_USB;
-               au_writel(pin_func, SYS_PINFUNC);
-       }
-#endif /* defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) */
-
-       /* Enable sys bus clock divider when IDLE state or no bus activity. */
-       au_writel(au_readl(SYS_POWERCTRL) | (0x3 << 5), SYS_POWERCTRL);
-
-       /* Enable the RTC if not already enabled. */
-       if (!(readb(base + 0x28) & 0x20)) {
-               writeb(readb(base + 0x28) | 0x20, base + 0x28);
-               au_sync();
-       }
-       /* Put the clock in BCD mode. */
-       if (readb(base + 0x2C) & 0x4) { /* reg B */
-               writeb(readb(base + 0x2c) & ~0x4, base + 0x2c);
-               au_sync();
-       }
-}
-
-static int __init pb1100_init_irq(void)
-{
-       irq_set_irq_type(AU1100_GPIO9_INT, IRQF_TRIGGER_LOW); /* PCCD# */
-       irq_set_irq_type(AU1100_GPIO10_INT, IRQF_TRIGGER_LOW); /* PCSTSCHG# */
-       irq_set_irq_type(AU1100_GPIO11_INT, IRQF_TRIGGER_LOW); /* PCCard# */
-       irq_set_irq_type(AU1100_GPIO13_INT, IRQF_TRIGGER_LOW); /* DC_IRQ# */
-
-       return 0;
-}
-arch_initcall(pb1100_init_irq);
diff --git a/arch/mips/alchemy/devboards/pb1100/platform.c b/arch/mips/alchemy/devboards/pb1100/platform.c
deleted file mode 100644 (file)
index 9c57c01..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Pb1100 board platform device registration
- *
- * Copyright (C) 2009 Manuel Lauss
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include <linux/init.h>
-#include <linux/dma-mapping.h>
-#include <linux/platform_device.h>
-
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-db1x00/bcsr.h>
-
-#include "../platform.h"
-
-static struct resource au1100_lcd_resources[] = {
-       [0] = {
-               .start  = AU1100_LCD_PHYS_ADDR,
-               .end    = AU1100_LCD_PHYS_ADDR + 0x800 - 1,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = AU1100_LCD_INT,
-               .end    = AU1100_LCD_INT,
-               .flags  = IORESOURCE_IRQ,
-       }
-};
-
-static u64 au1100_lcd_dmamask = DMA_BIT_MASK(32);
-
-static struct platform_device au1100_lcd_device = {
-       .name           = "au1100-lcd",
-       .id             = 0,
-       .dev = {
-               .dma_mask               = &au1100_lcd_dmamask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-       },
-       .num_resources  = ARRAY_SIZE(au1100_lcd_resources),
-       .resource       = au1100_lcd_resources,
-};
-
-static int __init pb1100_dev_init(void)
-{
-       int swapped;
-
-       /* PCMCIA. single socket, identical to Pb1500 */
-       db1x_register_pcmcia_socket(
-               AU1000_PCMCIA_ATTR_PHYS_ADDR,
-               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1,
-               AU1000_PCMCIA_MEM_PHYS_ADDR,
-               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x000400000 - 1,
-               AU1000_PCMCIA_IO_PHYS_ADDR,
-               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x000010000 - 1,
-               AU1100_GPIO11_INT, AU1100_GPIO9_INT,     /* card / insert */
-               /*AU1100_GPIO10_INT*/0, 0, 0); /* stschg / eject / id */
-
-       swapped = bcsr_read(BCSR_STATUS) &  BCSR_STATUS_DB1000_SWAPBOOT;
-       db1x_register_norflash(64 * 1024 * 1024, 4, swapped);
-       platform_device_register(&au1100_lcd_device);
-
-       return 0;
-}
-device_initcall(pb1100_dev_init);
diff --git a/arch/mips/alchemy/devboards/pb1200/Makefile b/arch/mips/alchemy/devboards/pb1200/Makefile
deleted file mode 100644 (file)
index 18c1bd5..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Makefile for the Alchemy Semiconductor Pb1200/DBAu1200 boards.
-#
-
-obj-y := board_setup.o platform.o
diff --git a/arch/mips/alchemy/devboards/pb1200/board_setup.c b/arch/mips/alchemy/devboards/pb1200/board_setup.c
deleted file mode 100644 (file)
index 6d06b07..0000000
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     Alchemy Pb1200/Db1200 board setup.
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/sched.h>
-
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-db1x00/bcsr.h>
-
-#ifdef CONFIG_MIPS_PB1200
-#include <asm/mach-pb1x00/pb1200.h>
-#endif
-
-#ifdef CONFIG_MIPS_DB1200
-#include <asm/mach-db1x00/db1200.h>
-#define PB1200_INT_BEGIN DB1200_INT_BEGIN
-#define PB1200_INT_END DB1200_INT_END
-#endif
-
-#include <prom.h>
-
-const char *get_system_type(void)
-{
-       return "Alchemy Pb1200";
-}
-
-void __init board_setup(void)
-{
-       printk(KERN_INFO "AMD Alchemy Pb1200 Board\n");
-       bcsr_init(PB1200_BCSR_PHYS_ADDR,
-                 PB1200_BCSR_PHYS_ADDR + PB1200_BCSR_HEXLED_OFS);
-
-#if 0
-       {
-               u32 pin_func;
-
-               /*
-                * Enable PSC1 SYNC for AC97.  Normaly done in audio driver,
-                * but it is board specific code, so put it here.
-                */
-               pin_func = au_readl(SYS_PINFUNC);
-               au_sync();
-               pin_func |= SYS_PF_MUST_BE_SET | SYS_PF_PSC1_S1;
-               au_writel(pin_func, SYS_PINFUNC);
-
-               au_writel(0, (u32)bcsr | 0x10); /* turn off PCMCIA power */
-               au_sync();
-       }
-#endif
-
-#if defined(CONFIG_I2C_AU1550)
-       {
-               u32 freq0, clksrc;
-               u32 pin_func;
-
-               /* Select SMBus in CPLD */
-               bcsr_mod(BCSR_RESETS, BCSR_RESETS_PSC0MUX, 0);
-
-               pin_func = au_readl(SYS_PINFUNC);
-               au_sync();
-               pin_func &= ~(SYS_PINFUNC_P0A | SYS_PINFUNC_P0B);
-               /* Set GPIOs correctly */
-               pin_func |= 2 << 17;
-               au_writel(pin_func, SYS_PINFUNC);
-               au_sync();
-
-               /* The I2C driver depends on 50 MHz clock */
-               freq0 = au_readl(SYS_FREQCTRL0);
-               au_sync();
-               freq0 &= ~(SYS_FC_FRDIV1_MASK | SYS_FC_FS1 | SYS_FC_FE1);
-               freq0 |= 3 << SYS_FC_FRDIV1_BIT;
-               /* 396 MHz / (3 + 1) * 2 == 49.5 MHz */
-               au_writel(freq0, SYS_FREQCTRL0);
-               au_sync();
-               freq0 |= SYS_FC_FE1;
-               au_writel(freq0, SYS_FREQCTRL0);
-               au_sync();
-
-               clksrc = au_readl(SYS_CLKSRC);
-               au_sync();
-               clksrc &= ~(SYS_CS_CE0 | SYS_CS_DE0 | SYS_CS_ME0_MASK);
-               /* Bit 22 is EXTCLK0 for PSC0 */
-               clksrc |= SYS_CS_MUX_FQ1 << SYS_CS_ME0_BIT;
-               au_writel(clksrc, SYS_CLKSRC);
-               au_sync();
-       }
-#endif
-
-       /*
-        * The Pb1200 development board uses external MUX for PSC0 to
-        * support SMB/SPI. bcsr_resets bit 12: 0=SMB 1=SPI
-        */
-#ifdef CONFIG_I2C_AU1550
-       bcsr_mod(BCSR_RESETS, BCSR_RESETS_PSC0MUX, 0);
-#endif
-       au_sync();
-}
-
-static int __init pb1200_init_irq(void)
-{
-       /* We have a problem with CPLD rev 3. */
-       if (BCSR_WHOAMI_CPLD(bcsr_read(BCSR_WHOAMI)) <= 3) {
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "Pb1200 must be at CPLD rev 4. Please have Pb1200\n");
-               printk(KERN_ERR "updated to latest revision. This software will\n");
-               printk(KERN_ERR "not work on anything less than CPLD rev 4.\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               panic("Game over.  Your score is 0.");
-       }
-
-       irq_set_irq_type(AU1200_GPIO7_INT, IRQF_TRIGGER_LOW);
-       bcsr_init_irq(PB1200_INT_BEGIN, PB1200_INT_END, AU1200_GPIO7_INT);
-
-       return 0;
-}
-arch_initcall(pb1200_init_irq);
-
-
-int board_au1200fb_panel(void)
-{
-       return (bcsr_read(BCSR_SWITCHES) >> 8) & 0x0f;
-}
-
-int board_au1200fb_panel_init(void)
-{
-       /* Apply power */
-       bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD |
-                               BCSR_BOARD_LCDBL);
-       /* printk(KERN_DEBUG "board_au1200fb_panel_init()\n"); */
-       return 0;
-}
-
-int board_au1200fb_panel_shutdown(void)
-{
-       /* Remove power */
-       bcsr_mod(BCSR_BOARD, BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD |
-                            BCSR_BOARD_LCDBL, 0);
-       /* printk(KERN_DEBUG "board_au1200fb_panel_shutdown()\n"); */
-       return 0;
-}
diff --git a/arch/mips/alchemy/devboards/pb1200/platform.c b/arch/mips/alchemy/devboards/pb1200/platform.c
deleted file mode 100644 (file)
index 54f7f7b..0000000
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
- * Pb1200/DBAu1200 board platform device registration
- *
- * Copyright (C) 2008 MontaVista Software Inc. <source@mvista.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include <linux/dma-mapping.h>
-#include <linux/init.h>
-#include <linux/leds.h>
-#include <linux/platform_device.h>
-#include <linux/smc91x.h>
-
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-au1x00/au1100_mmc.h>
-#include <asm/mach-au1x00/au1xxx_dbdma.h>
-#include <asm/mach-db1x00/bcsr.h>
-#include <asm/mach-pb1x00/pb1200.h>
-
-#include "../platform.h"
-
-static int mmc_activity;
-
-static void pb1200mmc0_set_power(void *mmc_host, int state)
-{
-       if (state)
-               bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_SD0PWR);
-       else
-               bcsr_mod(BCSR_BOARD, BCSR_BOARD_SD0PWR, 0);
-
-       msleep(1);
-}
-
-static int pb1200mmc0_card_readonly(void *mmc_host)
-{
-       return (bcsr_read(BCSR_STATUS) & BCSR_STATUS_SD0WP) ? 1 : 0;
-}
-
-static int pb1200mmc0_card_inserted(void *mmc_host)
-{
-       return (bcsr_read(BCSR_SIGSTAT) & BCSR_INT_SD0INSERT) ? 1 : 0;
-}
-
-static void pb1200_mmcled_set(struct led_classdev *led,
-                       enum led_brightness brightness)
-{
-       if (brightness != LED_OFF) {
-               if (++mmc_activity == 1)
-                       bcsr_mod(BCSR_LEDS, BCSR_LEDS_LED0, 0);
-       } else {
-               if (--mmc_activity == 0)
-                       bcsr_mod(BCSR_LEDS, 0, BCSR_LEDS_LED0);
-       }
-}
-
-static struct led_classdev pb1200mmc_led = {
-       .brightness_set = pb1200_mmcled_set,
-};
-
-static void pb1200mmc1_set_power(void *mmc_host, int state)
-{
-       if (state)
-               bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_SD1PWR);
-       else
-               bcsr_mod(BCSR_BOARD, BCSR_BOARD_SD1PWR, 0);
-
-       msleep(1);
-}
-
-static int pb1200mmc1_card_readonly(void *mmc_host)
-{
-       return (bcsr_read(BCSR_STATUS) & BCSR_STATUS_SD1WP) ? 1 : 0;
-}
-
-static int pb1200mmc1_card_inserted(void *mmc_host)
-{
-       return (bcsr_read(BCSR_SIGSTAT) & BCSR_INT_SD1INSERT) ? 1 : 0;
-}
-
-static struct au1xmmc_platform_data pb1200mmc_platdata[2] = {
-       [0] = {
-               .set_power      = pb1200mmc0_set_power,
-               .card_inserted  = pb1200mmc0_card_inserted,
-               .card_readonly  = pb1200mmc0_card_readonly,
-               .cd_setup       = NULL,         /* use poll-timer in driver */
-               .led            = &pb1200mmc_led,
-       },
-       [1] = {
-               .set_power      = pb1200mmc1_set_power,
-               .card_inserted  = pb1200mmc1_card_inserted,
-               .card_readonly  = pb1200mmc1_card_readonly,
-               .cd_setup       = NULL,         /* use poll-timer in driver */
-               .led            = &pb1200mmc_led,
-       },
-};
-
-static u64 au1xxx_mmc_dmamask =  DMA_BIT_MASK(32);
-
-static struct resource au1200_mmc0_res[] = {
-       [0] = {
-               .start  = AU1100_SD0_PHYS_ADDR,
-               .end    = AU1100_SD0_PHYS_ADDR + 0xfff,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = AU1200_SD_INT,
-               .end    = AU1200_SD_INT,
-               .flags  = IORESOURCE_IRQ,
-       },
-       [2] = {
-               .start  = AU1200_DSCR_CMD0_SDMS_TX0,
-               .end    = AU1200_DSCR_CMD0_SDMS_TX0,
-               .flags  = IORESOURCE_DMA,
-       },
-       [3] = {
-               .start  = AU1200_DSCR_CMD0_SDMS_RX0,
-               .end    = AU1200_DSCR_CMD0_SDMS_RX0,
-               .flags  = IORESOURCE_DMA,
-       }
-};
-
-static struct platform_device pb1200_mmc0_dev = {
-       .name           = "au1xxx-mmc",
-       .id             = 0,
-       .dev = {
-               .dma_mask               = &au1xxx_mmc_dmamask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-               .platform_data          = &pb1200mmc_platdata[0],
-       },
-       .num_resources  = ARRAY_SIZE(au1200_mmc0_res),
-       .resource       = au1200_mmc0_res,
-};
-
-static struct resource au1200_mmc1_res[] = {
-       [0] = {
-               .start  = AU1100_SD1_PHYS_ADDR,
-               .end    = AU1100_SD1_PHYS_ADDR + 0xfff,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = AU1200_SD_INT,
-               .end    = AU1200_SD_INT,
-               .flags  = IORESOURCE_IRQ,
-       },
-       [2] = {
-               .start  = AU1200_DSCR_CMD0_SDMS_TX1,
-               .end    = AU1200_DSCR_CMD0_SDMS_TX1,
-               .flags  = IORESOURCE_DMA,
-       },
-       [3] = {
-               .start  = AU1200_DSCR_CMD0_SDMS_RX1,
-               .end    = AU1200_DSCR_CMD0_SDMS_RX1,
-               .flags  = IORESOURCE_DMA,
-       }
-};
-
-static struct platform_device pb1200_mmc1_dev = {
-       .name           = "au1xxx-mmc",
-       .id             = 1,
-       .dev = {
-               .dma_mask               = &au1xxx_mmc_dmamask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-               .platform_data          = &pb1200mmc_platdata[1],
-       },
-       .num_resources  = ARRAY_SIZE(au1200_mmc1_res),
-       .resource       = au1200_mmc1_res,
-};
-
-
-static struct resource ide_resources[] = {
-       [0] = {
-               .start  = IDE_PHYS_ADDR,
-               .end    = IDE_PHYS_ADDR + IDE_PHYS_LEN - 1,
-               .flags  = IORESOURCE_MEM
-       },
-       [1] = {
-               .start  = IDE_INT,
-               .end    = IDE_INT,
-               .flags  = IORESOURCE_IRQ
-       },
-       [2] = {
-               .start  = AU1200_DSCR_CMD0_DMA_REQ1,
-               .end    = AU1200_DSCR_CMD0_DMA_REQ1,
-               .flags  = IORESOURCE_DMA,
-       },
-};
-
-static u64 ide_dmamask = DMA_BIT_MASK(32);
-
-static struct platform_device ide_device = {
-       .name           = "au1200-ide",
-       .id             = 0,
-       .dev = {
-               .dma_mask               = &ide_dmamask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-       },
-       .num_resources  = ARRAY_SIZE(ide_resources),
-       .resource       = ide_resources
-};
-
-static struct smc91x_platdata smc_data = {
-       .flags  = SMC91X_NOWAIT | SMC91X_USE_16BIT,
-       .leda   = RPC_LED_100_10,
-       .ledb   = RPC_LED_TX_RX,
-};
-
-static struct resource smc91c111_resources[] = {
-       [0] = {
-               .name   = "smc91x-regs",
-               .start  = SMC91C111_PHYS_ADDR,
-               .end    = SMC91C111_PHYS_ADDR + 0xf,
-               .flags  = IORESOURCE_MEM
-       },
-       [1] = {
-               .start  = SMC91C111_INT,
-               .end    = SMC91C111_INT,
-               .flags  = IORESOURCE_IRQ
-       },
-};
-
-static struct platform_device smc91c111_device = {
-       .dev    = {
-               .platform_data  = &smc_data,
-       },
-       .name           = "smc91x",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(smc91c111_resources),
-       .resource       = smc91c111_resources
-};
-
-static struct resource au1200_psc0_res[] = {
-       [0] = {
-               .start  = AU1550_PSC0_PHYS_ADDR,
-               .end    = AU1550_PSC0_PHYS_ADDR + 0xfff,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = AU1200_PSC0_INT,
-               .end    = AU1200_PSC0_INT,
-               .flags  = IORESOURCE_IRQ,
-       },
-       [2] = {
-               .start  = AU1200_DSCR_CMD0_PSC0_TX,
-               .end    = AU1200_DSCR_CMD0_PSC0_TX,
-               .flags  = IORESOURCE_DMA,
-       },
-       [3] = {
-               .start  = AU1200_DSCR_CMD0_PSC0_RX,
-               .end    = AU1200_DSCR_CMD0_PSC0_RX,
-               .flags  = IORESOURCE_DMA,
-       },
-};
-
-static struct platform_device pb1200_i2c_dev = {
-       .name           = "au1xpsc_smbus",
-       .id             = 0,    /* bus number */
-       .num_resources  = ARRAY_SIZE(au1200_psc0_res),
-       .resource       = au1200_psc0_res,
-};
-
-static struct resource au1200_lcd_res[] = {
-       [0] = {
-               .start  = AU1200_LCD_PHYS_ADDR,
-               .end    = AU1200_LCD_PHYS_ADDR + 0x800 - 1,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = AU1200_LCD_INT,
-               .end    = AU1200_LCD_INT,
-               .flags  = IORESOURCE_IRQ,
-       }
-};
-
-static u64 au1200_lcd_dmamask = DMA_BIT_MASK(32);
-
-static struct platform_device au1200_lcd_dev = {
-       .name           = "au1200-lcd",
-       .id             = 0,
-       .dev = {
-               .dma_mask               = &au1200_lcd_dmamask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-       },
-       .num_resources  = ARRAY_SIZE(au1200_lcd_res),
-       .resource       = au1200_lcd_res,
-};
-
-static struct platform_device *board_platform_devices[] __initdata = {
-       &ide_device,
-       &smc91c111_device,
-       &pb1200_i2c_dev,
-       &pb1200_mmc0_dev,
-       &pb1200_mmc1_dev,
-       &au1200_lcd_dev,
-};
-
-static int __init board_register_devices(void)
-{
-       int swapped;
-
-       db1x_register_pcmcia_socket(
-               AU1000_PCMCIA_ATTR_PHYS_ADDR,
-               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1,
-               AU1000_PCMCIA_MEM_PHYS_ADDR,
-               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x000400000 - 1,
-               AU1000_PCMCIA_IO_PHYS_ADDR,
-               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x000010000 - 1,
-               PB1200_PC0_INT, PB1200_PC0_INSERT_INT,
-               /*PB1200_PC0_STSCHG_INT*/0, PB1200_PC0_EJECT_INT, 0);
-
-       db1x_register_pcmcia_socket(
-               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x008000000,
-               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x008400000 - 1,
-               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x008000000,
-               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x008400000 - 1,
-               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x008000000,
-               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x008010000 - 1,
-               PB1200_PC1_INT, PB1200_PC1_INSERT_INT,
-               /*PB1200_PC1_STSCHG_INT*/0, PB1200_PC1_EJECT_INT, 1);
-
-       swapped = bcsr_read(BCSR_STATUS) &  BCSR_STATUS_DB1200_SWAPBOOT;
-       db1x_register_norflash(128 * 1024 * 1024, 2, swapped);
-
-       return platform_add_devices(board_platform_devices,
-                                   ARRAY_SIZE(board_platform_devices));
-}
-device_initcall(board_register_devices);
diff --git a/arch/mips/alchemy/devboards/pb1500.c b/arch/mips/alchemy/devboards/pb1500.c
new file mode 100644 (file)
index 0000000..e7b807b
--- /dev/null
@@ -0,0 +1,198 @@
+/*
+ * Pb1500 board support.
+ *
+ * Copyright (C) 2009 Manuel Lauss
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include <linux/delay.h>
+#include <linux/dma-mapping.h>
+#include <linux/gpio.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-db1x00/bcsr.h>
+#include <prom.h>
+#include "platform.h"
+
+const char *get_system_type(void)
+{
+       return "PB1500";
+}
+
+void __init board_setup(void)
+{
+       u32 pin_func;
+       u32 sys_freqctrl, sys_clksrc;
+
+       bcsr_init(DB1000_BCSR_PHYS_ADDR,
+                 DB1000_BCSR_PHYS_ADDR + DB1000_BCSR_HEXLED_OFS);
+
+       sys_clksrc = sys_freqctrl = pin_func = 0;
+       /* Set AUX clock to 12 MHz * 8 = 96 MHz */
+       au_writel(8, SYS_AUXPLL);
+       alchemy_gpio1_input_enable();
+       udelay(100);
+
+       /* GPIO201 is input for PCMCIA card detect */
+       /* GPIO203 is input for PCMCIA interrupt request */
+       alchemy_gpio_direction_input(201);
+       alchemy_gpio_direction_input(203);
+
+#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
+
+       /* Zero and disable FREQ2 */
+       sys_freqctrl = au_readl(SYS_FREQCTRL0);
+       sys_freqctrl &= ~0xFFF00000;
+       au_writel(sys_freqctrl, SYS_FREQCTRL0);
+
+       /* zero and disable USBH/USBD clocks */
+       sys_clksrc = au_readl(SYS_CLKSRC);
+       sys_clksrc &= ~(SYS_CS_CUD | SYS_CS_DUD | SYS_CS_MUD_MASK |
+                       SYS_CS_CUH | SYS_CS_DUH | SYS_CS_MUH_MASK);
+       au_writel(sys_clksrc, SYS_CLKSRC);
+
+       sys_freqctrl = au_readl(SYS_FREQCTRL0);
+       sys_freqctrl &= ~0xFFF00000;
+
+       sys_clksrc = au_readl(SYS_CLKSRC);
+       sys_clksrc &= ~(SYS_CS_CUD | SYS_CS_DUD | SYS_CS_MUD_MASK |
+                       SYS_CS_CUH | SYS_CS_DUH | SYS_CS_MUH_MASK);
+
+       /* FREQ2 = aux/2 = 48 MHz */
+       sys_freqctrl |= (0 << SYS_FC_FRDIV2_BIT) | SYS_FC_FE2 | SYS_FC_FS2;
+       au_writel(sys_freqctrl, SYS_FREQCTRL0);
+
+       /*
+        * Route 48MHz FREQ2 into USB Host and/or Device
+        */
+       sys_clksrc |= SYS_CS_MUX_FQ2 << SYS_CS_MUH_BIT;
+       au_writel(sys_clksrc, SYS_CLKSRC);
+
+       pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_USB;
+       /* 2nd USB port is USB host */
+       pin_func |= SYS_PF_USB;
+       au_writel(pin_func, SYS_PINFUNC);
+#endif /* defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) */
+
+#ifdef CONFIG_PCI
+       {
+               void __iomem *base =
+                               (void __iomem *)KSEG1ADDR(AU1500_PCI_PHYS_ADDR);
+               /* Setup PCI bus controller */
+               __raw_writel(0x00003fff, base + PCI_REG_CMEM);
+               __raw_writel(0xf0000000, base + PCI_REG_MWMASK_DEV);
+               __raw_writel(0, base + PCI_REG_MWBASE_REV_CCL);
+               __raw_writel(0x02a00356, base + PCI_REG_STATCMD);
+               __raw_writel(0x00003c04, base + PCI_REG_PARAM);
+               __raw_writel(0x00000008, base + PCI_REG_MBAR);
+               wmb();
+       }
+#endif
+
+       /* Enable sys bus clock divider when IDLE state or no bus activity. */
+       au_writel(au_readl(SYS_POWERCTRL) | (0x3 << 5), SYS_POWERCTRL);
+
+       /* Enable the RTC if not already enabled */
+       if (!(au_readl(0xac000028) & 0x20)) {
+               printk(KERN_INFO "enabling clock ...\n");
+               au_writel((au_readl(0xac000028) | 0x20), 0xac000028);
+       }
+       /* Put the clock in BCD mode */
+       if (au_readl(0xac00002c) & 0x4) { /* reg B */
+               au_writel(au_readl(0xac00002c) & ~0x4, 0xac00002c);
+               au_sync();
+       }
+}
+
+/******************************************************************************/
+
+static int pb1500_map_pci_irq(const struct pci_dev *d, u8 slot, u8 pin)
+{
+       if ((slot < 12) || (slot > 13) || pin == 0)
+               return -1;
+       if (slot == 12)
+               return (pin == 1) ? AU1500_PCI_INTA : 0xff;
+       if (slot == 13) {
+               switch (pin) {
+               case 1: return AU1500_PCI_INTA;
+               case 2: return AU1500_PCI_INTB;
+               case 3: return AU1500_PCI_INTC;
+               case 4: return AU1500_PCI_INTD;
+               }
+       }
+       return -1;
+}
+
+static struct resource alchemy_pci_host_res[] = {
+       [0] = {
+               .start  = AU1500_PCI_PHYS_ADDR,
+               .end    = AU1500_PCI_PHYS_ADDR + 0xfff,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct alchemy_pci_platdata pb1500_pci_pd = {
+       .board_map_irq  = pb1500_map_pci_irq,
+       .pci_cfg_set    = PCI_CONFIG_AEN | PCI_CONFIG_R2H | PCI_CONFIG_R1H |
+                         PCI_CONFIG_CH |
+#if defined(__MIPSEB__)
+                         PCI_CONFIG_SIC_HWA_DAT | PCI_CONFIG_SM,
+#else
+                         0,
+#endif
+};
+
+static struct platform_device pb1500_pci_host = {
+       .dev.platform_data = &pb1500_pci_pd,
+       .name           = "alchemy-pci",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(alchemy_pci_host_res),
+       .resource       = alchemy_pci_host_res,
+};
+
+static int __init pb1500_dev_init(void)
+{
+       int swapped;
+
+       irq_set_irq_type(AU1500_GPIO9_INT,   IRQF_TRIGGER_LOW);   /* CD0# */
+       irq_set_irq_type(AU1500_GPIO10_INT,  IRQF_TRIGGER_LOW);  /* CARD0 */
+       irq_set_irq_type(AU1500_GPIO11_INT,  IRQF_TRIGGER_LOW);  /* STSCHG0# */
+       irq_set_irq_type(AU1500_GPIO204_INT, IRQF_TRIGGER_HIGH);
+       irq_set_irq_type(AU1500_GPIO201_INT, IRQF_TRIGGER_LOW);
+       irq_set_irq_type(AU1500_GPIO202_INT, IRQF_TRIGGER_LOW);
+       irq_set_irq_type(AU1500_GPIO203_INT, IRQF_TRIGGER_LOW);
+       irq_set_irq_type(AU1500_GPIO205_INT, IRQF_TRIGGER_LOW);
+
+       /* PCMCIA. single socket, identical to Pb1100 */
+       db1x_register_pcmcia_socket(
+               AU1000_PCMCIA_ATTR_PHYS_ADDR,
+               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1,
+               AU1000_PCMCIA_MEM_PHYS_ADDR,
+               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x000400000 - 1,
+               AU1000_PCMCIA_IO_PHYS_ADDR,
+               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x000010000 - 1,
+               AU1500_GPIO11_INT, AU1500_GPIO9_INT,     /* card / insert */
+               /*AU1500_GPIO10_INT*/0, 0, 0); /* stschg / eject / id */
+
+       swapped = bcsr_read(BCSR_STATUS) &  BCSR_STATUS_DB1000_SWAPBOOT;
+       db1x_register_norflash(64 * 1024 * 1024, 4, swapped);
+       platform_device_register(&pb1500_pci_host);
+
+       return 0;
+}
+arch_initcall(pb1500_dev_init);
diff --git a/arch/mips/alchemy/devboards/pb1500/Makefile b/arch/mips/alchemy/devboards/pb1500/Makefile
deleted file mode 100644 (file)
index e83b151..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-#  Copyright 2000, 2001, 2008 MontaVista Software Inc.
-#  Author: MontaVista Software, Inc. <source@mvista.com>
-#
-# Makefile for the Alchemy Semiconductor Pb1500 board.
-#
-
-obj-y := board_setup.o platform.o
diff --git a/arch/mips/alchemy/devboards/pb1500/board_setup.c b/arch/mips/alchemy/devboards/pb1500/board_setup.c
deleted file mode 100644 (file)
index 37c1883..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright 2000, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/delay.h>
-#include <linux/gpio.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-db1x00/bcsr.h>
-
-#include <prom.h>
-
-const char *get_system_type(void)
-{
-       return "Alchemy Pb1500";
-}
-
-void __init board_setup(void)
-{
-       u32 pin_func;
-       u32 sys_freqctrl, sys_clksrc;
-
-       bcsr_init(DB1000_BCSR_PHYS_ADDR,
-                 DB1000_BCSR_PHYS_ADDR + DB1000_BCSR_HEXLED_OFS);
-
-       sys_clksrc = sys_freqctrl = pin_func = 0;
-       /* Set AUX clock to 12 MHz * 8 = 96 MHz */
-       au_writel(8, SYS_AUXPLL);
-       alchemy_gpio1_input_enable();
-       udelay(100);
-
-       /* GPIO201 is input for PCMCIA card detect */
-       /* GPIO203 is input for PCMCIA interrupt request */
-       alchemy_gpio_direction_input(201);
-       alchemy_gpio_direction_input(203);
-
-#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
-
-       /* Zero and disable FREQ2 */
-       sys_freqctrl = au_readl(SYS_FREQCTRL0);
-       sys_freqctrl &= ~0xFFF00000;
-       au_writel(sys_freqctrl, SYS_FREQCTRL0);
-
-       /* zero and disable USBH/USBD clocks */
-       sys_clksrc = au_readl(SYS_CLKSRC);
-       sys_clksrc &= ~(SYS_CS_CUD | SYS_CS_DUD | SYS_CS_MUD_MASK |
-                       SYS_CS_CUH | SYS_CS_DUH | SYS_CS_MUH_MASK);
-       au_writel(sys_clksrc, SYS_CLKSRC);
-
-       sys_freqctrl = au_readl(SYS_FREQCTRL0);
-       sys_freqctrl &= ~0xFFF00000;
-
-       sys_clksrc = au_readl(SYS_CLKSRC);
-       sys_clksrc &= ~(SYS_CS_CUD | SYS_CS_DUD | SYS_CS_MUD_MASK |
-                       SYS_CS_CUH | SYS_CS_DUH | SYS_CS_MUH_MASK);
-
-       /* FREQ2 = aux/2 = 48 MHz */
-       sys_freqctrl |= (0 << SYS_FC_FRDIV2_BIT) | SYS_FC_FE2 | SYS_FC_FS2;
-       au_writel(sys_freqctrl, SYS_FREQCTRL0);
-
-       /*
-        * Route 48MHz FREQ2 into USB Host and/or Device
-        */
-       sys_clksrc |= SYS_CS_MUX_FQ2 << SYS_CS_MUH_BIT;
-       au_writel(sys_clksrc, SYS_CLKSRC);
-
-       pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_USB;
-       /* 2nd USB port is USB host */
-       pin_func |= SYS_PF_USB;
-       au_writel(pin_func, SYS_PINFUNC);
-#endif /* defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) */
-
-#ifdef CONFIG_PCI
-       {
-               void __iomem *base =
-                               (void __iomem *)KSEG1ADDR(AU1500_PCI_PHYS_ADDR);
-               /* Setup PCI bus controller */
-               __raw_writel(0x00003fff, base + PCI_REG_CMEM);
-               __raw_writel(0xf0000000, base + PCI_REG_MWMASK_DEV);
-               __raw_writel(0, base + PCI_REG_MWBASE_REV_CCL);
-               __raw_writel(0x02a00356, base + PCI_REG_STATCMD);
-               __raw_writel(0x00003c04, base + PCI_REG_PARAM);
-               __raw_writel(0x00000008, base + PCI_REG_MBAR);
-               wmb();
-       }
-#endif
-
-       /* Enable sys bus clock divider when IDLE state or no bus activity. */
-       au_writel(au_readl(SYS_POWERCTRL) | (0x3 << 5), SYS_POWERCTRL);
-
-       /* Enable the RTC if not already enabled */
-       if (!(au_readl(0xac000028) & 0x20)) {
-               printk(KERN_INFO "enabling clock ...\n");
-               au_writel((au_readl(0xac000028) | 0x20), 0xac000028);
-       }
-       /* Put the clock in BCD mode */
-       if (au_readl(0xac00002c) & 0x4) { /* reg B */
-               au_writel(au_readl(0xac00002c) & ~0x4, 0xac00002c);
-               au_sync();
-       }
-}
-
-static int __init pb1500_init_irq(void)
-{
-       irq_set_irq_type(AU1500_GPIO9_INT, IRQF_TRIGGER_LOW);   /* CD0# */
-       irq_set_irq_type(AU1500_GPIO10_INT, IRQF_TRIGGER_LOW);  /* CARD0 */
-       irq_set_irq_type(AU1500_GPIO11_INT, IRQF_TRIGGER_LOW);  /* STSCHG0# */
-       irq_set_irq_type(AU1500_GPIO204_INT, IRQF_TRIGGER_HIGH);
-       irq_set_irq_type(AU1500_GPIO201_INT, IRQF_TRIGGER_LOW);
-       irq_set_irq_type(AU1500_GPIO202_INT, IRQF_TRIGGER_LOW);
-       irq_set_irq_type(AU1500_GPIO203_INT, IRQF_TRIGGER_LOW);
-       irq_set_irq_type(AU1500_GPIO205_INT, IRQF_TRIGGER_LOW);
-
-       return 0;
-}
-arch_initcall(pb1500_init_irq);
diff --git a/arch/mips/alchemy/devboards/pb1500/platform.c b/arch/mips/alchemy/devboards/pb1500/platform.c
deleted file mode 100644 (file)
index 1e52a01..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Pb1500 board platform device registration
- *
- * Copyright (C) 2009 Manuel Lauss
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include <linux/dma-mapping.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-db1x00/bcsr.h>
-
-#include "../platform.h"
-
-static int pb1500_map_pci_irq(const struct pci_dev *d, u8 slot, u8 pin)
-{
-       if ((slot < 12) || (slot > 13) || pin == 0)
-               return -1;
-       if (slot == 12)
-               return (pin == 1) ? AU1500_PCI_INTA : 0xff;
-       if (slot == 13) {
-               switch (pin) {
-               case 1: return AU1500_PCI_INTA;
-               case 2: return AU1500_PCI_INTB;
-               case 3: return AU1500_PCI_INTC;
-               case 4: return AU1500_PCI_INTD;
-               }
-       }
-       return -1;
-}
-
-static struct resource alchemy_pci_host_res[] = {
-       [0] = {
-               .start  = AU1500_PCI_PHYS_ADDR,
-               .end    = AU1500_PCI_PHYS_ADDR + 0xfff,
-               .flags  = IORESOURCE_MEM,
-       },
-};
-
-static struct alchemy_pci_platdata pb1500_pci_pd = {
-       .board_map_irq  = pb1500_map_pci_irq,
-       .pci_cfg_set    = PCI_CONFIG_AEN | PCI_CONFIG_R2H | PCI_CONFIG_R1H |
-                         PCI_CONFIG_CH |
-#if defined(__MIPSEB__)
-                         PCI_CONFIG_SIC_HWA_DAT | PCI_CONFIG_SM,
-#else
-                         0,
-#endif
-};
-
-static struct platform_device pb1500_pci_host = {
-       .dev.platform_data = &pb1500_pci_pd,
-       .name           = "alchemy-pci",
-       .id             = 0,
-       .num_resources  = ARRAY_SIZE(alchemy_pci_host_res),
-       .resource       = alchemy_pci_host_res,
-};
-
-static int __init pb1500_dev_init(void)
-{
-       int swapped;
-
-       /* PCMCIA. single socket, identical to Pb1100 */
-       db1x_register_pcmcia_socket(
-               AU1000_PCMCIA_ATTR_PHYS_ADDR,
-               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1,
-               AU1000_PCMCIA_MEM_PHYS_ADDR,
-               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x000400000 - 1,
-               AU1000_PCMCIA_IO_PHYS_ADDR,
-               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x000010000 - 1,
-               AU1500_GPIO11_INT, AU1500_GPIO9_INT,     /* card / insert */
-               /*AU1500_GPIO10_INT*/0, 0, 0); /* stschg / eject / id */
-
-       swapped = bcsr_read(BCSR_STATUS) &  BCSR_STATUS_DB1000_SWAPBOOT;
-       db1x_register_norflash(64 * 1024 * 1024, 4, swapped);
-       platform_device_register(&pb1500_pci_host);
-
-       return 0;
-}
-arch_initcall(pb1500_dev_init);
diff --git a/arch/mips/alchemy/devboards/pb1550.c b/arch/mips/alchemy/devboards/pb1550.c
new file mode 100644 (file)
index 0000000..b37e7de
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+ * Pb1550 board support.
+ *
+ * Copyright (C) 2009-2011 Manuel Lauss
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include <linux/dma-mapping.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-au1x00/au1xxx_dbdma.h>
+#include <asm/mach-au1x00/au1550nd.h>
+#include <asm/mach-au1x00/gpio.h>
+#include <asm/mach-db1x00/bcsr.h>
+#include "platform.h"
+
+const char *get_system_type(void)
+{
+       return "PB1550";
+}
+
+void __init board_setup(void)
+{
+       u32 pin_func;
+
+       bcsr_init(PB1550_BCSR_PHYS_ADDR,
+                 PB1550_BCSR_PHYS_ADDR + PB1550_BCSR_HEXLED_OFS);
+
+       alchemy_gpio2_enable();
+
+       /*
+        * Enable PSC1 SYNC for AC'97.  Normaly done in audio driver,
+        * but it is board specific code, so put it here.
+        */
+       pin_func = au_readl(SYS_PINFUNC);
+       au_sync();
+       pin_func |= SYS_PF_MUST_BE_SET | SYS_PF_PSC1_S1;
+       au_writel(pin_func, SYS_PINFUNC);
+
+       bcsr_write(BCSR_PCMCIA, 0);     /* turn off PCMCIA power */
+
+       printk(KERN_INFO "AMD Alchemy Pb1550 Board\n");
+}
+
+/******************************************************************************/
+
+static int pb1550_map_pci_irq(const struct pci_dev *d, u8 slot, u8 pin)
+{
+       if ((slot < 12) || (slot > 13) || pin == 0)
+               return -1;
+       if (slot == 12) {
+               switch (pin) {
+               case 1: return AU1500_PCI_INTB;
+               case 2: return AU1500_PCI_INTC;
+               case 3: return AU1500_PCI_INTD;
+               case 4: return AU1500_PCI_INTA;
+               }
+       }
+       if (slot == 13) {
+               switch (pin) {
+               case 1: return AU1500_PCI_INTA;
+               case 2: return AU1500_PCI_INTB;
+               case 3: return AU1500_PCI_INTC;
+               case 4: return AU1500_PCI_INTD;
+               }
+       }
+       return -1;
+}
+
+static struct resource alchemy_pci_host_res[] = {
+       [0] = {
+               .start  = AU1500_PCI_PHYS_ADDR,
+               .end    = AU1500_PCI_PHYS_ADDR + 0xfff,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct alchemy_pci_platdata pb1550_pci_pd = {
+       .board_map_irq  = pb1550_map_pci_irq,
+};
+
+static struct platform_device pb1550_pci_host = {
+       .dev.platform_data = &pb1550_pci_pd,
+       .name           = "alchemy-pci",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(alchemy_pci_host_res),
+       .resource       = alchemy_pci_host_res,
+};
+
+static struct resource au1550_psc2_res[] = {
+       [0] = {
+               .start  = AU1550_PSC2_PHYS_ADDR,
+               .end    = AU1550_PSC2_PHYS_ADDR + 0xfff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AU1550_PSC2_INT,
+               .end    = AU1550_PSC2_INT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = AU1550_DSCR_CMD0_PSC2_TX,
+               .end    = AU1550_DSCR_CMD0_PSC2_TX,
+               .flags  = IORESOURCE_DMA,
+       },
+       [3] = {
+               .start  = AU1550_DSCR_CMD0_PSC2_RX,
+               .end    = AU1550_DSCR_CMD0_PSC2_RX,
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+static struct platform_device pb1550_i2c_dev = {
+       .name           = "au1xpsc_smbus",
+       .id             = 0,    /* bus number */
+       .num_resources  = ARRAY_SIZE(au1550_psc2_res),
+       .resource       = au1550_psc2_res,
+};
+
+static struct mtd_partition pb1550_nand_parts[] = {
+       [0] = {
+               .name   = "NAND FS 0",
+               .offset = 0,
+               .size   = 8 * 1024 * 1024,
+       },
+       [1] = {
+               .name   = "NAND FS 1",
+               .offset = MTDPART_OFS_APPEND,
+               .size   = MTDPART_SIZ_FULL,
+       },
+};
+
+static struct au1550nd_platdata pb1550_nand_pd = {
+       .parts          = pb1550_nand_parts,
+       .num_parts      = ARRAY_SIZE(pb1550_nand_parts),
+       .devwidth       = 0,    /* x8 NAND default, needs fixing up */
+};
+
+static struct resource pb1550_nand_res[] = {
+       [0] = {
+               .start  = 0x20000000,
+               .end    = 0x20000fff,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device pb1550_nand_dev = {
+       .name           = "au1550-nand",
+       .id             = -1,
+       .resource       = pb1550_nand_res,
+       .num_resources  = ARRAY_SIZE(pb1550_nand_res),
+       .dev            = {
+               .platform_data  = &pb1550_nand_pd,
+       },
+};
+
+static void __init pb1550_nand_setup(void)
+{
+       int boot_swapboot = (au_readl(MEM_STSTAT) & (0x7 << 1)) |
+                           ((bcsr_read(BCSR_STATUS) >> 6) & 0x1);
+
+       switch (boot_swapboot) {
+       case 0:
+       case 2:
+       case 8:
+       case 0xC:
+       case 0xD:
+               /* x16 NAND Flash */
+               pb1550_nand_pd.devwidth = 1;
+               /* fallthrough */
+       case 1:
+       case 9:
+       case 3:
+       case 0xE:
+       case 0xF:
+               /* x8 NAND, already set up */
+               platform_device_register(&pb1550_nand_dev);
+       }
+}
+
+static int __init pb1550_dev_init(void)
+{
+       int swapped;
+
+       irq_set_irq_type(AU1550_GPIO0_INT, IRQF_TRIGGER_LOW);
+       irq_set_irq_type(AU1550_GPIO1_INT, IRQF_TRIGGER_LOW);
+       irq_set_irq_type(AU1550_GPIO201_205_INT, IRQF_TRIGGER_HIGH);
+
+       /* enable both PCMCIA card irqs in the shared line */
+       alchemy_gpio2_enable_int(201);
+       alchemy_gpio2_enable_int(202);
+
+       /* Pb1550, like all others, also has statuschange irqs; however they're
+       * wired up on one of the Au1550's shared GPIO201_205 line, which also
+       * services the PCMCIA card interrupts.  So we ignore statuschange and
+       * use the GPIO201_205 exclusively for card interrupts, since a) pcmcia
+       * drivers are used to shared irqs and b) statuschange isn't really use-
+       * ful anyway.
+       */
+       db1x_register_pcmcia_socket(
+               AU1000_PCMCIA_ATTR_PHYS_ADDR,
+               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1,
+               AU1000_PCMCIA_MEM_PHYS_ADDR,
+               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x000400000 - 1,
+               AU1000_PCMCIA_IO_PHYS_ADDR,
+               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x000010000 - 1,
+               AU1550_GPIO201_205_INT, AU1550_GPIO0_INT, 0, 0, 0);
+
+       db1x_register_pcmcia_socket(
+               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x008000000,
+               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x008400000 - 1,
+               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x008000000,
+               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x008400000 - 1,
+               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x008000000,
+               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x008010000 - 1,
+               AU1550_GPIO201_205_INT, AU1550_GPIO1_INT, 0, 0, 1);
+
+       /* NAND setup */
+       gpio_direction_input(206);      /* GPIO206 high */
+       pb1550_nand_setup();
+
+       swapped = bcsr_read(BCSR_STATUS) & BCSR_STATUS_PB1550_SWAPBOOT;
+       db1x_register_norflash(128 * 1024 * 1024, 4, swapped);
+       platform_device_register(&pb1550_pci_host);
+       platform_device_register(&pb1550_i2c_dev);
+
+       return 0;
+}
+arch_initcall(pb1550_dev_init);
diff --git a/arch/mips/alchemy/devboards/pb1550/Makefile b/arch/mips/alchemy/devboards/pb1550/Makefile
deleted file mode 100644 (file)
index 9661b6e..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-#  Copyright 2000, 2008 MontaVista Software Inc.
-#  Author: MontaVista Software, Inc. <source@mvista.com>
-#
-# Makefile for the Alchemy Semiconductor Pb1550 board.
-#
-
-obj-y := board_setup.o platform.o
diff --git a/arch/mips/alchemy/devboards/pb1550/board_setup.c b/arch/mips/alchemy/devboards/pb1550/board_setup.c
deleted file mode 100644 (file)
index 0f62d1e..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     Alchemy Pb1550 board setup.
- *
- * Copyright 2000, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-#include <linux/interrupt.h>
-
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-pb1x00/pb1550.h>
-#include <asm/mach-db1x00/bcsr.h>
-#include <asm/mach-au1x00/gpio.h>
-
-#include <prom.h>
-
-const char *get_system_type(void)
-{
-       return "Alchemy Pb1550";
-}
-
-void __init board_setup(void)
-{
-       u32 pin_func;
-
-       bcsr_init(PB1550_BCSR_PHYS_ADDR,
-                 PB1550_BCSR_PHYS_ADDR + PB1550_BCSR_HEXLED_OFS);
-
-       alchemy_gpio2_enable();
-
-       /*
-        * Enable PSC1 SYNC for AC'97.  Normaly done in audio driver,
-        * but it is board specific code, so put it here.
-        */
-       pin_func = au_readl(SYS_PINFUNC);
-       au_sync();
-       pin_func |= SYS_PF_MUST_BE_SET | SYS_PF_PSC1_S1;
-       au_writel(pin_func, SYS_PINFUNC);
-
-       bcsr_write(BCSR_PCMCIA, 0);     /* turn off PCMCIA power */
-
-       printk(KERN_INFO "AMD Alchemy Pb1550 Board\n");
-}
-
-static int __init pb1550_init_irq(void)
-{
-       irq_set_irq_type(AU1550_GPIO0_INT, IRQF_TRIGGER_LOW);
-       irq_set_irq_type(AU1550_GPIO1_INT, IRQF_TRIGGER_LOW);
-       irq_set_irq_type(AU1550_GPIO201_205_INT, IRQF_TRIGGER_HIGH);
-
-       /* enable both PCMCIA card irqs in the shared line */
-       alchemy_gpio2_enable_int(201);
-       alchemy_gpio2_enable_int(202);
-
-       return 0;
-}
-arch_initcall(pb1550_init_irq);
diff --git a/arch/mips/alchemy/devboards/pb1550/platform.c b/arch/mips/alchemy/devboards/pb1550/platform.c
deleted file mode 100644 (file)
index a4604b8..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Pb1550 board platform device registration
- *
- * Copyright (C) 2009 Manuel Lauss
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include <linux/dma-mapping.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-au1x00/au1xxx_dbdma.h>
-#include <asm/mach-pb1x00/pb1550.h>
-#include <asm/mach-db1x00/bcsr.h>
-
-#include "../platform.h"
-
-static int pb1550_map_pci_irq(const struct pci_dev *d, u8 slot, u8 pin)
-{
-       if ((slot < 12) || (slot > 13) || pin == 0)
-               return -1;
-       if (slot == 12) {
-               switch (pin) {
-               case 1: return AU1500_PCI_INTB;
-               case 2: return AU1500_PCI_INTC;
-               case 3: return AU1500_PCI_INTD;
-               case 4: return AU1500_PCI_INTA;
-               }
-       }
-       if (slot == 13) {
-               switch (pin) {
-               case 1: return AU1500_PCI_INTA;
-               case 2: return AU1500_PCI_INTB;
-               case 3: return AU1500_PCI_INTC;
-               case 4: return AU1500_PCI_INTD;
-               }
-       }
-       return -1;
-}
-
-static struct resource alchemy_pci_host_res[] = {
-       [0] = {
-               .start  = AU1500_PCI_PHYS_ADDR,
-               .end    = AU1500_PCI_PHYS_ADDR + 0xfff,
-               .flags  = IORESOURCE_MEM,
-       },
-};
-
-static struct alchemy_pci_platdata pb1550_pci_pd = {
-       .board_map_irq  = pb1550_map_pci_irq,
-};
-
-static struct platform_device pb1550_pci_host = {
-       .dev.platform_data = &pb1550_pci_pd,
-       .name           = "alchemy-pci",
-       .id             = 0,
-       .num_resources  = ARRAY_SIZE(alchemy_pci_host_res),
-       .resource       = alchemy_pci_host_res,
-};
-
-static struct resource au1550_psc2_res[] = {
-       [0] = {
-               .start  = AU1550_PSC2_PHYS_ADDR,
-               .end    = AU1550_PSC2_PHYS_ADDR + 0xfff,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = AU1550_PSC2_INT,
-               .end    = AU1550_PSC2_INT,
-               .flags  = IORESOURCE_IRQ,
-       },
-       [2] = {
-               .start  = AU1550_DSCR_CMD0_PSC2_TX,
-               .end    = AU1550_DSCR_CMD0_PSC2_TX,
-               .flags  = IORESOURCE_DMA,
-       },
-       [3] = {
-               .start  = AU1550_DSCR_CMD0_PSC2_RX,
-               .end    = AU1550_DSCR_CMD0_PSC2_RX,
-               .flags  = IORESOURCE_DMA,
-       },
-};
-
-static struct platform_device pb1550_i2c_dev = {
-       .name           = "au1xpsc_smbus",
-       .id             = 0,    /* bus number */
-       .num_resources  = ARRAY_SIZE(au1550_psc2_res),
-       .resource       = au1550_psc2_res,
-};
-
-static int __init pb1550_dev_init(void)
-{
-       int swapped;
-
-       /* Pb1550, like all others, also has statuschange irqs; however they're
-       * wired up on one of the Au1550's shared GPIO201_205 line, which also
-       * services the PCMCIA card interrupts.  So we ignore statuschange and
-       * use the GPIO201_205 exclusively for card interrupts, since a) pcmcia
-       * drivers are used to shared irqs and b) statuschange isn't really use-
-       * ful anyway.
-       */
-       db1x_register_pcmcia_socket(
-               AU1000_PCMCIA_ATTR_PHYS_ADDR,
-               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1,
-               AU1000_PCMCIA_MEM_PHYS_ADDR,
-               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x000400000 - 1,
-               AU1000_PCMCIA_IO_PHYS_ADDR,
-               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x000010000 - 1,
-               AU1550_GPIO201_205_INT, AU1550_GPIO0_INT, 0, 0, 0);
-
-       db1x_register_pcmcia_socket(
-               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x008000000,
-               AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x008400000 - 1,
-               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x008000000,
-               AU1000_PCMCIA_MEM_PHYS_ADDR  + 0x008400000 - 1,
-               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x008000000,
-               AU1000_PCMCIA_IO_PHYS_ADDR   + 0x008010000 - 1,
-               AU1550_GPIO201_205_INT, AU1550_GPIO1_INT, 0, 0, 1);
-
-       swapped = bcsr_read(BCSR_STATUS) & BCSR_STATUS_PB1550_SWAPBOOT;
-       db1x_register_norflash(128 * 1024 * 1024, 4, swapped);
-       platform_device_register(&pb1550_pci_host);
-       platform_device_register(&pb1550_i2c_dev);
-
-       return 0;
-}
-arch_initcall(pb1550_dev_init);
index 49a4b3244d8e1ad792f701b2f3b550617078c5f8..621f70afb63a10189751b8123a6ed04b1e5c78c9 100644 (file)
 #include <asm/reboot.h>
 #include <asm/mach-db1x00/bcsr.h>
 
+
+static struct platform_device db1x00_rtc_dev = {
+       .name   = "rtc-au1xxx",
+       .id     = -1,
+};
+
+
 static void db1x_power_off(void)
 {
        bcsr_write(BCSR_RESETS, 0);
@@ -25,7 +32,7 @@ static void db1x_reset(char *c)
        bcsr_write(BCSR_SYSTEM, 0);
 }
 
-static int __init db1x_poweroff_setup(void)
+static int __init db1x_late_setup(void)
 {
        if (!pm_power_off)
                pm_power_off = db1x_power_off;
@@ -34,9 +41,11 @@ static int __init db1x_poweroff_setup(void)
        if (!_machine_restart)
                _machine_restart = db1x_reset;
 
+       platform_device_register(&db1x00_rtc_dev);
+
        return 0;
 }
-late_initcall(db1x_poweroff_setup);
+device_initcall(db1x_late_setup);
 
 /* register a pcmcia socket */
 int __init db1x_register_pcmcia_socket(phys_addr_t pcmcia_attr_start,
index e5306b56da6d011face7e6072c93eb82ed3ab0fc..93a22107cc41fc2d39fdf2c000ce25b47b84ead6 100644 (file)
 #include <asm/mach-au1x00/au1000.h>
 #include <prom.h>
 
-#if defined(CONFIG_MIPS_PB1000) || defined(CONFIG_MIPS_DB1000) || \
-    defined(CONFIG_MIPS_PB1100) || defined(CONFIG_MIPS_DB1100) || \
-    defined(CONFIG_MIPS_PB1500) || defined(CONFIG_MIPS_DB1500) || \
-    defined(CONFIG_MIPS_BOSPORUS) || defined(CONFIG_MIPS_MIRAGE)
+#if defined(CONFIG_MIPS_DB1000) || \
+    defined(CONFIG_MIPS_PB1100) || \
+    defined(CONFIG_MIPS_PB1500)
 #define ALCHEMY_BOARD_DEFAULT_MEMSIZE  0x04000000
 
 #else  /* Au1550/Au1200-based develboards */
@@ -62,5 +61,9 @@ void __init prom_init(void)
 
 void prom_putchar(unsigned char c)
 {
+#ifdef CONFIG_MIPS_DB1300
+       alchemy_uart_putchar(AU1300_UART2_PHYS_ADDR, c);
+#else
        alchemy_uart_putchar(AU1000_UART0_PHYS_ADDR, c);
+#endif
 }
diff --git a/arch/mips/alchemy/gpr/Makefile b/arch/mips/alchemy/gpr/Makefile
deleted file mode 100644 (file)
index cb73fe2..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-#  Copyright 2003 MontaVista Software Inc.
-#  Author: MontaVista Software, Inc. <source@mvista.com>
-#
-# Makefile for Trapeze ITS GPR board.
-#
-
-obj-y += board_setup.o init.o platform.o
diff --git a/arch/mips/alchemy/gpr/board_setup.c b/arch/mips/alchemy/gpr/board_setup.c
deleted file mode 100644 (file)
index dea45c7..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2010 Wolfgang Grandegger <wg@denx.de>
- *
- * Copyright 2000-2003, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/gpio.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-#include <linux/pm.h>
-
-#include <asm/reboot.h>
-#include <asm/mach-au1x00/au1000.h>
-
-#include <prom.h>
-
-static void gpr_reset(char *c)
-{
-       /* switch System-LED to orange (red# and green# on) */
-       alchemy_gpio_direction_output(4, 0);
-       alchemy_gpio_direction_output(5, 0);
-
-       /* trigger watchdog to reset board in 200ms */
-       printk(KERN_EMERG "Triggering watchdog soft reset...\n");
-       raw_local_irq_disable();
-       alchemy_gpio_direction_output(1, 0);
-       udelay(1);
-       alchemy_gpio_set_value(1, 1);
-       while (1)
-               cpu_wait();
-}
-
-static void gpr_power_off(void)
-{
-       while (1)
-               cpu_wait();
-}
-
-void __init board_setup(void)
-{
-       printk(KERN_INFO "Trapeze ITS GPR board\n");
-
-       pm_power_off = gpr_power_off;
-       _machine_halt = gpr_power_off;
-       _machine_restart = gpr_reset;
-
-       /* Enable UART1/3 */
-       alchemy_uart_enable(AU1000_UART3_PHYS_ADDR);
-       alchemy_uart_enable(AU1000_UART1_PHYS_ADDR);
-
-       /* Take away Reset of UMTS-card */
-       alchemy_gpio_direction_output(215, 1);
-}
diff --git a/arch/mips/alchemy/gpr/init.c b/arch/mips/alchemy/gpr/init.c
deleted file mode 100644 (file)
index 229aafa..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright 2010 Wolfgang Grandegger <wg@denx.de>
- *
- * Copyright 2003, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-#include <linux/kernel.h>
-
-#include <asm/bootinfo.h>
-#include <asm/mach-au1x00/au1000.h>
-
-#include <prom.h>
-
-const char *get_system_type(void)
-{
-       return "GPR";
-}
-
-void __init prom_init(void)
-{
-       unsigned char *memsize_str;
-       unsigned long memsize;
-
-       prom_argc = fw_arg0;
-       prom_argv = (char **)fw_arg1;
-       prom_envp = (char **)fw_arg2;
-
-       prom_init_cmdline();
-
-       memsize_str = prom_getenv("memsize");
-       if (!memsize_str)
-               memsize = 0x04000000;
-       else
-               strict_strtoul(memsize_str, 0, &memsize);
-       add_memory_region(0, memsize, BOOT_MEM_RAM);
-}
-
-void prom_putchar(unsigned char c)
-{
-       alchemy_uart_putchar(AU1000_UART0_PHYS_ADDR, c);
-}
diff --git a/arch/mips/alchemy/gpr/platform.c b/arch/mips/alchemy/gpr/platform.c
deleted file mode 100644 (file)
index 982ce85..0000000
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * GPR board platform device registration
- *
- * Copyright (C) 2010 Wolfgang Grandegger <wg@denx.de>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/mtd/partitions.h>
-#include <linux/mtd/physmap.h>
-#include <linux/leds.h>
-#include <linux/gpio.h>
-#include <linux/i2c.h>
-#include <linux/i2c-gpio.h>
-
-#include <asm/mach-au1x00/au1000.h>
-
-/*
- * Watchdog
- */
-static struct resource gpr_wdt_resource[] = {
-       [0] = {
-               .start  = 1,
-               .end    = 1,
-               .name   = "gpr-adm6320-wdt",
-               .flags  = IORESOURCE_IRQ,
-       }
-};
-
-static struct platform_device gpr_wdt_device = {
-       .name = "adm6320-wdt",
-       .id = 0,
-       .num_resources = ARRAY_SIZE(gpr_wdt_resource),
-       .resource = gpr_wdt_resource,
-};
-
-/*
- * FLASH
- *
- * 0x00000000-0x00200000 : "kernel"
- * 0x00200000-0x00a00000 : "rootfs"
- * 0x01d00000-0x01f00000 : "config"
- * 0x01c00000-0x01d00000 : "yamon"
- * 0x01d00000-0x01d40000 : "yamon env vars"
- * 0x00000000-0x00a00000 : "kernel+rootfs"
- */
-static struct mtd_partition gpr_mtd_partitions[] = {
-       {
-               .name   = "kernel",
-               .size   = 0x00200000,
-               .offset = 0,
-       },
-       {
-               .name   = "rootfs",
-               .size   = 0x00800000,
-               .offset = MTDPART_OFS_APPEND,
-               .mask_flags = MTD_WRITEABLE,
-       },
-       {
-               .name   = "config",
-               .size   = 0x00200000,
-               .offset = 0x01d00000,
-       },
-       {
-               .name   = "yamon",
-               .size   = 0x00100000,
-               .offset = 0x01c00000,
-       },
-       {
-               .name   = "yamon env vars",
-               .size   = 0x00040000,
-               .offset = MTDPART_OFS_APPEND,
-       },
-       {
-               .name   = "kernel+rootfs",
-               .size   = 0x00a00000,
-               .offset = 0,
-       },
-};
-
-static struct physmap_flash_data gpr_flash_data = {
-       .width          = 4,
-       .nr_parts       = ARRAY_SIZE(gpr_mtd_partitions),
-       .parts          = gpr_mtd_partitions,
-};
-
-static struct resource gpr_mtd_resource = {
-       .start  = 0x1e000000,
-       .end    = 0x1fffffff,
-       .flags  = IORESOURCE_MEM,
-};
-
-static struct platform_device gpr_mtd_device = {
-       .name           = "physmap-flash",
-       .dev            = {
-               .platform_data  = &gpr_flash_data,
-       },
-       .num_resources  = 1,
-       .resource       = &gpr_mtd_resource,
-};
-
-/*
- * LEDs
- */
-static struct gpio_led gpr_gpio_leds[] = {
-       {       /* green */
-               .name                   = "gpr:green",
-               .gpio                   = 4,
-               .active_low             = 1,
-       },
-       {       /* red */
-               .name                   = "gpr:red",
-               .gpio                   = 5,
-               .active_low             = 1,
-       }
-};
-
-static struct gpio_led_platform_data gpr_led_data = {
-       .num_leds = ARRAY_SIZE(gpr_gpio_leds),
-       .leds = gpr_gpio_leds,
-};
-
-static struct platform_device gpr_led_devices = {
-       .name = "leds-gpio",
-       .id = -1,
-       .dev = {
-               .platform_data = &gpr_led_data,
-       }
-};
-
-/*
- * I2C
- */
-static struct i2c_gpio_platform_data gpr_i2c_data = {
-       .sda_pin                = 209,
-       .sda_is_open_drain      = 1,
-       .scl_pin                = 210,
-       .scl_is_open_drain      = 1,
-       .udelay                 = 2,            /* ~100 kHz */
-       .timeout                = HZ,
- };
-
-static struct platform_device gpr_i2c_device = {
-       .name                   = "i2c-gpio",
-       .id                     = -1,
-       .dev.platform_data      = &gpr_i2c_data,
-};
-
-static struct i2c_board_info gpr_i2c_info[] __initdata = {
-       {
-               I2C_BOARD_INFO("lm83", 0x18),
-               .type = "lm83"
-       }
-};
-
-
-
-static struct resource alchemy_pci_host_res[] = {
-       [0] = {
-               .start  = AU1500_PCI_PHYS_ADDR,
-               .end    = AU1500_PCI_PHYS_ADDR + 0xfff,
-               .flags  = IORESOURCE_MEM,
-       },
-};
-
-static int gpr_map_pci_irq(const struct pci_dev *d, u8 slot, u8 pin)
-{
-       if ((slot == 0) && (pin == 1))
-               return AU1550_PCI_INTA;
-       else if ((slot == 0) && (pin == 2))
-               return AU1550_PCI_INTB;
-
-       return -1;
-}
-
-static struct alchemy_pci_platdata gpr_pci_pd = {
-       .board_map_irq  = gpr_map_pci_irq,
-       .pci_cfg_set    = PCI_CONFIG_AEN | PCI_CONFIG_R2H | PCI_CONFIG_R1H |
-                         PCI_CONFIG_CH |
-#if defined(__MIPSEB__)
-                         PCI_CONFIG_SIC_HWA_DAT | PCI_CONFIG_SM,
-#else
-                         0,
-#endif
-};
-
-static struct platform_device gpr_pci_host_dev = {
-       .dev.platform_data = &gpr_pci_pd,
-       .name           = "alchemy-pci",
-       .id             = 0,
-       .num_resources  = ARRAY_SIZE(alchemy_pci_host_res),
-       .resource       = alchemy_pci_host_res,
-};
-
-static struct platform_device *gpr_devices[] __initdata = {
-       &gpr_wdt_device,
-       &gpr_mtd_device,
-       &gpr_i2c_device,
-       &gpr_led_devices,
-};
-
-static int __init gpr_pci_init(void)
-{
-       return platform_device_register(&gpr_pci_host_dev);
-}
-/* must be arch_initcall; MIPS PCI scans busses in a subsys_initcall */
-arch_initcall(gpr_pci_init);
-
-
-static int __init gpr_dev_init(void)
-{
-       i2c_register_board_info(0, gpr_i2c_info, ARRAY_SIZE(gpr_i2c_info));
-
-       return platform_add_devices(gpr_devices, ARRAY_SIZE(gpr_devices));
-}
-device_initcall(gpr_dev_init);
diff --git a/arch/mips/alchemy/mtx-1/Makefile b/arch/mips/alchemy/mtx-1/Makefile
deleted file mode 100644 (file)
index 81b540c..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#
-#  Copyright 2003 MontaVista Software Inc.
-#  Author: MontaVista Software, Inc. <source@mvista.com>
-#       Bruno Randolf <bruno.randolf@4g-systems.biz>
-#
-# Makefile for 4G Systems MTX-1 board.
-#
-
-obj-y += init.o board_setup.o platform.o
diff --git a/arch/mips/alchemy/mtx-1/board_setup.c b/arch/mips/alchemy/mtx-1/board_setup.c
deleted file mode 100644 (file)
index 851a5ab..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     4G Systems MTX-1 board setup.
- *
- * Copyright 2003, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *         Bruno Randolf <bruno.randolf@4g-systems.biz>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/gpio.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/pm.h>
-
-#include <asm/reboot.h>
-#include <asm/mach-au1x00/au1000.h>
-
-#include <prom.h>
-
-static void mtx1_reset(char *c)
-{
-       /* Jump to the reset vector */
-       __asm__ __volatile__("jr\t%0"::"r"(0xbfc00000));
-}
-
-static void mtx1_power_off(void)
-{
-       while (1)
-               asm volatile (
-               "       .set    mips32                                  \n"
-               "       wait                                            \n"
-               "       .set    mips0                                   \n");
-}
-
-void __init board_setup(void)
-{
-#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
-       /* Enable USB power switch */
-       alchemy_gpio_direction_output(204, 0);
-#endif /* defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) */
-
-       /* Initialize sys_pinfunc */
-       au_writel(SYS_PF_NI2, SYS_PINFUNC);
-
-       /* Initialize GPIO */
-       au_writel(~0, KSEG1ADDR(AU1000_SYS_PHYS_ADDR) + SYS_TRIOUTCLR);
-       alchemy_gpio_direction_output(0, 0);    /* Disable M66EN (PCI 66MHz) */
-       alchemy_gpio_direction_output(3, 1);    /* Disable PCI CLKRUN# */
-       alchemy_gpio_direction_output(1, 1);    /* Enable EXT_IO3 */
-       alchemy_gpio_direction_output(5, 0);    /* Disable eth PHY TX_ER */
-
-       /* Enable LED and set it to green */
-       alchemy_gpio_direction_output(211, 1);  /* green on */
-       alchemy_gpio_direction_output(212, 0);  /* red off */
-
-       pm_power_off = mtx1_power_off;
-       _machine_halt = mtx1_power_off;
-       _machine_restart = mtx1_reset;
-
-       printk(KERN_INFO "4G Systems MTX-1 Board\n");
-}
-
-static int __init mtx1_init_irq(void)
-{
-       irq_set_irq_type(AU1500_GPIO204_INT, IRQF_TRIGGER_HIGH);
-       irq_set_irq_type(AU1500_GPIO201_INT, IRQF_TRIGGER_LOW);
-       irq_set_irq_type(AU1500_GPIO202_INT, IRQF_TRIGGER_LOW);
-       irq_set_irq_type(AU1500_GPIO203_INT, IRQF_TRIGGER_LOW);
-       irq_set_irq_type(AU1500_GPIO205_INT, IRQF_TRIGGER_LOW);
-
-       return 0;
-}
-arch_initcall(mtx1_init_irq);
diff --git a/arch/mips/alchemy/mtx-1/init.c b/arch/mips/alchemy/mtx-1/init.c
deleted file mode 100644 (file)
index 2e81cc7..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     4G Systems MTX-1 board setup
- *
- * Copyright 2003, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *         Bruno Randolf <bruno.randolf@4g-systems.biz>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-
-#include <asm/bootinfo.h>
-#include <asm/mach-au1x00/au1000.h>
-
-#include <prom.h>
-
-const char *get_system_type(void)
-{
-       return "MTX-1";
-}
-
-void __init prom_init(void)
-{
-       unsigned char *memsize_str;
-       unsigned long memsize;
-
-       prom_argc = fw_arg0;
-       prom_argv = (char **)fw_arg1;
-       prom_envp = (char **)fw_arg2;
-
-       prom_init_cmdline();
-
-       memsize_str = prom_getenv("memsize");
-       if (!memsize_str)
-               memsize = 0x04000000;
-       else
-               strict_strtoul(memsize_str, 0, &memsize);
-       add_memory_region(0, memsize, BOOT_MEM_RAM);
-}
-
-void prom_putchar(unsigned char c)
-{
-       alchemy_uart_putchar(AU1000_UART0_PHYS_ADDR, c);
-}
diff --git a/arch/mips/alchemy/mtx-1/platform.c b/arch/mips/alchemy/mtx-1/platform.c
deleted file mode 100644 (file)
index cc47b68..0000000
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * MTX-1 platform devices registration
- *
- * Copyright (C) 2007-2009, Florian Fainelli <florian@openwrt.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/leds.h>
-#include <linux/gpio.h>
-#include <linux/gpio_keys.h>
-#include <linux/input.h>
-#include <linux/mtd/partitions.h>
-#include <linux/mtd/physmap.h>
-#include <mtd/mtd-abi.h>
-
-#include <asm/mach-au1x00/au1xxx_eth.h>
-
-static struct gpio_keys_button mtx1_gpio_button[] = {
-       {
-               .gpio = 207,
-               .code = BTN_0,
-               .desc = "System button",
-       }
-};
-
-static struct gpio_keys_platform_data mtx1_buttons_data = {
-       .buttons = mtx1_gpio_button,
-       .nbuttons = ARRAY_SIZE(mtx1_gpio_button),
-};
-
-static struct platform_device mtx1_button = {
-       .name = "gpio-keys",
-       .id = -1,
-       .dev = {
-               .platform_data = &mtx1_buttons_data,
-       }
-};
-
-static struct resource mtx1_wdt_res[] = {
-       [0] = {
-               .start  = 215,
-               .end    = 215,
-               .name   = "mtx1-wdt-gpio",
-               .flags  = IORESOURCE_IRQ,
-       }
-};
-
-static struct platform_device mtx1_wdt = {
-       .name = "mtx1-wdt",
-       .id = 0,
-       .num_resources = ARRAY_SIZE(mtx1_wdt_res),
-       .resource = mtx1_wdt_res,
-};
-
-static struct gpio_led default_leds[] = {
-       {
-               .name   = "mtx1:green",
-               .gpio = 211,
-       }, {
-               .name = "mtx1:red",
-               .gpio = 212,
-       },
-};
-
-static struct gpio_led_platform_data mtx1_led_data = {
-       .num_leds = ARRAY_SIZE(default_leds),
-       .leds = default_leds,
-};
-
-static struct platform_device mtx1_gpio_leds = {
-       .name = "leds-gpio",
-       .id = -1,
-       .dev = {
-               .platform_data = &mtx1_led_data,
-       }
-};
-
-static struct mtd_partition mtx1_mtd_partitions[] = {
-       {
-               .name   = "filesystem",
-               .size   = 0x01C00000,
-               .offset = 0,
-       },
-       {
-               .name   = "yamon",
-               .size   = 0x00100000,
-               .offset = MTDPART_OFS_APPEND,
-               .mask_flags = MTD_WRITEABLE,
-       },
-       {
-               .name   = "kernel",
-               .size   = 0x002c0000,
-               .offset = MTDPART_OFS_APPEND,
-       },
-       {
-               .name   = "yamon env",
-               .size   = 0x00040000,
-               .offset = MTDPART_OFS_APPEND,
-       },
-};
-
-static struct physmap_flash_data mtx1_flash_data = {
-       .width          = 4,
-       .nr_parts       = 4,
-       .parts          = mtx1_mtd_partitions,
-};
-
-static struct resource mtx1_mtd_resource = {
-       .start  = 0x1e000000,
-       .end    = 0x1fffffff,
-       .flags  = IORESOURCE_MEM,
-};
-
-static struct platform_device mtx1_mtd = {
-       .name           = "physmap-flash",
-       .dev            = {
-               .platform_data  = &mtx1_flash_data,
-       },
-       .num_resources  = 1,
-       .resource       = &mtx1_mtd_resource,
-};
-
-static struct resource alchemy_pci_host_res[] = {
-       [0] = {
-               .start  = AU1500_PCI_PHYS_ADDR,
-               .end    = AU1500_PCI_PHYS_ADDR + 0xfff,
-               .flags  = IORESOURCE_MEM,
-       },
-};
-
-static int mtx1_pci_idsel(unsigned int devsel, int assert)
-{
-       /* This function is only necessary to support a proprietary Cardbus
-        * adapter on the mtx-1 "singleboard" variant. It triggers a custom
-        * logic chip connected to EXT_IO3 (GPIO1) to suppress IDSEL signals.
-        */
-       if (assert && devsel != 0)
-               /* Suppress signal to Cardbus */
-               alchemy_gpio_set_value(1, 0);   /* set EXT_IO3 OFF */
-       else
-               alchemy_gpio_set_value(1, 1);   /* set EXT_IO3 ON */
-
-       udelay(1);
-       return 1;
-}
-
-static const char mtx1_irqtab[][5] = {
-       [0] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTA, 0xff, 0xff }, /* IDSEL 00 - AdapterA-Slot0 (top) */
-       [1] = { -1, AU1500_PCI_INTB, AU1500_PCI_INTA, 0xff, 0xff }, /* IDSEL 01 - AdapterA-Slot1 (bottom) */
-       [2] = { -1, AU1500_PCI_INTC, AU1500_PCI_INTD, 0xff, 0xff }, /* IDSEL 02 - AdapterB-Slot0 (top) */
-       [3] = { -1, AU1500_PCI_INTD, AU1500_PCI_INTC, 0xff, 0xff }, /* IDSEL 03 - AdapterB-Slot1 (bottom) */
-       [4] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTB, 0xff, 0xff }, /* IDSEL 04 - AdapterC-Slot0 (top) */
-       [5] = { -1, AU1500_PCI_INTB, AU1500_PCI_INTA, 0xff, 0xff }, /* IDSEL 05 - AdapterC-Slot1 (bottom) */
-       [6] = { -1, AU1500_PCI_INTC, AU1500_PCI_INTD, 0xff, 0xff }, /* IDSEL 06 - AdapterD-Slot0 (top) */
-       [7] = { -1, AU1500_PCI_INTD, AU1500_PCI_INTC, 0xff, 0xff }, /* IDSEL 07 - AdapterD-Slot1 (bottom) */
-};
-
-static int mtx1_map_pci_irq(const struct pci_dev *d, u8 slot, u8 pin)
-{
-       return mtx1_irqtab[slot][pin];
-}
-
-static struct alchemy_pci_platdata mtx1_pci_pd = {
-       .board_map_irq   = mtx1_map_pci_irq,
-       .board_pci_idsel = mtx1_pci_idsel,
-       .pci_cfg_set     = PCI_CONFIG_AEN | PCI_CONFIG_R2H | PCI_CONFIG_R1H |
-                          PCI_CONFIG_CH |
-#if defined(__MIPSEB__)
-                          PCI_CONFIG_SIC_HWA_DAT | PCI_CONFIG_SM,
-#else
-                          0,
-#endif
-};
-
-static struct platform_device mtx1_pci_host = {
-       .dev.platform_data = &mtx1_pci_pd,
-       .name           = "alchemy-pci",
-       .id             = 0,
-       .num_resources  = ARRAY_SIZE(alchemy_pci_host_res),
-       .resource       = alchemy_pci_host_res,
-};
-
-
-static struct __initdata platform_device * mtx1_devs[] = {
-       &mtx1_pci_host,
-       &mtx1_gpio_leds,
-       &mtx1_wdt,
-       &mtx1_button,
-       &mtx1_mtd,
-};
-
-static struct au1000_eth_platform_data mtx1_au1000_eth0_pdata = {
-       .phy_search_highest_addr        = 1,
-       .phy1_search_mac0               = 1,
-};
-
-static int __init mtx1_register_devices(void)
-{
-       int rc;
-
-       au1xxx_override_eth_cfg(0, &mtx1_au1000_eth0_pdata);
-
-       rc = gpio_request(mtx1_gpio_button[0].gpio,
-                                       mtx1_gpio_button[0].desc);
-       if (rc < 0) {
-               printk(KERN_INFO "mtx1: failed to request %d\n",
-                                       mtx1_gpio_button[0].gpio);
-               goto out;
-       }
-       gpio_direction_input(mtx1_gpio_button[0].gpio);
-out:
-       return platform_add_devices(mtx1_devs, ARRAY_SIZE(mtx1_devs));
-}
-
-arch_initcall(mtx1_register_devices);
diff --git a/arch/mips/alchemy/xxs1500/Makefile b/arch/mips/alchemy/xxs1500/Makefile
deleted file mode 100644 (file)
index 91defcf..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-#  Copyright 2003 MontaVista Software Inc.
-#  Author: MontaVista Software, Inc. <source@mvista.com>
-#
-# Makefile for MyCable XXS1500 board.
-#
-
-obj-y += init.o board_setup.o platform.o
diff --git a/arch/mips/alchemy/xxs1500/board_setup.c b/arch/mips/alchemy/xxs1500/board_setup.c
deleted file mode 100644 (file)
index 3fa83f7..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright 2000-2003, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/gpio.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-#include <linux/pm.h>
-
-#include <asm/reboot.h>
-#include <asm/mach-au1x00/au1000.h>
-
-#include <prom.h>
-
-static void xxs1500_reset(char *c)
-{
-       /* Jump to the reset vector */
-       __asm__ __volatile__("jr\t%0"::"r"(0xbfc00000));
-}
-
-static void xxs1500_power_off(void)
-{
-       while (1)
-               asm volatile (
-               "       .set    mips32                                  \n"
-               "       wait                                            \n"
-               "       .set    mips0                                   \n");
-}
-
-void __init board_setup(void)
-{
-       u32 pin_func;
-
-       pm_power_off = xxs1500_power_off;
-       _machine_halt = xxs1500_power_off;
-       _machine_restart = xxs1500_reset;
-
-       alchemy_gpio1_input_enable();
-       alchemy_gpio2_enable();
-
-       /* Set multiple use pins (UART3/GPIO) to UART (it's used as UART too) */
-       pin_func  = au_readl(SYS_PINFUNC) & ~SYS_PF_UR3;
-       pin_func |= SYS_PF_UR3;
-       au_writel(pin_func, SYS_PINFUNC);
-
-       /* Enable UART */
-       alchemy_uart_enable(AU1000_UART3_PHYS_ADDR);
-       /* Enable DTR (MCR bit 0) = USB power up */
-       __raw_writel(1, (void __iomem *)KSEG1ADDR(AU1000_UART3_PHYS_ADDR + 0x18));
-       wmb();
-}
-
-static int __init xxs1500_init_irq(void)
-{
-       irq_set_irq_type(AU1500_GPIO204_INT, IRQF_TRIGGER_HIGH);
-       irq_set_irq_type(AU1500_GPIO201_INT, IRQF_TRIGGER_LOW);
-       irq_set_irq_type(AU1500_GPIO202_INT, IRQF_TRIGGER_LOW);
-       irq_set_irq_type(AU1500_GPIO203_INT, IRQF_TRIGGER_LOW);
-       irq_set_irq_type(AU1500_GPIO205_INT, IRQF_TRIGGER_LOW);
-       irq_set_irq_type(AU1500_GPIO207_INT, IRQF_TRIGGER_LOW);
-
-       irq_set_irq_type(AU1500_GPIO0_INT, IRQF_TRIGGER_LOW);
-       irq_set_irq_type(AU1500_GPIO1_INT, IRQF_TRIGGER_LOW);
-       irq_set_irq_type(AU1500_GPIO2_INT, IRQF_TRIGGER_LOW);
-       irq_set_irq_type(AU1500_GPIO3_INT, IRQF_TRIGGER_LOW);
-       irq_set_irq_type(AU1500_GPIO4_INT, IRQF_TRIGGER_LOW); /* CF irq */
-       irq_set_irq_type(AU1500_GPIO5_INT, IRQF_TRIGGER_LOW);
-
-       return 0;
-}
-arch_initcall(xxs1500_init_irq);
diff --git a/arch/mips/alchemy/xxs1500/init.c b/arch/mips/alchemy/xxs1500/init.c
deleted file mode 100644 (file)
index 0ee02cf..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     XXS1500 board setup
- *
- * Copyright 2003, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-#include <linux/kernel.h>
-
-#include <asm/bootinfo.h>
-#include <asm/mach-au1x00/au1000.h>
-
-#include <prom.h>
-
-const char *get_system_type(void)
-{
-       return "XXS1500";
-}
-
-void __init prom_init(void)
-{
-       unsigned char *memsize_str;
-       unsigned long memsize;
-
-       prom_argc = fw_arg0;
-       prom_argv = (char **)fw_arg1;
-       prom_envp = (char **)fw_arg2;
-
-       prom_init_cmdline();
-
-       memsize_str = prom_getenv("memsize");
-       if (!memsize_str || strict_strtoul(memsize_str, 0, &memsize))
-               memsize = 0x04000000;
-
-       add_memory_region(0, memsize, BOOT_MEM_RAM);
-}
-
-void prom_putchar(unsigned char c)
-{
-       alchemy_uart_putchar(AU1000_UART0_PHYS_ADDR, c);
-}
diff --git a/arch/mips/alchemy/xxs1500/platform.c b/arch/mips/alchemy/xxs1500/platform.c
deleted file mode 100644 (file)
index 06a3a45..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * XXS1500 board platform device registration
- *
- * Copyright (C) 2009 Manuel Lauss
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include <linux/init.h>
-#include <linux/platform_device.h>
-
-#include <asm/mach-au1x00/au1000.h>
-
-static struct resource xxs1500_pcmcia_res[] = {
-       {
-               .name   = "pcmcia-io",
-               .flags  = IORESOURCE_MEM,
-               .start  = AU1000_PCMCIA_IO_PHYS_ADDR,
-               .end    = AU1000_PCMCIA_IO_PHYS_ADDR + 0x000400000 - 1,
-       },
-       {
-               .name   = "pcmcia-attr",
-               .flags  = IORESOURCE_MEM,
-               .start  = AU1000_PCMCIA_ATTR_PHYS_ADDR,
-               .end    = AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1,
-       },
-       {
-               .name   = "pcmcia-mem",
-               .flags  = IORESOURCE_MEM,
-               .start  = AU1000_PCMCIA_MEM_PHYS_ADDR,
-               .end    = AU1000_PCMCIA_MEM_PHYS_ADDR + 0x000400000 - 1,
-       },
-};
-
-static struct platform_device xxs1500_pcmcia_dev = {
-       .name           = "xxs1500_pcmcia",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(xxs1500_pcmcia_res),
-       .resource       = xxs1500_pcmcia_res,
-};
-
-static struct platform_device *xxs1500_devs[] __initdata = {
-       &xxs1500_pcmcia_dev,
-};
-
-static int __init xxs1500_dev_init(void)
-{
-       return platform_add_devices(xxs1500_devs,
-                                   ARRAY_SIZE(xxs1500_devs));
-}
-device_initcall(xxs1500_dev_init);
index bb571bcdb8f2f06d5d2cb8b2d787591f35b4e66d..d8dbd8f0c1d2924308da51f309e4b4f16a9c7111 100644 (file)
@@ -217,7 +217,7 @@ struct titan_gpio_cfg {
        u32 func;
 };
 
-static struct titan_gpio_cfg titan_gpio_table[] = {
+static const struct titan_gpio_cfg titan_gpio_table[] = {
        /* reg, start bit, mux value */
        {4, 24, 1},
        {4, 26, 1},
index 33ffecf6a6d662403cc8cd3fb24de1737dc3e39b..1a24d317e7a3a5d52e11724e93bf2400db78a4a1 100644 (file)
@@ -462,6 +462,40 @@ static struct gpio_led fb_fon_leds[] = {
        },
 };
 
+static struct gpio_led gt701_leds[] = {
+       {
+               .name                   = "inet:green",
+               .gpio                   = 13,
+               .active_low             = 1,
+       },
+       {
+               .name                   = "usb",
+               .gpio                   = 12,
+               .active_low             = 1,
+       },
+       {
+               .name                   = "inet:red",
+               .gpio                   = 9,
+               .active_low             = 1,
+       },
+       {
+               .name                   = "power:red",
+               .gpio                   = 7,
+               .active_low             = 1,
+       },
+       {
+               .name                   = "power:green",
+               .gpio                   = 8,
+               .active_low             = 1,
+               .default_trigger        = "default-on",
+       },
+        {
+                .name                   = "ethernet",
+                .gpio                   = 10,
+                .active_low             = 1,
+        },
+};
+
 static struct gpio_led_platform_data ar7_led_data;
 
 static struct platform_device ar7_gpio_leds = {
@@ -503,6 +537,9 @@ static void __init detect_leds(void)
        } else if (strstr(prid, "CYWM") || strstr(prid, "CYWL")) {
                ar7_led_data.num_leds = ARRAY_SIZE(titan_leds);
                ar7_led_data.leds = titan_leds;
+       } else if (strstr(prid, "GT701")) {
+               ar7_led_data.num_leds = ARRAY_SIZE(gt701_leds);
+               ar7_led_data.leds = gt701_leds;
        }
 }
 
@@ -536,7 +573,7 @@ static int __init ar7_register_uarts(void)
 
        bus_clk = clk_get(NULL, "bus");
        if (IS_ERR(bus_clk))
-               panic("unable to get bus clk\n");
+               panic("unable to get bus clk");
 
        uart_port.type          = PORT_AR7;
        uart_port.uartclk       = clk_get_rate(bus_clk) / 2;
index 8088c6fdb83ed7e0a2b1689373569dbd3a526988..a23adc49d50fa2348ac4788d4feb38211318989d 100644 (file)
@@ -69,7 +69,7 @@ struct psbl_rec {
        u32     ffs_size;
 };
 
-static __initdata char psp_env_version[] = "TIENV0.8";
+static const char psp_env_version[] __initconst = "TIENV0.8";
 
 struct psp_env_chunk {
        u8      num;
@@ -84,7 +84,7 @@ struct psp_var_map_entry {
        char    *value;
 };
 
-static struct psp_var_map_entry psp_var_map[] = {
+static const struct psp_var_map_entry psp_var_map[] = {
        {  1,   "cpufrequency" },
        {  2,   "memsize" },
        {  3,   "flashsize" },
index f20b53e597c42fca192bc40866da920452c36cb9..9a357fffcfbe0a0c6767e5b12d70d22f23e5b1b7 100644 (file)
@@ -96,7 +96,7 @@ void __init plat_mem_setup(void)
 
        io_base = (unsigned long)ioremap(AR7_REGS_BASE, 0x10000);
        if (!io_base)
-               panic("Can't remap IO base!\n");
+               panic("Can't remap IO base!");
        set_io_port_base(io_base);
 
        prom_meminit();
index 47707410582cc3a584b21ec9547cba937a17fa3c..e0fae8f4442b792dbb86bcbbf15a260edf91b2ce 100644 (file)
@@ -2,13 +2,26 @@ if ATH79
 
 menu "Atheros AR71XX/AR724X/AR913X machine selection"
 
+config ATH79_MACH_AP121
+       bool "Atheros AP121 reference board"
+       select SOC_AR933X
+       select ATH79_DEV_GPIO_BUTTONS
+       select ATH79_DEV_LEDS_GPIO
+       select ATH79_DEV_SPI
+       select ATH79_DEV_USB
+       select ATH79_DEV_WMAC
+       help
+         Say 'Y' here if you want your kernel to support the
+         Atheros AP121 reference board.
+
 config ATH79_MACH_AP81
        bool "Atheros AP81 reference board"
        select SOC_AR913X
-       select ATH79_DEV_AR913X_WMAC
        select ATH79_DEV_GPIO_BUTTONS
        select ATH79_DEV_LEDS_GPIO
        select ATH79_DEV_SPI
+       select ATH79_DEV_USB
+       select ATH79_DEV_WMAC
        help
          Say 'Y' here if you want your kernel to support the
          Atheros AP81 reference board.
@@ -19,10 +32,21 @@ config ATH79_MACH_PB44
        select ATH79_DEV_GPIO_BUTTONS
        select ATH79_DEV_LEDS_GPIO
        select ATH79_DEV_SPI
+       select ATH79_DEV_USB
        help
          Say 'Y' here if you want your kernel to support the
          Atheros PB44 reference board.
 
+config ATH79_MACH_UBNT_XM
+       bool "Ubiquiti Networks XM (rev 1.0) board"
+       select SOC_AR724X
+       select ATH79_DEV_GPIO_BUTTONS
+       select ATH79_DEV_LEDS_GPIO
+       select ATH79_DEV_SPI
+       help
+         Say 'Y' here if you want your kernel to support the
+         Ubiquiti Networks XM (rev 1.0) board.
+
 endmenu
 
 config SOC_AR71XX
@@ -33,14 +57,15 @@ config SOC_AR71XX
 config SOC_AR724X
        select USB_ARCH_HAS_EHCI
        select USB_ARCH_HAS_OHCI
+       select HW_HAS_PCI
        def_bool n
 
 config SOC_AR913X
        select USB_ARCH_HAS_EHCI
        def_bool n
 
-config ATH79_DEV_AR913X_WMAC
-       depends on SOC_AR913X
+config SOC_AR933X
+       select USB_ARCH_HAS_EHCI
        def_bool n
 
 config ATH79_DEV_GPIO_BUTTONS
@@ -52,4 +77,11 @@ config ATH79_DEV_LEDS_GPIO
 config ATH79_DEV_SPI
        def_bool n
 
+config ATH79_DEV_USB
+       def_bool n
+
+config ATH79_DEV_WMAC
+       depends on (SOC_AR913X || SOC_AR933X)
+       def_bool n
+
 endif
index c33d4653007c3cd1545873fc2e151e1cf04f2e48..3b911e09dbecb5386136b4872affb515a8438caa 100644 (file)
@@ -16,13 +16,16 @@ obj-$(CONFIG_EARLY_PRINTK)          += early_printk.o
 # Devices
 #
 obj-y                                  += dev-common.o
-obj-$(CONFIG_ATH79_DEV_AR913X_WMAC)    += dev-ar913x-wmac.o
 obj-$(CONFIG_ATH79_DEV_GPIO_BUTTONS)   += dev-gpio-buttons.o
 obj-$(CONFIG_ATH79_DEV_LEDS_GPIO)      += dev-leds-gpio.o
 obj-$(CONFIG_ATH79_DEV_SPI)            += dev-spi.o
+obj-$(CONFIG_ATH79_DEV_USB)            += dev-usb.o
+obj-$(CONFIG_ATH79_DEV_WMAC)           += dev-wmac.o
 
 #
 # Machines
 #
+obj-$(CONFIG_ATH79_MACH_AP121)         += mach-ap121.o
 obj-$(CONFIG_ATH79_MACH_AP81)          += mach-ap81.o
 obj-$(CONFIG_ATH79_MACH_PB44)          += mach-pb44.o
+obj-$(CONFIG_ATH79_MACH_UBNT_XM)       += mach-ubnt-xm.o
index 680bde99a26c3bf8ad314549b8d7ee16cbcdbfe0..54d0eb4db987266657f1ac5fa58085015d820f4c 100644 (file)
@@ -110,6 +110,59 @@ static void __init ar913x_clocks_init(void)
        ath79_uart_clk.rate = ath79_ahb_clk.rate;
 }
 
+static void __init ar933x_clocks_init(void)
+{
+       u32 clock_ctrl;
+       u32 cpu_config;
+       u32 freq;
+       u32 t;
+
+       t = ath79_reset_rr(AR933X_RESET_REG_BOOTSTRAP);
+       if (t & AR933X_BOOTSTRAP_REF_CLK_40)
+               ath79_ref_clk.rate = (40 * 1000 * 1000);
+       else
+               ath79_ref_clk.rate = (25 * 1000 * 1000);
+
+       clock_ctrl = ath79_pll_rr(AR933X_PLL_CLOCK_CTRL_REG);
+       if (clock_ctrl & AR933X_PLL_CLOCK_CTRL_BYPASS) {
+               ath79_cpu_clk.rate = ath79_ref_clk.rate;
+               ath79_ahb_clk.rate = ath79_ref_clk.rate;
+               ath79_ddr_clk.rate = ath79_ref_clk.rate;
+       } else {
+               cpu_config = ath79_pll_rr(AR933X_PLL_CPU_CONFIG_REG);
+
+               t = (cpu_config >> AR933X_PLL_CPU_CONFIG_REFDIV_SHIFT) &
+                   AR933X_PLL_CPU_CONFIG_REFDIV_MASK;
+               freq = ath79_ref_clk.rate / t;
+
+               t = (cpu_config >> AR933X_PLL_CPU_CONFIG_NINT_SHIFT) &
+                   AR933X_PLL_CPU_CONFIG_NINT_MASK;
+               freq *= t;
+
+               t = (cpu_config >> AR933X_PLL_CPU_CONFIG_OUTDIV_SHIFT) &
+                   AR933X_PLL_CPU_CONFIG_OUTDIV_MASK;
+               if (t == 0)
+                       t = 1;
+
+               freq >>= t;
+
+               t = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_CPU_DIV_SHIFT) &
+                    AR933X_PLL_CLOCK_CTRL_CPU_DIV_MASK) + 1;
+               ath79_cpu_clk.rate = freq / t;
+
+               t = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_DDR_DIV_SHIFT) &
+                     AR933X_PLL_CLOCK_CTRL_DDR_DIV_MASK) + 1;
+               ath79_ddr_clk.rate = freq / t;
+
+               t = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_AHB_DIV_SHIFT) &
+                    AR933X_PLL_CLOCK_CTRL_AHB_DIV_MASK) + 1;
+               ath79_ahb_clk.rate = freq / t;
+       }
+
+       ath79_wdt_clk.rate = ath79_ref_clk.rate;
+       ath79_uart_clk.rate = ath79_ref_clk.rate;
+}
+
 void __init ath79_clocks_init(void)
 {
        if (soc_is_ar71xx())
@@ -118,6 +171,8 @@ void __init ath79_clocks_init(void)
                ar724x_clocks_init();
        else if (soc_is_ar913x())
                ar913x_clocks_init();
+       else if (soc_is_ar933x())
+               ar933x_clocks_init();
        else
                BUG();
 
index 58f60e722a0340e01338dc50863194eb6fc19eee..f0fda982b9650698c6b641aeeb6c38d9ea16f060 100644 (file)
@@ -30,6 +30,7 @@ u32 ath79_ddr_freq;
 EXPORT_SYMBOL_GPL(ath79_ddr_freq);
 
 enum ath79_soc_type ath79_soc;
+unsigned int ath79_soc_rev;
 
 void __iomem *ath79_pll_base;
 void __iomem *ath79_reset_base;
@@ -64,6 +65,8 @@ void ath79_device_reset_set(u32 mask)
                reg = AR724X_RESET_REG_RESET_MODULE;
        else if (soc_is_ar913x())
                reg = AR913X_RESET_REG_RESET_MODULE;
+       else if (soc_is_ar933x())
+               reg = AR933X_RESET_REG_RESET_MODULE;
        else
                BUG();
 
@@ -86,6 +89,8 @@ void ath79_device_reset_clear(u32 mask)
                reg = AR724X_RESET_REG_RESET_MODULE;
        else if (soc_is_ar913x())
                reg = AR913X_RESET_REG_RESET_MODULE;
+       else if (soc_is_ar933x())
+               reg = AR933X_RESET_REG_RESET_MODULE;
        else
                BUG();
 
diff --git a/arch/mips/ath79/dev-ar913x-wmac.c b/arch/mips/ath79/dev-ar913x-wmac.c
deleted file mode 100644 (file)
index 48f425a..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Atheros AR913X SoC built-in WMAC device support
- *
- *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
- *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under the terms of the GNU General Public License version 2 as published
- *  by the Free Software Foundation.
- */
-
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/irq.h>
-#include <linux/platform_device.h>
-#include <linux/ath9k_platform.h>
-
-#include <asm/mach-ath79/ath79.h>
-#include <asm/mach-ath79/ar71xx_regs.h>
-#include "dev-ar913x-wmac.h"
-
-static struct ath9k_platform_data ar913x_wmac_data;
-
-static struct resource ar913x_wmac_resources[] = {
-       {
-               .start  = AR913X_WMAC_BASE,
-               .end    = AR913X_WMAC_BASE + AR913X_WMAC_SIZE - 1,
-               .flags  = IORESOURCE_MEM,
-       }, {
-               .start  = ATH79_CPU_IRQ_IP2,
-               .end    = ATH79_CPU_IRQ_IP2,
-               .flags  = IORESOURCE_IRQ,
-       },
-};
-
-static struct platform_device ar913x_wmac_device = {
-       .name           = "ath9k",
-       .id             = -1,
-       .resource       = ar913x_wmac_resources,
-       .num_resources  = ARRAY_SIZE(ar913x_wmac_resources),
-       .dev = {
-               .platform_data = &ar913x_wmac_data,
-       },
-};
-
-void __init ath79_register_ar913x_wmac(u8 *cal_data)
-{
-       if (cal_data)
-               memcpy(ar913x_wmac_data.eeprom_data, cal_data,
-                      sizeof(ar913x_wmac_data.eeprom_data));
-
-       /* reset the WMAC */
-       ath79_device_reset_set(AR913X_RESET_AMBA2WMAC);
-       mdelay(10);
-
-       ath79_device_reset_clear(AR913X_RESET_AMBA2WMAC);
-       mdelay(10);
-
-       platform_device_register(&ar913x_wmac_device);
-}
diff --git a/arch/mips/ath79/dev-ar913x-wmac.h b/arch/mips/ath79/dev-ar913x-wmac.h
deleted file mode 100644 (file)
index 579d562..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *  Atheros AR913X SoC built-in WMAC device support
- *
- *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
- *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under the terms of the GNU General Public License version 2 as published
- *  by the Free Software Foundation.
- */
-
-#ifndef _ATH79_DEV_AR913X_WMAC_H
-#define _ATH79_DEV_AR913X_WMAC_H
-
-void ath79_register_ar913x_wmac(u8 *cal_data);
-
-#endif /* _ATH79_DEV_AR913X_WMAC_H */
index 3b82e325bebfbe552e07cedb1b30a66ba6eb90be..f4956f809072e37f975ee1dd2ac9d3885c425422 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <asm/mach-ath79/ath79.h>
 #include <asm/mach-ath79/ar71xx_regs.h>
+#include <asm/mach-ath79/ar933x_uart_platform.h>
 #include "common.h"
 #include "dev-common.h"
 
@@ -54,6 +55,30 @@ static struct platform_device ath79_uart_device = {
        },
 };
 
+static struct resource ar933x_uart_resources[] = {
+       {
+               .start  = AR933X_UART_BASE,
+               .end    = AR933X_UART_BASE + AR71XX_UART_SIZE - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .start  = ATH79_MISC_IRQ_UART,
+               .end    = ATH79_MISC_IRQ_UART,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct ar933x_uart_platform_data ar933x_uart_data;
+static struct platform_device ar933x_uart_device = {
+       .name           = "ar933x-uart",
+       .id             = -1,
+       .resource       = ar933x_uart_resources,
+       .num_resources  = ARRAY_SIZE(ar933x_uart_resources),
+       .dev = {
+               .platform_data  = &ar933x_uart_data,
+       },
+};
+
 void __init ath79_register_uart(void)
 {
        struct clk *clk;
@@ -62,8 +87,17 @@ void __init ath79_register_uart(void)
        if (IS_ERR(clk))
                panic("unable to get UART clock, err=%ld", PTR_ERR(clk));
 
-       ath79_uart_data[0].uartclk = clk_get_rate(clk);
-       platform_device_register(&ath79_uart_device);
+       if (soc_is_ar71xx() ||
+           soc_is_ar724x() ||
+           soc_is_ar913x()) {
+               ath79_uart_data[0].uartclk = clk_get_rate(clk);
+               platform_device_register(&ath79_uart_device);
+       } else if (soc_is_ar933x()) {
+               ar933x_uart_data.uartclk = clk_get_rate(clk);
+               platform_device_register(&ar933x_uart_device);
+       } else {
+               BUG();
+       }
 }
 
 static struct platform_device ath79_wdt_device = {
diff --git a/arch/mips/ath79/dev-usb.c b/arch/mips/ath79/dev-usb.c
new file mode 100644 (file)
index 0000000..002d6d2
--- /dev/null
@@ -0,0 +1,197 @@
+/*
+ *  Atheros AR7XXX/AR9XXX USB Host Controller device
+ *
+ *  Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
+ *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
+ *
+ *  Parts of this file are based on Atheros' 2.6.15 BSP
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License version 2 as published
+ *  by the Free Software Foundation.
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/irq.h>
+#include <linux/dma-mapping.h>
+#include <linux/platform_device.h>
+
+#include <asm/mach-ath79/ath79.h>
+#include <asm/mach-ath79/ar71xx_regs.h>
+#include "common.h"
+#include "dev-usb.h"
+
+static struct resource ath79_ohci_resources[] = {
+       [0] = {
+               /* .start and .end fields are filled dynamically */
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = ATH79_MISC_IRQ_OHCI,
+               .end    = ATH79_MISC_IRQ_OHCI,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static u64 ath79_ohci_dmamask = DMA_BIT_MASK(32);
+static struct platform_device ath79_ohci_device = {
+       .name           = "ath79-ohci",
+       .id             = -1,
+       .resource       = ath79_ohci_resources,
+       .num_resources  = ARRAY_SIZE(ath79_ohci_resources),
+       .dev = {
+               .dma_mask               = &ath79_ohci_dmamask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+       },
+};
+
+static struct resource ath79_ehci_resources[] = {
+       [0] = {
+               /* .start and .end fields are filled dynamically */
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = ATH79_CPU_IRQ_USB,
+               .end    = ATH79_CPU_IRQ_USB,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static u64 ath79_ehci_dmamask = DMA_BIT_MASK(32);
+static struct platform_device ath79_ehci_device = {
+       .name           = "ath79-ehci",
+       .id             = -1,
+       .resource       = ath79_ehci_resources,
+       .num_resources  = ARRAY_SIZE(ath79_ehci_resources),
+       .dev = {
+               .dma_mask               = &ath79_ehci_dmamask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+       },
+};
+
+#define AR71XX_USB_RESET_MASK  (AR71XX_RESET_USB_HOST | \
+                                AR71XX_RESET_USB_PHY | \
+                                AR71XX_RESET_USB_OHCI_DLL)
+
+static void __init ath79_usb_setup(void)
+{
+       void __iomem *usb_ctrl_base;
+
+       ath79_device_reset_set(AR71XX_USB_RESET_MASK);
+       mdelay(1000);
+       ath79_device_reset_clear(AR71XX_USB_RESET_MASK);
+
+       usb_ctrl_base = ioremap(AR71XX_USB_CTRL_BASE, AR71XX_USB_CTRL_SIZE);
+
+       /* Turning on the Buff and Desc swap bits */
+       __raw_writel(0xf0000, usb_ctrl_base + AR71XX_USB_CTRL_REG_CONFIG);
+
+       /* WAR for HW bug. Here it adjusts the duration between two SOFS */
+       __raw_writel(0x20c00, usb_ctrl_base + AR71XX_USB_CTRL_REG_FLADJ);
+
+       iounmap(usb_ctrl_base);
+
+       mdelay(900);
+
+       ath79_ohci_resources[0].start = AR71XX_OHCI_BASE;
+       ath79_ohci_resources[0].end = AR71XX_OHCI_BASE + AR71XX_OHCI_SIZE - 1;
+       platform_device_register(&ath79_ohci_device);
+
+       ath79_ehci_resources[0].start = AR71XX_EHCI_BASE;
+       ath79_ehci_resources[0].end = AR71XX_EHCI_BASE + AR71XX_EHCI_SIZE - 1;
+       ath79_ehci_device.name = "ar71xx-ehci";
+       platform_device_register(&ath79_ehci_device);
+}
+
+static void __init ar7240_usb_setup(void)
+{
+       void __iomem *usb_ctrl_base;
+
+       ath79_device_reset_clear(AR7240_RESET_OHCI_DLL);
+       ath79_device_reset_set(AR7240_RESET_USB_HOST);
+
+       mdelay(1000);
+
+       ath79_device_reset_set(AR7240_RESET_OHCI_DLL);
+       ath79_device_reset_clear(AR7240_RESET_USB_HOST);
+
+       usb_ctrl_base = ioremap(AR7240_USB_CTRL_BASE, AR7240_USB_CTRL_SIZE);
+
+       /* WAR for HW bug. Here it adjusts the duration between two SOFS */
+       __raw_writel(0x3, usb_ctrl_base + AR71XX_USB_CTRL_REG_FLADJ);
+
+       iounmap(usb_ctrl_base);
+
+       ath79_ohci_resources[0].start = AR7240_OHCI_BASE;
+       ath79_ohci_resources[0].end = AR7240_OHCI_BASE + AR7240_OHCI_SIZE - 1;
+       platform_device_register(&ath79_ohci_device);
+}
+
+static void __init ar724x_usb_setup(void)
+{
+       ath79_device_reset_set(AR724X_RESET_USBSUS_OVERRIDE);
+       mdelay(10);
+
+       ath79_device_reset_clear(AR724X_RESET_USB_HOST);
+       mdelay(10);
+
+       ath79_device_reset_clear(AR724X_RESET_USB_PHY);
+       mdelay(10);
+
+       ath79_ehci_resources[0].start = AR724X_EHCI_BASE;
+       ath79_ehci_resources[0].end = AR724X_EHCI_BASE + AR724X_EHCI_SIZE - 1;
+       ath79_ehci_device.name = "ar724x-ehci";
+       platform_device_register(&ath79_ehci_device);
+}
+
+static void __init ar913x_usb_setup(void)
+{
+       ath79_device_reset_set(AR913X_RESET_USBSUS_OVERRIDE);
+       mdelay(10);
+
+       ath79_device_reset_clear(AR913X_RESET_USB_HOST);
+       mdelay(10);
+
+       ath79_device_reset_clear(AR913X_RESET_USB_PHY);
+       mdelay(10);
+
+       ath79_ehci_resources[0].start = AR913X_EHCI_BASE;
+       ath79_ehci_resources[0].end = AR913X_EHCI_BASE + AR913X_EHCI_SIZE - 1;
+       ath79_ehci_device.name = "ar913x-ehci";
+       platform_device_register(&ath79_ehci_device);
+}
+
+static void __init ar933x_usb_setup(void)
+{
+       ath79_device_reset_set(AR933X_RESET_USBSUS_OVERRIDE);
+       mdelay(10);
+
+       ath79_device_reset_clear(AR933X_RESET_USB_HOST);
+       mdelay(10);
+
+       ath79_device_reset_clear(AR933X_RESET_USB_PHY);
+       mdelay(10);
+
+       ath79_ehci_resources[0].start = AR933X_EHCI_BASE;
+       ath79_ehci_resources[0].end = AR933X_EHCI_BASE + AR933X_EHCI_SIZE - 1;
+       ath79_ehci_device.name = "ar933x-ehci";
+       platform_device_register(&ath79_ehci_device);
+}
+
+void __init ath79_register_usb(void)
+{
+       if (soc_is_ar71xx())
+               ath79_usb_setup();
+       else if (soc_is_ar7240())
+               ar7240_usb_setup();
+       else if (soc_is_ar7241() || soc_is_ar7242())
+               ar724x_usb_setup();
+       else if (soc_is_ar913x())
+               ar913x_usb_setup();
+       else if (soc_is_ar933x())
+               ar933x_usb_setup();
+       else
+               BUG();
+}
diff --git a/arch/mips/ath79/dev-usb.h b/arch/mips/ath79/dev-usb.h
new file mode 100644 (file)
index 0000000..4b86a69
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ *  Atheros AR71XX/AR724X/AR913X USB Host Controller support
+ *
+ *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
+ *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License version 2 as published
+ *  by the Free Software Foundation.
+ */
+
+#ifndef _ATH79_DEV_USB_H
+#define _ATH79_DEV_USB_H
+
+void ath79_register_usb(void);
+
+#endif /* _ATH79_DEV_USB_H */
diff --git a/arch/mips/ath79/dev-wmac.c b/arch/mips/ath79/dev-wmac.c
new file mode 100644 (file)
index 0000000..24f5469
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ *  Atheros AR913X/AR933X SoC built-in WMAC device support
+ *
+ *  Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
+ *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License version 2 as published
+ *  by the Free Software Foundation.
+ */
+
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/irq.h>
+#include <linux/platform_device.h>
+#include <linux/ath9k_platform.h>
+
+#include <asm/mach-ath79/ath79.h>
+#include <asm/mach-ath79/ar71xx_regs.h>
+#include "dev-wmac.h"
+
+static struct ath9k_platform_data ath79_wmac_data;
+
+static struct resource ath79_wmac_resources[] = {
+       {
+               /* .start and .end fields are filled dynamically */
+               .flags  = IORESOURCE_MEM,
+       }, {
+               .start  = ATH79_CPU_IRQ_IP2,
+               .end    = ATH79_CPU_IRQ_IP2,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device ath79_wmac_device = {
+       .name           = "ath9k",
+       .id             = -1,
+       .resource       = ath79_wmac_resources,
+       .num_resources  = ARRAY_SIZE(ath79_wmac_resources),
+       .dev = {
+               .platform_data = &ath79_wmac_data,
+       },
+};
+
+static void __init ar913x_wmac_setup(void)
+{
+       /* reset the WMAC */
+       ath79_device_reset_set(AR913X_RESET_AMBA2WMAC);
+       mdelay(10);
+
+       ath79_device_reset_clear(AR913X_RESET_AMBA2WMAC);
+       mdelay(10);
+
+       ath79_wmac_resources[0].start = AR913X_WMAC_BASE;
+       ath79_wmac_resources[0].end = AR913X_WMAC_BASE + AR913X_WMAC_SIZE - 1;
+}
+
+
+static int ar933x_wmac_reset(void)
+{
+       ath79_device_reset_clear(AR933X_RESET_WMAC);
+       ath79_device_reset_set(AR933X_RESET_WMAC);
+
+       return 0;
+}
+
+static int ar933x_r1_get_wmac_revision(void)
+{
+       return ath79_soc_rev;
+}
+
+static void __init ar933x_wmac_setup(void)
+{
+       u32 t;
+
+       ar933x_wmac_reset();
+
+       ath79_wmac_device.name = "ar933x_wmac";
+
+       ath79_wmac_resources[0].start = AR933X_WMAC_BASE;
+       ath79_wmac_resources[0].end = AR933X_WMAC_BASE + AR933X_WMAC_SIZE - 1;
+
+       t = ath79_reset_rr(AR933X_RESET_REG_BOOTSTRAP);
+       if (t & AR933X_BOOTSTRAP_REF_CLK_40)
+               ath79_wmac_data.is_clk_25mhz = false;
+       else
+               ath79_wmac_data.is_clk_25mhz = true;
+
+       if (ath79_soc_rev == 1)
+               ath79_wmac_data.get_mac_revision = ar933x_r1_get_wmac_revision;
+
+       ath79_wmac_data.external_reset = ar933x_wmac_reset;
+}
+
+void __init ath79_register_wmac(u8 *cal_data)
+{
+       if (soc_is_ar913x())
+               ar913x_wmac_setup();
+       if (soc_is_ar933x())
+               ar933x_wmac_setup();
+       else
+               BUG();
+
+       if (cal_data)
+               memcpy(ath79_wmac_data.eeprom_data, cal_data,
+                      sizeof(ath79_wmac_data.eeprom_data));
+
+       platform_device_register(&ath79_wmac_device);
+}
diff --git a/arch/mips/ath79/dev-wmac.h b/arch/mips/ath79/dev-wmac.h
new file mode 100644 (file)
index 0000000..c9cd870
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ *  Atheros AR913X/AR933X SoC built-in WMAC device support
+ *
+ *  Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
+ *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License version 2 as published
+ *  by the Free Software Foundation.
+ */
+
+#ifndef _ATH79_DEV_WMAC_H
+#define _ATH79_DEV_WMAC_H
+
+void ath79_register_wmac(u8 *cal_data);
+
+#endif /* _ATH79_DEV_WMAC_H */
index 7499b0e9df263e38b00181323da58debd0ae00b6..6a51ced7a293fe840351d1e7b0ff5f467784a334 100644 (file)
@@ -1,7 +1,7 @@
 /*
- *  Atheros AR71XX/AR724X/AR913X SoC early printk support
+ *  Atheros AR7XXX/AR9XXX SoC early printk support
  *
- *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
+ *  Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
  *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
  *
  *  This program is free software; you can redistribute it and/or modify it
  */
 
 #include <linux/io.h>
+#include <linux/errno.h>
 #include <linux/serial_reg.h>
 #include <asm/addrspace.h>
 
+#include <asm/mach-ath79/ath79.h>
 #include <asm/mach-ath79/ar71xx_regs.h>
+#include <asm/mach-ath79/ar933x_uart.h>
 
-static inline void prom_wait_thre(void __iomem *base)
+static void (*_prom_putchar) (unsigned char);
+
+static inline void prom_putchar_wait(void __iomem *reg, u32 mask, u32 val)
 {
-       u32 lsr;
+       u32 t;
 
        do {
-               lsr = __raw_readl(base + UART_LSR * 4);
-               if (lsr & UART_LSR_THRE)
+               t = __raw_readl(reg);
+               if ((t & mask) == val)
                        break;
        } while (1);
 }
 
-void prom_putchar(unsigned char ch)
+static void prom_putchar_ar71xx(unsigned char ch)
 {
        void __iomem *base = (void __iomem *)(KSEG1ADDR(AR71XX_UART_BASE));
 
-       prom_wait_thre(base);
+       prom_putchar_wait(base + UART_LSR * 4, UART_LSR_THRE, UART_LSR_THRE);
        __raw_writel(ch, base + UART_TX * 4);
-       prom_wait_thre(base);
+       prom_putchar_wait(base + UART_LSR * 4, UART_LSR_THRE, UART_LSR_THRE);
+}
+
+static void prom_putchar_ar933x(unsigned char ch)
+{
+       void __iomem *base = (void __iomem *)(KSEG1ADDR(AR933X_UART_BASE));
+
+       prom_putchar_wait(base + AR933X_UART_DATA_REG, AR933X_UART_DATA_TX_CSR,
+                         AR933X_UART_DATA_TX_CSR);
+       __raw_writel(AR933X_UART_DATA_TX_CSR | ch, base + AR933X_UART_DATA_REG);
+       prom_putchar_wait(base + AR933X_UART_DATA_REG, AR933X_UART_DATA_TX_CSR,
+                         AR933X_UART_DATA_TX_CSR);
+}
+
+static void prom_putchar_dummy(unsigned char ch)
+{
+       /* nothing to do */
+}
+
+static void prom_putchar_init(void)
+{
+       void __iomem *base;
+       u32 id;
+
+       base = (void __iomem *)(KSEG1ADDR(AR71XX_RESET_BASE));
+       id = __raw_readl(base + AR71XX_RESET_REG_REV_ID);
+       id &= REV_ID_MAJOR_MASK;
+
+       switch (id) {
+       case REV_ID_MAJOR_AR71XX:
+       case REV_ID_MAJOR_AR7240:
+       case REV_ID_MAJOR_AR7241:
+       case REV_ID_MAJOR_AR7242:
+       case REV_ID_MAJOR_AR913X:
+               _prom_putchar = prom_putchar_ar71xx;
+               break;
+
+       case REV_ID_MAJOR_AR9330:
+       case REV_ID_MAJOR_AR9331:
+               _prom_putchar = prom_putchar_ar933x;
+               break;
+
+       default:
+               _prom_putchar = prom_putchar_dummy;
+               break;
+       }
+}
+
+void prom_putchar(unsigned char ch)
+{
+       if (!_prom_putchar)
+               prom_putchar_init();
+
+       _prom_putchar(ch);
 }
index a0c426b82123ae2c8e67b20f082a8fecf09b9b48..a2f8ca630ed667bb49c2144129f2232c7c047fc1 100644 (file)
@@ -153,6 +153,8 @@ void __init ath79_gpio_init(void)
                ath79_gpio_count = AR724X_GPIO_COUNT;
        else if (soc_is_ar913x())
                ath79_gpio_count = AR913X_GPIO_COUNT;
+       else if (soc_is_ar933x())
+               ath79_gpio_count = AR933X_GPIO_COUNT;
        else
                BUG();
 
index ac610d5fe3bab415ef649872072bacce58718c19..1b073de44680ea0fdba8c95f84cf6f214f394448 100644 (file)
@@ -46,6 +46,15 @@ static void ath79_misc_irq_handler(unsigned int irq, struct irq_desc *desc)
        else if (pending & MISC_INT_TIMER)
                generic_handle_irq(ATH79_MISC_IRQ_TIMER);
 
+       else if (pending & MISC_INT_TIMER2)
+               generic_handle_irq(ATH79_MISC_IRQ_TIMER2);
+
+       else if (pending & MISC_INT_TIMER3)
+               generic_handle_irq(ATH79_MISC_IRQ_TIMER3);
+
+       else if (pending & MISC_INT_TIMER4)
+               generic_handle_irq(ATH79_MISC_IRQ_TIMER4);
+
        else if (pending & MISC_INT_OHCI)
                generic_handle_irq(ATH79_MISC_IRQ_OHCI);
 
@@ -58,6 +67,9 @@ static void ath79_misc_irq_handler(unsigned int irq, struct irq_desc *desc)
        else if (pending & MISC_INT_WDOG)
                generic_handle_irq(ATH79_MISC_IRQ_WDOG);
 
+       else if (pending & MISC_INT_ETHSW)
+               generic_handle_irq(ATH79_MISC_IRQ_ETHSW);
+
        else
                spurious_interrupt();
 }
@@ -117,7 +129,7 @@ static void __init ath79_misc_irq_init(void)
 
        if (soc_is_ar71xx() || soc_is_ar913x())
                ath79_misc_irq_chip.irq_mask_ack = ar71xx_misc_irq_mask;
-       else if (soc_is_ar724x())
+       else if (soc_is_ar724x() || soc_is_ar933x())
                ath79_misc_irq_chip.irq_ack = ar724x_misc_irq_ack;
        else
                BUG();
@@ -174,6 +186,9 @@ void __init arch_init_irq(void)
        } else if (soc_is_ar913x()) {
                ath79_ip2_flush_reg = AR913X_DDR_REG_FLUSH_WMAC;
                ath79_ip3_flush_reg = AR913X_DDR_REG_FLUSH_USB;
+       } else if (soc_is_ar933x()) {
+               ath79_ip2_flush_reg = AR933X_DDR_REG_FLUSH_WMAC;
+               ath79_ip3_flush_reg = AR933X_DDR_REG_FLUSH_USB;
        } else
                BUG();
 
diff --git a/arch/mips/ath79/mach-ap121.c b/arch/mips/ath79/mach-ap121.c
new file mode 100644 (file)
index 0000000..4c20200
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ *  Atheros AP121 board support
+ *
+ *  Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License version 2 as published
+ *  by the Free Software Foundation.
+ */
+
+#include "machtypes.h"
+#include "dev-gpio-buttons.h"
+#include "dev-leds-gpio.h"
+#include "dev-spi.h"
+#include "dev-usb.h"
+#include "dev-wmac.h"
+
+#define AP121_GPIO_LED_WLAN            0
+#define AP121_GPIO_LED_USB             1
+
+#define AP121_GPIO_BTN_JUMPSTART       11
+#define AP121_GPIO_BTN_RESET           12
+
+#define AP121_KEYS_POLL_INTERVAL       20      /* msecs */
+#define AP121_KEYS_DEBOUNCE_INTERVAL   (3 * AP121_KEYS_POLL_INTERVAL)
+
+#define AP121_CAL_DATA_ADDR    0x1fff1000
+
+static struct gpio_led ap121_leds_gpio[] __initdata = {
+       {
+               .name           = "ap121:green:usb",
+               .gpio           = AP121_GPIO_LED_USB,
+               .active_low     = 0,
+       },
+       {
+               .name           = "ap121:green:wlan",
+               .gpio           = AP121_GPIO_LED_WLAN,
+               .active_low     = 0,
+       },
+};
+
+static struct gpio_keys_button ap121_gpio_keys[] __initdata = {
+       {
+               .desc           = "jumpstart button",
+               .type           = EV_KEY,
+               .code           = KEY_WPS_BUTTON,
+               .debounce_interval = AP121_KEYS_DEBOUNCE_INTERVAL,
+               .gpio           = AP121_GPIO_BTN_JUMPSTART,
+               .active_low     = 1,
+       },
+       {
+               .desc           = "reset button",
+               .type           = EV_KEY,
+               .code           = KEY_RESTART,
+               .debounce_interval = AP121_KEYS_DEBOUNCE_INTERVAL,
+               .gpio           = AP121_GPIO_BTN_RESET,
+               .active_low     = 1,
+       }
+};
+
+static struct spi_board_info ap121_spi_info[] = {
+       {
+               .bus_num        = 0,
+               .chip_select    = 0,
+               .max_speed_hz   = 25000000,
+               .modalias       = "mx25l1606e",
+       }
+};
+
+static struct ath79_spi_platform_data ap121_spi_data = {
+       .bus_num        = 0,
+       .num_chipselect = 1,
+};
+
+static void __init ap121_setup(void)
+{
+       u8 *cal_data = (u8 *) KSEG1ADDR(AP121_CAL_DATA_ADDR);
+
+       ath79_register_leds_gpio(-1, ARRAY_SIZE(ap121_leds_gpio),
+                                ap121_leds_gpio);
+       ath79_register_gpio_keys_polled(-1, AP121_KEYS_POLL_INTERVAL,
+                                       ARRAY_SIZE(ap121_gpio_keys),
+                                       ap121_gpio_keys);
+
+       ath79_register_spi(&ap121_spi_data, ap121_spi_info,
+                          ARRAY_SIZE(ap121_spi_info));
+       ath79_register_usb();
+       ath79_register_wmac(cal_data);
+}
+
+MIPS_MACHINE(ATH79_MACH_AP121, "AP121", "Atheros AP121 reference board",
+            ap121_setup);
index eee4c121deb4297ca756d131a2d2908fa9eacbea..abe19836331c531448c17aba798181a952a66f8a 100644 (file)
  */
 
 #include "machtypes.h"
-#include "dev-ar913x-wmac.h"
+#include "dev-wmac.h"
 #include "dev-gpio-buttons.h"
 #include "dev-leds-gpio.h"
 #include "dev-spi.h"
+#include "dev-usb.h"
 
 #define AP81_GPIO_LED_STATUS   1
 #define AP81_GPIO_LED_AOSS     3
@@ -91,7 +92,8 @@ static void __init ap81_setup(void)
                                        ap81_gpio_keys);
        ath79_register_spi(&ap81_spi_data, ap81_spi_info,
                           ARRAY_SIZE(ap81_spi_info));
-       ath79_register_ar913x_wmac(cal_data);
+       ath79_register_wmac(cal_data);
+       ath79_register_usb();
 }
 
 MIPS_MACHINE(ATH79_MACH_AP81, "AP81", "Atheros AP81 reference board",
index ec7b7a135d53c57063b66c4fff52e3572e9902c6..fe9701a322916bbb946b2cc037aa57fd02d6329f 100644 (file)
@@ -18,6 +18,7 @@
 #include "dev-gpio-buttons.h"
 #include "dev-leds-gpio.h"
 #include "dev-spi.h"
+#include "dev-usb.h"
 
 #define PB44_GPIO_I2C_SCL      0
 #define PB44_GPIO_I2C_SDA      1
@@ -112,6 +113,7 @@ static void __init pb44_init(void)
                                        pb44_gpio_keys);
        ath79_register_spi(&pb44_spi_data, pb44_spi_info,
                           ARRAY_SIZE(pb44_spi_info));
+       ath79_register_usb();
 }
 
 MIPS_MACHINE(ATH79_MACH_PB44, "PB44", "Atheros PB44 reference board",
diff --git a/arch/mips/ath79/mach-ubnt-xm.c b/arch/mips/ath79/mach-ubnt-xm.c
new file mode 100644 (file)
index 0000000..3c311a5
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+ *  Ubiquiti Networks XM (rev 1.0) board support
+ *
+ *  Copyright (C) 2011 René Bolldorf <xsecute@googlemail.com>
+ *
+ *  Derived from: mach-pb44.c
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License version 2 as published
+ *  by the Free Software Foundation.
+ */
+
+#include <linux/init.h>
+#include <linux/pci.h>
+
+#ifdef CONFIG_PCI
+#include <linux/ath9k_platform.h>
+#include <asm/mach-ath79/pci-ath724x.h>
+#endif /* CONFIG_PCI */
+
+#include "machtypes.h"
+#include "dev-gpio-buttons.h"
+#include "dev-leds-gpio.h"
+#include "dev-spi.h"
+
+#define UBNT_XM_GPIO_LED_L1            0
+#define UBNT_XM_GPIO_LED_L2            1
+#define UBNT_XM_GPIO_LED_L3            11
+#define UBNT_XM_GPIO_LED_L4            7
+
+#define UBNT_XM_GPIO_BTN_RESET         12
+
+#define UBNT_XM_KEYS_POLL_INTERVAL     20
+#define UBNT_XM_KEYS_DEBOUNCE_INTERVAL (3 * UBNT_XM_KEYS_POLL_INTERVAL)
+
+#define UBNT_XM_PCI_IRQ                        48
+#define UBNT_XM_EEPROM_ADDR            (u8 *) KSEG1ADDR(0x1fff1000)
+
+static struct gpio_led ubnt_xm_leds_gpio[] __initdata = {
+       {
+               .name           = "ubnt-xm:red:link1",
+               .gpio           = UBNT_XM_GPIO_LED_L1,
+               .active_low     = 0,
+       }, {
+               .name           = "ubnt-xm:orange:link2",
+               .gpio           = UBNT_XM_GPIO_LED_L2,
+               .active_low     = 0,
+       }, {
+               .name           = "ubnt-xm:green:link3",
+               .gpio           = UBNT_XM_GPIO_LED_L3,
+               .active_low     = 0,
+       }, {
+               .name           = "ubnt-xm:green:link4",
+               .gpio           = UBNT_XM_GPIO_LED_L4,
+               .active_low     = 0,
+       },
+};
+
+static struct gpio_keys_button ubnt_xm_gpio_keys[] __initdata = {
+       {
+               .desc                   = "reset",
+               .type                   = EV_KEY,
+               .code                   = KEY_RESTART,
+               .debounce_interval      = UBNT_XM_KEYS_DEBOUNCE_INTERVAL,
+               .gpio                   = UBNT_XM_GPIO_BTN_RESET,
+               .active_low             = 1,
+       }
+};
+
+static struct spi_board_info ubnt_xm_spi_info[] = {
+       {
+               .bus_num        = 0,
+               .chip_select    = 0,
+               .max_speed_hz   = 25000000,
+               .modalias       = "mx25l6405d",
+       }
+};
+
+static struct ath79_spi_platform_data ubnt_xm_spi_data = {
+       .bus_num                = 0,
+       .num_chipselect         = 1,
+};
+
+#ifdef CONFIG_PCI
+static struct ath9k_platform_data ubnt_xm_eeprom_data;
+
+static struct ath724x_pci_data ubnt_xm_pci_data[] = {
+       {
+               .irq    = UBNT_XM_PCI_IRQ,
+               .pdata  = &ubnt_xm_eeprom_data,
+       },
+};
+#endif /* CONFIG_PCI */
+
+static void __init ubnt_xm_init(void)
+{
+       ath79_register_leds_gpio(-1, ARRAY_SIZE(ubnt_xm_leds_gpio),
+                                ubnt_xm_leds_gpio);
+
+       ath79_register_gpio_keys_polled(-1, UBNT_XM_KEYS_POLL_INTERVAL,
+                                       ARRAY_SIZE(ubnt_xm_gpio_keys),
+                                       ubnt_xm_gpio_keys);
+
+       ath79_register_spi(&ubnt_xm_spi_data, ubnt_xm_spi_info,
+                          ARRAY_SIZE(ubnt_xm_spi_info));
+
+#ifdef CONFIG_PCI
+       memcpy(ubnt_xm_eeprom_data.eeprom_data, UBNT_XM_EEPROM_ADDR,
+              sizeof(ubnt_xm_eeprom_data.eeprom_data));
+
+       ath724x_pci_add_data(ubnt_xm_pci_data, ARRAY_SIZE(ubnt_xm_pci_data));
+#endif /* CONFIG_PCI */
+
+}
+
+MIPS_MACHINE(ATH79_MACH_UBNT_XM,
+            "UBNT-XM",
+            "Ubiquiti Networks XM (rev 1.0) board",
+            ubnt_xm_init);
index 3940fe470b2dfaf2bbaea81b7f6c1ae928802ea3..9a1f3826626e13703c24abc17b05a930f7528558 100644 (file)
 
 enum ath79_mach_type {
        ATH79_MACH_GENERIC = 0,
+       ATH79_MACH_AP121,               /* Atheros AP121 reference board */
        ATH79_MACH_AP81,                /* Atheros AP81 reference board */
        ATH79_MACH_PB44,                /* Atheros PB44 reference board */
+       ATH79_MACH_UBNT_XM,             /* Ubiquiti Networks XM board rev 1.0 */
 };
 
 #endif /* _ATH79_MACHTYPE_H */
index 159b42f106b098185b908eae7efc85b245f8bb52..80a7d4023d7ffbd872ce76ed62bbe8b496d7e6bc 100644 (file)
@@ -101,19 +101,31 @@ static void __init ath79_detect_sys_type(void)
        case REV_ID_MAJOR_AR7240:
                ath79_soc = ATH79_SOC_AR7240;
                chip = "7240";
-               rev = (id & AR724X_REV_ID_REVISION_MASK);
+               rev = id & AR724X_REV_ID_REVISION_MASK;
                break;
 
        case REV_ID_MAJOR_AR7241:
                ath79_soc = ATH79_SOC_AR7241;
                chip = "7241";
-               rev = (id & AR724X_REV_ID_REVISION_MASK);
+               rev = id & AR724X_REV_ID_REVISION_MASK;
                break;
 
        case REV_ID_MAJOR_AR7242:
                ath79_soc = ATH79_SOC_AR7242;
                chip = "7242";
-               rev = (id & AR724X_REV_ID_REVISION_MASK);
+               rev = id & AR724X_REV_ID_REVISION_MASK;
+               break;
+
+       case REV_ID_MAJOR_AR9330:
+               ath79_soc = ATH79_SOC_AR9330;
+               chip = "9330";
+               rev = id & AR933X_REV_ID_REVISION_MASK;
+               break;
+
+       case REV_ID_MAJOR_AR9331:
+               ath79_soc = ATH79_SOC_AR9331;
+               chip = "9331";
+               rev = id & AR933X_REV_ID_REVISION_MASK;
                break;
 
        case REV_ID_MAJOR_AR913X:
@@ -134,9 +146,11 @@ static void __init ath79_detect_sys_type(void)
                break;
 
        default:
-               panic("ath79: unknown SoC, id:0x%08x\n", id);
+               panic("ath79: unknown SoC, id:0x%08x", id);
        }
 
+       ath79_soc_rev = rev;
+
        sprintf(ath79_sys_type, "Atheros AR%s rev %u", chip, rev);
        pr_info("SoC: %s\n", ath79_sys_type);
 }
index 1cfdda03546a8dc5819d682107e3c52289231e24..aab6b0c40a7569b54767c5e473e75da5ba5b8563 100644 (file)
@@ -289,7 +289,7 @@ static void __init bcm47xx_register_ssb(void)
        err = ssb_bus_ssbbus_register(&(bcm47xx_bus.ssb), SSB_ENUM_BASE,
                                      bcm47xx_get_invariants);
        if (err)
-               panic("Failed to initialize SSB bus (err %d)\n", err);
+               panic("Failed to initialize SSB bus (err %d)", err);
 
        mcore = &bcm47xx_bus.ssb.mipscore;
        if (nvram_getenv("kernel_args", buf, sizeof(buf)) >= 0) {
@@ -314,7 +314,7 @@ static void __init bcm47xx_register_bcma(void)
 
        err = bcma_host_soc_register(&bcm47xx_bus.bcma);
        if (err)
-               panic("Failed to initialize BCMA bus (err %d)\n", err);
+               panic("Failed to initialize BCMA bus (err %d)", err);
 }
 #endif
 
index fb177d6df0665388e749e3f2ec078d29343d2b24..6b1b9ad8d857d01df1254657635c641a53a09148 100644 (file)
@@ -20,6 +20,10 @@ config BCM63XX_CPU_6348
 config BCM63XX_CPU_6358
        bool "support 6358 CPU"
        select HW_HAS_PCI
+
+config BCM63XX_CPU_6368
+       bool "support 6368 CPU"
+       select HW_HAS_PCI
 endmenu
 
 source "arch/mips/bcm63xx/boards/Kconfig"
index 40b223b603be588ea6702579cd658c170e2f0384..e62461f817d7c10e3d0881a08451afc7f02aeac4 100644 (file)
@@ -709,15 +709,9 @@ void __init board_prom_init(void)
        char cfe_version[32];
        u32 val;
 
-       /* read base address of boot chip select (0)
-        * 6345 does not have MPI but boots from standard
-        * MIPS Flash address */
-       if (BCMCPU_IS_6345())
-               val = 0x1fc00000;
-       else {
-               val = bcm_mpi_readl(MPI_CSBASE_REG(0));
-               val &= MPI_CSBASE_BASE_MASK;
-       }
+       /* read base address of boot chip select (0) */
+       val = bcm_mpi_readl(MPI_CSBASE_REG(0));
+       val &= MPI_CSBASE_BASE_MASK;
        boot_addr = (u8 *)KSEG1ADDR(val);
 
        /* dump cfe version */
@@ -797,18 +791,6 @@ void __init board_prom_init(void)
        }
 
        bcm_gpio_writel(val, GPIO_MODE_REG);
-
-       /* Generate MAC address for WLAN and
-        * register our SPROM */
-#ifdef CONFIG_SSB_PCIHOST
-       if (!board_get_mac_address(bcm63xx_sprom.il0mac)) {
-               memcpy(bcm63xx_sprom.et0mac, bcm63xx_sprom.il0mac, ETH_ALEN);
-               memcpy(bcm63xx_sprom.et1mac, bcm63xx_sprom.il0mac, ETH_ALEN);
-               if (ssb_arch_register_fallback_sprom(
-                               &bcm63xx_get_fallback_sprom) < 0)
-                       printk(KERN_ERR PFX "failed to register fallback SPROM\n");
-       }
-#endif
 }
 
 /*
@@ -892,13 +874,23 @@ int __init board_register_devices(void)
        if (board.has_dsp)
                bcm63xx_dsp_register(&board.dsp);
 
-       /* read base address of boot chip select (0) */
-       if (BCMCPU_IS_6345())
-               val = 0x1fc00000;
-       else {
-               val = bcm_mpi_readl(MPI_CSBASE_REG(0));
-               val &= MPI_CSBASE_BASE_MASK;
+       /* Generate MAC address for WLAN and register our SPROM,
+        * do this after registering enet devices
+        */
+#ifdef CONFIG_SSB_PCIHOST
+       if (!board_get_mac_address(bcm63xx_sprom.il0mac)) {
+               memcpy(bcm63xx_sprom.et0mac, bcm63xx_sprom.il0mac, ETH_ALEN);
+               memcpy(bcm63xx_sprom.et1mac, bcm63xx_sprom.il0mac, ETH_ALEN);
+               if (ssb_arch_register_fallback_sprom(
+                               &bcm63xx_get_fallback_sprom) < 0)
+                       pr_err(PFX "failed to register fallback SPROM\n");
        }
+#endif
+
+       /* read base address of boot chip select (0) */
+       val = bcm_mpi_readl(MPI_CSBASE_REG(0));
+       val &= MPI_CSBASE_BASE_MASK;
+
        mtd_resources[0].start = val;
        mtd_resources[0].end = 0x1FFFFFFF;
 
index 2c68ee9ccee2b3fa3ebfcbd72ee044688bc06765..9d57c71b7b582cc9c24f664df6ae156bc9752522 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/mutex.h>
 #include <linux/err.h>
 #include <linux/clk.h>
+#include <linux/delay.h>
 #include <bcm63xx_cpu.h>
 #include <bcm63xx_io.h>
 #include <bcm63xx_regs.h>
@@ -112,6 +113,34 @@ static struct clk clk_ephy = {
        .set    = ephy_set,
 };
 
+/*
+ * Ethernet switch clock
+ */
+static void enetsw_set(struct clk *clk, int enable)
+{
+       if (!BCMCPU_IS_6368())
+               return;
+       bcm_hwclock_set(CKCTL_6368_ROBOSW_CLK_EN |
+                       CKCTL_6368_SWPKT_USB_EN |
+                       CKCTL_6368_SWPKT_SAR_EN, enable);
+       if (enable) {
+               u32 val;
+
+               /* reset switch core afer clock change */
+               val = bcm_perf_readl(PERF_SOFTRESET_6368_REG);
+               val &= ~SOFTRESET_6368_ENETSW_MASK;
+               bcm_perf_writel(val, PERF_SOFTRESET_6368_REG);
+               msleep(10);
+               val |= SOFTRESET_6368_ENETSW_MASK;
+               bcm_perf_writel(val, PERF_SOFTRESET_6368_REG);
+               msleep(10);
+       }
+}
+
+static struct clk clk_enetsw = {
+       .set    = enetsw_set,
+};
+
 /*
  * PCM clock
  */
@@ -131,9 +160,10 @@ static struct clk clk_pcm = {
  */
 static void usbh_set(struct clk *clk, int enable)
 {
-       if (!BCMCPU_IS_6348())
-               return;
-       bcm_hwclock_set(CKCTL_6348_USBH_EN, enable);
+       if (BCMCPU_IS_6348())
+               bcm_hwclock_set(CKCTL_6348_USBH_EN, enable);
+       else if (BCMCPU_IS_6368())
+               bcm_hwclock_set(CKCTL_6368_USBH_CLK_EN, enable);
 }
 
 static struct clk clk_usbh = {
@@ -161,6 +191,36 @@ static struct clk clk_spi = {
        .set    = spi_set,
 };
 
+/*
+ * XTM clock
+ */
+static void xtm_set(struct clk *clk, int enable)
+{
+       if (!BCMCPU_IS_6368())
+               return;
+
+       bcm_hwclock_set(CKCTL_6368_SAR_CLK_EN |
+                       CKCTL_6368_SWPKT_SAR_EN, enable);
+
+       if (enable) {
+               u32 val;
+
+               /* reset sar core afer clock change */
+               val = bcm_perf_readl(PERF_SOFTRESET_6368_REG);
+               val &= ~SOFTRESET_6368_SAR_MASK;
+               bcm_perf_writel(val, PERF_SOFTRESET_6368_REG);
+               mdelay(1);
+               val |= SOFTRESET_6368_SAR_MASK;
+               bcm_perf_writel(val, PERF_SOFTRESET_6368_REG);
+               mdelay(1);
+       }
+}
+
+
+static struct clk clk_xtm = {
+       .set    = xtm_set,
+};
+
 /*
  * Internal peripheral clock
  */
@@ -204,12 +264,16 @@ struct clk *clk_get(struct device *dev, const char *id)
                return &clk_enet0;
        if (!strcmp(id, "enet1"))
                return &clk_enet1;
+       if (!strcmp(id, "enetsw"))
+               return &clk_enetsw;
        if (!strcmp(id, "ephy"))
                return &clk_ephy;
        if (!strcmp(id, "usbh"))
                return &clk_usbh;
        if (!strcmp(id, "spi"))
                return &clk_spi;
+       if (!strcmp(id, "xtm"))
+               return &clk_xtm;
        if (!strcmp(id, "periph"))
                return &clk_periph;
        if (BCMCPU_IS_6358() && !strcmp(id, "pcm"))
index 7c7e4d4486ce0d0099ab2cd92bca6d426237d2b8..8f0d6c7725ea278eecf0fedca355fb5e33c7e824 100644 (file)
@@ -29,166 +29,47 @@ static u16 bcm63xx_cpu_rev;
 static unsigned int bcm63xx_cpu_freq;
 static unsigned int bcm63xx_memory_size;
 
-/*
- * 6338 register sets and irqs
- */
-static const unsigned long bcm96338_regs_base[] = {
-       [RSET_DSL_LMEM]         = BCM_6338_DSL_LMEM_BASE,
-       [RSET_PERF]             = BCM_6338_PERF_BASE,
-       [RSET_TIMER]            = BCM_6338_TIMER_BASE,
-       [RSET_WDT]              = BCM_6338_WDT_BASE,
-       [RSET_UART0]            = BCM_6338_UART0_BASE,
-       [RSET_UART1]            = BCM_6338_UART1_BASE,
-       [RSET_GPIO]             = BCM_6338_GPIO_BASE,
-       [RSET_SPI]              = BCM_6338_SPI_BASE,
-       [RSET_OHCI0]            = BCM_6338_OHCI0_BASE,
-       [RSET_OHCI_PRIV]        = BCM_6338_OHCI_PRIV_BASE,
-       [RSET_USBH_PRIV]        = BCM_6338_USBH_PRIV_BASE,
-       [RSET_UDC0]             = BCM_6338_UDC0_BASE,
-       [RSET_MPI]              = BCM_6338_MPI_BASE,
-       [RSET_PCMCIA]           = BCM_6338_PCMCIA_BASE,
-       [RSET_SDRAM]            = BCM_6338_SDRAM_BASE,
-       [RSET_DSL]              = BCM_6338_DSL_BASE,
-       [RSET_ENET0]            = BCM_6338_ENET0_BASE,
-       [RSET_ENET1]            = BCM_6338_ENET1_BASE,
-       [RSET_ENETDMA]          = BCM_6338_ENETDMA_BASE,
-       [RSET_MEMC]             = BCM_6338_MEMC_BASE,
-       [RSET_DDR]              = BCM_6338_DDR_BASE,
+static const unsigned long bcm6338_regs_base[] = {
+       __GEN_CPU_REGS_TABLE(6338)
 };
 
-static const int bcm96338_irqs[] = {
-       [IRQ_TIMER]             = BCM_6338_TIMER_IRQ,
-       [IRQ_UART0]             = BCM_6338_UART0_IRQ,
-       [IRQ_DSL]               = BCM_6338_DSL_IRQ,
-       [IRQ_ENET0]             = BCM_6338_ENET0_IRQ,
-       [IRQ_ENET_PHY]          = BCM_6338_ENET_PHY_IRQ,
-       [IRQ_ENET0_RXDMA]       = BCM_6338_ENET0_RXDMA_IRQ,
-       [IRQ_ENET0_TXDMA]       = BCM_6338_ENET0_TXDMA_IRQ,
+static const int bcm6338_irqs[] = {
+       __GEN_CPU_IRQ_TABLE(6338)
 };
 
-/*
- * 6345 register sets and irqs
- */
-static const unsigned long bcm96345_regs_base[] = {
-       [RSET_DSL_LMEM]         = BCM_6345_DSL_LMEM_BASE,
-       [RSET_PERF]             = BCM_6345_PERF_BASE,
-       [RSET_TIMER]            = BCM_6345_TIMER_BASE,
-       [RSET_WDT]              = BCM_6345_WDT_BASE,
-       [RSET_UART0]            = BCM_6345_UART0_BASE,
-       [RSET_UART1]            = BCM_6345_UART1_BASE,
-       [RSET_GPIO]             = BCM_6345_GPIO_BASE,
-       [RSET_SPI]              = BCM_6345_SPI_BASE,
-       [RSET_UDC0]             = BCM_6345_UDC0_BASE,
-       [RSET_OHCI0]            = BCM_6345_OHCI0_BASE,
-       [RSET_OHCI_PRIV]        = BCM_6345_OHCI_PRIV_BASE,
-       [RSET_USBH_PRIV]        = BCM_6345_USBH_PRIV_BASE,
-       [RSET_MPI]              = BCM_6345_MPI_BASE,
-       [RSET_PCMCIA]           = BCM_6345_PCMCIA_BASE,
-       [RSET_DSL]              = BCM_6345_DSL_BASE,
-       [RSET_ENET0]            = BCM_6345_ENET0_BASE,
-       [RSET_ENET1]            = BCM_6345_ENET1_BASE,
-       [RSET_ENETDMA]          = BCM_6345_ENETDMA_BASE,
-       [RSET_EHCI0]            = BCM_6345_EHCI0_BASE,
-       [RSET_SDRAM]            = BCM_6345_SDRAM_BASE,
-       [RSET_MEMC]             = BCM_6345_MEMC_BASE,
-       [RSET_DDR]              = BCM_6345_DDR_BASE,
+static const unsigned long bcm6345_regs_base[] = {
+       __GEN_CPU_REGS_TABLE(6345)
 };
 
-static const int bcm96345_irqs[] = {
-       [IRQ_TIMER]             = BCM_6345_TIMER_IRQ,
-       [IRQ_UART0]             = BCM_6345_UART0_IRQ,
-       [IRQ_DSL]               = BCM_6345_DSL_IRQ,
-       [IRQ_ENET0]             = BCM_6345_ENET0_IRQ,
-       [IRQ_ENET_PHY]          = BCM_6345_ENET_PHY_IRQ,
-       [IRQ_ENET0_RXDMA]       = BCM_6345_ENET0_RXDMA_IRQ,
-       [IRQ_ENET0_TXDMA]       = BCM_6345_ENET0_TXDMA_IRQ,
+static const int bcm6345_irqs[] = {
+       __GEN_CPU_IRQ_TABLE(6345)
 };
 
-/*
- * 6348 register sets and irqs
- */
-static const unsigned long bcm96348_regs_base[] = {
-       [RSET_DSL_LMEM]         = BCM_6348_DSL_LMEM_BASE,
-       [RSET_PERF]             = BCM_6348_PERF_BASE,
-       [RSET_TIMER]            = BCM_6348_TIMER_BASE,
-       [RSET_WDT]              = BCM_6348_WDT_BASE,
-       [RSET_UART0]            = BCM_6348_UART0_BASE,
-       [RSET_UART1]            = BCM_6348_UART1_BASE,
-       [RSET_GPIO]             = BCM_6348_GPIO_BASE,
-       [RSET_SPI]              = BCM_6348_SPI_BASE,
-       [RSET_OHCI0]            = BCM_6348_OHCI0_BASE,
-       [RSET_OHCI_PRIV]        = BCM_6348_OHCI_PRIV_BASE,
-       [RSET_USBH_PRIV]        = BCM_6348_USBH_PRIV_BASE,
-       [RSET_MPI]              = BCM_6348_MPI_BASE,
-       [RSET_PCMCIA]           = BCM_6348_PCMCIA_BASE,
-       [RSET_SDRAM]            = BCM_6348_SDRAM_BASE,
-       [RSET_DSL]              = BCM_6348_DSL_BASE,
-       [RSET_ENET0]            = BCM_6348_ENET0_BASE,
-       [RSET_ENET1]            = BCM_6348_ENET1_BASE,
-       [RSET_ENETDMA]          = BCM_6348_ENETDMA_BASE,
-       [RSET_MEMC]             = BCM_6348_MEMC_BASE,
-       [RSET_DDR]              = BCM_6348_DDR_BASE,
+static const unsigned long bcm6348_regs_base[] = {
+       __GEN_CPU_REGS_TABLE(6348)
 };
 
-static const int bcm96348_irqs[] = {
-       [IRQ_TIMER]             = BCM_6348_TIMER_IRQ,
-       [IRQ_UART0]             = BCM_6348_UART0_IRQ,
-       [IRQ_DSL]               = BCM_6348_DSL_IRQ,
-       [IRQ_ENET0]             = BCM_6348_ENET0_IRQ,
-       [IRQ_ENET1]             = BCM_6348_ENET1_IRQ,
-       [IRQ_ENET_PHY]          = BCM_6348_ENET_PHY_IRQ,
-       [IRQ_OHCI0]             = BCM_6348_OHCI0_IRQ,
-       [IRQ_PCMCIA]            = BCM_6348_PCMCIA_IRQ,
-       [IRQ_ENET0_RXDMA]       = BCM_6348_ENET0_RXDMA_IRQ,
-       [IRQ_ENET0_TXDMA]       = BCM_6348_ENET0_TXDMA_IRQ,
-       [IRQ_ENET1_RXDMA]       = BCM_6348_ENET1_RXDMA_IRQ,
-       [IRQ_ENET1_TXDMA]       = BCM_6348_ENET1_TXDMA_IRQ,
-       [IRQ_PCI]               = BCM_6348_PCI_IRQ,
+static const int bcm6348_irqs[] = {
+       __GEN_CPU_IRQ_TABLE(6348)
+
 };
 
-/*
- * 6358 register sets and irqs
- */
-static const unsigned long bcm96358_regs_base[] = {
-       [RSET_DSL_LMEM]         = BCM_6358_DSL_LMEM_BASE,
-       [RSET_PERF]             = BCM_6358_PERF_BASE,
-       [RSET_TIMER]            = BCM_6358_TIMER_BASE,
-       [RSET_WDT]              = BCM_6358_WDT_BASE,
-       [RSET_UART0]            = BCM_6358_UART0_BASE,
-       [RSET_UART1]            = BCM_6358_UART1_BASE,
-       [RSET_GPIO]             = BCM_6358_GPIO_BASE,
-       [RSET_SPI]              = BCM_6358_SPI_BASE,
-       [RSET_OHCI0]            = BCM_6358_OHCI0_BASE,
-       [RSET_EHCI0]            = BCM_6358_EHCI0_BASE,
-       [RSET_OHCI_PRIV]        = BCM_6358_OHCI_PRIV_BASE,
-       [RSET_USBH_PRIV]        = BCM_6358_USBH_PRIV_BASE,
-       [RSET_MPI]              = BCM_6358_MPI_BASE,
-       [RSET_PCMCIA]           = BCM_6358_PCMCIA_BASE,
-       [RSET_SDRAM]            = BCM_6358_SDRAM_BASE,
-       [RSET_DSL]              = BCM_6358_DSL_BASE,
-       [RSET_ENET0]            = BCM_6358_ENET0_BASE,
-       [RSET_ENET1]            = BCM_6358_ENET1_BASE,
-       [RSET_ENETDMA]          = BCM_6358_ENETDMA_BASE,
-       [RSET_MEMC]             = BCM_6358_MEMC_BASE,
-       [RSET_DDR]              = BCM_6358_DDR_BASE,
+static const unsigned long bcm6358_regs_base[] = {
+       __GEN_CPU_REGS_TABLE(6358)
+};
+
+static const int bcm6358_irqs[] = {
+       __GEN_CPU_IRQ_TABLE(6358)
+
 };
 
-static const int bcm96358_irqs[] = {
-       [IRQ_TIMER]             = BCM_6358_TIMER_IRQ,
-       [IRQ_UART0]             = BCM_6358_UART0_IRQ,
-       [IRQ_UART1]             = BCM_6358_UART1_IRQ,
-       [IRQ_DSL]               = BCM_6358_DSL_IRQ,
-       [IRQ_ENET0]             = BCM_6358_ENET0_IRQ,
-       [IRQ_ENET1]             = BCM_6358_ENET1_IRQ,
-       [IRQ_ENET_PHY]          = BCM_6358_ENET_PHY_IRQ,
-       [IRQ_OHCI0]             = BCM_6358_OHCI0_IRQ,
-       [IRQ_EHCI0]             = BCM_6358_EHCI0_IRQ,
-       [IRQ_PCMCIA]            = BCM_6358_PCMCIA_IRQ,
-       [IRQ_ENET0_RXDMA]       = BCM_6358_ENET0_RXDMA_IRQ,
-       [IRQ_ENET0_TXDMA]       = BCM_6358_ENET0_TXDMA_IRQ,
-       [IRQ_ENET1_RXDMA]       = BCM_6358_ENET1_RXDMA_IRQ,
-       [IRQ_ENET1_TXDMA]       = BCM_6358_ENET1_TXDMA_IRQ,
-       [IRQ_PCI]               = BCM_6358_PCI_IRQ,
+static const unsigned long bcm6368_regs_base[] = {
+       __GEN_CPU_REGS_TABLE(6368)
+};
+
+static const int bcm6368_irqs[] = {
+       __GEN_CPU_IRQ_TABLE(6368)
+
 };
 
 u16 __bcm63xx_get_cpu_id(void)
@@ -217,20 +98,19 @@ unsigned int bcm63xx_get_memory_size(void)
 
 static unsigned int detect_cpu_clock(void)
 {
-       unsigned int tmp, n1 = 0, n2 = 0, m1 = 0;
-
-       /* BCM6338 has a fixed 240 Mhz frequency */
-       if (BCMCPU_IS_6338())
+       switch (bcm63xx_get_cpu_id()) {
+       case BCM6338_CPU_ID:
+               /* BCM6338 has a fixed 240 Mhz frequency */
                return 240000000;
 
-       /* BCM6345 has a fixed 140Mhz frequency */
-       if (BCMCPU_IS_6345())
+       case BCM6345_CPU_ID:
+               /* BCM6345 has a fixed 140Mhz frequency */
                return 140000000;
 
-       /*
-        * frequency depends on PLL configuration:
-        */
-       if (BCMCPU_IS_6348()) {
+       case BCM6348_CPU_ID:
+       {
+               unsigned int tmp, n1, n2, m1;
+
                /* 16MHz * (N1 + 1) * (N2 + 2) / (M1_CPU + 1) */
                tmp = bcm_perf_readl(PERF_MIPSPLLCTL_REG);
                n1 = (tmp & MIPSPLLCTL_N1_MASK) >> MIPSPLLCTL_N1_SHIFT;
@@ -239,17 +119,47 @@ static unsigned int detect_cpu_clock(void)
                n1 += 1;
                n2 += 2;
                m1 += 1;
+               return (16 * 1000000 * n1 * n2) / m1;
        }
 
-       if (BCMCPU_IS_6358()) {
+       case BCM6358_CPU_ID:
+       {
+               unsigned int tmp, n1, n2, m1;
+
                /* 16MHz * N1 * N2 / M1_CPU */
                tmp = bcm_ddr_readl(DDR_DMIPSPLLCFG_REG);
                n1 = (tmp & DMIPSPLLCFG_N1_MASK) >> DMIPSPLLCFG_N1_SHIFT;
                n2 = (tmp & DMIPSPLLCFG_N2_MASK) >> DMIPSPLLCFG_N2_SHIFT;
                m1 = (tmp & DMIPSPLLCFG_M1_MASK) >> DMIPSPLLCFG_M1_SHIFT;
+               return (16 * 1000000 * n1 * n2) / m1;
        }
 
-       return (16 * 1000000 * n1 * n2) / m1;
+       case BCM6368_CPU_ID:
+       {
+               unsigned int tmp, p1, p2, ndiv, m1;
+
+               /* (64MHz / P1) * P2 * NDIV / M1_CPU */
+               tmp = bcm_ddr_readl(DDR_DMIPSPLLCFG_6368_REG);
+
+               p1 = (tmp & DMIPSPLLCFG_6368_P1_MASK) >>
+                       DMIPSPLLCFG_6368_P1_SHIFT;
+
+               p2 = (tmp & DMIPSPLLCFG_6368_P2_MASK) >>
+                       DMIPSPLLCFG_6368_P2_SHIFT;
+
+               ndiv = (tmp & DMIPSPLLCFG_6368_NDIV_MASK) >>
+                       DMIPSPLLCFG_6368_NDIV_SHIFT;
+
+               tmp = bcm_ddr_readl(DDR_DMIPSPLLDIV_6368_REG);
+               m1 = (tmp & DMIPSPLLDIV_6368_MDIV_MASK) >>
+                       DMIPSPLLDIV_6368_MDIV_SHIFT;
+
+               return (((64 * 1000000) / p1) * p2 * ndiv) / m1;
+       }
+
+       default:
+               BUG();
+       }
 }
 
 /*
@@ -260,8 +170,10 @@ static unsigned int detect_memory_size(void)
        unsigned int cols = 0, rows = 0, is_32bits = 0, banks = 0;
        u32 val;
 
-       if (BCMCPU_IS_6345())
-               return (8 * 1024 * 1024);
+       if (BCMCPU_IS_6345()) {
+               val = bcm_sdram_readl(SDRAM_MBASE_REG);
+               return (val * 8 * 1024 * 1024);
+       }
 
        if (BCMCPU_IS_6338() || BCMCPU_IS_6348()) {
                val = bcm_sdram_readl(SDRAM_CFG_REG);
@@ -271,7 +183,7 @@ static unsigned int detect_memory_size(void)
                banks = (val & SDRAM_CFG_BANK_MASK) ? 2 : 1;
        }
 
-       if (BCMCPU_IS_6358()) {
+       if (BCMCPU_IS_6358() || BCMCPU_IS_6368()) {
                val = bcm_memc_readl(MEMC_CFG_REG);
                rows = (val & MEMC_CFG_ROW_MASK) >> MEMC_CFG_ROW_SHIFT;
                cols = (val & MEMC_CFG_COL_MASK) >> MEMC_CFG_COL_SHIFT;
@@ -301,24 +213,33 @@ void __init bcm63xx_cpu_init(void)
        case CPU_BMIPS3300:
                if ((read_c0_prid() & 0xff00) == PRID_IMP_BMIPS3300_ALT) {
                        expected_cpu_id = BCM6348_CPU_ID;
-                       bcm63xx_regs_base = bcm96348_regs_base;
-                       bcm63xx_irqs = bcm96348_irqs;
+                       bcm63xx_regs_base = bcm6348_regs_base;
+                       bcm63xx_irqs = bcm6348_irqs;
                } else {
                        __cpu_name[cpu] = "Broadcom BCM6338";
                        expected_cpu_id = BCM6338_CPU_ID;
-                       bcm63xx_regs_base = bcm96338_regs_base;
-                       bcm63xx_irqs = bcm96338_irqs;
+                       bcm63xx_regs_base = bcm6338_regs_base;
+                       bcm63xx_irqs = bcm6338_irqs;
                }
                break;
        case CPU_BMIPS32:
                expected_cpu_id = BCM6345_CPU_ID;
-               bcm63xx_regs_base = bcm96345_regs_base;
-               bcm63xx_irqs = bcm96345_irqs;
+               bcm63xx_regs_base = bcm6345_regs_base;
+               bcm63xx_irqs = bcm6345_irqs;
                break;
        case CPU_BMIPS4350:
-               expected_cpu_id = BCM6358_CPU_ID;
-               bcm63xx_regs_base = bcm96358_regs_base;
-               bcm63xx_irqs = bcm96358_irqs;
+               switch (read_c0_prid() & 0xf0) {
+               case 0x10:
+                       expected_cpu_id = BCM6358_CPU_ID;
+                       bcm63xx_regs_base = bcm6358_regs_base;
+                       bcm63xx_irqs = bcm6358_irqs;
+                       break;
+               case 0x30:
+                       expected_cpu_id = BCM6368_CPU_ID;
+                       bcm63xx_regs_base = bcm6368_regs_base;
+                       bcm63xx_irqs = bcm6368_irqs;
+                       break;
+               }
                break;
        }
 
index c2963da0253e65ca9520879d0e6a992e541cd798..d6e42c608325a85d9abb5036ad2946dbbabb11ff 100644 (file)
@@ -54,7 +54,7 @@ int __init bcm63xx_uart_register(unsigned int id)
        if (id >= ARRAY_SIZE(bcm63xx_uart_devices))
                return -ENODEV;
 
-       if (id == 1 && !BCMCPU_IS_6358())
+       if (id == 1 && (!BCMCPU_IS_6358() && !BCMCPU_IS_6368()))
                return -ENODEV;
 
        if (id == 0) {
index f560fe7d38ddafd0920f3afbea58ffb91683dcc5..a6c2135dbf3867d480339e663530cc6f533548ec 100644 (file)
@@ -4,7 +4,7 @@
  * for more details.
  *
  * Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr>
- * Copyright (C) 2008 Florian Fainelli <florian@openwrt.org>
+ * Copyright (C) 2008-2011 Florian Fainelli <florian@openwrt.org>
  */
 
 #include <linux/kernel.h>
 #include <bcm63xx_io.h>
 #include <bcm63xx_regs.h>
 
+#ifndef BCMCPU_RUNTIME_DETECT
+#define gpio_out_low_reg       GPIO_DATA_LO_REG
+#ifdef CONFIG_BCM63XX_CPU_6345
+#ifdef gpio_out_low_reg
+#undef gpio_out_low_reg
+#define gpio_out_low_reg       GPIO_DATA_LO_REG_6345
+#endif /* gpio_out_low_reg */
+#endif /* CONFIG_BCM63XX_CPU_6345 */
+
+static inline void bcm63xx_gpio_out_low_reg_init(void)
+{
+}
+#else /* ! BCMCPU_RUNTIME_DETECT */
+static u32 gpio_out_low_reg;
+
+static void bcm63xx_gpio_out_low_reg_init(void)
+{
+       switch (bcm63xx_get_cpu_id()) {
+       case BCM6345_CPU_ID:
+               gpio_out_low_reg = GPIO_DATA_LO_REG_6345;
+               break;
+       default:
+               gpio_out_low_reg = GPIO_DATA_LO_REG;
+               break;
+       }
+}
+#endif /* ! BCMCPU_RUNTIME_DETECT */
+
 static DEFINE_SPINLOCK(bcm63xx_gpio_lock);
 static u32 gpio_out_low, gpio_out_high;
 
@@ -33,7 +61,7 @@ static void bcm63xx_gpio_set(struct gpio_chip *chip,
                BUG();
 
        if (gpio < 32) {
-               reg = GPIO_DATA_LO_REG;
+               reg = gpio_out_low_reg;
                mask = 1 << gpio;
                v = &gpio_out_low;
        } else {
@@ -60,7 +88,7 @@ static int bcm63xx_gpio_get(struct gpio_chip *chip, unsigned gpio)
                BUG();
 
        if (gpio < 32) {
-               reg = GPIO_DATA_LO_REG;
+               reg = gpio_out_low_reg;
                mask = 1 << gpio;
        } else {
                reg = GPIO_DATA_HI_REG;
@@ -125,8 +153,11 @@ static struct gpio_chip bcm63xx_gpio_chip = {
 
 int __init bcm63xx_gpio_init(void)
 {
-       gpio_out_low = bcm_gpio_readl(GPIO_DATA_LO_REG);
-       gpio_out_high = bcm_gpio_readl(GPIO_DATA_HI_REG);
+       bcm63xx_gpio_out_low_reg_init();
+
+       gpio_out_low = bcm_gpio_readl(gpio_out_low_reg);
+       if (!BCMCPU_IS_6345())
+               gpio_out_high = bcm_gpio_readl(GPIO_DATA_HI_REG);
        bcm63xx_gpio_chip.ngpio = bcm63xx_gpio_count();
        pr_info("registering %d GPIOs\n", bcm63xx_gpio_chip.ngpio);
 
index 162e11b4ed755f7e227d4cfc485d40170716abdf..9a216a451d92fd74228d697ac19ca949a9d11469 100644 (file)
 #include <bcm63xx_io.h>
 #include <bcm63xx_irq.h>
 
+static void __dispatch_internal(void) __maybe_unused;
+static void __dispatch_internal_64(void) __maybe_unused;
+static void __internal_irq_mask_32(unsigned int irq) __maybe_unused;
+static void __internal_irq_mask_64(unsigned int irq) __maybe_unused;
+static void __internal_irq_unmask_32(unsigned int irq) __maybe_unused;
+static void __internal_irq_unmask_64(unsigned int irq) __maybe_unused;
+
+#ifndef BCMCPU_RUNTIME_DETECT
+#ifdef CONFIG_BCM63XX_CPU_6338
+#define irq_stat_reg           PERF_IRQSTAT_6338_REG
+#define irq_mask_reg           PERF_IRQMASK_6338_REG
+#define irq_bits               32
+#define is_ext_irq_cascaded    0
+#define ext_irq_start          0
+#define ext_irq_end            0
+#define ext_irq_count          4
+#define ext_irq_cfg_reg1       PERF_EXTIRQ_CFG_REG_6338
+#define ext_irq_cfg_reg2       0
+#endif
+#ifdef CONFIG_BCM63XX_CPU_6345
+#define irq_stat_reg           PERF_IRQSTAT_6345_REG
+#define irq_mask_reg           PERF_IRQMASK_6345_REG
+#define irq_bits               32
+#define is_ext_irq_cascaded    0
+#define ext_irq_start          0
+#define ext_irq_end            0
+#define ext_irq_count          0
+#define ext_irq_cfg_reg1       0
+#define ext_irq_cfg_reg2       0
+#endif
+#ifdef CONFIG_BCM63XX_CPU_6348
+#define irq_stat_reg           PERF_IRQSTAT_6348_REG
+#define irq_mask_reg           PERF_IRQMASK_6348_REG
+#define irq_bits               32
+#define is_ext_irq_cascaded    0
+#define ext_irq_start          0
+#define ext_irq_end            0
+#define ext_irq_count          4
+#define ext_irq_cfg_reg1       PERF_EXTIRQ_CFG_REG_6348
+#define ext_irq_cfg_reg2       0
+#endif
+#ifdef CONFIG_BCM63XX_CPU_6358
+#define irq_stat_reg           PERF_IRQSTAT_6358_REG
+#define irq_mask_reg           PERF_IRQMASK_6358_REG
+#define irq_bits               32
+#define is_ext_irq_cascaded    1
+#define ext_irq_start          (BCM_6358_EXT_IRQ0 - IRQ_INTERNAL_BASE)
+#define ext_irq_end            (BCM_6358_EXT_IRQ3 - IRQ_INTERNAL_BASE)
+#define ext_irq_count          4
+#define ext_irq_cfg_reg1       PERF_EXTIRQ_CFG_REG_6358
+#define ext_irq_cfg_reg2       0
+#endif
+#ifdef CONFIG_BCM63XX_CPU_6368
+#define irq_stat_reg           PERF_IRQSTAT_6368_REG
+#define irq_mask_reg           PERF_IRQMASK_6368_REG
+#define irq_bits               64
+#define is_ext_irq_cascaded    1
+#define ext_irq_start          (BCM_6368_EXT_IRQ0 - IRQ_INTERNAL_BASE)
+#define ext_irq_end            (BCM_6368_EXT_IRQ5 - IRQ_INTERNAL_BASE)
+#define ext_irq_count          6
+#define ext_irq_cfg_reg1       PERF_EXTIRQ_CFG_REG_6368
+#define ext_irq_cfg_reg2       PERF_EXTIRQ_CFG_REG2_6368
+#endif
+
+#if irq_bits == 32
+#define dispatch_internal                      __dispatch_internal
+#define internal_irq_mask                      __internal_irq_mask_32
+#define internal_irq_unmask                    __internal_irq_unmask_32
+#else
+#define dispatch_internal                      __dispatch_internal_64
+#define internal_irq_mask                      __internal_irq_mask_64
+#define internal_irq_unmask                    __internal_irq_unmask_64
+#endif
+
+#define irq_stat_addr  (bcm63xx_regset_address(RSET_PERF) + irq_stat_reg)
+#define irq_mask_addr  (bcm63xx_regset_address(RSET_PERF) + irq_mask_reg)
+
+static inline void bcm63xx_init_irq(void)
+{
+}
+#else /* ! BCMCPU_RUNTIME_DETECT */
+
+static u32 irq_stat_addr, irq_mask_addr;
+static void (*dispatch_internal)(void);
+static int is_ext_irq_cascaded;
+static unsigned int ext_irq_count;
+static unsigned int ext_irq_start, ext_irq_end;
+static unsigned int ext_irq_cfg_reg1, ext_irq_cfg_reg2;
+static void (*internal_irq_mask)(unsigned int irq);
+static void (*internal_irq_unmask)(unsigned int irq);
+
+static void bcm63xx_init_irq(void)
+{
+       int irq_bits;
+
+       irq_stat_addr = bcm63xx_regset_address(RSET_PERF);
+       irq_mask_addr = bcm63xx_regset_address(RSET_PERF);
+
+       switch (bcm63xx_get_cpu_id()) {
+       case BCM6338_CPU_ID:
+               irq_stat_addr += PERF_IRQSTAT_6338_REG;
+               irq_mask_addr += PERF_IRQMASK_6338_REG;
+               irq_bits = 32;
+               break;
+       case BCM6345_CPU_ID:
+               irq_stat_addr += PERF_IRQSTAT_6345_REG;
+               irq_mask_addr += PERF_IRQMASK_6345_REG;
+               irq_bits = 32;
+               break;
+       case BCM6348_CPU_ID:
+               irq_stat_addr += PERF_IRQSTAT_6348_REG;
+               irq_mask_addr += PERF_IRQMASK_6348_REG;
+               irq_bits = 32;
+               ext_irq_count = 4;
+               ext_irq_cfg_reg1 = PERF_EXTIRQ_CFG_REG_6348;
+               break;
+       case BCM6358_CPU_ID:
+               irq_stat_addr += PERF_IRQSTAT_6358_REG;
+               irq_mask_addr += PERF_IRQMASK_6358_REG;
+               irq_bits = 32;
+               ext_irq_count = 4;
+               is_ext_irq_cascaded = 1;
+               ext_irq_start = BCM_6358_EXT_IRQ0 - IRQ_INTERNAL_BASE;
+               ext_irq_end = BCM_6358_EXT_IRQ3 - IRQ_INTERNAL_BASE;
+               ext_irq_cfg_reg1 = PERF_EXTIRQ_CFG_REG_6358;
+               break;
+       case BCM6368_CPU_ID:
+               irq_stat_addr += PERF_IRQSTAT_6368_REG;
+               irq_mask_addr += PERF_IRQMASK_6368_REG;
+               irq_bits = 64;
+               ext_irq_count = 6;
+               is_ext_irq_cascaded = 1;
+               ext_irq_start = BCM_6368_EXT_IRQ0 - IRQ_INTERNAL_BASE;
+               ext_irq_end = BCM_6368_EXT_IRQ5 - IRQ_INTERNAL_BASE;
+               ext_irq_cfg_reg1 = PERF_EXTIRQ_CFG_REG_6368;
+               ext_irq_cfg_reg2 = PERF_EXTIRQ_CFG_REG2_6368;
+               break;
+       default:
+               BUG();
+       }
+
+       if (irq_bits == 32) {
+               dispatch_internal = __dispatch_internal;
+               internal_irq_mask = __internal_irq_mask_32;
+               internal_irq_unmask = __internal_irq_unmask_32;
+       } else {
+               dispatch_internal = __dispatch_internal_64;
+               internal_irq_mask = __internal_irq_mask_64;
+               internal_irq_unmask = __internal_irq_unmask_64;
+       }
+}
+#endif /* ! BCMCPU_RUNTIME_DETECT */
+
+static inline u32 get_ext_irq_perf_reg(int irq)
+{
+       if (irq < 4)
+               return ext_irq_cfg_reg1;
+       return ext_irq_cfg_reg2;
+}
+
+static inline void handle_internal(int intbit)
+{
+       if (is_ext_irq_cascaded &&
+           intbit >= ext_irq_start && intbit <= ext_irq_end)
+               do_IRQ(intbit - ext_irq_start + IRQ_EXTERNAL_BASE);
+       else
+               do_IRQ(intbit + IRQ_INTERNAL_BASE);
+}
+
 /*
  * dispatch internal devices IRQ (uart, enet, watchdog, ...). do not
  * prioritize any interrupt relatively to another. the static counter
  * will resume the loop where it ended the last time we left this
  * function.
  */
-static void bcm63xx_irq_dispatch_internal(void)
+static void __dispatch_internal(void)
 {
        u32 pending;
        static int i;
 
-       pending = bcm_perf_readl(PERF_IRQMASK_REG) &
-               bcm_perf_readl(PERF_IRQSTAT_REG);
+       pending = bcm_readl(irq_stat_addr) & bcm_readl(irq_mask_addr);
 
        if (!pending)
                return ;
@@ -41,7 +209,28 @@ static void bcm63xx_irq_dispatch_internal(void)
 
                i = (i + 1) & 0x1f;
                if (pending & (1 << to_call)) {
-                       do_IRQ(to_call + IRQ_INTERNAL_BASE);
+                       handle_internal(to_call);
+                       break;
+               }
+       }
+}
+
+static void __dispatch_internal_64(void)
+{
+       u64 pending;
+       static int i;
+
+       pending = bcm_readq(irq_stat_addr) & bcm_readq(irq_mask_addr);
+
+       if (!pending)
+               return ;
+
+       while (1) {
+               int to_call = i;
+
+               i = (i + 1) & 0x3f;
+               if (pending & (1ull << to_call)) {
+                       handle_internal(to_call);
                        break;
                }
        }
@@ -60,15 +249,17 @@ asmlinkage void plat_irq_dispatch(void)
                if (cause & CAUSEF_IP7)
                        do_IRQ(7);
                if (cause & CAUSEF_IP2)
-                       bcm63xx_irq_dispatch_internal();
-               if (cause & CAUSEF_IP3)
-                       do_IRQ(IRQ_EXT_0);
-               if (cause & CAUSEF_IP4)
-                       do_IRQ(IRQ_EXT_1);
-               if (cause & CAUSEF_IP5)
-                       do_IRQ(IRQ_EXT_2);
-               if (cause & CAUSEF_IP6)
-                       do_IRQ(IRQ_EXT_3);
+                       dispatch_internal();
+               if (!is_ext_irq_cascaded) {
+                       if (cause & CAUSEF_IP3)
+                               do_IRQ(IRQ_EXT_0);
+                       if (cause & CAUSEF_IP4)
+                               do_IRQ(IRQ_EXT_1);
+                       if (cause & CAUSEF_IP5)
+                               do_IRQ(IRQ_EXT_2);
+                       if (cause & CAUSEF_IP6)
+                               do_IRQ(IRQ_EXT_3);
+               }
        } while (1);
 }
 
@@ -76,24 +267,50 @@ asmlinkage void plat_irq_dispatch(void)
  * internal IRQs operations: only mask/unmask on PERF irq mask
  * register.
  */
-static inline void bcm63xx_internal_irq_mask(struct irq_data *d)
+static void __internal_irq_mask_32(unsigned int irq)
 {
-       unsigned int irq = d->irq - IRQ_INTERNAL_BASE;
        u32 mask;
 
-       mask = bcm_perf_readl(PERF_IRQMASK_REG);
+       mask = bcm_readl(irq_mask_addr);
        mask &= ~(1 << irq);
-       bcm_perf_writel(mask, PERF_IRQMASK_REG);
+       bcm_writel(mask, irq_mask_addr);
 }
 
-static void bcm63xx_internal_irq_unmask(struct irq_data *d)
+static void __internal_irq_mask_64(unsigned int irq)
+{
+       u64 mask;
+
+       mask = bcm_readq(irq_mask_addr);
+       mask &= ~(1ull << irq);
+       bcm_writeq(mask, irq_mask_addr);
+}
+
+static void __internal_irq_unmask_32(unsigned int irq)
 {
-       unsigned int irq = d->irq - IRQ_INTERNAL_BASE;
        u32 mask;
 
-       mask = bcm_perf_readl(PERF_IRQMASK_REG);
+       mask = bcm_readl(irq_mask_addr);
        mask |= (1 << irq);
-       bcm_perf_writel(mask, PERF_IRQMASK_REG);
+       bcm_writel(mask, irq_mask_addr);
+}
+
+static void __internal_irq_unmask_64(unsigned int irq)
+{
+       u64 mask;
+
+       mask = bcm_readq(irq_mask_addr);
+       mask |= (1ull << irq);
+       bcm_writeq(mask, irq_mask_addr);
+}
+
+static void bcm63xx_internal_irq_mask(struct irq_data *d)
+{
+       internal_irq_mask(d->irq - IRQ_INTERNAL_BASE);
+}
+
+static void bcm63xx_internal_irq_unmask(struct irq_data *d)
+{
+       internal_irq_unmask(d->irq - IRQ_INTERNAL_BASE);
 }
 
 /*
@@ -102,94 +319,131 @@ static void bcm63xx_internal_irq_unmask(struct irq_data *d)
  */
 static void bcm63xx_external_irq_mask(struct irq_data *d)
 {
-       unsigned int irq = d->irq - IRQ_EXT_BASE;
-       u32 reg;
+       unsigned int irq = d->irq - IRQ_EXTERNAL_BASE;
+       u32 reg, regaddr;
 
-       reg = bcm_perf_readl(PERF_EXTIRQ_CFG_REG);
-       reg &= ~EXTIRQ_CFG_MASK(irq);
-       bcm_perf_writel(reg, PERF_EXTIRQ_CFG_REG);
+       regaddr = get_ext_irq_perf_reg(irq);
+       reg = bcm_perf_readl(regaddr);
+
+       if (BCMCPU_IS_6348())
+               reg &= ~EXTIRQ_CFG_MASK_6348(irq % 4);
+       else
+               reg &= ~EXTIRQ_CFG_MASK(irq % 4);
+
+       bcm_perf_writel(reg, regaddr);
+       if (is_ext_irq_cascaded)
+               internal_irq_mask(irq + ext_irq_start);
 }
 
 static void bcm63xx_external_irq_unmask(struct irq_data *d)
 {
-       unsigned int irq = d->irq - IRQ_EXT_BASE;
-       u32 reg;
+       unsigned int irq = d->irq - IRQ_EXTERNAL_BASE;
+       u32 reg, regaddr;
 
-       reg = bcm_perf_readl(PERF_EXTIRQ_CFG_REG);
-       reg |= EXTIRQ_CFG_MASK(irq);
-       bcm_perf_writel(reg, PERF_EXTIRQ_CFG_REG);
+       regaddr = get_ext_irq_perf_reg(irq);
+       reg = bcm_perf_readl(regaddr);
+
+       if (BCMCPU_IS_6348())
+               reg |= EXTIRQ_CFG_MASK_6348(irq % 4);
+       else
+               reg |= EXTIRQ_CFG_MASK(irq % 4);
+
+       bcm_perf_writel(reg, regaddr);
+
+       if (is_ext_irq_cascaded)
+               internal_irq_unmask(irq + ext_irq_start);
 }
 
 static void bcm63xx_external_irq_clear(struct irq_data *d)
 {
-       unsigned int irq = d->irq - IRQ_EXT_BASE;
-       u32 reg;
+       unsigned int irq = d->irq - IRQ_EXTERNAL_BASE;
+       u32 reg, regaddr;
 
-       reg = bcm_perf_readl(PERF_EXTIRQ_CFG_REG);
-       reg |= EXTIRQ_CFG_CLEAR(irq);
-       bcm_perf_writel(reg, PERF_EXTIRQ_CFG_REG);
-}
+       regaddr = get_ext_irq_perf_reg(irq);
+       reg = bcm_perf_readl(regaddr);
 
-static unsigned int bcm63xx_external_irq_startup(struct irq_data *d)
-{
-       set_c0_status(0x100 << (d->irq - IRQ_MIPS_BASE));
-       irq_enable_hazard();
-       bcm63xx_external_irq_unmask(d);
-       return 0;
-}
+       if (BCMCPU_IS_6348())
+               reg |= EXTIRQ_CFG_CLEAR_6348(irq % 4);
+       else
+               reg |= EXTIRQ_CFG_CLEAR(irq % 4);
 
-static void bcm63xx_external_irq_shutdown(struct irq_data *d)
-{
-       bcm63xx_external_irq_mask(d);
-       clear_c0_status(0x100 << (d->irq - IRQ_MIPS_BASE));
-       irq_disable_hazard();
+       bcm_perf_writel(reg, regaddr);
 }
 
 static int bcm63xx_external_irq_set_type(struct irq_data *d,
                                         unsigned int flow_type)
 {
-       unsigned int irq = d->irq - IRQ_EXT_BASE;
-       u32 reg;
+       unsigned int irq = d->irq - IRQ_EXTERNAL_BASE;
+       u32 reg, regaddr;
+       int levelsense, sense, bothedge;
 
        flow_type &= IRQ_TYPE_SENSE_MASK;
 
        if (flow_type == IRQ_TYPE_NONE)
                flow_type = IRQ_TYPE_LEVEL_LOW;
 
-       reg = bcm_perf_readl(PERF_EXTIRQ_CFG_REG);
+       levelsense = sense = bothedge = 0;
        switch (flow_type) {
        case IRQ_TYPE_EDGE_BOTH:
-               reg &= ~EXTIRQ_CFG_LEVELSENSE(irq);
-               reg |= EXTIRQ_CFG_BOTHEDGE(irq);
+               bothedge = 1;
                break;
 
        case IRQ_TYPE_EDGE_RISING:
-               reg &= ~EXTIRQ_CFG_LEVELSENSE(irq);
-               reg |= EXTIRQ_CFG_SENSE(irq);
-               reg &= ~EXTIRQ_CFG_BOTHEDGE(irq);
+               sense = 1;
                break;
 
        case IRQ_TYPE_EDGE_FALLING:
-               reg &= ~EXTIRQ_CFG_LEVELSENSE(irq);
-               reg &= ~EXTIRQ_CFG_SENSE(irq);
-               reg &= ~EXTIRQ_CFG_BOTHEDGE(irq);
                break;
 
        case IRQ_TYPE_LEVEL_HIGH:
-               reg |= EXTIRQ_CFG_LEVELSENSE(irq);
-               reg |= EXTIRQ_CFG_SENSE(irq);
+               levelsense = 1;
+               sense = 1;
                break;
 
        case IRQ_TYPE_LEVEL_LOW:
-               reg |= EXTIRQ_CFG_LEVELSENSE(irq);
-               reg &= ~EXTIRQ_CFG_SENSE(irq);
+               levelsense = 1;
                break;
 
        default:
                printk(KERN_ERR "bogus flow type combination given !\n");
                return -EINVAL;
        }
-       bcm_perf_writel(reg, PERF_EXTIRQ_CFG_REG);
+
+       regaddr = get_ext_irq_perf_reg(irq);
+       reg = bcm_perf_readl(regaddr);
+       irq %= 4;
+
+       if (BCMCPU_IS_6348()) {
+               if (levelsense)
+                       reg |= EXTIRQ_CFG_LEVELSENSE_6348(irq);
+               else
+                       reg &= ~EXTIRQ_CFG_LEVELSENSE_6348(irq);
+               if (sense)
+                       reg |= EXTIRQ_CFG_SENSE_6348(irq);
+               else
+                       reg &= ~EXTIRQ_CFG_SENSE_6348(irq);
+               if (bothedge)
+                       reg |= EXTIRQ_CFG_BOTHEDGE_6348(irq);
+               else
+                       reg &= ~EXTIRQ_CFG_BOTHEDGE_6348(irq);
+       }
+
+       if (BCMCPU_IS_6338() || BCMCPU_IS_6358() || BCMCPU_IS_6368()) {
+               if (levelsense)
+                       reg |= EXTIRQ_CFG_LEVELSENSE(irq);
+               else
+                       reg &= ~EXTIRQ_CFG_LEVELSENSE(irq);
+               if (sense)
+                       reg |= EXTIRQ_CFG_SENSE(irq);
+               else
+                       reg &= ~EXTIRQ_CFG_SENSE(irq);
+               if (bothedge)
+                       reg |= EXTIRQ_CFG_BOTHEDGE(irq);
+               else
+                       reg &= ~EXTIRQ_CFG_BOTHEDGE(irq);
+       }
+
+       bcm_perf_writel(reg, regaddr);
 
        irqd_set_trigger_type(d, flow_type);
        if (flow_type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
@@ -208,9 +462,6 @@ static struct irq_chip bcm63xx_internal_irq_chip = {
 
 static struct irq_chip bcm63xx_external_irq_chip = {
        .name           = "bcm63xx_epic",
-       .irq_startup    = bcm63xx_external_irq_startup,
-       .irq_shutdown   = bcm63xx_external_irq_shutdown,
-
        .irq_ack        = bcm63xx_external_irq_clear,
 
        .irq_mask       = bcm63xx_external_irq_mask,
@@ -225,18 +476,30 @@ static struct irqaction cpu_ip2_cascade_action = {
        .flags          = IRQF_NO_THREAD,
 };
 
+static struct irqaction cpu_ext_cascade_action = {
+       .handler        = no_action,
+       .name           = "cascade_extirq",
+       .flags          = IRQF_NO_THREAD,
+};
+
 void __init arch_init_irq(void)
 {
        int i;
 
+       bcm63xx_init_irq();
        mips_cpu_irq_init();
        for (i = IRQ_INTERNAL_BASE; i < NR_IRQS; ++i)
                irq_set_chip_and_handler(i, &bcm63xx_internal_irq_chip,
                                         handle_level_irq);
 
-       for (i = IRQ_EXT_BASE; i < IRQ_EXT_BASE + 4; ++i)
+       for (i = IRQ_EXTERNAL_BASE; i < IRQ_EXTERNAL_BASE + ext_irq_count; ++i)
                irq_set_chip_and_handler(i, &bcm63xx_external_irq_chip,
                                         handle_edge_irq);
 
-       setup_irq(IRQ_MIPS_BASE + 2, &cpu_ip2_cascade_action);
+       if (!is_ext_irq_cascaded) {
+               for (i = 3; i < 3 + ext_irq_count; ++i)
+                       setup_irq(MIPS_CPU_IRQ_BASE + i, &cpu_ext_cascade_action);
+       }
+
+       setup_irq(MIPS_CPU_IRQ_BASE + 2, &cpu_ip2_cascade_action);
 }
index be252efa0757960bba1ce7d17e2dedd9f19629d3..99d7f405cbebf953c2646a842f1221bc7fe58d18 100644 (file)
@@ -32,9 +32,12 @@ void __init prom_init(void)
                mask = CKCTL_6345_ALL_SAFE_EN;
        else if (BCMCPU_IS_6348())
                mask = CKCTL_6348_ALL_SAFE_EN;
-       else
-               /* BCMCPU_IS_6358() */
+       else if (BCMCPU_IS_6358())
                mask = CKCTL_6358_ALL_SAFE_EN;
+       else if (BCMCPU_IS_6368())
+               mask = CKCTL_6368_ALL_SAFE_EN;
+       else
+               mask = 0;
 
        reg = bcm_perf_readl(PERF_CKCTL_REG);
        reg &= ~mask;
index d0056598fbfcac2e36438dda2940b7cd0df7194b..d209f85d87bb654cb41f0b2308c871bb6c3aa845 100644 (file)
@@ -63,13 +63,33 @@ static void bcm6348_a1_reboot(void)
 
 void bcm63xx_machine_reboot(void)
 {
-       u32 reg;
+       u32 reg, perf_regs[2] = { 0, 0 };
+       unsigned int i;
 
        /* mask and clear all external irq */
-       reg = bcm_perf_readl(PERF_EXTIRQ_CFG_REG);
-       reg &= ~EXTIRQ_CFG_MASK_ALL;
-       reg |= EXTIRQ_CFG_CLEAR_ALL;
-       bcm_perf_writel(reg, PERF_EXTIRQ_CFG_REG);
+       switch (bcm63xx_get_cpu_id()) {
+       case BCM6338_CPU_ID:
+               perf_regs[0] = PERF_EXTIRQ_CFG_REG_6338;
+               break;
+       case BCM6348_CPU_ID:
+               perf_regs[0] = PERF_EXTIRQ_CFG_REG_6348;
+               break;
+       case BCM6358_CPU_ID:
+               perf_regs[0] = PERF_EXTIRQ_CFG_REG_6358;
+               break;
+       }
+
+       for (i = 0; i < 2; i++) {
+               reg = bcm_perf_readl(perf_regs[i]);
+               if (BCMCPU_IS_6348()) {
+                       reg &= ~EXTIRQ_CFG_MASK_ALL_6348;
+                       reg |= EXTIRQ_CFG_CLEAR_ALL_6348;
+               } else {
+                       reg &= ~EXTIRQ_CFG_MASK_ALL;
+                       reg |= EXTIRQ_CFG_CLEAR_ALL;
+               }
+               bcm_perf_writel(reg, perf_regs[i]);
+       }
 
        if (BCMCPU_IS_6348() && (bcm63xx_get_cpu_rev() == 0xa1))
                bcm6348_a1_reboot();
@@ -124,4 +144,4 @@ int __init bcm63xx_register_devices(void)
        return board_register_devices();
 }
 
-arch_initcall(bcm63xx_register_devices);
+device_initcall(bcm63xx_register_devices);
index eb063e6dead923b2a26077b5c4262e5fd0c53a31..3112df8f90dbc9726166f13e93a82c441efc5a27 100644 (file)
@@ -2,6 +2,9 @@
 
 void putc(char c)
 {
-       /* all current (Jan. 2010) in-kernel boards */
+#ifdef CONFIG_MIPS_DB1300
+       alchemy_uart_putchar(AU1300_UART2_PHYS_ADDR, c);
+#else
        alchemy_uart_putchar(AU1000_UART0_PHYS_ADDR, c);
+#endif
 }
index cad555ebeca3b855356d928b66e736e6a286cef6..f9e275a50d982be23ffda94a1e23d019c25569b5 100644 (file)
@@ -86,10 +86,6 @@ config ARCH_SPARSEMEM_ENABLE
        def_bool y
        select SPARSEMEM_STATIC
 
-config CAVIUM_OCTEON_HELPER
-       def_bool y
-       depends on OCTEON_ETHERNET || PCI
-
 config IOMMU_HELPER
        bool
 
index ea4febaa4bb1caf50f2ef92cc6c711e94c4285e2..b6bb92c16a47e94981f6e49672554b82c228491f 100644 (file)
@@ -61,6 +61,16 @@ static phys_addr_t octeon_gen1_dma_to_phys(struct device *dev, dma_addr_t daddr)
        return daddr;
 }
 
+static dma_addr_t octeon_gen2_phys_to_dma(struct device *dev, phys_addr_t paddr)
+{
+       return octeon_hole_phys_to_dma(paddr);
+}
+
+static phys_addr_t octeon_gen2_dma_to_phys(struct device *dev, dma_addr_t daddr)
+{
+       return octeon_hole_dma_to_phys(daddr);
+}
+
 static dma_addr_t octeon_big_phys_to_dma(struct device *dev, phys_addr_t paddr)
 {
        if (paddr >= 0x410000000ull && paddr < 0x420000000ull)
@@ -262,11 +272,11 @@ void __init plat_swiotlb_setup(void)
 
        for (i = 0 ; i < boot_mem_map.nr_map; i++) {
                struct boot_mem_map_entry *e = &boot_mem_map.map[i];
-               if (e->type != BOOT_MEM_RAM)
+               if (e->type != BOOT_MEM_RAM && e->type != BOOT_MEM_INIT_RAM)
                        continue;
 
                /* These addresses map low for PCI. */
-               if (e->addr > 0x410000000ull)
+               if (e->addr > 0x410000000ull && !OCTEON_IS_MODEL(OCTEON_CN6XXX))
                        continue;
 
                addr_size += e->size;
@@ -295,6 +305,11 @@ void __init plat_swiotlb_setup(void)
                 */
                swiotlbsize = 64 * (1<<20);
        }
+#endif
+#ifdef CONFIG_USB_OCTEON_OHCI
+       /* OCTEON II ohci is only 32-bit. */
+       if (OCTEON_IS_MODEL(OCTEON_CN6XXX) && max_addr >= 0x100000000ul)
+               swiotlbsize = 64 * (1<<20);
 #endif
        swiotlb_nslabs = swiotlbsize >> IO_TLB_SHIFT;
        swiotlb_nslabs = ALIGN(swiotlb_nslabs, IO_TLB_SEGSIZE);
@@ -330,6 +345,10 @@ struct dma_map_ops *octeon_pci_dma_map_ops;
 void __init octeon_pci_dma_init(void)
 {
        switch (octeon_dma_bar_type) {
+       case OCTEON_DMA_BAR_TYPE_PCIE2:
+               _octeon_pci_dma_map_ops.phys_to_dma = octeon_gen2_phys_to_dma;
+               _octeon_pci_dma_map_ops.dma_to_phys = octeon_gen2_dma_to_phys;
+               break;
        case OCTEON_DMA_BAR_TYPE_PCIE:
                _octeon_pci_dma_map_ops.phys_to_dma = octeon_gen1_phys_to_dma;
                _octeon_pci_dma_map_ops.dma_to_phys = octeon_gen1_dma_to_phys;
index 7f41c5be2190ddca03fc92a00e8f21bd735414f5..b6d6e841a984ea61270581b4fed097dcd68897bf 100644 (file)
 #
 
 obj-y += cvmx-bootmem.o cvmx-l2c.o cvmx-sysinfo.o octeon-model.o
+obj-y += cvmx-pko.o cvmx-spi.o cvmx-cmd-queue.o \
+       cvmx-helper-board.o cvmx-helper.o cvmx-helper-xaui.o \
+       cvmx-helper-rgmii.o cvmx-helper-sgmii.o cvmx-helper-npi.o \
+       cvmx-helper-loop.o cvmx-helper-spi.o cvmx-helper-util.o \
+       cvmx-interrupt-decodes.o cvmx-interrupt-rsl.o
 
-obj-$(CONFIG_CAVIUM_OCTEON_HELPER) += cvmx-helper-errata.o cvmx-helper-jtag.o
+obj-y += cvmx-helper-errata.o cvmx-helper-jtag.o
diff --git a/arch/mips/cavium-octeon/executive/cvmx-cmd-queue.c b/arch/mips/cavium-octeon/executive/cvmx-cmd-queue.c
new file mode 100644 (file)
index 0000000..132bccc
--- /dev/null
@@ -0,0 +1,306 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ * Support functions for managing command queues used for
+ * various hardware blocks.
+ */
+
+#include <linux/kernel.h>
+
+#include <asm/octeon/octeon.h>
+
+#include <asm/octeon/cvmx-config.h>
+#include <asm/octeon/cvmx-fpa.h>
+#include <asm/octeon/cvmx-cmd-queue.h>
+
+#include <asm/octeon/cvmx-npei-defs.h>
+#include <asm/octeon/cvmx-pexp-defs.h>
+#include <asm/octeon/cvmx-pko-defs.h>
+
+/**
+ * This application uses this pointer to access the global queue
+ * state. It points to a bootmem named block.
+ */
+__cvmx_cmd_queue_all_state_t *__cvmx_cmd_queue_state_ptr;
+
+/**
+ * Initialize the Global queue state pointer.
+ *
+ * Returns CVMX_CMD_QUEUE_SUCCESS or a failure code
+ */
+static cvmx_cmd_queue_result_t __cvmx_cmd_queue_init_state_ptr(void)
+{
+       char *alloc_name = "cvmx_cmd_queues";
+#if defined(CONFIG_CAVIUM_RESERVE32) && CONFIG_CAVIUM_RESERVE32
+       extern uint64_t octeon_reserve32_memory;
+#endif
+
+       if (likely(__cvmx_cmd_queue_state_ptr))
+               return CVMX_CMD_QUEUE_SUCCESS;
+
+#if defined(CONFIG_CAVIUM_RESERVE32) && CONFIG_CAVIUM_RESERVE32
+       if (octeon_reserve32_memory)
+               __cvmx_cmd_queue_state_ptr =
+                   cvmx_bootmem_alloc_named_range(sizeof(*__cvmx_cmd_queue_state_ptr),
+                                                  octeon_reserve32_memory,
+                                                  octeon_reserve32_memory +
+                                                  (CONFIG_CAVIUM_RESERVE32 <<
+                                                   20) - 1, 128, alloc_name);
+       else
+#endif
+               __cvmx_cmd_queue_state_ptr =
+                   cvmx_bootmem_alloc_named(sizeof(*__cvmx_cmd_queue_state_ptr),
+                                           128,
+                                           alloc_name);
+       if (__cvmx_cmd_queue_state_ptr)
+               memset(__cvmx_cmd_queue_state_ptr, 0,
+                      sizeof(*__cvmx_cmd_queue_state_ptr));
+       else {
+               struct cvmx_bootmem_named_block_desc *block_desc =
+                   cvmx_bootmem_find_named_block(alloc_name);
+               if (block_desc)
+                       __cvmx_cmd_queue_state_ptr =
+                           cvmx_phys_to_ptr(block_desc->base_addr);
+               else {
+                       cvmx_dprintf
+                           ("ERROR: cvmx_cmd_queue_initialize: Unable to get named block %s.\n",
+                            alloc_name);
+                       return CVMX_CMD_QUEUE_NO_MEMORY;
+               }
+       }
+       return CVMX_CMD_QUEUE_SUCCESS;
+}
+
+/**
+ * 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.
+ *
+ * @queue_id:  Hardware command queue to initialize.
+ * @max_depth: Maximum outstanding commands that can be queued.
+ * @fpa_pool:  FPA pool the command queues should come from.
+ * @pool_size: Size of each buffer in the FPA pool (bytes)
+ *
+ * Returns 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)
+{
+       __cvmx_cmd_queue_state_t *qstate;
+       cvmx_cmd_queue_result_t result = __cvmx_cmd_queue_init_state_ptr();
+       if (result != CVMX_CMD_QUEUE_SUCCESS)
+               return result;
+
+       qstate = __cvmx_cmd_queue_get_state(queue_id);
+       if (qstate == NULL)
+               return CVMX_CMD_QUEUE_INVALID_PARAM;
+
+       /*
+        * We artificially limit max_depth to 1<<20 words. It is an
+        * arbitrary limit.
+        */
+       if (CVMX_CMD_QUEUE_ENABLE_MAX_DEPTH) {
+               if ((max_depth < 0) || (max_depth > 1 << 20))
+                       return CVMX_CMD_QUEUE_INVALID_PARAM;
+       } else if (max_depth != 0)
+               return CVMX_CMD_QUEUE_INVALID_PARAM;
+
+       if ((fpa_pool < 0) || (fpa_pool > 7))
+               return CVMX_CMD_QUEUE_INVALID_PARAM;
+       if ((pool_size < 128) || (pool_size > 65536))
+               return CVMX_CMD_QUEUE_INVALID_PARAM;
+
+       /* See if someone else has already initialized the queue */
+       if (qstate->base_ptr_div128) {
+               if (max_depth != (int)qstate->max_depth) {
+                       cvmx_dprintf("ERROR: cvmx_cmd_queue_initialize: "
+                               "Queue already initialized with different "
+                               "max_depth (%d).\n",
+                            (int)qstate->max_depth);
+                       return CVMX_CMD_QUEUE_INVALID_PARAM;
+               }
+               if (fpa_pool != qstate->fpa_pool) {
+                       cvmx_dprintf("ERROR: cvmx_cmd_queue_initialize: "
+                               "Queue already initialized with different "
+                               "FPA pool (%u).\n",
+                            qstate->fpa_pool);
+                       return CVMX_CMD_QUEUE_INVALID_PARAM;
+               }
+               if ((pool_size >> 3) - 1 != qstate->pool_size_m1) {
+                       cvmx_dprintf("ERROR: cvmx_cmd_queue_initialize: "
+                               "Queue already initialized with different "
+                               "FPA pool size (%u).\n",
+                            (qstate->pool_size_m1 + 1) << 3);
+                       return CVMX_CMD_QUEUE_INVALID_PARAM;
+               }
+               CVMX_SYNCWS;
+               return CVMX_CMD_QUEUE_ALREADY_SETUP;
+       } else {
+               union cvmx_fpa_ctl_status status;
+               void *buffer;
+
+               status.u64 = cvmx_read_csr(CVMX_FPA_CTL_STATUS);
+               if (!status.s.enb) {
+                       cvmx_dprintf("ERROR: cvmx_cmd_queue_initialize: "
+                                    "FPA is not enabled.\n");
+                       return CVMX_CMD_QUEUE_NO_MEMORY;
+               }
+               buffer = cvmx_fpa_alloc(fpa_pool);
+               if (buffer == NULL) {
+                       cvmx_dprintf("ERROR: cvmx_cmd_queue_initialize: "
+                                    "Unable to allocate initial buffer.\n");
+                       return CVMX_CMD_QUEUE_NO_MEMORY;
+               }
+
+               memset(qstate, 0, sizeof(*qstate));
+               qstate->max_depth = max_depth;
+               qstate->fpa_pool = fpa_pool;
+               qstate->pool_size_m1 = (pool_size >> 3) - 1;
+               qstate->base_ptr_div128 = cvmx_ptr_to_phys(buffer) / 128;
+               /*
+                * We zeroed the now serving field so we need to also
+                * zero the ticket.
+                */
+               __cvmx_cmd_queue_state_ptr->
+                   ticket[__cvmx_cmd_queue_get_index(queue_id)] = 0;
+               CVMX_SYNCWS;
+               return CVMX_CMD_QUEUE_SUCCESS;
+       }
+}
+
+/**
+ * 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.
+ *
+ * @queue_id: Queue to shutdown
+ *
+ * Returns CVMX_CMD_QUEUE_SUCCESS or a failure code
+ */
+cvmx_cmd_queue_result_t cvmx_cmd_queue_shutdown(cvmx_cmd_queue_id_t queue_id)
+{
+       __cvmx_cmd_queue_state_t *qptr = __cvmx_cmd_queue_get_state(queue_id);
+       if (qptr == NULL) {
+               cvmx_dprintf("ERROR: cvmx_cmd_queue_shutdown: Unable to "
+                            "get queue information.\n");
+               return CVMX_CMD_QUEUE_INVALID_PARAM;
+       }
+
+       if (cvmx_cmd_queue_length(queue_id) > 0) {
+               cvmx_dprintf("ERROR: cvmx_cmd_queue_shutdown: Queue still "
+                            "has data in it.\n");
+               return CVMX_CMD_QUEUE_FULL;
+       }
+
+       __cvmx_cmd_queue_lock(queue_id, qptr);
+       if (qptr->base_ptr_div128) {
+               cvmx_fpa_free(cvmx_phys_to_ptr
+                             ((uint64_t) qptr->base_ptr_div128 << 7),
+                             qptr->fpa_pool, 0);
+               qptr->base_ptr_div128 = 0;
+       }
+       __cvmx_cmd_queue_unlock(qptr);
+
+       return CVMX_CMD_QUEUE_SUCCESS;
+}
+
+/**
+ * Return the number of command words pending in the queue. This
+ * function may be relatively slow for some hardware units.
+ *
+ * @queue_id: Hardware command queue to query
+ *
+ * Returns Number of outstanding commands
+ */
+int cvmx_cmd_queue_length(cvmx_cmd_queue_id_t queue_id)
+{
+       if (CVMX_ENABLE_PARAMETER_CHECKING) {
+               if (__cvmx_cmd_queue_get_state(queue_id) == NULL)
+                       return CVMX_CMD_QUEUE_INVALID_PARAM;
+       }
+
+       /*
+        * The cast is here so gcc with check that all values in the
+        * cvmx_cmd_queue_id_t enumeration are here.
+        */
+       switch ((cvmx_cmd_queue_id_t) (queue_id & 0xff0000)) {
+       case CVMX_CMD_QUEUE_PKO_BASE:
+               /*
+                * FIXME: Need atomic lock on
+                * CVMX_PKO_REG_READ_IDX. Right now we are normally
+                * called with the queue lock, so that is a SLIGHT
+                * amount of protection.
+                */
+               cvmx_write_csr(CVMX_PKO_REG_READ_IDX, queue_id & 0xffff);
+               if (OCTEON_IS_MODEL(OCTEON_CN3XXX)) {
+                       union cvmx_pko_mem_debug9 debug9;
+                       debug9.u64 = cvmx_read_csr(CVMX_PKO_MEM_DEBUG9);
+                       return debug9.cn38xx.doorbell;
+               } else {
+                       union cvmx_pko_mem_debug8 debug8;
+                       debug8.u64 = cvmx_read_csr(CVMX_PKO_MEM_DEBUG8);
+                       return debug8.cn58xx.doorbell;
+               }
+       case CVMX_CMD_QUEUE_ZIP:
+       case CVMX_CMD_QUEUE_DFA:
+       case CVMX_CMD_QUEUE_RAID:
+               /* FIXME: Implement other lengths */
+               return 0;
+       case CVMX_CMD_QUEUE_DMA_BASE:
+               {
+                       union cvmx_npei_dmax_counts dmax_counts;
+                       dmax_counts.u64 =
+                           cvmx_read_csr(CVMX_PEXP_NPEI_DMAX_COUNTS
+                                         (queue_id & 0x7));
+                       return dmax_counts.s.dbell;
+               }
+       case CVMX_CMD_QUEUE_END:
+               return CVMX_CMD_QUEUE_INVALID_PARAM;
+       }
+       return CVMX_CMD_QUEUE_INVALID_PARAM;
+}
+
+/**
+ * Return the command buffer to be written to. The purpose of this
+ * function is to allow CVMX routine access t othe low level buffer
+ * for initial hardware setup. User applications should not call this
+ * function directly.
+ *
+ * @queue_id: Command queue to query
+ *
+ * Returns Command buffer or NULL on failure
+ */
+void *cvmx_cmd_queue_buffer(cvmx_cmd_queue_id_t queue_id)
+{
+       __cvmx_cmd_queue_state_t *qptr = __cvmx_cmd_queue_get_state(queue_id);
+       if (qptr && qptr->base_ptr_div128)
+               return cvmx_phys_to_ptr((uint64_t) qptr->base_ptr_div128 << 7);
+       else
+               return NULL;
+}
diff --git a/arch/mips/cavium-octeon/executive/cvmx-fpa.c b/arch/mips/cavium-octeon/executive/cvmx-fpa.c
new file mode 100644 (file)
index 0000000..ad44b8b
--- /dev/null
@@ -0,0 +1,183 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/**
+ * @file
+ *
+ * Support library for the hardware Free Pool Allocator.
+ *
+ *
+ */
+
+#include "cvmx-config.h"
+#include "cvmx.h"
+#include "cvmx-fpa.h"
+#include "cvmx-ipd.h"
+
+/**
+ * Current state of all the pools. Use access functions
+ * instead of using it directly.
+ */
+CVMX_SHARED cvmx_fpa_pool_info_t cvmx_fpa_pool_info[CVMX_FPA_NUM_POOLS];
+
+/**
+ * Setup a FPA pool to control a new block of memory. The
+ * buffer pointer must be a physical address.
+ *
+ * @pool:       Pool to initialize
+ *                   0 <= pool < 8
+ * @name:       Constant character string to name this pool.
+ *                   String is not copied.
+ * @buffer:     Pointer to the block of memory to use. This must be
+ *                   accessible by all processors and external hardware.
+ * @block_size: Size for each block controlled by the FPA
+ * @num_blocks: Number of blocks
+ *
+ * Returns 0 on Success,
+ *         -1 on failure
+ */
+int cvmx_fpa_setup_pool(uint64_t pool, const char *name, void *buffer,
+                       uint64_t block_size, uint64_t num_blocks)
+{
+       char *ptr;
+       if (!buffer) {
+               cvmx_dprintf
+                   ("ERROR: cvmx_fpa_setup_pool: NULL buffer pointer!\n");
+               return -1;
+       }
+       if (pool >= CVMX_FPA_NUM_POOLS) {
+               cvmx_dprintf("ERROR: cvmx_fpa_setup_pool: Illegal pool!\n");
+               return -1;
+       }
+
+       if (block_size < CVMX_FPA_MIN_BLOCK_SIZE) {
+               cvmx_dprintf
+                   ("ERROR: cvmx_fpa_setup_pool: Block size too small.\n");
+               return -1;
+       }
+
+       if (((unsigned long)buffer & (CVMX_FPA_ALIGNMENT - 1)) != 0) {
+               cvmx_dprintf
+                   ("ERROR: cvmx_fpa_setup_pool: Buffer not aligned properly.\n");
+               return -1;
+       }
+
+       cvmx_fpa_pool_info[pool].name = name;
+       cvmx_fpa_pool_info[pool].size = block_size;
+       cvmx_fpa_pool_info[pool].starting_element_count = num_blocks;
+       cvmx_fpa_pool_info[pool].base = buffer;
+
+       ptr = (char *)buffer;
+       while (num_blocks--) {
+               cvmx_fpa_free(ptr, pool, 0);
+               ptr += block_size;
+       }
+       return 0;
+}
+
+/**
+ * Shutdown a Memory pool and validate that it had all of
+ * the buffers originally placed in it.
+ *
+ * @pool:   Pool to shutdown
+ * Returns Zero on success
+ *         - Positive is count of missing buffers
+ *         - Negative is too many buffers or corrupted pointers
+ */
+uint64_t cvmx_fpa_shutdown_pool(uint64_t pool)
+{
+       uint64_t errors = 0;
+       uint64_t count = 0;
+       uint64_t base = cvmx_ptr_to_phys(cvmx_fpa_pool_info[pool].base);
+       uint64_t finish =
+           base +
+           cvmx_fpa_pool_info[pool].size *
+           cvmx_fpa_pool_info[pool].starting_element_count;
+       void *ptr;
+       uint64_t address;
+
+       count = 0;
+       do {
+               ptr = cvmx_fpa_alloc(pool);
+               if (ptr)
+                       address = cvmx_ptr_to_phys(ptr);
+               else
+                       address = 0;
+               if (address) {
+                       if ((address >= base) && (address < finish) &&
+                           (((address -
+                              base) % cvmx_fpa_pool_info[pool].size) == 0)) {
+                               count++;
+                       } else {
+                               cvmx_dprintf
+                                   ("ERROR: cvmx_fpa_shutdown_pool: Illegal address 0x%llx in pool %s(%d)\n",
+                                    (unsigned long long)address,
+                                    cvmx_fpa_pool_info[pool].name, (int)pool);
+                               errors++;
+                       }
+               }
+       } while (address);
+
+#ifdef CVMX_ENABLE_PKO_FUNCTIONS
+       if (pool == 0)
+               cvmx_ipd_free_ptr();
+#endif
+
+       if (errors) {
+               cvmx_dprintf
+                   ("ERROR: cvmx_fpa_shutdown_pool: Pool %s(%d) started at 0x%llx, ended at 0x%llx, with a step of 0x%llx\n",
+                    cvmx_fpa_pool_info[pool].name, (int)pool,
+                    (unsigned long long)base, (unsigned long long)finish,
+                    (unsigned long long)cvmx_fpa_pool_info[pool].size);
+               return -errors;
+       } else
+               return 0;
+}
+
+uint64_t cvmx_fpa_get_block_size(uint64_t pool)
+{
+       switch (pool) {
+       case 0:
+               return CVMX_FPA_POOL_0_SIZE;
+       case 1:
+               return CVMX_FPA_POOL_1_SIZE;
+       case 2:
+               return CVMX_FPA_POOL_2_SIZE;
+       case 3:
+               return CVMX_FPA_POOL_3_SIZE;
+       case 4:
+               return CVMX_FPA_POOL_4_SIZE;
+       case 5:
+               return CVMX_FPA_POOL_5_SIZE;
+       case 6:
+               return CVMX_FPA_POOL_6_SIZE;
+       case 7:
+               return CVMX_FPA_POOL_7_SIZE;
+       default:
+               return 0;
+       }
+}
diff --git a/arch/mips/cavium-octeon/executive/cvmx-helper-board.c b/arch/mips/cavium-octeon/executive/cvmx-helper-board.c
new file mode 100644 (file)
index 0000000..fd20153
--- /dev/null
@@ -0,0 +1,711 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ *
+ * Helper functions to abstract board specific data about
+ * network ports from the rest of the cvmx-helper files.
+ */
+
+#include <asm/octeon/octeon.h>
+#include <asm/octeon/cvmx-bootinfo.h>
+
+#include <asm/octeon/cvmx-config.h>
+
+#include <asm/octeon/cvmx-mdio.h>
+
+#include <asm/octeon/cvmx-helper.h>
+#include <asm/octeon/cvmx-helper-util.h>
+#include <asm/octeon/cvmx-helper-board.h>
+
+#include <asm/octeon/cvmx-gmxx-defs.h>
+#include <asm/octeon/cvmx-asxx-defs.h>
+
+/**
+ * cvmx_override_board_link_get(int ipd_port) is a function
+ * pointer. It is meant to allow customization of the process of
+ * talking to a PHY to determine link speed. It is called every
+ * time a PHY must be polled for link status. Users should set
+ * this pointer to a function before calling any cvmx-helper
+ * operations.
+ */
+cvmx_helper_link_info_t(*cvmx_override_board_link_get) (int ipd_port) =
+    NULL;
+
+/**
+ * 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 replies on the
+ * fact that every Octeon board receives a unique board type
+ * enumeration from the bootloader.
+ *
+ * @ipd_port: Octeon IPD port to get the MII address for.
+ *
+ * Returns MII PHY address and bus number or -1.
+ */
+int cvmx_helper_board_get_mii_address(int ipd_port)
+{
+       switch (cvmx_sysinfo_get()->board_type) {
+       case CVMX_BOARD_TYPE_SIM:
+               /* Simulator doesn't have MII */
+               return -1;
+       case CVMX_BOARD_TYPE_EBT3000:
+       case CVMX_BOARD_TYPE_EBT5800:
+       case CVMX_BOARD_TYPE_THUNDER:
+       case CVMX_BOARD_TYPE_NICPRO2:
+               /* Interface 0 is SPI4, interface 1 is RGMII */
+               if ((ipd_port >= 16) && (ipd_port < 20))
+                       return ipd_port - 16;
+               else
+                       return -1;
+       case CVMX_BOARD_TYPE_KODAMA:
+       case CVMX_BOARD_TYPE_EBH3100:
+       case CVMX_BOARD_TYPE_HIKARI:
+       case CVMX_BOARD_TYPE_CN3010_EVB_HS5:
+       case CVMX_BOARD_TYPE_CN3005_EVB_HS5:
+       case CVMX_BOARD_TYPE_CN3020_EVB_HS5:
+               /*
+                * Port 0 is WAN connected to a PHY, Port 1 is GMII
+                * connected to a switch
+                */
+               if (ipd_port == 0)
+                       return 4;
+               else if (ipd_port == 1)
+                       return 9;
+               else
+                       return -1;
+       case CVMX_BOARD_TYPE_NAC38:
+               /* Board has 8 RGMII ports PHYs are 0-7 */
+               if ((ipd_port >= 0) && (ipd_port < 4))
+                       return ipd_port;
+               else if ((ipd_port >= 16) && (ipd_port < 20))
+                       return ipd_port - 16 + 4;
+               else
+                       return -1;
+       case CVMX_BOARD_TYPE_EBH3000:
+               /* Board has dual SPI4 and no PHYs */
+               return -1;
+       case CVMX_BOARD_TYPE_EBH5200:
+       case CVMX_BOARD_TYPE_EBH5201:
+       case CVMX_BOARD_TYPE_EBT5200:
+               /* Board has 2 management ports */
+               if ((ipd_port >= CVMX_HELPER_BOARD_MGMT_IPD_PORT) &&
+                   (ipd_port < (CVMX_HELPER_BOARD_MGMT_IPD_PORT + 2)))
+                       return ipd_port - CVMX_HELPER_BOARD_MGMT_IPD_PORT;
+               /*
+                * Board has 4 SGMII ports. The PHYs start right after the MII
+                * ports MII0 = 0, MII1 = 1, SGMII = 2-5.
+                */
+               if ((ipd_port >= 0) && (ipd_port < 4))
+                       return ipd_port + 2;
+               else
+                       return -1;
+       case CVMX_BOARD_TYPE_EBH5600:
+       case CVMX_BOARD_TYPE_EBH5601:
+       case CVMX_BOARD_TYPE_EBH5610:
+               /* Board has 1 management port */
+               if (ipd_port == CVMX_HELPER_BOARD_MGMT_IPD_PORT)
+                       return 0;
+               /*
+                * Board has 8 SGMII ports. 4 connect out, two connect
+                * to a switch, and 2 loop to each other
+                */
+               if ((ipd_port >= 0) && (ipd_port < 4))
+                       return ipd_port + 1;
+               else
+                       return -1;
+       case CVMX_BOARD_TYPE_CUST_NB5:
+               if (ipd_port == 2)
+                       return 4;
+               else
+                       return -1;
+       case CVMX_BOARD_TYPE_NIC_XLE_4G:
+               /* Board has 4 SGMII ports. connected QLM3(interface 1) */
+               if ((ipd_port >= 16) && (ipd_port < 20))
+                       return ipd_port - 16 + 1;
+               else
+                       return -1;
+       case CVMX_BOARD_TYPE_NIC_XLE_10G:
+       case CVMX_BOARD_TYPE_NIC10E:
+               return -1;
+       case CVMX_BOARD_TYPE_NIC4E:
+               if (ipd_port >= 0 && ipd_port <= 3)
+                       return (ipd_port + 0x1f) & 0x1f;
+               else
+                       return -1;
+       case CVMX_BOARD_TYPE_NIC2E:
+               if (ipd_port >= 0 && ipd_port <= 1)
+                       return ipd_port + 1;
+               else
+                       return -1;
+       case CVMX_BOARD_TYPE_BBGW_REF:
+               /*
+                * No PHYs are connected to Octeon, everything is
+                * through switch.
+                */
+               return -1;
+
+       case CVMX_BOARD_TYPE_CUST_WSX16:
+               if (ipd_port >= 0 && ipd_port <= 3)
+                       return ipd_port;
+               else if (ipd_port >= 16 && ipd_port <= 19)
+                       return ipd_port - 16 + 4;
+               else
+                       return -1;
+       }
+
+       /* Some unknown board. Somebody forgot to update this function... */
+       cvmx_dprintf
+           ("cvmx_helper_board_get_mii_address: Unknown board type %d\n",
+            cvmx_sysinfo_get()->board_type);
+       return -1;
+}
+
+/**
+ * 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.
+ *
+ * @ipd_port: IPD input port associated with the port we want to get link
+ *                 status for.
+ *
+ * Returns 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)
+{
+       cvmx_helper_link_info_t result;
+       int phy_addr;
+       int is_broadcom_phy = 0;
+
+       /* Give the user a chance to override the processing of this function */
+       if (cvmx_override_board_link_get)
+               return cvmx_override_board_link_get(ipd_port);
+
+       /* Unless we fix it later, all links are defaulted to down */
+       result.u64 = 0;
+
+       /*
+        * This switch statement should handle all ports that either don't use
+        * Marvell PHYS, or don't support in-band status.
+        */
+       switch (cvmx_sysinfo_get()->board_type) {
+       case CVMX_BOARD_TYPE_SIM:
+               /* The simulator gives you a simulated 1Gbps full duplex link */
+               result.s.link_up = 1;
+               result.s.full_duplex = 1;
+               result.s.speed = 1000;
+               return result;
+       case CVMX_BOARD_TYPE_EBH3100:
+       case CVMX_BOARD_TYPE_CN3010_EVB_HS5:
+       case CVMX_BOARD_TYPE_CN3005_EVB_HS5:
+       case CVMX_BOARD_TYPE_CN3020_EVB_HS5:
+               /* Port 1 on these boards is always Gigabit */
+               if (ipd_port == 1) {
+                       result.s.link_up = 1;
+                       result.s.full_duplex = 1;
+                       result.s.speed = 1000;
+                       return result;
+               }
+               /* Fall through to the generic code below */
+               break;
+       case CVMX_BOARD_TYPE_CUST_NB5:
+               /* Port 1 on these boards is always Gigabit */
+               if (ipd_port == 1) {
+                       result.s.link_up = 1;
+                       result.s.full_duplex = 1;
+                       result.s.speed = 1000;
+                       return result;
+               } else          /* The other port uses a broadcom PHY */
+                       is_broadcom_phy = 1;
+               break;
+       case CVMX_BOARD_TYPE_BBGW_REF:
+               /* Port 1 on these boards is always Gigabit */
+               if (ipd_port == 2) {
+                       /* Port 2 is not hooked up */
+                       result.u64 = 0;
+                       return result;
+               } else {
+                       /* Ports 0 and 1 connect to the switch */
+                       result.s.link_up = 1;
+                       result.s.full_duplex = 1;
+                       result.s.speed = 1000;
+                       return result;
+               }
+               break;
+       }
+
+       phy_addr = cvmx_helper_board_get_mii_address(ipd_port);
+       if (phy_addr != -1) {
+               if (is_broadcom_phy) {
+                       /*
+                        * Below we are going to read SMI/MDIO
+                        * register 0x19 which works on Broadcom
+                        * parts
+                        */
+                       int phy_status =
+                           cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
+                                          0x19);
+                       switch ((phy_status >> 8) & 0x7) {
+                       case 0:
+                               result.u64 = 0;
+                               break;
+                       case 1:
+                               result.s.link_up = 1;
+                               result.s.full_duplex = 0;
+                               result.s.speed = 10;
+                               break;
+                       case 2:
+                               result.s.link_up = 1;
+                               result.s.full_duplex = 1;
+                               result.s.speed = 10;
+                               break;
+                       case 3:
+                               result.s.link_up = 1;
+                               result.s.full_duplex = 0;
+                               result.s.speed = 100;
+                               break;
+                       case 4:
+                               result.s.link_up = 1;
+                               result.s.full_duplex = 1;
+                               result.s.speed = 100;
+                               break;
+                       case 5:
+                               result.s.link_up = 1;
+                               result.s.full_duplex = 1;
+                               result.s.speed = 100;
+                               break;
+                       case 6:
+                               result.s.link_up = 1;
+                               result.s.full_duplex = 0;
+                               result.s.speed = 1000;
+                               break;
+                       case 7:
+                               result.s.link_up = 1;
+                               result.s.full_duplex = 1;
+                               result.s.speed = 1000;
+                               break;
+                       }
+               } else {
+                       /*
+                        * This code assumes we are using a Marvell
+                        * Gigabit PHY. All the speed information can
+                        * be read from register 17 in one
+                        * go. Somebody using a different PHY will
+                        * need to handle it above in the board
+                        * specific area.
+                        */
+                       int phy_status =
+                           cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff, 17);
+
+                       /*
+                        * If the resolve bit 11 isn't set, see if
+                        * autoneg is turned off (bit 12, reg 0). The
+                        * resolve bit doesn't get set properly when
+                        * autoneg is off, so force it.
+                        */
+                       if ((phy_status & (1 << 11)) == 0) {
+                               int auto_status =
+                                   cvmx_mdio_read(phy_addr >> 8,
+                                                  phy_addr & 0xff, 0);
+                               if ((auto_status & (1 << 12)) == 0)
+                                       phy_status |= 1 << 11;
+                       }
+
+                       /*
+                        * Only return a link if the PHY has finished
+                        * auto negotiation and set the resolved bit
+                        * (bit 11)
+                        */
+                       if (phy_status & (1 << 11)) {
+                               result.s.link_up = 1;
+                               result.s.full_duplex = ((phy_status >> 13) & 1);
+                               switch ((phy_status >> 14) & 3) {
+                               case 0: /* 10 Mbps */
+                                       result.s.speed = 10;
+                                       break;
+                               case 1: /* 100 Mbps */
+                                       result.s.speed = 100;
+                                       break;
+                               case 2: /* 1 Gbps */
+                                       result.s.speed = 1000;
+                                       break;
+                               case 3: /* Illegal */
+                                       result.u64 = 0;
+                                       break;
+                               }
+                       }
+               }
+       } else if (OCTEON_IS_MODEL(OCTEON_CN3XXX)
+                  || OCTEON_IS_MODEL(OCTEON_CN58XX)
+                  || OCTEON_IS_MODEL(OCTEON_CN50XX)) {
+               /*
+                * We don't have a PHY address, so attempt to use
+                * in-band status. It is really important that boards
+                * not supporting in-band status never get
+                * here. Reading broken in-band status tends to do bad
+                * things
+                */
+               union cvmx_gmxx_rxx_rx_inbnd inband_status;
+               int interface = cvmx_helper_get_interface_num(ipd_port);
+               int index = cvmx_helper_get_interface_index_num(ipd_port);
+               inband_status.u64 =
+                   cvmx_read_csr(CVMX_GMXX_RXX_RX_INBND(index, interface));
+
+               result.s.link_up = inband_status.s.status;
+               result.s.full_duplex = inband_status.s.duplex;
+               switch (inband_status.s.speed) {
+               case 0: /* 10 Mbps */
+                       result.s.speed = 10;
+                       break;
+               case 1: /* 100 Mbps */
+                       result.s.speed = 100;
+                       break;
+               case 2: /* 1 Gbps */
+                       result.s.speed = 1000;
+                       break;
+               case 3: /* Illegal */
+                       result.u64 = 0;
+                       break;
+               }
+       } else {
+               /*
+                * We don't have a PHY address and we don't have
+                * in-band status. There is no way to determine the
+                * link speed. Return down assuming this port isn't
+                * wired
+                */
+               result.u64 = 0;
+       }
+
+       /* If link is down, return all fields as zero. */
+       if (!result.s.link_up)
+               result.u64 = 0;
+
+       return result;
+}
+
+/**
+ * This function as a board specific method of changing the PHY
+ * speed, duplex, and auto-negotiation. This programs the PHY and
+ * not Octeon. This can be used to force Octeon's links to
+ * specific settings.
+ *
+ * @phy_addr:  The address of the PHY to program
+ * @enable_autoneg:
+ *                  Non zero if you want to enable auto-negotiation.
+ * @link_info: Link speed to program. If the speed is zero and auto-negotiation
+ *                  is enabled, all possible negotiation speeds are advertised.
+ *
+ * Returns 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)
+{
+
+       /* Set the flow control settings based on link_flags */
+       if ((link_flags & set_phy_link_flags_flow_control_mask) !=
+           set_phy_link_flags_flow_control_dont_touch) {
+               cvmx_mdio_phy_reg_autoneg_adver_t reg_autoneg_adver;
+               reg_autoneg_adver.u16 =
+                   cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
+                                  CVMX_MDIO_PHY_REG_AUTONEG_ADVER);
+               reg_autoneg_adver.s.asymmetric_pause =
+                   (link_flags & set_phy_link_flags_flow_control_mask) ==
+                   set_phy_link_flags_flow_control_enable;
+               reg_autoneg_adver.s.pause =
+                   (link_flags & set_phy_link_flags_flow_control_mask) ==
+                   set_phy_link_flags_flow_control_enable;
+               cvmx_mdio_write(phy_addr >> 8, phy_addr & 0xff,
+                               CVMX_MDIO_PHY_REG_AUTONEG_ADVER,
+                               reg_autoneg_adver.u16);
+       }
+
+       /* If speed isn't set and autoneg is on advertise all supported modes */
+       if ((link_flags & set_phy_link_flags_autoneg)
+           && (link_info.s.speed == 0)) {
+               cvmx_mdio_phy_reg_control_t reg_control;
+               cvmx_mdio_phy_reg_status_t reg_status;
+               cvmx_mdio_phy_reg_autoneg_adver_t reg_autoneg_adver;
+               cvmx_mdio_phy_reg_extended_status_t reg_extended_status;
+               cvmx_mdio_phy_reg_control_1000_t reg_control_1000;
+
+               reg_status.u16 =
+                   cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
+                                  CVMX_MDIO_PHY_REG_STATUS);
+               reg_autoneg_adver.u16 =
+                   cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
+                                  CVMX_MDIO_PHY_REG_AUTONEG_ADVER);
+               reg_autoneg_adver.s.advert_100base_t4 =
+                   reg_status.s.capable_100base_t4;
+               reg_autoneg_adver.s.advert_10base_tx_full =
+                   reg_status.s.capable_10_full;
+               reg_autoneg_adver.s.advert_10base_tx_half =
+                   reg_status.s.capable_10_half;
+               reg_autoneg_adver.s.advert_100base_tx_full =
+                   reg_status.s.capable_100base_x_full;
+               reg_autoneg_adver.s.advert_100base_tx_half =
+                   reg_status.s.capable_100base_x_half;
+               cvmx_mdio_write(phy_addr >> 8, phy_addr & 0xff,
+                               CVMX_MDIO_PHY_REG_AUTONEG_ADVER,
+                               reg_autoneg_adver.u16);
+               if (reg_status.s.capable_extended_status) {
+                       reg_extended_status.u16 =
+                           cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
+                                          CVMX_MDIO_PHY_REG_EXTENDED_STATUS);
+                       reg_control_1000.u16 =
+                           cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
+                                          CVMX_MDIO_PHY_REG_CONTROL_1000);
+                       reg_control_1000.s.advert_1000base_t_full =
+                           reg_extended_status.s.capable_1000base_t_full;
+                       reg_control_1000.s.advert_1000base_t_half =
+                           reg_extended_status.s.capable_1000base_t_half;
+                       cvmx_mdio_write(phy_addr >> 8, phy_addr & 0xff,
+                                       CVMX_MDIO_PHY_REG_CONTROL_1000,
+                                       reg_control_1000.u16);
+               }
+               reg_control.u16 =
+                   cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
+                                  CVMX_MDIO_PHY_REG_CONTROL);
+               reg_control.s.autoneg_enable = 1;
+               reg_control.s.restart_autoneg = 1;
+               cvmx_mdio_write(phy_addr >> 8, phy_addr & 0xff,
+                               CVMX_MDIO_PHY_REG_CONTROL, reg_control.u16);
+       } else if ((link_flags & set_phy_link_flags_autoneg)) {
+               cvmx_mdio_phy_reg_control_t reg_control;
+               cvmx_mdio_phy_reg_status_t reg_status;
+               cvmx_mdio_phy_reg_autoneg_adver_t reg_autoneg_adver;
+               cvmx_mdio_phy_reg_control_1000_t reg_control_1000;
+
+               reg_status.u16 =
+                   cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
+                                  CVMX_MDIO_PHY_REG_STATUS);
+               reg_autoneg_adver.u16 =
+                   cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
+                                  CVMX_MDIO_PHY_REG_AUTONEG_ADVER);
+               reg_autoneg_adver.s.advert_100base_t4 = 0;
+               reg_autoneg_adver.s.advert_10base_tx_full = 0;
+               reg_autoneg_adver.s.advert_10base_tx_half = 0;
+               reg_autoneg_adver.s.advert_100base_tx_full = 0;
+               reg_autoneg_adver.s.advert_100base_tx_half = 0;
+               if (reg_status.s.capable_extended_status) {
+                       reg_control_1000.u16 =
+                           cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
+                                          CVMX_MDIO_PHY_REG_CONTROL_1000);
+                       reg_control_1000.s.advert_1000base_t_full = 0;
+                       reg_control_1000.s.advert_1000base_t_half = 0;
+               }
+               switch (link_info.s.speed) {
+               case 10:
+                       reg_autoneg_adver.s.advert_10base_tx_full =
+                           link_info.s.full_duplex;
+                       reg_autoneg_adver.s.advert_10base_tx_half =
+                           !link_info.s.full_duplex;
+                       break;
+               case 100:
+                       reg_autoneg_adver.s.advert_100base_tx_full =
+                           link_info.s.full_duplex;
+                       reg_autoneg_adver.s.advert_100base_tx_half =
+                           !link_info.s.full_duplex;
+                       break;
+               case 1000:
+                       reg_control_1000.s.advert_1000base_t_full =
+                           link_info.s.full_duplex;
+                       reg_control_1000.s.advert_1000base_t_half =
+                           !link_info.s.full_duplex;
+                       break;
+               }
+               cvmx_mdio_write(phy_addr >> 8, phy_addr & 0xff,
+                               CVMX_MDIO_PHY_REG_AUTONEG_ADVER,
+                               reg_autoneg_adver.u16);
+               if (reg_status.s.capable_extended_status)
+                       cvmx_mdio_write(phy_addr >> 8, phy_addr & 0xff,
+                                       CVMX_MDIO_PHY_REG_CONTROL_1000,
+                                       reg_control_1000.u16);
+               reg_control.u16 =
+                   cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
+                                  CVMX_MDIO_PHY_REG_CONTROL);
+               reg_control.s.autoneg_enable = 1;
+               reg_control.s.restart_autoneg = 1;
+               cvmx_mdio_write(phy_addr >> 8, phy_addr & 0xff,
+                               CVMX_MDIO_PHY_REG_CONTROL, reg_control.u16);
+       } else {
+               cvmx_mdio_phy_reg_control_t reg_control;
+               reg_control.u16 =
+                   cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
+                                  CVMX_MDIO_PHY_REG_CONTROL);
+               reg_control.s.autoneg_enable = 0;
+               reg_control.s.restart_autoneg = 1;
+               reg_control.s.duplex = link_info.s.full_duplex;
+               if (link_info.s.speed == 1000) {
+                       reg_control.s.speed_msb = 1;
+                       reg_control.s.speed_lsb = 0;
+               } else if (link_info.s.speed == 100) {
+                       reg_control.s.speed_msb = 0;
+                       reg_control.s.speed_lsb = 1;
+               } else if (link_info.s.speed == 10) {
+                       reg_control.s.speed_msb = 0;
+                       reg_control.s.speed_lsb = 0;
+               }
+               cvmx_mdio_write(phy_addr >> 8, phy_addr & 0xff,
+                               CVMX_MDIO_PHY_REG_CONTROL, reg_control.u16);
+       }
+       return 0;
+}
+
+/**
+ * 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 modifed for every new Octeon board.
+ * Internally it uses switch statements based on the cvmx_sysinfo
+ * data to determine board types and revisions. It relys on the
+ * fact that every Octeon board receives a unique board type
+ * enumeration from the bootloader.
+ *
+ * @interface: Interface to probe
+ * @supported_ports:
+ *                  Number of ports Octeon supports.
+ *
+ * Returns 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)
+{
+       switch (cvmx_sysinfo_get()->board_type) {
+       case CVMX_BOARD_TYPE_CN3005_EVB_HS5:
+               if (interface == 0)
+                       return 2;
+               break;
+       case CVMX_BOARD_TYPE_BBGW_REF:
+               if (interface == 0)
+                       return 2;
+               break;
+       case CVMX_BOARD_TYPE_NIC_XLE_4G:
+               if (interface == 0)
+                       return 0;
+               break;
+               /* The 2nd interface on the EBH5600 is connected to the Marvel switch,
+                  which we don't support. Disable ports connected to it */
+       case CVMX_BOARD_TYPE_EBH5600:
+               if (interface == 1)
+                       return 0;
+               break;
+       }
+       return supported_ports;
+}
+
+/**
+ * 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.
+ *
+ * @interface: Interface to enable
+ *
+ * Returns Zero on success, negative on failure
+ */
+int __cvmx_helper_board_hardware_enable(int interface)
+{
+       if (cvmx_sysinfo_get()->board_type == CVMX_BOARD_TYPE_CN3005_EVB_HS5) {
+               if (interface == 0) {
+                       /* Different config for switch port */
+                       cvmx_write_csr(CVMX_ASXX_TX_CLK_SETX(1, interface), 0);
+                       cvmx_write_csr(CVMX_ASXX_RX_CLK_SETX(1, interface), 0);
+                       /*
+                        * Boards with gigabit WAN ports need a
+                        * different setting that is compatible with
+                        * 100 Mbit settings
+                        */
+                       cvmx_write_csr(CVMX_ASXX_TX_CLK_SETX(0, interface),
+                                      0xc);
+                       cvmx_write_csr(CVMX_ASXX_RX_CLK_SETX(0, interface),
+                                      0xc);
+               }
+       } else if (cvmx_sysinfo_get()->board_type ==
+                  CVMX_BOARD_TYPE_CN3010_EVB_HS5) {
+               /*
+                * Broadcom PHYs require differnet ASX
+                * clocks. Unfortunately many boards don't define a
+                * new board Id and simply mangle the
+                * CN3010_EVB_HS5
+                */
+               if (interface == 0) {
+                       /*
+                        * Some boards use a hacked up bootloader that
+                        * identifies them as CN3010_EVB_HS5
+                        * evaluation boards.  This leads to all kinds
+                        * of configuration problems.  Detect one
+                        * case, and print warning, while trying to do
+                        * the right thing.
+                        */
+                       int phy_addr = cvmx_helper_board_get_mii_address(0);
+                       if (phy_addr != -1) {
+                               int phy_identifier =
+                                   cvmx_mdio_read(phy_addr >> 8,
+                                                  phy_addr & 0xff, 0x2);
+                               /* Is it a Broadcom PHY? */
+                               if (phy_identifier == 0x0143) {
+                                       cvmx_dprintf("\n");
+                                       cvmx_dprintf("ERROR:\n");
+                                       cvmx_dprintf
+                                           ("ERROR: Board type is CVMX_BOARD_TYPE_CN3010_EVB_HS5, but Broadcom PHY found.\n");
+                                       cvmx_dprintf
+                                           ("ERROR: The board type is mis-configured, and software malfunctions are likely.\n");
+                                       cvmx_dprintf
+                                           ("ERROR: All boards require a unique board type to identify them.\n");
+                                       cvmx_dprintf("ERROR:\n");
+                                       cvmx_dprintf("\n");
+                                       cvmx_wait(1000000000);
+                                       cvmx_write_csr(CVMX_ASXX_RX_CLK_SETX
+                                                      (0, interface), 5);
+                                       cvmx_write_csr(CVMX_ASXX_TX_CLK_SETX
+                                                      (0, interface), 5);
+                               }
+                       }
+               }
+       }
+       return 0;
+}
diff --git a/arch/mips/cavium-octeon/executive/cvmx-helper-fpa.c b/arch/mips/cavium-octeon/executive/cvmx-helper-fpa.c
new file mode 100644 (file)
index 0000000..c239e5f
--- /dev/null
@@ -0,0 +1,243 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/**
+ * @file
+ *
+ * Helper functions for FPA setup.
+ *
+ */
+#include "executive-config.h"
+#include "cvmx-config.h"
+#include "cvmx.h"
+#include "cvmx-bootmem.h"
+#include "cvmx-fpa.h"
+#include "cvmx-helper-fpa.h"
+
+/**
+ * Allocate memory for and initialize a single FPA pool.
+ *
+ * @pool:    Pool to initialize
+ * @buffer_size:  Size of buffers to allocate in bytes
+ * @buffers: Number of buffers to put in the pool. Zero is allowed
+ * @name:    String name of the pool for debugging purposes
+ * Returns Zero on success, non-zero on failure
+ */
+static int __cvmx_helper_initialize_fpa_pool(int pool, uint64_t buffer_size,
+                                            uint64_t buffers, const char *name)
+{
+       uint64_t current_num;
+       void *memory;
+       uint64_t align = CVMX_CACHE_LINE_SIZE;
+
+       /*
+        * Align the allocation so that power of 2 size buffers are
+        * naturally aligned.
+        */
+       while (align < buffer_size)
+               align = align << 1;
+
+       if (buffers == 0)
+               return 0;
+
+       current_num = cvmx_read_csr(CVMX_FPA_QUEX_AVAILABLE(pool));
+       if (current_num) {
+               cvmx_dprintf("Fpa pool %d(%s) already has %llu buffers. "
+                            "Skipping setup.\n",
+                    pool, name, (unsigned long long)current_num);
+               return 0;
+       }
+
+       memory = cvmx_bootmem_alloc(buffer_size * buffers, align);
+       if (memory == NULL) {
+               cvmx_dprintf("Out of memory initializing fpa pool %d(%s).\n",
+                            pool, name);
+               return -1;
+       }
+       cvmx_fpa_setup_pool(pool, name, memory, buffer_size, buffers);
+       return 0;
+}
+
+/**
+ * Allocate memory and initialize the FPA pools using memory
+ * from cvmx-bootmem. Specifying zero for the number of
+ * buffers 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. Use cvmx_helper_initialize_fpa instead of
+ * this function directly.
+ *
+ * @pip_pool: Should always be CVMX_FPA_PACKET_POOL
+ * @pip_size: Should always be CVMX_FPA_PACKET_POOL_SIZE
+ * @pip_buffers:
+ *                 Number of packet buffers.
+ * @wqe_pool: Should always be CVMX_FPA_WQE_POOL
+ * @wqe_size: Should always be CVMX_FPA_WQE_POOL_SIZE
+ * @wqe_entries:
+ *                 Number of work queue entries
+ * @pko_pool: Should always be CVMX_FPA_OUTPUT_BUFFER_POOL
+ * @pko_size: Should always be CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE
+ * @pko_buffers:
+ *                 PKO Command buffers. You should at minimum have two per
+ *                 each PKO queue.
+ * @tim_pool: Should always be CVMX_FPA_TIMER_POOL
+ * @tim_size: Should always be CVMX_FPA_TIMER_POOL_SIZE
+ * @tim_buffers:
+ *                 TIM ring buffer command queues. At least two per timer bucket
+ *                 is recommened.
+ * @dfa_pool: Should always be CVMX_FPA_DFA_POOL
+ * @dfa_size: Should always be CVMX_FPA_DFA_POOL_SIZE
+ * @dfa_buffers:
+ *                 DFA command buffer. A relatively small (32 for example)
+ *                 number should work.
+ * Returns Zero on success, non-zero if out of memory
+ */
+static int __cvmx_helper_initialize_fpa(int pip_pool, int pip_size,
+                                       int pip_buffers, int wqe_pool,
+                                       int wqe_size, int wqe_entries,
+                                       int pko_pool, int pko_size,
+                                       int pko_buffers, int tim_pool,
+                                       int tim_size, int tim_buffers,
+                                       int dfa_pool, int dfa_size,
+                                       int dfa_buffers)
+{
+       int status;
+
+       cvmx_fpa_enable();
+
+       if ((pip_buffers > 0) && (pip_buffers <= 64))
+               cvmx_dprintf
+                   ("Warning: %d packet buffers may not be enough for hardware"
+                    " prefetch. 65 or more is recommended.\n", pip_buffers);
+
+       if (pip_pool >= 0) {
+               status =
+                   __cvmx_helper_initialize_fpa_pool(pip_pool, pip_size,
+                                                     pip_buffers,
+                                                     "Packet Buffers");
+               if (status)
+                       return status;
+       }
+
+       if (wqe_pool >= 0) {
+               status =
+                   __cvmx_helper_initialize_fpa_pool(wqe_pool, wqe_size,
+                                                     wqe_entries,
+                                                     "Work Queue Entries");
+               if (status)
+                       return status;
+       }
+
+       if (pko_pool >= 0) {
+               status =
+                   __cvmx_helper_initialize_fpa_pool(pko_pool, pko_size,
+                                                     pko_buffers,
+                                                     "PKO Command Buffers");
+               if (status)
+                       return status;
+       }
+
+       if (tim_pool >= 0) {
+               status =
+                   __cvmx_helper_initialize_fpa_pool(tim_pool, tim_size,
+                                                     tim_buffers,
+                                                     "TIM Command Buffers");
+               if (status)
+                       return status;
+       }
+
+       if (dfa_pool >= 0) {
+               status =
+                   __cvmx_helper_initialize_fpa_pool(dfa_pool, dfa_size,
+                                                     dfa_buffers,
+                                                     "DFA Command Buffers");
+               if (status)
+                       return status;
+       }
+
+       return 0;
+}
+
+/**
+ * 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.
+ *
+ * @packet_buffers:
+ *               Number of packet buffers to allocate
+ * @work_queue_entries:
+ *               Number of work queue entries
+ * @pko_buffers:
+ *               PKO Command buffers. You should at minimum have two per
+ *               each PKO queue.
+ * @tim_buffers:
+ *               TIM ring buffer command queues. At least two per timer bucket
+ *               is recommened.
+ * @dfa_buffers:
+ *               DFA command buffer. A relatively small (32 for example)
+ *               number should work.
+ * Returns 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)
+{
+#ifndef CVMX_FPA_PACKET_POOL
+#define CVMX_FPA_PACKET_POOL -1
+#define CVMX_FPA_PACKET_POOL_SIZE 0
+#endif
+#ifndef CVMX_FPA_WQE_POOL
+#define CVMX_FPA_WQE_POOL -1
+#define CVMX_FPA_WQE_POOL_SIZE 0
+#endif
+#ifndef CVMX_FPA_OUTPUT_BUFFER_POOL
+#define CVMX_FPA_OUTPUT_BUFFER_POOL -1
+#define CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE 0
+#endif
+#ifndef CVMX_FPA_TIMER_POOL
+#define CVMX_FPA_TIMER_POOL -1
+#define CVMX_FPA_TIMER_POOL_SIZE 0
+#endif
+#ifndef CVMX_FPA_DFA_POOL
+#define CVMX_FPA_DFA_POOL -1
+#define CVMX_FPA_DFA_POOL_SIZE 0
+#endif
+       return __cvmx_helper_initialize_fpa(CVMX_FPA_PACKET_POOL,
+                                           CVMX_FPA_PACKET_POOL_SIZE,
+                                           packet_buffers, CVMX_FPA_WQE_POOL,
+                                           CVMX_FPA_WQE_POOL_SIZE,
+                                           work_queue_entries,
+                                           CVMX_FPA_OUTPUT_BUFFER_POOL,
+                                           CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE,
+                                           pko_buffers, CVMX_FPA_TIMER_POOL,
+                                           CVMX_FPA_TIMER_POOL_SIZE,
+                                           tim_buffers, CVMX_FPA_DFA_POOL,
+                                           CVMX_FPA_DFA_POOL_SIZE,
+                                           dfa_buffers);
+}
diff --git a/arch/mips/cavium-octeon/executive/cvmx-helper-loop.c b/arch/mips/cavium-octeon/executive/cvmx-helper-loop.c
new file mode 100644 (file)
index 0000000..bfbd461
--- /dev/null
@@ -0,0 +1,85 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ * Functions for LOOP initialization, configuration,
+ * and monitoring.
+ */
+#include <asm/octeon/octeon.h>
+
+#include <asm/octeon/cvmx-config.h>
+
+#include <asm/octeon/cvmx-helper.h>
+#include <asm/octeon/cvmx-pip-defs.h>
+
+/**
+ * Probe a LOOP interface and determine the number of ports
+ * connected to it. The LOOP interface should still be down
+ * after this call.
+ *
+ * @interface: Interface to probe
+ *
+ * Returns Number of ports on the interface. Zero to disable.
+ */
+int __cvmx_helper_loop_probe(int interface)
+{
+       union cvmx_ipd_sub_port_fcs ipd_sub_port_fcs;
+       int num_ports = 4;
+       int port;
+
+       /* We need to disable length checking so packet < 64 bytes and jumbo
+          frames don't get errors */
+       for (port = 0; port < num_ports; port++) {
+               union cvmx_pip_prt_cfgx port_cfg;
+               int ipd_port = cvmx_helper_get_ipd_port(interface, port);
+               port_cfg.u64 = cvmx_read_csr(CVMX_PIP_PRT_CFGX(ipd_port));
+               port_cfg.s.maxerr_en = 0;
+               port_cfg.s.minerr_en = 0;
+               cvmx_write_csr(CVMX_PIP_PRT_CFGX(ipd_port), port_cfg.u64);
+       }
+
+       /* Disable FCS stripping for loopback ports */
+       ipd_sub_port_fcs.u64 = cvmx_read_csr(CVMX_IPD_SUB_PORT_FCS);
+       ipd_sub_port_fcs.s.port_bit2 = 0;
+       cvmx_write_csr(CVMX_IPD_SUB_PORT_FCS, ipd_sub_port_fcs.u64);
+       return num_ports;
+}
+
+/**
+ * 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.
+ *
+ * @interface: Interface to bring up
+ *
+ * Returns Zero on success, negative on failure
+ */
+int __cvmx_helper_loop_enable(int interface)
+{
+       /* Do nothing. */
+       return 0;
+}
diff --git a/arch/mips/cavium-octeon/executive/cvmx-helper-npi.c b/arch/mips/cavium-octeon/executive/cvmx-helper-npi.c
new file mode 100644 (file)
index 0000000..cc94cfa
--- /dev/null
@@ -0,0 +1,113 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ * Functions for NPI initialization, configuration,
+ * and monitoring.
+ */
+#include <asm/octeon/octeon.h>
+
+#include <asm/octeon/cvmx-config.h>
+
+#include <asm/octeon/cvmx-helper.h>
+
+#include <asm/octeon/cvmx-pip-defs.h>
+
+/**
+ * Probe a NPI interface and determine the number of ports
+ * connected to it. The NPI interface should still be down
+ * after this call.
+ *
+ * @interface: Interface to probe
+ *
+ * Returns Number of ports on the interface. Zero to disable.
+ */
+int __cvmx_helper_npi_probe(int interface)
+{
+#if CVMX_PKO_QUEUES_PER_PORT_PCI > 0
+       if (OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))
+               return 4;
+       else if (OCTEON_IS_MODEL(OCTEON_CN56XX)
+                && !OCTEON_IS_MODEL(OCTEON_CN56XX_PASS1_X))
+               /* The packet engines didn't exist before pass 2 */
+               return 4;
+       else if (OCTEON_IS_MODEL(OCTEON_CN52XX)
+                && !OCTEON_IS_MODEL(OCTEON_CN52XX_PASS1_X))
+               /* The packet engines didn't exist before pass 2 */
+               return 4;
+#if 0
+       /*
+        * Technically CN30XX, CN31XX, and CN50XX contain packet
+        * engines, but nobody ever uses them. Since this is the case,
+        * we disable them here.
+        */
+       else if (OCTEON_IS_MODEL(OCTEON_CN31XX)
+                || OCTEON_IS_MODEL(OCTEON_CN50XX))
+               return 2;
+       else if (OCTEON_IS_MODEL(OCTEON_CN30XX))
+               return 1;
+#endif
+#endif
+       return 0;
+}
+
+/**
+ * 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.
+ *
+ * @interface: Interface to bring up
+ *
+ * Returns Zero on success, negative on failure
+ */
+int __cvmx_helper_npi_enable(int interface)
+{
+       /*
+        * On CN50XX, CN52XX, and CN56XX we need to disable length
+        * checking so packet < 64 bytes and jumbo frames don't get
+        * errors.
+        */
+       if (!OCTEON_IS_MODEL(OCTEON_CN3XXX) &&
+           !OCTEON_IS_MODEL(OCTEON_CN58XX)) {
+               int num_ports = cvmx_helper_ports_on_interface(interface);
+               int port;
+               for (port = 0; port < num_ports; port++) {
+                       union cvmx_pip_prt_cfgx port_cfg;
+                       int ipd_port =
+                           cvmx_helper_get_ipd_port(interface, port);
+                       port_cfg.u64 =
+                           cvmx_read_csr(CVMX_PIP_PRT_CFGX(ipd_port));
+                       port_cfg.s.maxerr_en = 0;
+                       port_cfg.s.minerr_en = 0;
+                       cvmx_write_csr(CVMX_PIP_PRT_CFGX(ipd_port),
+                                      port_cfg.u64);
+               }
+       }
+
+       /* Enables are controlled by the remote host, so nothing to do here */
+       return 0;
+}
diff --git a/arch/mips/cavium-octeon/executive/cvmx-helper-rgmii.c b/arch/mips/cavium-octeon/executive/cvmx-helper-rgmii.c
new file mode 100644 (file)
index 0000000..82b2184
--- /dev/null
@@ -0,0 +1,526 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ * Functions for RGMII/GMII/MII initialization, configuration,
+ * and monitoring.
+ */
+#include <asm/octeon/octeon.h>
+
+#include <asm/octeon/cvmx-config.h>
+
+
+#include <asm/octeon/cvmx-mdio.h>
+#include <asm/octeon/cvmx-pko.h>
+#include <asm/octeon/cvmx-helper.h>
+#include <asm/octeon/cvmx-helper-board.h>
+
+#include <asm/octeon/cvmx-npi-defs.h>
+#include <asm/octeon/cvmx-gmxx-defs.h>
+#include <asm/octeon/cvmx-asxx-defs.h>
+#include <asm/octeon/cvmx-dbg-defs.h>
+
+void __cvmx_interrupt_gmxx_enable(int interface);
+void __cvmx_interrupt_asxx_enable(int block);
+
+/**
+ * Probe RGMII ports and determine the number present
+ *
+ * @interface: Interface to probe
+ *
+ * Returns Number of RGMII/GMII/MII ports (0-4).
+ */
+int __cvmx_helper_rgmii_probe(int interface)
+{
+       int num_ports = 0;
+       union cvmx_gmxx_inf_mode mode;
+       mode.u64 = cvmx_read_csr(CVMX_GMXX_INF_MODE(interface));
+
+       if (mode.s.type) {
+               if (OCTEON_IS_MODEL(OCTEON_CN38XX)
+                   || OCTEON_IS_MODEL(OCTEON_CN58XX)) {
+                       cvmx_dprintf("ERROR: RGMII initialize called in "
+                                    "SPI interface\n");
+               } else if (OCTEON_IS_MODEL(OCTEON_CN31XX)
+                          || OCTEON_IS_MODEL(OCTEON_CN30XX)
+                          || OCTEON_IS_MODEL(OCTEON_CN50XX)) {
+                       /*
+                        * On these chips "type" says we're in
+                        * GMII/MII mode. This limits us to 2 ports
+                        */
+                       num_ports = 2;
+               } else {
+                       cvmx_dprintf("ERROR: Unsupported Octeon model in %s\n",
+                                    __func__);
+               }
+       } else {
+               if (OCTEON_IS_MODEL(OCTEON_CN38XX)
+                   || OCTEON_IS_MODEL(OCTEON_CN58XX)) {
+                       num_ports = 4;
+               } else if (OCTEON_IS_MODEL(OCTEON_CN31XX)
+                          || OCTEON_IS_MODEL(OCTEON_CN30XX)
+                          || OCTEON_IS_MODEL(OCTEON_CN50XX)) {
+                       num_ports = 3;
+               } else {
+                       cvmx_dprintf("ERROR: Unsupported Octeon model in %s\n",
+                                    __func__);
+               }
+       }
+       return num_ports;
+}
+
+/**
+ * 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.
+ *
+ * @port:   IPD port number to loop.
+ */
+void cvmx_helper_rgmii_internal_loopback(int port)
+{
+       int interface = (port >> 4) & 1;
+       int index = port & 0xf;
+       uint64_t tmp;
+
+       union cvmx_gmxx_prtx_cfg gmx_cfg;
+       gmx_cfg.u64 = 0;
+       gmx_cfg.s.duplex = 1;
+       gmx_cfg.s.slottime = 1;
+       gmx_cfg.s.speed = 1;
+       cvmx_write_csr(CVMX_GMXX_TXX_CLK(index, interface), 1);
+       cvmx_write_csr(CVMX_GMXX_TXX_SLOT(index, interface), 0x200);
+       cvmx_write_csr(CVMX_GMXX_TXX_BURST(index, interface), 0x2000);
+       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
+       tmp = cvmx_read_csr(CVMX_ASXX_PRT_LOOP(interface));
+       cvmx_write_csr(CVMX_ASXX_PRT_LOOP(interface), (1 << index) | tmp);
+       tmp = cvmx_read_csr(CVMX_ASXX_TX_PRT_EN(interface));
+       cvmx_write_csr(CVMX_ASXX_TX_PRT_EN(interface), (1 << index) | tmp);
+       tmp = cvmx_read_csr(CVMX_ASXX_RX_PRT_EN(interface));
+       cvmx_write_csr(CVMX_ASXX_RX_PRT_EN(interface), (1 << index) | tmp);
+       gmx_cfg.s.en = 1;
+       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
+}
+
+/**
+ * Workaround ASX setup errata with CN38XX pass1
+ *
+ * @interface: Interface to setup
+ * @port:      Port to setup (0..3)
+ * @cpu_clock_hz:
+ *                  Chip frequency in Hertz
+ *
+ * Returns Zero on success, negative on failure
+ */
+static int __cvmx_helper_errata_asx_pass1(int interface, int port,
+                                         int cpu_clock_hz)
+{
+       /* Set hi water mark as per errata GMX-4 */
+       if (cpu_clock_hz >= 325000000 && cpu_clock_hz < 375000000)
+               cvmx_write_csr(CVMX_ASXX_TX_HI_WATERX(port, interface), 12);
+       else if (cpu_clock_hz >= 375000000 && cpu_clock_hz < 437000000)
+               cvmx_write_csr(CVMX_ASXX_TX_HI_WATERX(port, interface), 11);
+       else if (cpu_clock_hz >= 437000000 && cpu_clock_hz < 550000000)
+               cvmx_write_csr(CVMX_ASXX_TX_HI_WATERX(port, interface), 10);
+       else if (cpu_clock_hz >= 550000000 && cpu_clock_hz < 687000000)
+               cvmx_write_csr(CVMX_ASXX_TX_HI_WATERX(port, interface), 9);
+       else
+               cvmx_dprintf("Illegal clock frequency (%d). "
+                       "CVMX_ASXX_TX_HI_WATERX not set\n", cpu_clock_hz);
+       return 0;
+}
+
+/**
+ * Configure all of the ASX, GMX, and PKO regsiters required
+ * to get RGMII to function on the supplied interface.
+ *
+ * @interface: PKO Interface to configure (0 or 1)
+ *
+ * Returns Zero on success
+ */
+int __cvmx_helper_rgmii_enable(int interface)
+{
+       int num_ports = cvmx_helper_ports_on_interface(interface);
+       int port;
+       struct cvmx_sysinfo *sys_info_ptr = cvmx_sysinfo_get();
+       union cvmx_gmxx_inf_mode mode;
+       union cvmx_asxx_tx_prt_en asx_tx;
+       union cvmx_asxx_rx_prt_en asx_rx;
+
+       mode.u64 = cvmx_read_csr(CVMX_GMXX_INF_MODE(interface));
+
+       if (mode.s.en == 0)
+               return -1;
+       if ((OCTEON_IS_MODEL(OCTEON_CN38XX) ||
+            OCTEON_IS_MODEL(OCTEON_CN58XX)) && mode.s.type == 1)
+               /* Ignore SPI interfaces */
+               return -1;
+
+       /* Configure the ASX registers needed to use the RGMII ports */
+       asx_tx.u64 = 0;
+       asx_tx.s.prt_en = cvmx_build_mask(num_ports);
+       cvmx_write_csr(CVMX_ASXX_TX_PRT_EN(interface), asx_tx.u64);
+
+       asx_rx.u64 = 0;
+       asx_rx.s.prt_en = cvmx_build_mask(num_ports);
+       cvmx_write_csr(CVMX_ASXX_RX_PRT_EN(interface), asx_rx.u64);
+
+       /* Configure the GMX registers needed to use the RGMII ports */
+       for (port = 0; port < num_ports; port++) {
+               /* Setting of CVMX_GMXX_TXX_THRESH has been moved to
+                  __cvmx_helper_setup_gmx() */
+
+               if (cvmx_octeon_is_pass1())
+                       __cvmx_helper_errata_asx_pass1(interface, port,
+                                                      sys_info_ptr->
+                                                      cpu_clock_hz);
+               else {
+                       /*
+                        * Configure more flexible RGMII preamble
+                        * checking. Pass 1 doesn't support this
+                        * feature.
+                        */
+                       union cvmx_gmxx_rxx_frm_ctl frm_ctl;
+                       frm_ctl.u64 =
+                           cvmx_read_csr(CVMX_GMXX_RXX_FRM_CTL
+                                         (port, interface));
+                       /* New field, so must be compile time */
+                       frm_ctl.s.pre_free = 1;
+                       cvmx_write_csr(CVMX_GMXX_RXX_FRM_CTL(port, interface),
+                                      frm_ctl.u64);
+               }
+
+               /*
+                * Each pause frame transmitted will ask for about 10M
+                * bit times before resume.  If buffer space comes
+                * available before that time has expired, an XON
+                * pause frame (0 time) will be transmitted to restart
+                * the flow.
+                */
+               cvmx_write_csr(CVMX_GMXX_TXX_PAUSE_PKT_TIME(port, interface),
+                              20000);
+               cvmx_write_csr(CVMX_GMXX_TXX_PAUSE_PKT_INTERVAL
+                              (port, interface), 19000);
+
+               if (OCTEON_IS_MODEL(OCTEON_CN50XX)) {
+                       cvmx_write_csr(CVMX_ASXX_TX_CLK_SETX(port, interface),
+                                      16);
+                       cvmx_write_csr(CVMX_ASXX_RX_CLK_SETX(port, interface),
+                                      16);
+               } else {
+                       cvmx_write_csr(CVMX_ASXX_TX_CLK_SETX(port, interface),
+                                      24);
+                       cvmx_write_csr(CVMX_ASXX_RX_CLK_SETX(port, interface),
+                                      24);
+               }
+       }
+
+       __cvmx_helper_setup_gmx(interface, num_ports);
+
+       /* enable the ports now */
+       for (port = 0; port < num_ports; port++) {
+               union cvmx_gmxx_prtx_cfg gmx_cfg;
+               cvmx_helper_link_autoconf(cvmx_helper_get_ipd_port
+                                         (interface, port));
+               gmx_cfg.u64 =
+                   cvmx_read_csr(CVMX_GMXX_PRTX_CFG(port, interface));
+               gmx_cfg.s.en = 1;
+               cvmx_write_csr(CVMX_GMXX_PRTX_CFG(port, interface),
+                              gmx_cfg.u64);
+       }
+       __cvmx_interrupt_asxx_enable(interface);
+       __cvmx_interrupt_gmxx_enable(interface);
+
+       return 0;
+}
+
+/**
+ * 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().
+ *
+ * @ipd_port: IPD/PKO port to query
+ *
+ * Returns Link state
+ */
+cvmx_helper_link_info_t __cvmx_helper_rgmii_link_get(int ipd_port)
+{
+       int interface = cvmx_helper_get_interface_num(ipd_port);
+       int index = cvmx_helper_get_interface_index_num(ipd_port);
+       union cvmx_asxx_prt_loop asxx_prt_loop;
+
+       asxx_prt_loop.u64 = cvmx_read_csr(CVMX_ASXX_PRT_LOOP(interface));
+       if (asxx_prt_loop.s.int_loop & (1 << index)) {
+               /* Force 1Gbps full duplex on internal loopback */
+               cvmx_helper_link_info_t result;
+               result.u64 = 0;
+               result.s.full_duplex = 1;
+               result.s.link_up = 1;
+               result.s.speed = 1000;
+               return result;
+       } else
+               return __cvmx_helper_board_link_get(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.
+ *
+ * @ipd_port:  IPD/PKO port to configure
+ * @link_info: The new link state
+ *
+ * Returns Zero on success, negative on failure
+ */
+int __cvmx_helper_rgmii_link_set(int ipd_port,
+                                cvmx_helper_link_info_t link_info)
+{
+       int result = 0;
+       int interface = cvmx_helper_get_interface_num(ipd_port);
+       int index = cvmx_helper_get_interface_index_num(ipd_port);
+       union cvmx_gmxx_prtx_cfg original_gmx_cfg;
+       union cvmx_gmxx_prtx_cfg new_gmx_cfg;
+       union cvmx_pko_mem_queue_qos pko_mem_queue_qos;
+       union cvmx_pko_mem_queue_qos pko_mem_queue_qos_save[16];
+       union cvmx_gmxx_tx_ovr_bp gmx_tx_ovr_bp;
+       union cvmx_gmxx_tx_ovr_bp gmx_tx_ovr_bp_save;
+       int i;
+
+       /* Ignore speed sets in the simulator */
+       if (cvmx_sysinfo_get()->board_type == CVMX_BOARD_TYPE_SIM)
+               return 0;
+
+       /* Read the current settings so we know the current enable state */
+       original_gmx_cfg.u64 =
+           cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
+       new_gmx_cfg = original_gmx_cfg;
+
+       /* Disable the lowest level RX */
+       cvmx_write_csr(CVMX_ASXX_RX_PRT_EN(interface),
+                      cvmx_read_csr(CVMX_ASXX_RX_PRT_EN(interface)) &
+                                    ~(1 << index));
+
+       memset(pko_mem_queue_qos_save, 0, sizeof(pko_mem_queue_qos_save));
+       /* Disable all queues so that TX should become idle */
+       for (i = 0; i < cvmx_pko_get_num_queues(ipd_port); i++) {
+               int queue = cvmx_pko_get_base_queue(ipd_port) + i;
+               cvmx_write_csr(CVMX_PKO_REG_READ_IDX, queue);
+               pko_mem_queue_qos.u64 = cvmx_read_csr(CVMX_PKO_MEM_QUEUE_QOS);
+               pko_mem_queue_qos.s.pid = ipd_port;
+               pko_mem_queue_qos.s.qid = queue;
+               pko_mem_queue_qos_save[i] = pko_mem_queue_qos;
+               pko_mem_queue_qos.s.qos_mask = 0;
+               cvmx_write_csr(CVMX_PKO_MEM_QUEUE_QOS, pko_mem_queue_qos.u64);
+       }
+
+       /* Disable backpressure */
+       gmx_tx_ovr_bp.u64 = cvmx_read_csr(CVMX_GMXX_TX_OVR_BP(interface));
+       gmx_tx_ovr_bp_save = gmx_tx_ovr_bp;
+       gmx_tx_ovr_bp.s.bp &= ~(1 << index);
+       gmx_tx_ovr_bp.s.en |= 1 << index;
+       cvmx_write_csr(CVMX_GMXX_TX_OVR_BP(interface), gmx_tx_ovr_bp.u64);
+       cvmx_read_csr(CVMX_GMXX_TX_OVR_BP(interface));
+
+       /*
+        * Poll the GMX state machine waiting for it to become
+        * idle. Preferably we should only change speed when it is
+        * idle. If it doesn't become idle we will still do the speed
+        * change, but there is a slight chance that GMX will
+        * lockup.
+        */
+       cvmx_write_csr(CVMX_NPI_DBG_SELECT,
+                      interface * 0x800 + index * 0x100 + 0x880);
+       CVMX_WAIT_FOR_FIELD64(CVMX_DBG_DATA, union cvmx_dbg_data, data & 7,
+                       ==, 0, 10000);
+       CVMX_WAIT_FOR_FIELD64(CVMX_DBG_DATA, union cvmx_dbg_data, data & 0xf,
+                       ==, 0, 10000);
+
+       /* Disable the port before we make any changes */
+       new_gmx_cfg.s.en = 0;
+       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), new_gmx_cfg.u64);
+       cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
+
+       /* Set full/half duplex */
+       if (cvmx_octeon_is_pass1())
+               /* Half duplex is broken for 38XX Pass 1 */
+               new_gmx_cfg.s.duplex = 1;
+       else if (!link_info.s.link_up)
+               /* Force full duplex on down links */
+               new_gmx_cfg.s.duplex = 1;
+       else
+               new_gmx_cfg.s.duplex = link_info.s.full_duplex;
+
+       /* Set the link speed. Anything unknown is set to 1Gbps */
+       if (link_info.s.speed == 10) {
+               new_gmx_cfg.s.slottime = 0;
+               new_gmx_cfg.s.speed = 0;
+       } else if (link_info.s.speed == 100) {
+               new_gmx_cfg.s.slottime = 0;
+               new_gmx_cfg.s.speed = 0;
+       } else {
+               new_gmx_cfg.s.slottime = 1;
+               new_gmx_cfg.s.speed = 1;
+       }
+
+       /* Adjust the clocks */
+       if (link_info.s.speed == 10) {
+               cvmx_write_csr(CVMX_GMXX_TXX_CLK(index, interface), 50);
+               cvmx_write_csr(CVMX_GMXX_TXX_SLOT(index, interface), 0x40);
+               cvmx_write_csr(CVMX_GMXX_TXX_BURST(index, interface), 0);
+       } else if (link_info.s.speed == 100) {
+               cvmx_write_csr(CVMX_GMXX_TXX_CLK(index, interface), 5);
+               cvmx_write_csr(CVMX_GMXX_TXX_SLOT(index, interface), 0x40);
+               cvmx_write_csr(CVMX_GMXX_TXX_BURST(index, interface), 0);
+       } else {
+               cvmx_write_csr(CVMX_GMXX_TXX_CLK(index, interface), 1);
+               cvmx_write_csr(CVMX_GMXX_TXX_SLOT(index, interface), 0x200);
+               cvmx_write_csr(CVMX_GMXX_TXX_BURST(index, interface), 0x2000);
+       }
+
+       if (OCTEON_IS_MODEL(OCTEON_CN30XX) || OCTEON_IS_MODEL(OCTEON_CN50XX)) {
+               if ((link_info.s.speed == 10) || (link_info.s.speed == 100)) {
+                       union cvmx_gmxx_inf_mode mode;
+                       mode.u64 = cvmx_read_csr(CVMX_GMXX_INF_MODE(interface));
+
+       /*
+        * Port  .en  .type  .p0mii  Configuration
+        * ----  ---  -----  ------  -----------------------------------------
+        *  X      0     X      X    All links are disabled.
+        *  0      1     X      0    Port 0 is RGMII
+        *  0      1     X      1    Port 0 is MII
+        *  1      1     0      X    Ports 1 and 2 are configured as RGMII ports.
+        *  1      1     1      X    Port 1: GMII/MII; Port 2: disabled. GMII or
+        *                           MII port is selected by GMX_PRT1_CFG[SPEED].
+        */
+
+                       /* In MII mode, CLK_CNT = 1. */
+                       if (((index == 0) && (mode.s.p0mii == 1))
+                           || ((index != 0) && (mode.s.type == 1))) {
+                               cvmx_write_csr(CVMX_GMXX_TXX_CLK
+                                              (index, interface), 1);
+                       }
+               }
+       }
+
+       /* Do a read to make sure all setup stuff is complete */
+       cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
+
+       /* Save the new GMX setting without enabling the port */
+       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), new_gmx_cfg.u64);
+
+       /* Enable the lowest level RX */
+       cvmx_write_csr(CVMX_ASXX_RX_PRT_EN(interface),
+                      cvmx_read_csr(CVMX_ASXX_RX_PRT_EN(interface)) | (1 <<
+                                                                       index));
+
+       /* Re-enable the TX path */
+       for (i = 0; i < cvmx_pko_get_num_queues(ipd_port); i++) {
+               int queue = cvmx_pko_get_base_queue(ipd_port) + i;
+               cvmx_write_csr(CVMX_PKO_REG_READ_IDX, queue);
+               cvmx_write_csr(CVMX_PKO_MEM_QUEUE_QOS,
+                              pko_mem_queue_qos_save[i].u64);
+       }
+
+       /* Restore backpressure */
+       cvmx_write_csr(CVMX_GMXX_TX_OVR_BP(interface), gmx_tx_ovr_bp_save.u64);
+
+       /* Restore the GMX enable state. Port config is complete */
+       new_gmx_cfg.s.en = original_gmx_cfg.s.en;
+       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), new_gmx_cfg.u64);
+
+       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.
+ *
+ * @ipd_port: IPD/PKO port to loopback.
+ * @enable_internal:
+ *                 Non zero if you want internal loopback
+ * @enable_external:
+ *                 Non zero if you want external loopback
+ *
+ * Returns Zero on success, negative on failure.
+ */
+int __cvmx_helper_rgmii_configure_loopback(int ipd_port, int enable_internal,
+                                          int enable_external)
+{
+       int interface = cvmx_helper_get_interface_num(ipd_port);
+       int index = cvmx_helper_get_interface_index_num(ipd_port);
+       int original_enable;
+       union cvmx_gmxx_prtx_cfg gmx_cfg;
+       union cvmx_asxx_prt_loop asxx_prt_loop;
+
+       /* Read the current enable state and save it */
+       gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
+       original_enable = gmx_cfg.s.en;
+       /* Force port to be disabled */
+       gmx_cfg.s.en = 0;
+       if (enable_internal) {
+               /* Force speed if we're doing internal loopback */
+               gmx_cfg.s.duplex = 1;
+               gmx_cfg.s.slottime = 1;
+               gmx_cfg.s.speed = 1;
+               cvmx_write_csr(CVMX_GMXX_TXX_CLK(index, interface), 1);
+               cvmx_write_csr(CVMX_GMXX_TXX_SLOT(index, interface), 0x200);
+               cvmx_write_csr(CVMX_GMXX_TXX_BURST(index, interface), 0x2000);
+       }
+       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
+
+       /* Set the loopback bits */
+       asxx_prt_loop.u64 = cvmx_read_csr(CVMX_ASXX_PRT_LOOP(interface));
+       if (enable_internal)
+               asxx_prt_loop.s.int_loop |= 1 << index;
+       else
+               asxx_prt_loop.s.int_loop &= ~(1 << index);
+       if (enable_external)
+               asxx_prt_loop.s.ext_loop |= 1 << index;
+       else
+               asxx_prt_loop.s.ext_loop &= ~(1 << index);
+       cvmx_write_csr(CVMX_ASXX_PRT_LOOP(interface), asxx_prt_loop.u64);
+
+       /* Force enables in internal loopback */
+       if (enable_internal) {
+               uint64_t tmp;
+               tmp = cvmx_read_csr(CVMX_ASXX_TX_PRT_EN(interface));
+               cvmx_write_csr(CVMX_ASXX_TX_PRT_EN(interface),
+                              (1 << index) | tmp);
+               tmp = cvmx_read_csr(CVMX_ASXX_RX_PRT_EN(interface));
+               cvmx_write_csr(CVMX_ASXX_RX_PRT_EN(interface),
+                              (1 << index) | tmp);
+               original_enable = 1;
+       }
+
+       /* Restore the enable state */
+       gmx_cfg.s.en = original_enable;
+       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
+       return 0;
+}
diff --git a/arch/mips/cavium-octeon/executive/cvmx-helper-sgmii.c b/arch/mips/cavium-octeon/executive/cvmx-helper-sgmii.c
new file mode 100644 (file)
index 0000000..0c0bf5d
--- /dev/null
@@ -0,0 +1,554 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ * Functions for SGMII initialization, configuration,
+ * and monitoring.
+ */
+
+#include <asm/octeon/octeon.h>
+
+#include <asm/octeon/cvmx-config.h>
+
+#include <asm/octeon/cvmx-mdio.h>
+#include <asm/octeon/cvmx-helper.h>
+#include <asm/octeon/cvmx-helper-board.h>
+
+#include <asm/octeon/cvmx-gmxx-defs.h>
+#include <asm/octeon/cvmx-pcsx-defs.h>
+
+void __cvmx_interrupt_gmxx_enable(int interface);
+void __cvmx_interrupt_pcsx_intx_en_reg_enable(int index, int block);
+void __cvmx_interrupt_pcsxx_int_en_reg_enable(int index);
+
+/**
+ * Perform initialization required only once for an SGMII port.
+ *
+ * @interface: Interface to init
+ * @index:     Index of prot on the interface
+ *
+ * Returns Zero on success, negative on failure
+ */
+static int __cvmx_helper_sgmii_hardware_init_one_time(int interface, int index)
+{
+       const uint64_t clock_mhz = cvmx_sysinfo_get()->cpu_clock_hz / 1000000;
+       union cvmx_pcsx_miscx_ctl_reg pcs_misc_ctl_reg;
+       union cvmx_pcsx_linkx_timer_count_reg pcsx_linkx_timer_count_reg;
+       union cvmx_gmxx_prtx_cfg gmxx_prtx_cfg;
+
+       /* Disable GMX */
+       gmxx_prtx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
+       gmxx_prtx_cfg.s.en = 0;
+       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmxx_prtx_cfg.u64);
+
+       /*
+        * Write PCS*_LINK*_TIMER_COUNT_REG[COUNT] with the
+        * appropriate value. 1000BASE-X specifies a 10ms
+        * interval. SGMII specifies a 1.6ms interval.
+        */
+       pcs_misc_ctl_reg.u64 =
+           cvmx_read_csr(CVMX_PCSX_MISCX_CTL_REG(index, interface));
+       pcsx_linkx_timer_count_reg.u64 =
+           cvmx_read_csr(CVMX_PCSX_LINKX_TIMER_COUNT_REG(index, interface));
+       if (pcs_misc_ctl_reg.s.mode) {
+               /* 1000BASE-X */
+               pcsx_linkx_timer_count_reg.s.count =
+                   (10000ull * clock_mhz) >> 10;
+       } else {
+               /* SGMII */
+               pcsx_linkx_timer_count_reg.s.count =
+                   (1600ull * clock_mhz) >> 10;
+       }
+       cvmx_write_csr(CVMX_PCSX_LINKX_TIMER_COUNT_REG(index, interface),
+                      pcsx_linkx_timer_count_reg.u64);
+
+       /*
+        * Write the advertisement register to be used as the
+        * tx_Config_Reg<D15:D0> of the autonegotiation.  In
+        * 1000BASE-X mode, tx_Config_Reg<D15:D0> is PCS*_AN*_ADV_REG.
+        * In SGMII PHY mode, tx_Config_Reg<D15:D0> is
+        * PCS*_SGM*_AN_ADV_REG.  In SGMII MAC mode,
+        * tx_Config_Reg<D15:D0> is the fixed value 0x4001, so this
+        * step can be skipped.
+        */
+       if (pcs_misc_ctl_reg.s.mode) {
+               /* 1000BASE-X */
+               union cvmx_pcsx_anx_adv_reg pcsx_anx_adv_reg;
+               pcsx_anx_adv_reg.u64 =
+                   cvmx_read_csr(CVMX_PCSX_ANX_ADV_REG(index, interface));
+               pcsx_anx_adv_reg.s.rem_flt = 0;
+               pcsx_anx_adv_reg.s.pause = 3;
+               pcsx_anx_adv_reg.s.hfd = 1;
+               pcsx_anx_adv_reg.s.fd = 1;
+               cvmx_write_csr(CVMX_PCSX_ANX_ADV_REG(index, interface),
+                              pcsx_anx_adv_reg.u64);
+       } else {
+               union cvmx_pcsx_miscx_ctl_reg pcsx_miscx_ctl_reg;
+               pcsx_miscx_ctl_reg.u64 =
+                   cvmx_read_csr(CVMX_PCSX_MISCX_CTL_REG(index, interface));
+               if (pcsx_miscx_ctl_reg.s.mac_phy) {
+                       /* PHY Mode */
+                       union cvmx_pcsx_sgmx_an_adv_reg pcsx_sgmx_an_adv_reg;
+                       pcsx_sgmx_an_adv_reg.u64 =
+                           cvmx_read_csr(CVMX_PCSX_SGMX_AN_ADV_REG
+                                         (index, interface));
+                       pcsx_sgmx_an_adv_reg.s.link = 1;
+                       pcsx_sgmx_an_adv_reg.s.dup = 1;
+                       pcsx_sgmx_an_adv_reg.s.speed = 2;
+                       cvmx_write_csr(CVMX_PCSX_SGMX_AN_ADV_REG
+                                      (index, interface),
+                                      pcsx_sgmx_an_adv_reg.u64);
+               } else {
+                       /* MAC Mode - Nothing to do */
+               }
+       }
+       return 0;
+}
+
+/**
+ * Initialize the SERTES link for the first time or after a loss
+ * of link.
+ *
+ * @interface: Interface to init
+ * @index:     Index of prot on the interface
+ *
+ * Returns Zero on success, negative on failure
+ */
+static int __cvmx_helper_sgmii_hardware_init_link(int interface, int index)
+{
+       union cvmx_pcsx_mrx_control_reg control_reg;
+
+       /*
+        * Take PCS through a reset sequence.
+        * PCS*_MR*_CONTROL_REG[PWR_DN] should be cleared to zero.
+        * Write PCS*_MR*_CONTROL_REG[RESET]=1 (while not changing the
+        * value of the other PCS*_MR*_CONTROL_REG bits).  Read
+        * PCS*_MR*_CONTROL_REG[RESET] until it changes value to
+        * zero.
+        */
+       control_reg.u64 =
+           cvmx_read_csr(CVMX_PCSX_MRX_CONTROL_REG(index, interface));
+       if (cvmx_sysinfo_get()->board_type != CVMX_BOARD_TYPE_SIM) {
+               control_reg.s.reset = 1;
+               cvmx_write_csr(CVMX_PCSX_MRX_CONTROL_REG(index, interface),
+                              control_reg.u64);
+               if (CVMX_WAIT_FOR_FIELD64
+                   (CVMX_PCSX_MRX_CONTROL_REG(index, interface),
+                    union cvmx_pcsx_mrx_control_reg, reset, ==, 0, 10000)) {
+                       cvmx_dprintf("SGMII%d: Timeout waiting for port %d "
+                                    "to finish reset\n",
+                            interface, index);
+                       return -1;
+               }
+       }
+
+       /*
+        * Write PCS*_MR*_CONTROL_REG[RST_AN]=1 to ensure a fresh
+        * sgmii negotiation starts.
+        */
+       control_reg.s.rst_an = 1;
+       control_reg.s.an_en = 1;
+       control_reg.s.pwr_dn = 0;
+       cvmx_write_csr(CVMX_PCSX_MRX_CONTROL_REG(index, interface),
+                      control_reg.u64);
+
+       /*
+        * Wait for PCS*_MR*_STATUS_REG[AN_CPT] to be set, indicating
+        * that sgmii autonegotiation is complete. In MAC mode this
+        * isn't an ethernet link, but a link between Octeon and the
+        * PHY.
+        */
+       if ((cvmx_sysinfo_get()->board_type != CVMX_BOARD_TYPE_SIM) &&
+           CVMX_WAIT_FOR_FIELD64(CVMX_PCSX_MRX_STATUS_REG(index, interface),
+                                 union cvmx_pcsx_mrx_status_reg, an_cpt, ==, 1,
+                                 10000)) {
+               /* cvmx_dprintf("SGMII%d: Port %d link timeout\n", interface, index); */
+               return -1;
+       }
+       return 0;
+}
+
+/**
+ * Configure an SGMII link to the specified speed after the SERTES
+ * link is up.
+ *
+ * @interface: Interface to init
+ * @index:     Index of prot on the interface
+ * @link_info: Link state to configure
+ *
+ * Returns Zero on success, negative on failure
+ */
+static int __cvmx_helper_sgmii_hardware_init_link_speed(int interface,
+                                                       int index,
+                                                       cvmx_helper_link_info_t
+                                                       link_info)
+{
+       int is_enabled;
+       union cvmx_gmxx_prtx_cfg gmxx_prtx_cfg;
+       union cvmx_pcsx_miscx_ctl_reg pcsx_miscx_ctl_reg;
+
+       /* Disable GMX before we make any changes. Remember the enable state */
+       gmxx_prtx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
+       is_enabled = gmxx_prtx_cfg.s.en;
+       gmxx_prtx_cfg.s.en = 0;
+       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmxx_prtx_cfg.u64);
+
+       /* Wait for GMX to be idle */
+       if (CVMX_WAIT_FOR_FIELD64
+           (CVMX_GMXX_PRTX_CFG(index, interface), union cvmx_gmxx_prtx_cfg,
+            rx_idle, ==, 1, 10000)
+           || CVMX_WAIT_FOR_FIELD64(CVMX_GMXX_PRTX_CFG(index, interface),
+                                    union cvmx_gmxx_prtx_cfg, tx_idle, ==, 1,
+                                    10000)) {
+               cvmx_dprintf
+                   ("SGMII%d: Timeout waiting for port %d to be idle\n",
+                    interface, index);
+               return -1;
+       }
+
+       /* Read GMX CFG again to make sure the disable completed */
+       gmxx_prtx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
+
+       /*
+        * Get the misc control for PCS. We will need to set the
+        * duplication amount.
+        */
+       pcsx_miscx_ctl_reg.u64 =
+           cvmx_read_csr(CVMX_PCSX_MISCX_CTL_REG(index, interface));
+
+       /*
+        * Use GMXENO to force the link down if the status we get says
+        * it should be down.
+        */
+       pcsx_miscx_ctl_reg.s.gmxeno = !link_info.s.link_up;
+
+       /* Only change the duplex setting if the link is up */
+       if (link_info.s.link_up)
+               gmxx_prtx_cfg.s.duplex = link_info.s.full_duplex;
+
+       /* Do speed based setting for GMX */
+       switch (link_info.s.speed) {
+       case 10:
+               gmxx_prtx_cfg.s.speed = 0;
+               gmxx_prtx_cfg.s.speed_msb = 1;
+               gmxx_prtx_cfg.s.slottime = 0;
+               /* Setting from GMX-603 */
+               pcsx_miscx_ctl_reg.s.samp_pt = 25;
+               cvmx_write_csr(CVMX_GMXX_TXX_SLOT(index, interface), 64);
+               cvmx_write_csr(CVMX_GMXX_TXX_BURST(index, interface), 0);
+               break;
+       case 100:
+               gmxx_prtx_cfg.s.speed = 0;
+               gmxx_prtx_cfg.s.speed_msb = 0;
+               gmxx_prtx_cfg.s.slottime = 0;
+               pcsx_miscx_ctl_reg.s.samp_pt = 0x5;
+               cvmx_write_csr(CVMX_GMXX_TXX_SLOT(index, interface), 64);
+               cvmx_write_csr(CVMX_GMXX_TXX_BURST(index, interface), 0);
+               break;
+       case 1000:
+               gmxx_prtx_cfg.s.speed = 1;
+               gmxx_prtx_cfg.s.speed_msb = 0;
+               gmxx_prtx_cfg.s.slottime = 1;
+               pcsx_miscx_ctl_reg.s.samp_pt = 1;
+               cvmx_write_csr(CVMX_GMXX_TXX_SLOT(index, interface), 512);
+               cvmx_write_csr(CVMX_GMXX_TXX_BURST(index, interface), 8192);
+               break;
+       default:
+               break;
+       }
+
+       /* Write the new misc control for PCS */
+       cvmx_write_csr(CVMX_PCSX_MISCX_CTL_REG(index, interface),
+                      pcsx_miscx_ctl_reg.u64);
+
+       /* Write the new GMX settings with the port still disabled */
+       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmxx_prtx_cfg.u64);
+
+       /* Read GMX CFG again to make sure the config completed */
+       gmxx_prtx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
+
+       /* Restore the enabled / disabled state */
+       gmxx_prtx_cfg.s.en = is_enabled;
+       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmxx_prtx_cfg.u64);
+
+       return 0;
+}
+
+/**
+ * Bring up the SGMII interface to be ready for packet I/O but
+ * leave I/O disabled using the GMX override. This function
+ * follows the bringup documented in 10.6.3 of the manual.
+ *
+ * @interface: Interface to bringup
+ * @num_ports: Number of ports on the interface
+ *
+ * Returns Zero on success, negative on failure
+ */
+static int __cvmx_helper_sgmii_hardware_init(int interface, int num_ports)
+{
+       int index;
+
+       __cvmx_helper_setup_gmx(interface, num_ports);
+
+       for (index = 0; index < num_ports; index++) {
+               int ipd_port = cvmx_helper_get_ipd_port(interface, index);
+               __cvmx_helper_sgmii_hardware_init_one_time(interface, index);
+               __cvmx_helper_sgmii_link_set(ipd_port,
+                                            __cvmx_helper_sgmii_link_get
+                                            (ipd_port));
+
+       }
+
+       return 0;
+}
+
+int __cvmx_helper_sgmii_enumerate(int interface)
+{
+       return 4;
+}
+/**
+ * Probe a SGMII interface and determine the number of ports
+ * connected to it. The SGMII interface should still be down after
+ * this call.
+ *
+ * @interface: Interface to probe
+ *
+ * Returns Number of ports on the interface. Zero to disable.
+ */
+int __cvmx_helper_sgmii_probe(int interface)
+{
+       union cvmx_gmxx_inf_mode mode;
+
+       /*
+        * Due to errata GMX-700 on CN56XXp1.x and CN52XXp1.x, the
+        * interface needs to be enabled before IPD otherwise per port
+        * backpressure may not work properly
+        */
+       mode.u64 = cvmx_read_csr(CVMX_GMXX_INF_MODE(interface));
+       mode.s.en = 1;
+       cvmx_write_csr(CVMX_GMXX_INF_MODE(interface), mode.u64);
+       return __cvmx_helper_sgmii_enumerate(interface);
+}
+
+/**
+ * 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.
+ *
+ * @interface: Interface to bring up
+ *
+ * Returns Zero on success, negative on failure
+ */
+int __cvmx_helper_sgmii_enable(int interface)
+{
+       int num_ports = cvmx_helper_ports_on_interface(interface);
+       int index;
+
+       __cvmx_helper_sgmii_hardware_init(interface, num_ports);
+
+       for (index = 0; index < num_ports; index++) {
+               union cvmx_gmxx_prtx_cfg gmxx_prtx_cfg;
+               gmxx_prtx_cfg.u64 =
+                   cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
+               gmxx_prtx_cfg.s.en = 1;
+               cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface),
+                              gmxx_prtx_cfg.u64);
+               __cvmx_interrupt_pcsx_intx_en_reg_enable(index, interface);
+       }
+       __cvmx_interrupt_pcsxx_int_en_reg_enable(interface);
+       __cvmx_interrupt_gmxx_enable(interface);
+       return 0;
+}
+
+/**
+ * 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().
+ *
+ * @ipd_port: IPD/PKO port to query
+ *
+ * Returns Link state
+ */
+cvmx_helper_link_info_t __cvmx_helper_sgmii_link_get(int ipd_port)
+{
+       cvmx_helper_link_info_t result;
+       union cvmx_pcsx_miscx_ctl_reg pcs_misc_ctl_reg;
+       int interface = cvmx_helper_get_interface_num(ipd_port);
+       int index = cvmx_helper_get_interface_index_num(ipd_port);
+       union cvmx_pcsx_mrx_control_reg pcsx_mrx_control_reg;
+
+       result.u64 = 0;
+
+       if (cvmx_sysinfo_get()->board_type == CVMX_BOARD_TYPE_SIM) {
+               /* The simulator gives you a simulated 1Gbps full duplex link */
+               result.s.link_up = 1;
+               result.s.full_duplex = 1;
+               result.s.speed = 1000;
+               return result;
+       }
+
+       pcsx_mrx_control_reg.u64 =
+           cvmx_read_csr(CVMX_PCSX_MRX_CONTROL_REG(index, interface));
+       if (pcsx_mrx_control_reg.s.loopbck1) {
+               /* Force 1Gbps full duplex link for internal loopback */
+               result.s.link_up = 1;
+               result.s.full_duplex = 1;
+               result.s.speed = 1000;
+               return result;
+       }
+
+       pcs_misc_ctl_reg.u64 =
+           cvmx_read_csr(CVMX_PCSX_MISCX_CTL_REG(index, interface));
+       if (pcs_misc_ctl_reg.s.mode) {
+               /* 1000BASE-X */
+               /* FIXME */
+       } else {
+               union cvmx_pcsx_miscx_ctl_reg pcsx_miscx_ctl_reg;
+               pcsx_miscx_ctl_reg.u64 =
+                   cvmx_read_csr(CVMX_PCSX_MISCX_CTL_REG(index, interface));
+               if (pcsx_miscx_ctl_reg.s.mac_phy) {
+                       /* PHY Mode */
+                       union cvmx_pcsx_mrx_status_reg pcsx_mrx_status_reg;
+                       union cvmx_pcsx_anx_results_reg pcsx_anx_results_reg;
+
+                       /*
+                        * Don't bother continuing if the SERTES low
+                        * level link is down
+                        */
+                       pcsx_mrx_status_reg.u64 =
+                           cvmx_read_csr(CVMX_PCSX_MRX_STATUS_REG
+                                         (index, interface));
+                       if (pcsx_mrx_status_reg.s.lnk_st == 0) {
+                               if (__cvmx_helper_sgmii_hardware_init_link
+                                   (interface, index) != 0)
+                                       return result;
+                       }
+
+                       /* Read the autoneg results */
+                       pcsx_anx_results_reg.u64 =
+                           cvmx_read_csr(CVMX_PCSX_ANX_RESULTS_REG
+                                         (index, interface));
+                       if (pcsx_anx_results_reg.s.an_cpt) {
+                               /*
+                                * Auto negotiation is complete. Set
+                                * status accordingly.
+                                */
+                               result.s.full_duplex =
+                                   pcsx_anx_results_reg.s.dup;
+                               result.s.link_up =
+                                   pcsx_anx_results_reg.s.link_ok;
+                               switch (pcsx_anx_results_reg.s.spd) {
+                               case 0:
+                                       result.s.speed = 10;
+                                       break;
+                               case 1:
+                                       result.s.speed = 100;
+                                       break;
+                               case 2:
+                                       result.s.speed = 1000;
+                                       break;
+                               default:
+                                       result.s.speed = 0;
+                                       result.s.link_up = 0;
+                                       break;
+                               }
+                       } else {
+                               /*
+                                * Auto negotiation isn't
+                                * complete. Return link down.
+                                */
+                               result.s.speed = 0;
+                               result.s.link_up = 0;
+                       }
+               } else {        /* MAC Mode */
+
+                       result = __cvmx_helper_board_link_get(ipd_port);
+               }
+       }
+       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.
+ *
+ * @ipd_port:  IPD/PKO port to configure
+ * @link_info: The new link state
+ *
+ * Returns Zero on success, negative on failure
+ */
+int __cvmx_helper_sgmii_link_set(int ipd_port,
+                                cvmx_helper_link_info_t link_info)
+{
+       int interface = cvmx_helper_get_interface_num(ipd_port);
+       int index = cvmx_helper_get_interface_index_num(ipd_port);
+       __cvmx_helper_sgmii_hardware_init_link(interface, index);
+       return __cvmx_helper_sgmii_hardware_init_link_speed(interface, index,
+                                                           link_info);
+}
+
+/**
+ * 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.
+ *
+ * @ipd_port: IPD/PKO port to loopback.
+ * @enable_internal:
+ *                 Non zero if you want internal loopback
+ * @enable_external:
+ *                 Non zero if you want external loopback
+ *
+ * Returns Zero on success, negative on failure.
+ */
+int __cvmx_helper_sgmii_configure_loopback(int ipd_port, int enable_internal,
+                                          int enable_external)
+{
+       int interface = cvmx_helper_get_interface_num(ipd_port);
+       int index = cvmx_helper_get_interface_index_num(ipd_port);
+       union cvmx_pcsx_mrx_control_reg pcsx_mrx_control_reg;
+       union cvmx_pcsx_miscx_ctl_reg pcsx_miscx_ctl_reg;
+
+       pcsx_mrx_control_reg.u64 =
+           cvmx_read_csr(CVMX_PCSX_MRX_CONTROL_REG(index, interface));
+       pcsx_mrx_control_reg.s.loopbck1 = enable_internal;
+       cvmx_write_csr(CVMX_PCSX_MRX_CONTROL_REG(index, interface),
+                      pcsx_mrx_control_reg.u64);
+
+       pcsx_miscx_ctl_reg.u64 =
+           cvmx_read_csr(CVMX_PCSX_MISCX_CTL_REG(index, interface));
+       pcsx_miscx_ctl_reg.s.loopbck2 = enable_external;
+       cvmx_write_csr(CVMX_PCSX_MISCX_CTL_REG(index, interface),
+                      pcsx_miscx_ctl_reg.u64);
+
+       __cvmx_helper_sgmii_hardware_init_link(interface, index);
+       return 0;
+}
diff --git a/arch/mips/cavium-octeon/executive/cvmx-helper-spi.c b/arch/mips/cavium-octeon/executive/cvmx-helper-spi.c
new file mode 100644 (file)
index 0000000..2830e4b
--- /dev/null
@@ -0,0 +1,205 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+void __cvmx_interrupt_gmxx_enable(int interface);
+void __cvmx_interrupt_spxx_int_msk_enable(int index);
+void __cvmx_interrupt_stxx_int_msk_enable(int index);
+
+/*
+ * Functions for SPI initialization, configuration,
+ * and monitoring.
+ */
+#include <asm/octeon/octeon.h>
+
+#include <asm/octeon/cvmx-config.h>
+#include <asm/octeon/cvmx-spi.h>
+#include <asm/octeon/cvmx-helper.h>
+
+#include <asm/octeon/cvmx-pip-defs.h>
+#include <asm/octeon/cvmx-pko-defs.h>
+
+/*
+ * CVMX_HELPER_SPI_TIMEOUT is used to determine how long the SPI
+ * initialization routines wait for SPI training. You can override the
+ * value using executive-config.h if necessary.
+ */
+#ifndef CVMX_HELPER_SPI_TIMEOUT
+#define CVMX_HELPER_SPI_TIMEOUT 10
+#endif
+
+int __cvmx_helper_spi_enumerate(int interface)
+{
+       if ((cvmx_sysinfo_get()->board_type != CVMX_BOARD_TYPE_SIM) &&
+           cvmx_spi4000_is_present(interface)) {
+               return 10;
+       } else {
+               return 16;
+       }
+}
+
+/**
+ * Probe a SPI interface and determine the number of ports
+ * connected to it. The SPI interface should still be down after
+ * this call.
+ *
+ * @interface: Interface to probe
+ *
+ * Returns Number of ports on the interface. Zero to disable.
+ */
+int __cvmx_helper_spi_probe(int interface)
+{
+       int num_ports = 0;
+
+       if ((cvmx_sysinfo_get()->board_type != CVMX_BOARD_TYPE_SIM) &&
+           cvmx_spi4000_is_present(interface)) {
+               num_ports = 10;
+       } else {
+               union cvmx_pko_reg_crc_enable enable;
+               num_ports = 16;
+               /*
+                * Unlike the SPI4000, most SPI devices don't
+                * automatically put on the L2 CRC. For everything
+                * except for the SPI4000 have PKO append the L2 CRC
+                * to the packet.
+                */
+               enable.u64 = cvmx_read_csr(CVMX_PKO_REG_CRC_ENABLE);
+               enable.s.enable |= 0xffff << (interface * 16);
+               cvmx_write_csr(CVMX_PKO_REG_CRC_ENABLE, enable.u64);
+       }
+       __cvmx_helper_setup_gmx(interface, num_ports);
+       return num_ports;
+}
+
+/**
+ * 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.
+ *
+ * @interface: Interface to bring up
+ *
+ * Returns Zero on success, negative on failure
+ */
+int __cvmx_helper_spi_enable(int interface)
+{
+       /*
+        * Normally the ethernet L2 CRC is checked and stripped in the
+        * GMX block.  When you are using SPI, this isn' the case and
+        * IPD needs to check the L2 CRC.
+        */
+       int num_ports = cvmx_helper_ports_on_interface(interface);
+       int ipd_port;
+       for (ipd_port = interface * 16; ipd_port < interface * 16 + num_ports;
+            ipd_port++) {
+               union cvmx_pip_prt_cfgx port_config;
+               port_config.u64 = cvmx_read_csr(CVMX_PIP_PRT_CFGX(ipd_port));
+               port_config.s.crc_en = 1;
+               cvmx_write_csr(CVMX_PIP_PRT_CFGX(ipd_port), port_config.u64);
+       }
+
+       if (cvmx_sysinfo_get()->board_type != CVMX_BOARD_TYPE_SIM) {
+               cvmx_spi_start_interface(interface, CVMX_SPI_MODE_DUPLEX,
+                                        CVMX_HELPER_SPI_TIMEOUT, num_ports);
+               if (cvmx_spi4000_is_present(interface))
+                       cvmx_spi4000_initialize(interface);
+       }
+       __cvmx_interrupt_spxx_int_msk_enable(interface);
+       __cvmx_interrupt_stxx_int_msk_enable(interface);
+       __cvmx_interrupt_gmxx_enable(interface);
+       return 0;
+}
+
+/**
+ * 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().
+ *
+ * @ipd_port: IPD/PKO port to query
+ *
+ * Returns Link state
+ */
+cvmx_helper_link_info_t __cvmx_helper_spi_link_get(int ipd_port)
+{
+       cvmx_helper_link_info_t result;
+       int interface = cvmx_helper_get_interface_num(ipd_port);
+       int index = cvmx_helper_get_interface_index_num(ipd_port);
+       result.u64 = 0;
+
+       if (cvmx_sysinfo_get()->board_type == CVMX_BOARD_TYPE_SIM) {
+               /* The simulator gives you a simulated full duplex link */
+               result.s.link_up = 1;
+               result.s.full_duplex = 1;
+               result.s.speed = 10000;
+       } else if (cvmx_spi4000_is_present(interface)) {
+               union cvmx_gmxx_rxx_rx_inbnd inband =
+                   cvmx_spi4000_check_speed(interface, index);
+               result.s.link_up = inband.s.status;
+               result.s.full_duplex = inband.s.duplex;
+               switch (inband.s.speed) {
+               case 0: /* 10 Mbps */
+                       result.s.speed = 10;
+                       break;
+               case 1: /* 100 Mbps */
+                       result.s.speed = 100;
+                       break;
+               case 2: /* 1 Gbps */
+                       result.s.speed = 1000;
+                       break;
+               case 3: /* Illegal */
+                       result.s.speed = 0;
+                       result.s.link_up = 0;
+                       break;
+               }
+       } else {
+               /* For generic SPI we can't determine the link, just return some
+                  sane results */
+               result.s.link_up = 1;
+               result.s.full_duplex = 1;
+               result.s.speed = 10000;
+       }
+       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.
+ *
+ * @ipd_port:  IPD/PKO port to configure
+ * @link_info: The new link state
+ *
+ * Returns Zero on success, negative on failure
+ */
+int __cvmx_helper_spi_link_set(int ipd_port, cvmx_helper_link_info_t link_info)
+{
+       /* Nothing to do. If we have a SPI4000 then the setup was already performed
+          by cvmx_spi4000_check_speed(). If not then there isn't any link
+          info */
+       return 0;
+}
diff --git a/arch/mips/cavium-octeon/executive/cvmx-helper-util.c b/arch/mips/cavium-octeon/executive/cvmx-helper-util.c
new file mode 100644 (file)
index 0000000..116dea1
--- /dev/null
@@ -0,0 +1,433 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ * Small helper utilities.
+ */
+#include <linux/kernel.h>
+
+#include <asm/octeon/octeon.h>
+
+#include <asm/octeon/cvmx-config.h>
+
+#include <asm/octeon/cvmx-fpa.h>
+#include <asm/octeon/cvmx-pip.h>
+#include <asm/octeon/cvmx-pko.h>
+#include <asm/octeon/cvmx-ipd.h>
+#include <asm/octeon/cvmx-spi.h>
+
+#include <asm/octeon/cvmx-helper.h>
+#include <asm/octeon/cvmx-helper-util.h>
+
+#include <asm/octeon/cvmx-ipd-defs.h>
+
+/**
+ * Convert a interface mode into a human readable string
+ *
+ * @mode:   Mode to convert
+ *
+ * Returns 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_SGMII:
+               return "SGMII";
+       case CVMX_HELPER_INTERFACE_MODE_PICMG:
+               return "PICMG";
+       case CVMX_HELPER_INTERFACE_MODE_NPI:
+               return "NPI";
+       case CVMX_HELPER_INTERFACE_MODE_LOOP:
+               return "LOOP";
+       }
+       return "UNKNOWN";
+}
+
+/**
+ * Debug routine to dump the packet structure to the console
+ *
+ * @work:   Work queue entry containing the packet to dump
+ * Returns
+ */
+int cvmx_helper_dump_packet(cvmx_wqe_t *work)
+{
+       uint64_t count;
+       uint64_t remaining_bytes;
+       union cvmx_buf_ptr buffer_ptr;
+       uint64_t start_of_buffer;
+       uint8_t *data_address;
+       uint8_t *end_of_data;
+
+       cvmx_dprintf("Packet Length:   %u\n", work->len);
+       cvmx_dprintf("    Input Port:  %u\n", work->ipprt);
+       cvmx_dprintf("    QoS:         %u\n", work->qos);
+       cvmx_dprintf("    Buffers:     %u\n", work->word2.s.bufs);
+
+       if (work->word2.s.bufs == 0) {
+               union cvmx_ipd_wqe_fpa_queue wqe_pool;
+               wqe_pool.u64 = cvmx_read_csr(CVMX_IPD_WQE_FPA_QUEUE);
+               buffer_ptr.u64 = 0;
+               buffer_ptr.s.pool = wqe_pool.s.wqe_pool;
+               buffer_ptr.s.size = 128;
+               buffer_ptr.s.addr = cvmx_ptr_to_phys(work->packet_data);
+               if (likely(!work->word2.s.not_IP)) {
+                       union cvmx_pip_ip_offset pip_ip_offset;
+                       pip_ip_offset.u64 = cvmx_read_csr(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 assumes 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 = cvmx_read_csr(CVMX_PIP_GBL_CFG);
+                       buffer_ptr.s.addr += pip_gbl_cfg.s.nip_shf;
+               }
+       } else
+               buffer_ptr = work->packet_ptr;
+       remaining_bytes = work->len;
+
+       while (remaining_bytes) {
+               start_of_buffer =
+                   ((buffer_ptr.s.addr >> 7) - buffer_ptr.s.back) << 7;
+               cvmx_dprintf("    Buffer Start:%llx\n",
+                            (unsigned long long)start_of_buffer);
+               cvmx_dprintf("    Buffer I   : %u\n", buffer_ptr.s.i);
+               cvmx_dprintf("    Buffer Back: %u\n", buffer_ptr.s.back);
+               cvmx_dprintf("    Buffer Pool: %u\n", buffer_ptr.s.pool);
+               cvmx_dprintf("    Buffer Data: %llx\n",
+                            (unsigned long long)buffer_ptr.s.addr);
+               cvmx_dprintf("    Buffer Size: %u\n", buffer_ptr.s.size);
+
+               cvmx_dprintf("\t\t");
+               data_address = (uint8_t *) cvmx_phys_to_ptr(buffer_ptr.s.addr);
+               end_of_data = data_address + buffer_ptr.s.size;
+               count = 0;
+               while (data_address < end_of_data) {
+                       if (remaining_bytes == 0)
+                               break;
+                       else
+                               remaining_bytes--;
+                       cvmx_dprintf("%02x", (unsigned int)*data_address);
+                       data_address++;
+                       if (remaining_bytes && (count == 7)) {
+                               cvmx_dprintf("\n\t\t");
+                               count = 0;
+                       } else
+                               count++;
+               }
+               cvmx_dprintf("\n");
+
+               if (remaining_bytes)
+                       buffer_ptr = *(union cvmx_buf_ptr *)
+                               cvmx_phys_to_ptr(buffer_ptr.s.addr - 8);
+       }
+       return 0;
+}
+
+/**
+ * Setup Random Early Drop on a specific input queue
+ *
+ * @queue:  Input queue to setup RED on (0-7)
+ * @pass_thresh:
+ *               Packets will begin slowly dropping when there are less than
+ *               this many packet buffers free in FPA 0.
+ * @drop_thresh:
+ *               All incomming packets will be dropped when there are less
+ *               than this many free packet buffers in FPA 0.
+ * Returns Zero on success. Negative on failure
+ */
+int cvmx_helper_setup_red_queue(int queue, int pass_thresh, int drop_thresh)
+{
+       union cvmx_ipd_qosx_red_marks red_marks;
+       union cvmx_ipd_red_quex_param red_param;
+
+       /* Set RED to begin dropping packets when there are pass_thresh buffers
+          left. It will linearly drop more packets until reaching drop_thresh
+          buffers */
+       red_marks.u64 = 0;
+       red_marks.s.drop = drop_thresh;
+       red_marks.s.pass = pass_thresh;
+       cvmx_write_csr(CVMX_IPD_QOSX_RED_MARKS(queue), red_marks.u64);
+
+       /* Use the actual queue 0 counter, not the average */
+       red_param.u64 = 0;
+       red_param.s.prb_con =
+           (255ul << 24) / (red_marks.s.pass - red_marks.s.drop);
+       red_param.s.avg_con = 1;
+       red_param.s.new_con = 255;
+       red_param.s.use_pcnt = 1;
+       cvmx_write_csr(CVMX_IPD_RED_QUEX_PARAM(queue), red_param.u64);
+       return 0;
+}
+
+/**
+ * Setup Random Early Drop to automatically begin dropping packets.
+ *
+ * @pass_thresh:
+ *               Packets will begin slowly dropping when there are less than
+ *               this many packet buffers free in FPA 0.
+ * @drop_thresh:
+ *               All incomming packets will be dropped when there are less
+ *               than this many free packet buffers in FPA 0.
+ * Returns Zero on success. Negative on failure
+ */
+int cvmx_helper_setup_red(int pass_thresh, int drop_thresh)
+{
+       union cvmx_ipd_portx_bp_page_cnt page_cnt;
+       union cvmx_ipd_bp_prt_red_end ipd_bp_prt_red_end;
+       union cvmx_ipd_red_port_enable red_port_enable;
+       int queue;
+       int interface;
+       int port;
+
+       /* Disable backpressure based on queued buffers. It needs SW support */
+       page_cnt.u64 = 0;
+       page_cnt.s.bp_enb = 0;
+       page_cnt.s.page_cnt = 100;
+       for (interface = 0; interface < 2; interface++) {
+               for (port = cvmx_helper_get_first_ipd_port(interface);
+                    port < cvmx_helper_get_last_ipd_port(interface); port++)
+                       cvmx_write_csr(CVMX_IPD_PORTX_BP_PAGE_CNT(port),
+                                      page_cnt.u64);
+       }
+
+       for (queue = 0; queue < 8; queue++)
+               cvmx_helper_setup_red_queue(queue, pass_thresh, drop_thresh);
+
+       /* Shutoff the dropping based on the per port page count. SW isn't
+          decrementing it right now */
+       ipd_bp_prt_red_end.u64 = 0;
+       ipd_bp_prt_red_end.s.prt_enb = 0;
+       cvmx_write_csr(CVMX_IPD_BP_PRT_RED_END, ipd_bp_prt_red_end.u64);
+
+       red_port_enable.u64 = 0;
+       red_port_enable.s.prt_enb = 0xfffffffffull;
+       red_port_enable.s.avg_dly = 10000;
+       red_port_enable.s.prb_dly = 10000;
+       cvmx_write_csr(CVMX_IPD_RED_PORT_ENABLE, red_port_enable.u64);
+
+       return 0;
+}
+
+/**
+ * Setup the common GMX settings that determine the number of
+ * ports. These setting apply to almost all configurations of all
+ * chips.
+ *
+ * @interface: Interface to configure
+ * @num_ports: Number of ports on the interface
+ *
+ * Returns Zero on success, negative on failure
+ */
+int __cvmx_helper_setup_gmx(int interface, 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;
+       int index;
+
+       /* Tell GMX the number of TX ports on this interface */
+       gmx_tx_prts.u64 = cvmx_read_csr(CVMX_GMXX_TX_PRTS(interface));
+       gmx_tx_prts.s.prts = num_ports;
+       cvmx_write_csr(CVMX_GMXX_TX_PRTS(interface), gmx_tx_prts.u64);
+
+       /* Tell GMX the number of RX ports on this interface.  This only
+        ** applies to *GMII and XAUI ports */
+       if (cvmx_helper_interface_get_mode(interface) ==
+           CVMX_HELPER_INTERFACE_MODE_RGMII
+           || cvmx_helper_interface_get_mode(interface) ==
+           CVMX_HELPER_INTERFACE_MODE_SGMII
+           || cvmx_helper_interface_get_mode(interface) ==
+           CVMX_HELPER_INTERFACE_MODE_GMII
+           || cvmx_helper_interface_get_mode(interface) ==
+           CVMX_HELPER_INTERFACE_MODE_XAUI) {
+               if (num_ports > 4) {
+                       cvmx_dprintf("__cvmx_helper_setup_gmx: Illegal "
+                                    "num_ports\n");
+                       return -1;
+               }
+
+               gmx_rx_prts.u64 = cvmx_read_csr(CVMX_GMXX_RX_PRTS(interface));
+               gmx_rx_prts.s.prts = num_ports;
+               cvmx_write_csr(CVMX_GMXX_RX_PRTS(interface), gmx_rx_prts.u64);
+       }
+
+       /* Skip setting CVMX_PKO_REG_GMX_PORT_MODE on 30XX, 31XX, and 50XX */
+       if (!OCTEON_IS_MODEL(OCTEON_CN30XX) && !OCTEON_IS_MODEL(OCTEON_CN31XX)
+           && !OCTEON_IS_MODEL(OCTEON_CN50XX)) {
+               /* Tell PKO the number of ports on this interface */
+               pko_mode.u64 = cvmx_read_csr(CVMX_PKO_REG_GMX_PORT_MODE);
+               if (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;
+               }
+               cvmx_write_csr(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 = cvmx_read_csr(CVMX_GMXX_TXX_THRESH(0, interface));
+       if (OCTEON_IS_MODEL(OCTEON_CN30XX) || OCTEON_IS_MODEL(OCTEON_CN31XX)
+           || OCTEON_IS_MODEL(OCTEON_CN50XX)) {
+               /* These chips have a fixed max threshold of 0x40 */
+               gmx_tx_thresh.s.cnt = 0x40;
+       } else {
+               /* Choose the max value for the number of ports */
+               if (num_ports <= 1)
+                       gmx_tx_thresh.s.cnt = 0x100 / 1;
+               else if (num_ports == 2)
+                       gmx_tx_thresh.s.cnt = 0x100 / 2;
+               else
+                       gmx_tx_thresh.s.cnt = 0x100 / 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++)
+               cvmx_write_csr(CVMX_GMXX_TXX_THRESH(index, interface),
+                              gmx_tx_thresh.u64);
+
+       return 0;
+}
+
+/**
+ * Returns the IPD/PKO port number for a port on the given
+ * interface.
+ *
+ * @interface: Interface to use
+ * @port:      Port on the interface
+ *
+ * Returns IPD/PKO port number
+ */
+int cvmx_helper_get_ipd_port(int interface, int port)
+{
+       switch (interface) {
+       case 0:
+               return port;
+       case 1:
+               return port + 16;
+       case 2:
+               return port + 32;
+       case 3:
+               return port + 36;
+       }
+       return -1;
+}
+
+/**
+ * Returns the interface number for an IPD/PKO port number.
+ *
+ * @ipd_port: IPD/PKO port number
+ *
+ * Returns Interface number
+ */
+int cvmx_helper_get_interface_num(int ipd_port)
+{
+       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
+               cvmx_dprintf("cvmx_helper_get_interface_num: Illegal IPD "
+                            "port number\n");
+
+       return -1;
+}
+
+/**
+ * Returns the interface index number for an IPD/PKO port
+ * number.
+ *
+ * @ipd_port: IPD/PKO port number
+ *
+ * Returns Interface index number
+ */
+int cvmx_helper_get_interface_index_num(int ipd_port)
+{
+       if (ipd_port < 32)
+               return ipd_port & 15;
+       else if (ipd_port < 36)
+               return ipd_port & 3;
+       else if (ipd_port < 40)
+               return ipd_port & 3;
+       else
+               cvmx_dprintf("cvmx_helper_get_interface_index_num: "
+                            "Illegal IPD port number\n");
+
+       return -1;
+}
diff --git a/arch/mips/cavium-octeon/executive/cvmx-helper-xaui.c b/arch/mips/cavium-octeon/executive/cvmx-helper-xaui.c
new file mode 100644 (file)
index 0000000..1723248
--- /dev/null
@@ -0,0 +1,354 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ * Functions for XAUI initialization, configuration,
+ * and monitoring.
+ *
+ */
+
+#include <asm/octeon/octeon.h>
+
+#include <asm/octeon/cvmx-config.h>
+
+#include <asm/octeon/cvmx-helper.h>
+
+#include <asm/octeon/cvmx-pko-defs.h>
+#include <asm/octeon/cvmx-gmxx-defs.h>
+#include <asm/octeon/cvmx-pcsxx-defs.h>
+
+void __cvmx_interrupt_gmxx_enable(int interface);
+void __cvmx_interrupt_pcsx_intx_en_reg_enable(int index, int block);
+void __cvmx_interrupt_pcsxx_int_en_reg_enable(int index);
+
+int __cvmx_helper_xaui_enumerate(int interface)
+{
+       union cvmx_gmxx_hg2_control gmx_hg2_control;
+
+       /* If HiGig2 is enabled return 16 ports, otherwise return 1 port */
+       gmx_hg2_control.u64 = cvmx_read_csr(CVMX_GMXX_HG2_CONTROL(interface));
+       if (gmx_hg2_control.s.hg2tx_en)
+               return 16;
+       else
+               return 1;
+}
+
+/**
+ * Probe a XAUI interface and determine the number of ports
+ * connected to it. The XAUI interface should still be down
+ * after this call.
+ *
+ * @interface: Interface to probe
+ *
+ * Returns Number of ports on the interface. Zero to disable.
+ */
+int __cvmx_helper_xaui_probe(int interface)
+{
+       int i;
+       union cvmx_gmxx_inf_mode mode;
+
+       /*
+        * Due to errata GMX-700 on CN56XXp1.x and CN52XXp1.x, the
+        * interface needs to be enabled before IPD otherwise per port
+        * backpressure may not work properly.
+        */
+       mode.u64 = cvmx_read_csr(CVMX_GMXX_INF_MODE(interface));
+       mode.s.en = 1;
+       cvmx_write_csr(CVMX_GMXX_INF_MODE(interface), mode.u64);
+
+       __cvmx_helper_setup_gmx(interface, 1);
+
+       /*
+        * Setup PKO to support 16 ports for HiGig2 virtual
+        * ports. We're pointing all of the PKO packet ports for this
+        * interface to the XAUI. This allows us to use HiGig2
+        * backpressure per port.
+        */
+       for (i = 0; i < 16; i++) {
+               union cvmx_pko_mem_port_ptrs pko_mem_port_ptrs;
+               pko_mem_port_ptrs.u64 = 0;
+               /*
+                * We set each PKO port to have equal priority in a
+                * round robin fashion.
+                */
+               pko_mem_port_ptrs.s.static_p = 0;
+               pko_mem_port_ptrs.s.qos_mask = 0xff;
+               /* All PKO ports map to the same XAUI hardware port */
+               pko_mem_port_ptrs.s.eid = interface * 4;
+               pko_mem_port_ptrs.s.pid = interface * 16 + i;
+               cvmx_write_csr(CVMX_PKO_MEM_PORT_PTRS, pko_mem_port_ptrs.u64);
+       }
+       return __cvmx_helper_xaui_enumerate(interface);
+}
+
+/**
+ * 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.
+ *
+ * @interface: Interface to bring up
+ *
+ * Returns Zero on success, negative on failure
+ */
+int __cvmx_helper_xaui_enable(int interface)
+{
+       union cvmx_gmxx_prtx_cfg gmx_cfg;
+       union cvmx_pcsxx_control1_reg xauiCtl;
+       union cvmx_pcsxx_misc_ctl_reg xauiMiscCtl;
+       union cvmx_gmxx_tx_xaui_ctl gmxXauiTxCtl;
+       union cvmx_gmxx_rxx_int_en gmx_rx_int_en;
+       union cvmx_gmxx_tx_int_en gmx_tx_int_en;
+       union cvmx_pcsxx_int_en_reg pcsx_int_en_reg;
+
+       /* (1) Interface has already been enabled. */
+
+       /* (2) Disable GMX. */
+       xauiMiscCtl.u64 = cvmx_read_csr(CVMX_PCSXX_MISC_CTL_REG(interface));
+       xauiMiscCtl.s.gmxeno = 1;
+       cvmx_write_csr(CVMX_PCSXX_MISC_CTL_REG(interface), xauiMiscCtl.u64);
+
+       /* (3) Disable GMX and PCSX interrupts. */
+       gmx_rx_int_en.u64 = cvmx_read_csr(CVMX_GMXX_RXX_INT_EN(0, interface));
+       cvmx_write_csr(CVMX_GMXX_RXX_INT_EN(0, interface), 0x0);
+       gmx_tx_int_en.u64 = cvmx_read_csr(CVMX_GMXX_TX_INT_EN(interface));
+       cvmx_write_csr(CVMX_GMXX_TX_INT_EN(interface), 0x0);
+       pcsx_int_en_reg.u64 = cvmx_read_csr(CVMX_PCSXX_INT_EN_REG(interface));
+       cvmx_write_csr(CVMX_PCSXX_INT_EN_REG(interface), 0x0);
+
+       /* (4) Bring up the PCSX and GMX reconciliation layer. */
+       /* (4)a Set polarity and lane swapping. */
+       /* (4)b */
+       gmxXauiTxCtl.u64 = cvmx_read_csr(CVMX_GMXX_TX_XAUI_CTL(interface));
+       /* Enable better IFG packing and improves performance */
+       gmxXauiTxCtl.s.dic_en = 1;
+       gmxXauiTxCtl.s.uni_en = 0;
+       cvmx_write_csr(CVMX_GMXX_TX_XAUI_CTL(interface), gmxXauiTxCtl.u64);
+
+       /* (4)c Aply reset sequence */
+       xauiCtl.u64 = cvmx_read_csr(CVMX_PCSXX_CONTROL1_REG(interface));
+       xauiCtl.s.lo_pwr = 0;
+       xauiCtl.s.reset = 1;
+       cvmx_write_csr(CVMX_PCSXX_CONTROL1_REG(interface), xauiCtl.u64);
+
+       /* Wait for PCS to come out of reset */
+       if (CVMX_WAIT_FOR_FIELD64
+           (CVMX_PCSXX_CONTROL1_REG(interface), union cvmx_pcsxx_control1_reg,
+            reset, ==, 0, 10000))
+               return -1;
+       /* Wait for PCS to be aligned */
+       if (CVMX_WAIT_FOR_FIELD64
+           (CVMX_PCSXX_10GBX_STATUS_REG(interface),
+            union cvmx_pcsxx_10gbx_status_reg, alignd, ==, 1, 10000))
+               return -1;
+       /* Wait for RX to be ready */
+       if (CVMX_WAIT_FOR_FIELD64
+           (CVMX_GMXX_RX_XAUI_CTL(interface), union cvmx_gmxx_rx_xaui_ctl,
+                   status, ==, 0, 10000))
+               return -1;
+
+       /* (6) Configure GMX */
+       gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(0, interface));
+       gmx_cfg.s.en = 0;
+       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(0, interface), gmx_cfg.u64);
+
+       /* Wait for GMX RX to be idle */
+       if (CVMX_WAIT_FOR_FIELD64
+           (CVMX_GMXX_PRTX_CFG(0, interface), union cvmx_gmxx_prtx_cfg,
+                   rx_idle, ==, 1, 10000))
+               return -1;
+       /* Wait for GMX TX to be idle */
+       if (CVMX_WAIT_FOR_FIELD64
+           (CVMX_GMXX_PRTX_CFG(0, interface), union cvmx_gmxx_prtx_cfg,
+                   tx_idle, ==, 1, 10000))
+               return -1;
+
+       /* GMX configure */
+       gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(0, interface));
+       gmx_cfg.s.speed = 1;
+       gmx_cfg.s.speed_msb = 0;
+       gmx_cfg.s.slottime = 1;
+       cvmx_write_csr(CVMX_GMXX_TX_PRTS(interface), 1);
+       cvmx_write_csr(CVMX_GMXX_TXX_SLOT(0, interface), 512);
+       cvmx_write_csr(CVMX_GMXX_TXX_BURST(0, interface), 8192);
+       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(0, interface), gmx_cfg.u64);
+
+       /* (7) Clear out any error state */
+       cvmx_write_csr(CVMX_GMXX_RXX_INT_REG(0, interface),
+                      cvmx_read_csr(CVMX_GMXX_RXX_INT_REG(0, interface)));
+       cvmx_write_csr(CVMX_GMXX_TX_INT_REG(interface),
+                      cvmx_read_csr(CVMX_GMXX_TX_INT_REG(interface)));
+       cvmx_write_csr(CVMX_PCSXX_INT_REG(interface),
+                      cvmx_read_csr(CVMX_PCSXX_INT_REG(interface)));
+
+       /* Wait for receive link */
+       if (CVMX_WAIT_FOR_FIELD64
+           (CVMX_PCSXX_STATUS1_REG(interface), union cvmx_pcsxx_status1_reg,
+            rcv_lnk, ==, 1, 10000))
+               return -1;
+       if (CVMX_WAIT_FOR_FIELD64
+           (CVMX_PCSXX_STATUS2_REG(interface), union cvmx_pcsxx_status2_reg,
+            xmtflt, ==, 0, 10000))
+               return -1;
+       if (CVMX_WAIT_FOR_FIELD64
+           (CVMX_PCSXX_STATUS2_REG(interface), union cvmx_pcsxx_status2_reg,
+            rcvflt, ==, 0, 10000))
+               return -1;
+
+       cvmx_write_csr(CVMX_GMXX_RXX_INT_EN(0, interface), gmx_rx_int_en.u64);
+       cvmx_write_csr(CVMX_GMXX_TX_INT_EN(interface), gmx_tx_int_en.u64);
+       cvmx_write_csr(CVMX_PCSXX_INT_EN_REG(interface), pcsx_int_en_reg.u64);
+
+       cvmx_helper_link_autoconf(cvmx_helper_get_ipd_port(interface, 0));
+
+       /* (8) Enable packet reception */
+       xauiMiscCtl.s.gmxeno = 0;
+       cvmx_write_csr(CVMX_PCSXX_MISC_CTL_REG(interface), xauiMiscCtl.u64);
+
+       gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(0, interface));
+       gmx_cfg.s.en = 1;
+       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(0, interface), gmx_cfg.u64);
+
+       __cvmx_interrupt_pcsx_intx_en_reg_enable(0, interface);
+       __cvmx_interrupt_pcsx_intx_en_reg_enable(1, interface);
+       __cvmx_interrupt_pcsx_intx_en_reg_enable(2, interface);
+       __cvmx_interrupt_pcsx_intx_en_reg_enable(3, interface);
+       __cvmx_interrupt_pcsxx_int_en_reg_enable(interface);
+       __cvmx_interrupt_gmxx_enable(interface);
+
+       return 0;
+}
+
+/**
+ * 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().
+ *
+ * @ipd_port: IPD/PKO port to query
+ *
+ * Returns Link state
+ */
+cvmx_helper_link_info_t __cvmx_helper_xaui_link_get(int ipd_port)
+{
+       int interface = cvmx_helper_get_interface_num(ipd_port);
+       union cvmx_gmxx_tx_xaui_ctl gmxx_tx_xaui_ctl;
+       union cvmx_gmxx_rx_xaui_ctl gmxx_rx_xaui_ctl;
+       union cvmx_pcsxx_status1_reg pcsxx_status1_reg;
+       cvmx_helper_link_info_t result;
+
+       gmxx_tx_xaui_ctl.u64 = cvmx_read_csr(CVMX_GMXX_TX_XAUI_CTL(interface));
+       gmxx_rx_xaui_ctl.u64 = cvmx_read_csr(CVMX_GMXX_RX_XAUI_CTL(interface));
+       pcsxx_status1_reg.u64 =
+           cvmx_read_csr(CVMX_PCSXX_STATUS1_REG(interface));
+       result.u64 = 0;
+
+       /* Only return a link if both RX and TX are happy */
+       if ((gmxx_tx_xaui_ctl.s.ls == 0) && (gmxx_rx_xaui_ctl.s.status == 0) &&
+           (pcsxx_status1_reg.s.rcv_lnk == 1)) {
+               result.s.link_up = 1;
+               result.s.full_duplex = 1;
+               result.s.speed = 10000;
+       } else {
+               /* Disable GMX and PCSX interrupts. */
+               cvmx_write_csr(CVMX_GMXX_RXX_INT_EN(0, interface), 0x0);
+               cvmx_write_csr(CVMX_GMXX_TX_INT_EN(interface), 0x0);
+               cvmx_write_csr(CVMX_PCSXX_INT_EN_REG(interface), 0x0);
+       }
+       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.
+ *
+ * @ipd_port:  IPD/PKO port to configure
+ * @link_info: The new link state
+ *
+ * Returns Zero on success, negative on failure
+ */
+int __cvmx_helper_xaui_link_set(int ipd_port, cvmx_helper_link_info_t link_info)
+{
+       int interface = cvmx_helper_get_interface_num(ipd_port);
+       union cvmx_gmxx_tx_xaui_ctl gmxx_tx_xaui_ctl;
+       union cvmx_gmxx_rx_xaui_ctl gmxx_rx_xaui_ctl;
+
+       gmxx_tx_xaui_ctl.u64 = cvmx_read_csr(CVMX_GMXX_TX_XAUI_CTL(interface));
+       gmxx_rx_xaui_ctl.u64 = cvmx_read_csr(CVMX_GMXX_RX_XAUI_CTL(interface));
+
+       /* If the link shouldn't be up, then just return */
+       if (!link_info.s.link_up)
+               return 0;
+
+       /* Do nothing if both RX and TX are happy */
+       if ((gmxx_tx_xaui_ctl.s.ls == 0) && (gmxx_rx_xaui_ctl.s.status == 0))
+               return 0;
+
+       /* Bring the link up */
+       return __cvmx_helper_xaui_enable(interface);
+}
+
+/**
+ * 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.
+ *
+ * @ipd_port: IPD/PKO port to loopback.
+ * @enable_internal:
+ *                 Non zero if you want internal loopback
+ * @enable_external:
+ *                 Non zero if you want external loopback
+ *
+ * Returns Zero on success, negative on failure.
+ */
+extern int __cvmx_helper_xaui_configure_loopback(int ipd_port,
+                                                int enable_internal,
+                                                int enable_external)
+{
+       int interface = cvmx_helper_get_interface_num(ipd_port);
+       union cvmx_pcsxx_control1_reg pcsxx_control1_reg;
+       union cvmx_gmxx_xaui_ext_loopback gmxx_xaui_ext_loopback;
+
+       /* Set the internal loop */
+       pcsxx_control1_reg.u64 =
+           cvmx_read_csr(CVMX_PCSXX_CONTROL1_REG(interface));
+       pcsxx_control1_reg.s.loopbck1 = enable_internal;
+       cvmx_write_csr(CVMX_PCSXX_CONTROL1_REG(interface),
+                      pcsxx_control1_reg.u64);
+
+       /* Set the external loop */
+       gmxx_xaui_ext_loopback.u64 =
+           cvmx_read_csr(CVMX_GMXX_XAUI_EXT_LOOPBACK(interface));
+       gmxx_xaui_ext_loopback.s.en = enable_external;
+       cvmx_write_csr(CVMX_GMXX_XAUI_EXT_LOOPBACK(interface),
+                      gmxx_xaui_ext_loopback.u64);
+
+       /* Take the link through a reset */
+       return __cvmx_helper_xaui_enable(interface);
+}
diff --git a/arch/mips/cavium-octeon/executive/cvmx-helper.c b/arch/mips/cavium-octeon/executive/cvmx-helper.c
new file mode 100644 (file)
index 0000000..fa49638
--- /dev/null
@@ -0,0 +1,1116 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ *
+ * Helper functions for common, but complicated tasks.
+ *
+ */
+#include <asm/octeon/octeon.h>
+
+#include <asm/octeon/cvmx-config.h>
+
+#include <asm/octeon/cvmx-fpa.h>
+#include <asm/octeon/cvmx-pip.h>
+#include <asm/octeon/cvmx-pko.h>
+#include <asm/octeon/cvmx-ipd.h>
+#include <asm/octeon/cvmx-spi.h>
+#include <asm/octeon/cvmx-helper.h>
+#include <asm/octeon/cvmx-helper-board.h>
+
+#include <asm/octeon/cvmx-pip-defs.h>
+#include <asm/octeon/cvmx-smix-defs.h>
+#include <asm/octeon/cvmx-asxx-defs.h>
+
+/**
+ * cvmx_override_pko_queue_priority(int ipd_port, uint64_t
+ * 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 pko_port,
+                                         uint64_t priorities[16]);
+
+/**
+ * cvmx_override_ipd_port_setup(int ipd_port) is a function
+ * pointer. It is meant to allow customization of the IPD port
+ * 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);
+
+/* Port count per interface */
+static int interface_port_count[4] = { 0, 0, 0, 0 };
+
+/* Port last configured link info index by IPD/PKO port */
+static cvmx_helper_link_info_t
+    port_link_info[CVMX_PIP_NUM_INPUT_PORTS];
+
+/**
+ * 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.
+ *
+ * Returns Number of interfaces on chip
+ */
+int cvmx_helper_get_number_of_interfaces(void)
+{
+       if (OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN52XX))
+               return 4;
+       else
+               return 3;
+}
+
+/**
+ * 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.
+ *
+ * @interface: Interface to get the port count for
+ *
+ * Returns Number of ports on interface. Can be Zero.
+ */
+int cvmx_helper_ports_on_interface(int interface)
+{
+       return interface_port_count[interface];
+}
+
+/**
+ * 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.
+ *
+ * @interface: Interface to probe
+ *
+ * Returns Mode of the interface. Unknown or unsupported interfaces return
+ *         DISABLED.
+ */
+cvmx_helper_interface_mode_t cvmx_helper_interface_get_mode(int interface)
+{
+       union cvmx_gmxx_inf_mode mode;
+       if (interface == 2)
+               return CVMX_HELPER_INTERFACE_MODE_NPI;
+
+       if (interface == 3) {
+               if (OCTEON_IS_MODEL(OCTEON_CN56XX)
+                   || OCTEON_IS_MODEL(OCTEON_CN52XX))
+                       return CVMX_HELPER_INTERFACE_MODE_LOOP;
+               else
+                       return CVMX_HELPER_INTERFACE_MODE_DISABLED;
+       }
+
+       if (interface == 0
+           && cvmx_sysinfo_get()->board_type == CVMX_BOARD_TYPE_CN3005_EVB_HS5
+           && cvmx_sysinfo_get()->board_rev_major == 1) {
+               /*
+                * Lie about interface type of CN3005 board.  This
+                * board has a switch on port 1 like the other
+                * evaluation boards, but it is connected over RGMII
+                * instead of GMII.  Report GMII mode so that the
+                * speed is forced to 1 Gbit full duplex.  Other than
+                * some initial configuration (which does not use the
+                * output of this function) there is no difference in
+                * setup between GMII and RGMII modes.
+                */
+               return CVMX_HELPER_INTERFACE_MODE_GMII;
+       }
+
+       /* Interface 1 is always disabled on CN31XX and CN30XX */
+       if ((interface == 1)
+           && (OCTEON_IS_MODEL(OCTEON_CN31XX) || OCTEON_IS_MODEL(OCTEON_CN30XX)
+               || OCTEON_IS_MODEL(OCTEON_CN50XX)
+               || OCTEON_IS_MODEL(OCTEON_CN52XX)))
+               return CVMX_HELPER_INTERFACE_MODE_DISABLED;
+
+       mode.u64 = cvmx_read_csr(CVMX_GMXX_INF_MODE(interface));
+
+       if (OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN52XX)) {
+               switch (mode.cn56xx.mode) {
+               case 0:
+                       return CVMX_HELPER_INTERFACE_MODE_DISABLED;
+               case 1:
+                       return CVMX_HELPER_INTERFACE_MODE_XAUI;
+               case 2:
+                       return CVMX_HELPER_INTERFACE_MODE_SGMII;
+               case 3:
+                       return CVMX_HELPER_INTERFACE_MODE_PICMG;
+               default:
+                       return CVMX_HELPER_INTERFACE_MODE_DISABLED;
+               }
+       } else {
+               if (!mode.s.en)
+                       return CVMX_HELPER_INTERFACE_MODE_DISABLED;
+
+               if (mode.s.type) {
+                       if (OCTEON_IS_MODEL(OCTEON_CN38XX)
+                           || OCTEON_IS_MODEL(OCTEON_CN58XX))
+                               return CVMX_HELPER_INTERFACE_MODE_SPI;
+                       else
+                               return CVMX_HELPER_INTERFACE_MODE_GMII;
+               } else
+                       return CVMX_HELPER_INTERFACE_MODE_RGMII;
+       }
+}
+
+/**
+ * Configure the IPD/PIP tagging and QoS options for a specific
+ * port. This function determines the POW work queue entry
+ * contents for a port. The setup performed here is controlled by
+ * the defines in executive-config.h.
+ *
+ * @ipd_port: Port to configure. This follows the IPD numbering, not the
+ *                 per interface numbering
+ *
+ * Returns Zero on success, negative on failure
+ */
+static int __cvmx_helper_port_setup_ipd(int ipd_port)
+{
+       union cvmx_pip_prt_cfgx port_config;
+       union cvmx_pip_prt_tagx tag_config;
+
+       port_config.u64 = cvmx_read_csr(CVMX_PIP_PRT_CFGX(ipd_port));
+       tag_config.u64 = cvmx_read_csr(CVMX_PIP_PRT_TAGX(ipd_port));
+
+       /* Have each port go to a different POW queue */
+       port_config.s.qos = ipd_port & 0x7;
+
+       /* Process the headers and place the IP header in the work queue */
+       port_config.s.mode = CVMX_HELPER_INPUT_PORT_SKIP_MODE;
+
+       tag_config.s.ip6_src_flag = CVMX_HELPER_INPUT_TAG_IPV6_SRC_IP;
+       tag_config.s.ip6_dst_flag = CVMX_HELPER_INPUT_TAG_IPV6_DST_IP;
+       tag_config.s.ip6_sprt_flag = CVMX_HELPER_INPUT_TAG_IPV6_SRC_PORT;
+       tag_config.s.ip6_dprt_flag = CVMX_HELPER_INPUT_TAG_IPV6_DST_PORT;
+       tag_config.s.ip6_nxth_flag = CVMX_HELPER_INPUT_TAG_IPV6_NEXT_HEADER;
+       tag_config.s.ip4_src_flag = CVMX_HELPER_INPUT_TAG_IPV4_SRC_IP;
+       tag_config.s.ip4_dst_flag = CVMX_HELPER_INPUT_TAG_IPV4_DST_IP;
+       tag_config.s.ip4_sprt_flag = CVMX_HELPER_INPUT_TAG_IPV4_SRC_PORT;
+       tag_config.s.ip4_dprt_flag = CVMX_HELPER_INPUT_TAG_IPV4_DST_PORT;
+       tag_config.s.ip4_pctl_flag = CVMX_HELPER_INPUT_TAG_IPV4_PROTOCOL;
+       tag_config.s.inc_prt_flag = CVMX_HELPER_INPUT_TAG_INPUT_PORT;
+       tag_config.s.tcp6_tag_type = CVMX_HELPER_INPUT_TAG_TYPE;
+       tag_config.s.tcp4_tag_type = CVMX_HELPER_INPUT_TAG_TYPE;
+       tag_config.s.ip6_tag_type = CVMX_HELPER_INPUT_TAG_TYPE;
+       tag_config.s.ip4_tag_type = CVMX_HELPER_INPUT_TAG_TYPE;
+       tag_config.s.non_tag_type = CVMX_HELPER_INPUT_TAG_TYPE;
+       /* Put all packets in group 0. Other groups can be used by the app */
+       tag_config.s.grp = 0;
+
+       cvmx_pip_config_port(ipd_port, port_config, tag_config);
+
+       /* Give the user a chance to override our setting for each port */
+       if (cvmx_override_ipd_port_setup)
+               cvmx_override_ipd_port_setup(ipd_port);
+
+       return 0;
+}
+
+/**
+ * This function sets the interface_port_count[interface] correctly,
+ * without modifying any hardware configuration.  Hardware setup of
+ * the ports will be performed later.
+ *
+ * @interface: Interface to probe
+ *
+ * Returns Zero on success, negative on failure
+ */
+int cvmx_helper_interface_enumerate(int interface)
+{
+       switch (cvmx_helper_interface_get_mode(interface)) {
+               /* These types don't support ports to IPD/PKO */
+       case CVMX_HELPER_INTERFACE_MODE_DISABLED:
+       case CVMX_HELPER_INTERFACE_MODE_PCIE:
+               interface_port_count[interface] = 0;
+               break;
+               /* XAUI is a single high speed port */
+       case CVMX_HELPER_INTERFACE_MODE_XAUI:
+               interface_port_count[interface] =
+                   __cvmx_helper_xaui_enumerate(interface);
+               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:
+               interface_port_count[interface] =
+                   __cvmx_helper_rgmii_enumerate(interface);
+               break;
+               /*
+                * SPI4 can have 1-16 ports depending on the device at
+                * the other end.
+                */
+       case CVMX_HELPER_INTERFACE_MODE_SPI:
+               interface_port_count[interface] =
+                   __cvmx_helper_spi_enumerate(interface);
+               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_PICMG:
+               interface_port_count[interface] =
+                   __cvmx_helper_sgmii_enumerate(interface);
+               break;
+               /* PCI target Network Packet Interface */
+       case CVMX_HELPER_INTERFACE_MODE_NPI:
+               interface_port_count[interface] =
+                   __cvmx_helper_npi_enumerate(interface);
+               break;
+               /*
+                * Special loopback only ports. These are not the same
+                * as other ports in loopback mode.
+                */
+       case CVMX_HELPER_INTERFACE_MODE_LOOP:
+               interface_port_count[interface] =
+                   __cvmx_helper_loop_enumerate(interface);
+               break;
+       }
+
+       interface_port_count[interface] =
+           __cvmx_helper_board_interface_probe(interface,
+                                               interface_port_count
+                                               [interface]);
+
+       /* Make sure all global variables propagate to other cores */
+       CVMX_SYNCWS;
+
+       return 0;
+}
+
+/**
+ * This function probes an interface to determine the actual
+ * number of hardware ports connected to it. It doesn't setup the
+ * ports or enable them. The main goal here is to set the global
+ * interface_port_count[interface] correctly. Hardware setup of the
+ * ports will be performed later.
+ *
+ * @interface: Interface to probe
+ *
+ * Returns Zero on success, negative on failure
+ */
+int cvmx_helper_interface_probe(int interface)
+{
+       cvmx_helper_interface_enumerate(interface);
+       /* 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 */
+       switch (cvmx_helper_interface_get_mode(interface)) {
+               /* These types don't support ports to IPD/PKO */
+       case CVMX_HELPER_INTERFACE_MODE_DISABLED:
+       case CVMX_HELPER_INTERFACE_MODE_PCIE:
+               break;
+               /* XAUI is a single high speed port */
+       case CVMX_HELPER_INTERFACE_MODE_XAUI:
+               __cvmx_helper_xaui_probe(interface);
+               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:
+               __cvmx_helper_rgmii_probe(interface);
+               break;
+               /*
+                * SPI4 can have 1-16 ports depending on the device at
+                * the other end.
+                */
+       case CVMX_HELPER_INTERFACE_MODE_SPI:
+               __cvmx_helper_spi_probe(interface);
+               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_PICMG:
+               __cvmx_helper_sgmii_probe(interface);
+               break;
+               /* PCI target Network Packet Interface */
+       case CVMX_HELPER_INTERFACE_MODE_NPI:
+               __cvmx_helper_npi_probe(interface);
+               break;
+               /*
+                * Special loopback only ports. These are not the same
+                * as other ports in loopback mode.
+                */
+       case CVMX_HELPER_INTERFACE_MODE_LOOP:
+               __cvmx_helper_loop_probe(interface);
+               break;
+       }
+
+       /* Make sure all global variables propagate to other cores */
+       CVMX_SYNCWS;
+
+       return 0;
+}
+
+/**
+ * Setup the IPD/PIP for the ports on an interface. Packet
+ * classification and tagging are set for every port on the
+ * interface. The number of ports on the interface must already
+ * have been probed.
+ *
+ * @interface: Interface to setup IPD/PIP for
+ *
+ * Returns Zero on success, negative on failure
+ */
+static int __cvmx_helper_interface_setup_ipd(int interface)
+{
+       int ipd_port = cvmx_helper_get_ipd_port(interface, 0);
+       int num_ports = interface_port_count[interface];
+
+       while (num_ports--) {
+               __cvmx_helper_port_setup_ipd(ipd_port);
+               ipd_port++;
+       }
+       return 0;
+}
+
+/**
+ * Setup global setting for IPD/PIP not related to a specific
+ * interface or port. This must be called before IPD is enabled.
+ *
+ * Returns Zero on success, negative on failure.
+ */
+static int __cvmx_helper_global_setup_ipd(void)
+{
+       /* Setup the global packet input options */
+       cvmx_ipd_config(CVMX_FPA_PACKET_POOL_SIZE / 8,
+                       CVMX_HELPER_FIRST_MBUFF_SKIP / 8,
+                       CVMX_HELPER_NOT_FIRST_MBUFF_SKIP / 8,
+                       /* The +8 is to account for the next ptr */
+                       (CVMX_HELPER_FIRST_MBUFF_SKIP + 8) / 128,
+                       /* The +8 is to account for the next ptr */
+                       (CVMX_HELPER_NOT_FIRST_MBUFF_SKIP + 8) / 128,
+                       CVMX_FPA_WQE_POOL,
+                       CVMX_IPD_OPC_MODE_STT,
+                       CVMX_HELPER_ENABLE_BACK_PRESSURE);
+       return 0;
+}
+
+/**
+ * Setup the PKO for the ports on an interface. The number of
+ * queues per port and the priority of each PKO output queue
+ * is set here. PKO must be disabled when this function is called.
+ *
+ * @interface: Interface to setup PKO for
+ *
+ * Returns Zero on success, negative on failure
+ */
+static int __cvmx_helper_interface_setup_pko(int interface)
+{
+       /*
+        * Each packet output queue has an associated priority. The
+        * higher the priority, the more often it can send a packet. A
+        * priority of 8 means it can send in all 8 rounds of
+        * contention. We're going to make each queue one less than
+        * the last.  The vector of priorities has been extended to
+        * support CN5xxx CPUs, where up to 16 queues can be
+        * associated to a port.  To keep backward compatibility we
+        * don't change the initial 8 priorities and replicate them in
+        * the second half.  With per-core PKO queues (PKO lockless
+        * operation) all queues have the same priority.
+        */
+       uint64_t priorities[16] =
+           { 8, 7, 6, 5, 4, 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, 1 };
+
+       /*
+        * Setup the IPD/PIP and PKO for the ports discovered
+        * above. Here packet classification, tagging and output
+        * priorities are set.
+        */
+       int ipd_port = cvmx_helper_get_ipd_port(interface, 0);
+       int num_ports = interface_port_count[interface];
+       while (num_ports--) {
+               /*
+                * Give the user a chance to override the per queue
+                * priorities.
+                */
+               if (cvmx_override_pko_queue_priority)
+                       cvmx_override_pko_queue_priority(ipd_port, priorities);
+
+               cvmx_pko_config_port(ipd_port,
+                                    cvmx_pko_get_base_queue_per_core(ipd_port,
+                                                                     0),
+                                    cvmx_pko_get_num_queues(ipd_port),
+                                    priorities);
+               ipd_port++;
+       }
+       return 0;
+}
+
+/**
+ * Setup global setting for PKO not related to a specific
+ * interface or port. This must be called before PKO is enabled.
+ *
+ * Returns Zero on success, negative on failure.
+ */
+static int __cvmx_helper_global_setup_pko(void)
+{
+       /*
+        * Disable tagwait FAU timeout. This needs to be done before
+        * anyone might start packet output using tags.
+        */
+       union cvmx_iob_fau_timeout fau_to;
+       fau_to.u64 = 0;
+       fau_to.s.tout_val = 0xfff;
+       fau_to.s.tout_enb = 0;
+       cvmx_write_csr(CVMX_IOB_FAU_TIMEOUT, fau_to.u64);
+       return 0;
+}
+
+/**
+ * Setup global backpressure setting.
+ *
+ * Returns Zero on success, negative on failure
+ */
+static int __cvmx_helper_global_setup_backpressure(void)
+{
+#if CVMX_HELPER_DISABLE_RGMII_BACKPRESSURE
+       /* Disable backpressure if configured to do so */
+       /* Disable backpressure (pause frame) generation */
+       int num_interfaces = cvmx_helper_get_number_of_interfaces();
+       int interface;
+       for (interface = 0; interface < num_interfaces; 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_NPI:
+               case CVMX_HELPER_INTERFACE_MODE_LOOP:
+               case CVMX_HELPER_INTERFACE_MODE_XAUI:
+                       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_PICMG:
+                       cvmx_gmx_set_backpressure_override(interface, 0xf);
+                       break;
+               }
+       }
+#endif
+
+       return 0;
+}
+
+/**
+ * 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.
+ *
+ * @interface: Interface to enable
+ *
+ * Returns Zero on success, negative on failure
+ */
+static int __cvmx_helper_packet_hardware_enable(int interface)
+{
+       int result = 0;
+       switch (cvmx_helper_interface_get_mode(interface)) {
+               /* These types don't support ports to IPD/PKO */
+       case CVMX_HELPER_INTERFACE_MODE_DISABLED:
+       case CVMX_HELPER_INTERFACE_MODE_PCIE:
+               /* Nothing to do */
+               break;
+               /* XAUI is a single high speed port */
+       case CVMX_HELPER_INTERFACE_MODE_XAUI:
+               result = __cvmx_helper_xaui_enable(interface);
+               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:
+               result = __cvmx_helper_rgmii_enable(interface);
+               break;
+               /*
+                * SPI4 can have 1-16 ports depending on the device at
+                * the other end
+                */
+       case CVMX_HELPER_INTERFACE_MODE_SPI:
+               result = __cvmx_helper_spi_enable(interface);
+               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_PICMG:
+               result = __cvmx_helper_sgmii_enable(interface);
+               break;
+               /* PCI target Network Packet Interface */
+       case CVMX_HELPER_INTERFACE_MODE_NPI:
+               result = __cvmx_helper_npi_enable(interface);
+               break;
+               /*
+                * Special loopback only ports. These are not the same
+                * as other ports in loopback mode
+                */
+       case CVMX_HELPER_INTERFACE_MODE_LOOP:
+               result = __cvmx_helper_loop_enable(interface);
+               break;
+       }
+       result |= __cvmx_helper_board_hardware_enable(interface);
+       return result;
+}
+
+/**
+ * Function to adjust internal IPD pointer alignments
+ *
+ * Returns 0 on success
+ *         !0 on failure
+ */
+int __cvmx_helper_errata_fix_ipd_ptr_alignment(void)
+{
+#define FIX_IPD_FIRST_BUFF_PAYLOAD_BYTES \
+     (CVMX_FPA_PACKET_POOL_SIZE-8-CVMX_HELPER_FIRST_MBUFF_SKIP)
+#define FIX_IPD_NON_FIRST_BUFF_PAYLOAD_BYTES \
+       (CVMX_FPA_PACKET_POOL_SIZE-8-CVMX_HELPER_NOT_FIRST_MBUFF_SKIP)
+#define FIX_IPD_OUTPORT 0
+       /* Ports 0-15 are interface 0, 16-31 are interface 1 */
+#define INTERFACE(port) (port >> 4)
+#define INDEX(port) (port & 0xf)
+       uint64_t *p64;
+       cvmx_pko_command_word0_t pko_command;
+       union cvmx_buf_ptr g_buffer, pkt_buffer;
+       cvmx_wqe_t *work;
+       int size, num_segs = 0, wqe_pcnt, pkt_pcnt;
+       union cvmx_gmxx_prtx_cfg gmx_cfg;
+       int retry_cnt;
+       int retry_loop_cnt;
+       int i;
+       cvmx_helper_link_info_t link_info;
+
+       /* Save values for restore at end */
+       uint64_t prtx_cfg =
+           cvmx_read_csr(CVMX_GMXX_PRTX_CFG
+                         (INDEX(FIX_IPD_OUTPORT), INTERFACE(FIX_IPD_OUTPORT)));
+       uint64_t tx_ptr_en =
+           cvmx_read_csr(CVMX_ASXX_TX_PRT_EN(INTERFACE(FIX_IPD_OUTPORT)));
+       uint64_t rx_ptr_en =
+           cvmx_read_csr(CVMX_ASXX_RX_PRT_EN(INTERFACE(FIX_IPD_OUTPORT)));
+       uint64_t rxx_jabber =
+           cvmx_read_csr(CVMX_GMXX_RXX_JABBER
+                         (INDEX(FIX_IPD_OUTPORT), INTERFACE(FIX_IPD_OUTPORT)));
+       uint64_t frame_max =
+           cvmx_read_csr(CVMX_GMXX_RXX_FRM_MAX
+                         (INDEX(FIX_IPD_OUTPORT), INTERFACE(FIX_IPD_OUTPORT)));
+
+       /* Configure port to gig FDX as required for loopback mode */
+       cvmx_helper_rgmii_internal_loopback(FIX_IPD_OUTPORT);
+
+       /*
+        * Disable reception on all ports so if traffic is present it
+        * will not interfere.
+        */
+       cvmx_write_csr(CVMX_ASXX_RX_PRT_EN(INTERFACE(FIX_IPD_OUTPORT)), 0);
+
+       cvmx_wait(100000000ull);
+
+       for (retry_loop_cnt = 0; retry_loop_cnt < 10; retry_loop_cnt++) {
+               retry_cnt = 100000;
+               wqe_pcnt = cvmx_read_csr(CVMX_IPD_PTR_COUNT);
+               pkt_pcnt = (wqe_pcnt >> 7) & 0x7f;
+               wqe_pcnt &= 0x7f;
+
+               num_segs = (2 + pkt_pcnt - wqe_pcnt) & 3;
+
+               if (num_segs == 0)
+                       goto fix_ipd_exit;
+
+               num_segs += 1;
+
+               size =
+                   FIX_IPD_FIRST_BUFF_PAYLOAD_BYTES +
+                   ((num_segs - 1) * FIX_IPD_NON_FIRST_BUFF_PAYLOAD_BYTES) -
+                   (FIX_IPD_NON_FIRST_BUFF_PAYLOAD_BYTES / 2);
+
+               cvmx_write_csr(CVMX_ASXX_PRT_LOOP(INTERFACE(FIX_IPD_OUTPORT)),
+                              1 << INDEX(FIX_IPD_OUTPORT));
+               CVMX_SYNC;
+
+               g_buffer.u64 = 0;
+               g_buffer.s.addr =
+                   cvmx_ptr_to_phys(cvmx_fpa_alloc(CVMX_FPA_WQE_POOL));
+               if (g_buffer.s.addr == 0) {
+                       cvmx_dprintf("WARNING: FIX_IPD_PTR_ALIGNMENT "
+                                    "buffer allocation failure.\n");
+                       goto fix_ipd_exit;
+               }
+
+               g_buffer.s.pool = CVMX_FPA_WQE_POOL;
+               g_buffer.s.size = num_segs;
+
+               pkt_buffer.u64 = 0;
+               pkt_buffer.s.addr =
+                   cvmx_ptr_to_phys(cvmx_fpa_alloc(CVMX_FPA_PACKET_POOL));
+               if (pkt_buffer.s.addr == 0) {
+                       cvmx_dprintf("WARNING: FIX_IPD_PTR_ALIGNMENT "
+                                    "buffer allocation failure.\n");
+                       goto fix_ipd_exit;
+               }
+               pkt_buffer.s.i = 1;
+               pkt_buffer.s.pool = CVMX_FPA_PACKET_POOL;
+               pkt_buffer.s.size = FIX_IPD_FIRST_BUFF_PAYLOAD_BYTES;
+
+               p64 = (uint64_t *) cvmx_phys_to_ptr(pkt_buffer.s.addr);
+               p64[0] = 0xffffffffffff0000ull;
+               p64[1] = 0x08004510ull;
+               p64[2] = ((uint64_t) (size - 14) << 48) | 0x5ae740004000ull;
+               p64[3] = 0x3a5fc0a81073c0a8ull;
+
+               for (i = 0; i < num_segs; i++) {
+                       if (i > 0)
+                               pkt_buffer.s.size =
+                                   FIX_IPD_NON_FIRST_BUFF_PAYLOAD_BYTES;
+
+                       if (i == (num_segs - 1))
+                               pkt_buffer.s.i = 0;
+
+                       *(uint64_t *) cvmx_phys_to_ptr(g_buffer.s.addr +
+                                                      8 * i) = pkt_buffer.u64;
+               }
+
+               /* Build the PKO command */
+               pko_command.u64 = 0;
+               pko_command.s.segs = num_segs;
+               pko_command.s.total_bytes = size;
+               pko_command.s.dontfree = 0;
+               pko_command.s.gather = 1;
+
+               gmx_cfg.u64 =
+                   cvmx_read_csr(CVMX_GMXX_PRTX_CFG
+                                 (INDEX(FIX_IPD_OUTPORT),
+                                  INTERFACE(FIX_IPD_OUTPORT)));
+               gmx_cfg.s.en = 1;
+               cvmx_write_csr(CVMX_GMXX_PRTX_CFG
+                              (INDEX(FIX_IPD_OUTPORT),
+                               INTERFACE(FIX_IPD_OUTPORT)), gmx_cfg.u64);
+               cvmx_write_csr(CVMX_ASXX_TX_PRT_EN(INTERFACE(FIX_IPD_OUTPORT)),
+                              1 << INDEX(FIX_IPD_OUTPORT));
+               cvmx_write_csr(CVMX_ASXX_RX_PRT_EN(INTERFACE(FIX_IPD_OUTPORT)),
+                              1 << INDEX(FIX_IPD_OUTPORT));
+
+               cvmx_write_csr(CVMX_GMXX_RXX_JABBER
+                              (INDEX(FIX_IPD_OUTPORT),
+                               INTERFACE(FIX_IPD_OUTPORT)), 65392 - 14 - 4);
+               cvmx_write_csr(CVMX_GMXX_RXX_FRM_MAX
+                              (INDEX(FIX_IPD_OUTPORT),
+                               INTERFACE(FIX_IPD_OUTPORT)), 65392 - 14 - 4);
+
+               cvmx_pko_send_packet_prepare(FIX_IPD_OUTPORT,
+                                            cvmx_pko_get_base_queue
+                                            (FIX_IPD_OUTPORT),
+                                            CVMX_PKO_LOCK_CMD_QUEUE);
+               cvmx_pko_send_packet_finish(FIX_IPD_OUTPORT,
+                                           cvmx_pko_get_base_queue
+                                           (FIX_IPD_OUTPORT), pko_command,
+                                           g_buffer, CVMX_PKO_LOCK_CMD_QUEUE);
+
+               CVMX_SYNC;
+
+               do {
+                       work = cvmx_pow_work_request_sync(CVMX_POW_WAIT);
+                       retry_cnt--;
+               } while ((work == NULL) && (retry_cnt > 0));
+
+               if (!retry_cnt)
+                       cvmx_dprintf("WARNING: FIX_IPD_PTR_ALIGNMENT "
+                                    "get_work() timeout occurred.\n");
+
+               /* Free packet */
+               if (work)
+                       cvmx_helper_free_packet_data(work);
+       }
+
+fix_ipd_exit:
+
+       /* Return CSR configs to saved values */
+       cvmx_write_csr(CVMX_GMXX_PRTX_CFG
+                      (INDEX(FIX_IPD_OUTPORT), INTERFACE(FIX_IPD_OUTPORT)),
+                      prtx_cfg);
+       cvmx_write_csr(CVMX_ASXX_TX_PRT_EN(INTERFACE(FIX_IPD_OUTPORT)),
+                      tx_ptr_en);
+       cvmx_write_csr(CVMX_ASXX_RX_PRT_EN(INTERFACE(FIX_IPD_OUTPORT)),
+                      rx_ptr_en);
+       cvmx_write_csr(CVMX_GMXX_RXX_JABBER
+                      (INDEX(FIX_IPD_OUTPORT), INTERFACE(FIX_IPD_OUTPORT)),
+                      rxx_jabber);
+       cvmx_write_csr(CVMX_GMXX_RXX_FRM_MAX
+                      (INDEX(FIX_IPD_OUTPORT), INTERFACE(FIX_IPD_OUTPORT)),
+                      frame_max);
+       cvmx_write_csr(CVMX_ASXX_PRT_LOOP(INTERFACE(FIX_IPD_OUTPORT)), 0);
+       /* Set link to down so autonegotiation will set it up again */
+       link_info.u64 = 0;
+       cvmx_helper_link_set(FIX_IPD_OUTPORT, link_info);
+
+       /*
+        * Bring the link back up as autonegotiation is not done in
+        * user applications.
+        */
+       cvmx_helper_link_autoconf(FIX_IPD_OUTPORT);
+
+       CVMX_SYNC;
+       if (num_segs)
+               cvmx_dprintf("WARNING: FIX_IPD_PTR_ALIGNMENT failed.\n");
+
+       return !!num_segs;
+
+}
+
+/**
+ * Called after all internal packet IO paths are setup. This
+ * function enables IPD/PIP and begins packet input and output.
+ *
+ * Returns Zero on success, negative on failure
+ */
+int cvmx_helper_ipd_and_packet_input_enable(void)
+{
+       int num_interfaces;
+       int interface;
+
+       /* 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++) {
+               if (cvmx_helper_ports_on_interface(interface) > 0)
+                       __cvmx_helper_packet_hardware_enable(interface);
+       }
+
+       /* Finally enable PKO now that the entire path is up and running */
+       cvmx_pko_enable();
+
+       if ((OCTEON_IS_MODEL(OCTEON_CN31XX_PASS1)
+            || OCTEON_IS_MODEL(OCTEON_CN30XX_PASS1))
+           && (cvmx_sysinfo_get()->board_type != CVMX_BOARD_TYPE_SIM))
+               __cvmx_helper_errata_fix_ipd_ptr_alignment();
+       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.
+ *
+ * Returns Zero on success, non-zero on failure
+ */
+int cvmx_helper_initialize_packet_io_global(void)
+{
+       int result = 0;
+       int interface;
+       union cvmx_l2c_cfg l2c_cfg;
+       union cvmx_smix_en smix_en;
+       const int num_interfaces = cvmx_helper_get_number_of_interfaces();
+
+       /*
+        * CN52XX pass 1: Due to a bug in 2nd order CDR, it needs to
+        * be disabled.
+        */
+       if (OCTEON_IS_MODEL(OCTEON_CN52XX_PASS1_0))
+               __cvmx_helper_errata_qlm_disable_2nd_order_cdr(1);
+
+       /*
+        * 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.
+        */
+       l2c_cfg.u64 = cvmx_read_csr(CVMX_L2C_CFG);
+       l2c_cfg.s.lrf_arb_mode = 0;
+       l2c_cfg.s.rfb_arb_mode = 0;
+       cvmx_write_csr(CVMX_L2C_CFG, l2c_cfg.u64);
+
+       /* Make sure SMI/MDIO is enabled so we can query PHYs */
+       smix_en.u64 = cvmx_read_csr(CVMX_SMIX_EN(0));
+       if (!smix_en.s.en) {
+               smix_en.s.en = 1;
+               cvmx_write_csr(CVMX_SMIX_EN(0), smix_en.u64);
+       }
+
+       /* Newer chips actually have two SMI/MDIO interfaces */
+       if (!OCTEON_IS_MODEL(OCTEON_CN3XXX) &&
+           !OCTEON_IS_MODEL(OCTEON_CN58XX) &&
+           !OCTEON_IS_MODEL(OCTEON_CN50XX)) {
+               smix_en.u64 = cvmx_read_csr(CVMX_SMIX_EN(1));
+               if (!smix_en.s.en) {
+                       smix_en.s.en = 1;
+                       cvmx_write_csr(CVMX_SMIX_EN(1), smix_en.u64);
+               }
+       }
+
+       cvmx_pko_initialize_global();
+       for (interface = 0; interface < num_interfaces; interface++) {
+               result |= cvmx_helper_interface_probe(interface);
+               if (cvmx_helper_ports_on_interface(interface) > 0)
+                       cvmx_dprintf("Interface %d has %d ports (%s)\n",
+                                    interface,
+                                    cvmx_helper_ports_on_interface(interface),
+                                    cvmx_helper_interface_mode_to_string
+                                    (cvmx_helper_interface_get_mode
+                                     (interface)));
+               result |= __cvmx_helper_interface_setup_ipd(interface);
+               result |= __cvmx_helper_interface_setup_pko(interface);
+       }
+
+       result |= __cvmx_helper_global_setup_ipd();
+       result |= __cvmx_helper_global_setup_pko();
+
+       /* Enable any flow control and backpressure */
+       result |= __cvmx_helper_global_setup_backpressure();
+
+#if CVMX_HELPER_ENABLE_IPD
+       result |= cvmx_helper_ipd_and_packet_input_enable();
+#endif
+       return result;
+}
+
+/**
+ * Does core local initialization for packet io
+ *
+ * Returns Zero on success, non-zero on failure
+ */
+int cvmx_helper_initialize_packet_io_local(void)
+{
+       return cvmx_pko_initialize_local();
+}
+
+/**
+ * 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));
+ *
+ * @ipd_port: IPD/PKO port to auto configure
+ *
+ * Returns Link state after configure
+ */
+cvmx_helper_link_info_t cvmx_helper_link_autoconf(int ipd_port)
+{
+       cvmx_helper_link_info_t link_info;
+       int interface = cvmx_helper_get_interface_num(ipd_port);
+       int index = cvmx_helper_get_interface_index_num(ipd_port);
+
+       if (index >= cvmx_helper_ports_on_interface(interface)) {
+               link_info.u64 = 0;
+               return link_info;
+       }
+
+       link_info = cvmx_helper_link_get(ipd_port);
+       if (link_info.u64 == port_link_info[ipd_port].u64)
+               return link_info;
+
+       /* If we fail to set the link speed, port_link_info will not change */
+       cvmx_helper_link_set(ipd_port, link_info);
+
+       /*
+        * port_link_info should be the current value, which will be
+        * different than expect if cvmx_helper_link_set() failed.
+        */
+       return port_link_info[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().
+ *
+ * @ipd_port: IPD/PKO port to query
+ *
+ * Returns Link state
+ */
+cvmx_helper_link_info_t cvmx_helper_link_get(int ipd_port)
+{
+       cvmx_helper_link_info_t result;
+       int interface = cvmx_helper_get_interface_num(ipd_port);
+       int index = cvmx_helper_get_interface_index_num(ipd_port);
+
+       /* The default result will be a down link unless the code below
+          changes it */
+       result.u64 = 0;
+
+       if (index >= cvmx_helper_ports_on_interface(interface))
+               return result;
+
+       switch (cvmx_helper_interface_get_mode(interface)) {
+       case CVMX_HELPER_INTERFACE_MODE_DISABLED:
+       case CVMX_HELPER_INTERFACE_MODE_PCIE:
+               /* Network links are not supported */
+               break;
+       case CVMX_HELPER_INTERFACE_MODE_XAUI:
+               result = __cvmx_helper_xaui_link_get(ipd_port);
+               break;
+       case CVMX_HELPER_INTERFACE_MODE_GMII:
+               if (index == 0)
+                       result = __cvmx_helper_rgmii_link_get(ipd_port);
+               else {
+                       result.s.full_duplex = 1;
+                       result.s.link_up = 1;
+                       result.s.speed = 1000;
+               }
+               break;
+       case CVMX_HELPER_INTERFACE_MODE_RGMII:
+               result = __cvmx_helper_rgmii_link_get(ipd_port);
+               break;
+       case CVMX_HELPER_INTERFACE_MODE_SPI:
+               result = __cvmx_helper_spi_link_get(ipd_port);
+               break;
+       case CVMX_HELPER_INTERFACE_MODE_SGMII:
+       case CVMX_HELPER_INTERFACE_MODE_PICMG:
+               result = __cvmx_helper_sgmii_link_get(ipd_port);
+               break;
+       case CVMX_HELPER_INTERFACE_MODE_NPI:
+       case CVMX_HELPER_INTERFACE_MODE_LOOP:
+               /* Network links are not supported */
+               break;
+       }
+       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.
+ *
+ * @ipd_port:  IPD/PKO port to configure
+ * @link_info: The new link state
+ *
+ * Returns Zero on success, negative on failure
+ */
+int cvmx_helper_link_set(int ipd_port, cvmx_helper_link_info_t link_info)
+{
+       int result = -1;
+       int interface = cvmx_helper_get_interface_num(ipd_port);
+       int index = cvmx_helper_get_interface_index_num(ipd_port);
+
+       if (index >= cvmx_helper_ports_on_interface(interface))
+               return -1;
+
+       switch (cvmx_helper_interface_get_mode(interface)) {
+       case CVMX_HELPER_INTERFACE_MODE_DISABLED:
+       case CVMX_HELPER_INTERFACE_MODE_PCIE:
+               break;
+       case CVMX_HELPER_INTERFACE_MODE_XAUI:
+               result = __cvmx_helper_xaui_link_set(ipd_port, link_info);
+               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:
+               result = __cvmx_helper_rgmii_link_set(ipd_port, link_info);
+               break;
+       case CVMX_HELPER_INTERFACE_MODE_SPI:
+               result = __cvmx_helper_spi_link_set(ipd_port, link_info);
+               break;
+       case CVMX_HELPER_INTERFACE_MODE_SGMII:
+       case CVMX_HELPER_INTERFACE_MODE_PICMG:
+               result = __cvmx_helper_sgmii_link_set(ipd_port, link_info);
+               break;
+       case CVMX_HELPER_INTERFACE_MODE_NPI:
+       case CVMX_HELPER_INTERFACE_MODE_LOOP:
+               break;
+       }
+       /* 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)
+               port_link_info[ipd_port].u64 = link_info.u64;
+       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.
+ *
+ * @ipd_port: IPD/PKO port to loopback.
+ * @enable_internal:
+ *                 Non zero if you want internal loopback
+ * @enable_external:
+ *                 Non zero if you want external loopback
+ *
+ * Returns Zero on success, negative on failure.
+ */
+int cvmx_helper_configure_loopback(int ipd_port, int enable_internal,
+                                  int enable_external)
+{
+       int result = -1;
+       int interface = cvmx_helper_get_interface_num(ipd_port);
+       int index = cvmx_helper_get_interface_index_num(ipd_port);
+
+       if (index >= cvmx_helper_ports_on_interface(interface))
+               return -1;
+
+       switch (cvmx_helper_interface_get_mode(interface)) {
+       case CVMX_HELPER_INTERFACE_MODE_DISABLED:
+       case CVMX_HELPER_INTERFACE_MODE_PCIE:
+       case CVMX_HELPER_INTERFACE_MODE_SPI:
+       case CVMX_HELPER_INTERFACE_MODE_NPI:
+       case CVMX_HELPER_INTERFACE_MODE_LOOP:
+               break;
+       case CVMX_HELPER_INTERFACE_MODE_XAUI:
+               result =
+                   __cvmx_helper_xaui_configure_loopback(ipd_port,
+                                                         enable_internal,
+                                                         enable_external);
+               break;
+       case CVMX_HELPER_INTERFACE_MODE_RGMII:
+       case CVMX_HELPER_INTERFACE_MODE_GMII:
+               result =
+                   __cvmx_helper_rgmii_configure_loopback(ipd_port,
+                                                          enable_internal,
+                                                          enable_external);
+               break;
+       case CVMX_HELPER_INTERFACE_MODE_SGMII:
+       case CVMX_HELPER_INTERFACE_MODE_PICMG:
+               result =
+                   __cvmx_helper_sgmii_configure_loopback(ipd_port,
+                                                          enable_internal,
+                                                          enable_external);
+               break;
+       }
+       return result;
+}
diff --git a/arch/mips/cavium-octeon/executive/cvmx-interrupt-decodes.c b/arch/mips/cavium-octeon/executive/cvmx-interrupt-decodes.c
new file mode 100644 (file)
index 0000000..e59d1b7
--- /dev/null
@@ -0,0 +1,371 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2009 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ *
+ * Automatically generated functions useful for enabling
+ * and decoding RSL_INT_BLOCKS interrupts.
+ *
+ */
+
+#include <asm/octeon/octeon.h>
+
+#include <asm/octeon/cvmx-gmxx-defs.h>
+#include <asm/octeon/cvmx-pcsx-defs.h>
+#include <asm/octeon/cvmx-pcsxx-defs.h>
+#include <asm/octeon/cvmx-spxx-defs.h>
+#include <asm/octeon/cvmx-stxx-defs.h>
+
+#ifndef PRINT_ERROR
+#define PRINT_ERROR(format, ...)
+#endif
+
+
+/**
+ * __cvmx_interrupt_gmxx_rxx_int_en_enable enables all interrupt bits in cvmx_gmxx_rxx_int_en_t
+ */
+void __cvmx_interrupt_gmxx_rxx_int_en_enable(int index, int block)
+{
+       union cvmx_gmxx_rxx_int_en gmx_rx_int_en;
+       cvmx_write_csr(CVMX_GMXX_RXX_INT_REG(index, block),
+                      cvmx_read_csr(CVMX_GMXX_RXX_INT_REG(index, block)));
+       gmx_rx_int_en.u64 = 0;
+       if (OCTEON_IS_MODEL(OCTEON_CN56XX)) {
+               /* Skipping gmx_rx_int_en.s.reserved_29_63 */
+               gmx_rx_int_en.s.hg2cc = 1;
+               gmx_rx_int_en.s.hg2fld = 1;
+               gmx_rx_int_en.s.undat = 1;
+               gmx_rx_int_en.s.uneop = 1;
+               gmx_rx_int_en.s.unsop = 1;
+               gmx_rx_int_en.s.bad_term = 1;
+               gmx_rx_int_en.s.bad_seq = 1;
+               gmx_rx_int_en.s.rem_fault = 1;
+               gmx_rx_int_en.s.loc_fault = 1;
+               gmx_rx_int_en.s.pause_drp = 1;
+               /* Skipping gmx_rx_int_en.s.reserved_16_18 */
+               /*gmx_rx_int_en.s.ifgerr = 1; */
+               /*gmx_rx_int_en.s.coldet = 1; // Collsion detect */
+               /*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
+               /*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
+               /*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
+               gmx_rx_int_en.s.ovrerr = 1;
+               /* Skipping gmx_rx_int_en.s.reserved_9_9 */
+               gmx_rx_int_en.s.skperr = 1;
+               gmx_rx_int_en.s.rcverr = 1;
+               /* Skipping gmx_rx_int_en.s.reserved_5_6 */
+               /*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
+               gmx_rx_int_en.s.jabber = 1;
+               /* Skipping gmx_rx_int_en.s.reserved_2_2 */
+               gmx_rx_int_en.s.carext = 1;
+               /* Skipping gmx_rx_int_en.s.reserved_0_0 */
+       }
+       if (OCTEON_IS_MODEL(OCTEON_CN30XX)) {
+               /* Skipping gmx_rx_int_en.s.reserved_19_63 */
+               /*gmx_rx_int_en.s.phy_dupx = 1; */
+               /*gmx_rx_int_en.s.phy_spd = 1; */
+               /*gmx_rx_int_en.s.phy_link = 1; */
+               /*gmx_rx_int_en.s.ifgerr = 1; */
+               /*gmx_rx_int_en.s.coldet = 1; // Collsion detect */
+               /*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
+               /*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
+               /*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
+               gmx_rx_int_en.s.ovrerr = 1;
+               gmx_rx_int_en.s.niberr = 1;
+               gmx_rx_int_en.s.skperr = 1;
+               gmx_rx_int_en.s.rcverr = 1;
+               /*gmx_rx_int_en.s.lenerr = 1; // Length errors are handled when we get work */
+               gmx_rx_int_en.s.alnerr = 1;
+               /*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
+               gmx_rx_int_en.s.jabber = 1;
+               gmx_rx_int_en.s.maxerr = 1;
+               gmx_rx_int_en.s.carext = 1;
+               gmx_rx_int_en.s.minerr = 1;
+       }
+       if (OCTEON_IS_MODEL(OCTEON_CN50XX)) {
+               /* Skipping gmx_rx_int_en.s.reserved_20_63 */
+               gmx_rx_int_en.s.pause_drp = 1;
+               /*gmx_rx_int_en.s.phy_dupx = 1; */
+               /*gmx_rx_int_en.s.phy_spd = 1; */
+               /*gmx_rx_int_en.s.phy_link = 1; */
+               /*gmx_rx_int_en.s.ifgerr = 1; */
+               /*gmx_rx_int_en.s.coldet = 1; // Collsion detect */
+               /*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
+               /*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
+               /*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
+               gmx_rx_int_en.s.ovrerr = 1;
+               gmx_rx_int_en.s.niberr = 1;
+               gmx_rx_int_en.s.skperr = 1;
+               gmx_rx_int_en.s.rcverr = 1;
+               /* Skipping gmx_rx_int_en.s.reserved_6_6 */
+               gmx_rx_int_en.s.alnerr = 1;
+               /*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
+               gmx_rx_int_en.s.jabber = 1;
+               /* Skipping gmx_rx_int_en.s.reserved_2_2 */
+               gmx_rx_int_en.s.carext = 1;
+               /* Skipping gmx_rx_int_en.s.reserved_0_0 */
+       }
+       if (OCTEON_IS_MODEL(OCTEON_CN38XX)) {
+               /* Skipping gmx_rx_int_en.s.reserved_19_63 */
+               /*gmx_rx_int_en.s.phy_dupx = 1; */
+               /*gmx_rx_int_en.s.phy_spd = 1; */
+               /*gmx_rx_int_en.s.phy_link = 1; */
+               /*gmx_rx_int_en.s.ifgerr = 1; */
+               /*gmx_rx_int_en.s.coldet = 1; // Collsion detect */
+               /*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
+               /*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
+               /*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
+               gmx_rx_int_en.s.ovrerr = 1;
+               gmx_rx_int_en.s.niberr = 1;
+               gmx_rx_int_en.s.skperr = 1;
+               gmx_rx_int_en.s.rcverr = 1;
+               /*gmx_rx_int_en.s.lenerr = 1; // Length errors are handled when we get work */
+               gmx_rx_int_en.s.alnerr = 1;
+               /*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
+               gmx_rx_int_en.s.jabber = 1;
+               gmx_rx_int_en.s.maxerr = 1;
+               gmx_rx_int_en.s.carext = 1;
+               gmx_rx_int_en.s.minerr = 1;
+       }
+       if (OCTEON_IS_MODEL(OCTEON_CN31XX)) {
+               /* Skipping gmx_rx_int_en.s.reserved_19_63 */
+               /*gmx_rx_int_en.s.phy_dupx = 1; */
+               /*gmx_rx_int_en.s.phy_spd = 1; */
+               /*gmx_rx_int_en.s.phy_link = 1; */
+               /*gmx_rx_int_en.s.ifgerr = 1; */
+               /*gmx_rx_int_en.s.coldet = 1; // Collsion detect */
+               /*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
+               /*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
+               /*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
+               gmx_rx_int_en.s.ovrerr = 1;
+               gmx_rx_int_en.s.niberr = 1;
+               gmx_rx_int_en.s.skperr = 1;
+               gmx_rx_int_en.s.rcverr = 1;
+               /*gmx_rx_int_en.s.lenerr = 1; // Length errors are handled when we get work */
+               gmx_rx_int_en.s.alnerr = 1;
+               /*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
+               gmx_rx_int_en.s.jabber = 1;
+               gmx_rx_int_en.s.maxerr = 1;
+               gmx_rx_int_en.s.carext = 1;
+               gmx_rx_int_en.s.minerr = 1;
+       }
+       if (OCTEON_IS_MODEL(OCTEON_CN58XX)) {
+               /* Skipping gmx_rx_int_en.s.reserved_20_63 */
+               gmx_rx_int_en.s.pause_drp = 1;
+               /*gmx_rx_int_en.s.phy_dupx = 1; */
+               /*gmx_rx_int_en.s.phy_spd = 1; */
+               /*gmx_rx_int_en.s.phy_link = 1; */
+               /*gmx_rx_int_en.s.ifgerr = 1; */
+               /*gmx_rx_int_en.s.coldet = 1; // Collsion detect */
+               /*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
+               /*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
+               /*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
+               gmx_rx_int_en.s.ovrerr = 1;
+               gmx_rx_int_en.s.niberr = 1;
+               gmx_rx_int_en.s.skperr = 1;
+               gmx_rx_int_en.s.rcverr = 1;
+               /*gmx_rx_int_en.s.lenerr = 1; // Length errors are handled when we get work */
+               gmx_rx_int_en.s.alnerr = 1;
+               /*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
+               gmx_rx_int_en.s.jabber = 1;
+               gmx_rx_int_en.s.maxerr = 1;
+               gmx_rx_int_en.s.carext = 1;
+               gmx_rx_int_en.s.minerr = 1;
+       }
+       if (OCTEON_IS_MODEL(OCTEON_CN52XX)) {
+               /* Skipping gmx_rx_int_en.s.reserved_29_63 */
+               gmx_rx_int_en.s.hg2cc = 1;
+               gmx_rx_int_en.s.hg2fld = 1;
+               gmx_rx_int_en.s.undat = 1;
+               gmx_rx_int_en.s.uneop = 1;
+               gmx_rx_int_en.s.unsop = 1;
+               gmx_rx_int_en.s.bad_term = 1;
+               gmx_rx_int_en.s.bad_seq = 0;
+               gmx_rx_int_en.s.rem_fault = 1;
+               gmx_rx_int_en.s.loc_fault = 0;
+               gmx_rx_int_en.s.pause_drp = 1;
+               /* Skipping gmx_rx_int_en.s.reserved_16_18 */
+               /*gmx_rx_int_en.s.ifgerr = 1; */
+               /*gmx_rx_int_en.s.coldet = 1; // Collsion detect */
+               /*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
+               /*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
+               /*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
+               gmx_rx_int_en.s.ovrerr = 1;
+               /* Skipping gmx_rx_int_en.s.reserved_9_9 */
+               gmx_rx_int_en.s.skperr = 1;
+               gmx_rx_int_en.s.rcverr = 1;
+               /* Skipping gmx_rx_int_en.s.reserved_5_6 */
+               /*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
+               gmx_rx_int_en.s.jabber = 1;
+               /* Skipping gmx_rx_int_en.s.reserved_2_2 */
+               gmx_rx_int_en.s.carext = 1;
+               /* Skipping gmx_rx_int_en.s.reserved_0_0 */
+       }
+       cvmx_write_csr(CVMX_GMXX_RXX_INT_EN(index, block), gmx_rx_int_en.u64);
+}
+/**
+ * __cvmx_interrupt_pcsx_intx_en_reg_enable enables all interrupt bits in cvmx_pcsx_intx_en_reg_t
+ */
+void __cvmx_interrupt_pcsx_intx_en_reg_enable(int index, int block)
+{
+       union cvmx_pcsx_intx_en_reg pcs_int_en_reg;
+       cvmx_write_csr(CVMX_PCSX_INTX_REG(index, block),
+                      cvmx_read_csr(CVMX_PCSX_INTX_REG(index, block)));
+       pcs_int_en_reg.u64 = 0;
+       if (OCTEON_IS_MODEL(OCTEON_CN56XX)) {
+               /* Skipping pcs_int_en_reg.s.reserved_12_63 */
+               /*pcs_int_en_reg.s.dup = 1; // This happens during normal operation */
+               pcs_int_en_reg.s.sync_bad_en = 1;
+               pcs_int_en_reg.s.an_bad_en = 1;
+               pcs_int_en_reg.s.rxlock_en = 1;
+               pcs_int_en_reg.s.rxbad_en = 1;
+               /*pcs_int_en_reg.s.rxerr_en = 1; // This happens during normal operation */
+               pcs_int_en_reg.s.txbad_en = 1;
+               pcs_int_en_reg.s.txfifo_en = 1;
+               pcs_int_en_reg.s.txfifu_en = 1;
+               pcs_int_en_reg.s.an_err_en = 1;
+               /*pcs_int_en_reg.s.xmit_en = 1; // This happens during normal operation */
+               /*pcs_int_en_reg.s.lnkspd_en = 1; // This happens during normal operation */
+       }
+       if (OCTEON_IS_MODEL(OCTEON_CN52XX)) {
+               /* Skipping pcs_int_en_reg.s.reserved_12_63 */
+               /*pcs_int_en_reg.s.dup = 1; // This happens during normal operation */
+               pcs_int_en_reg.s.sync_bad_en = 1;
+               pcs_int_en_reg.s.an_bad_en = 1;
+               pcs_int_en_reg.s.rxlock_en = 1;
+               pcs_int_en_reg.s.rxbad_en = 1;
+               /*pcs_int_en_reg.s.rxerr_en = 1; // This happens during normal operation */
+               pcs_int_en_reg.s.txbad_en = 1;
+               pcs_int_en_reg.s.txfifo_en = 1;
+               pcs_int_en_reg.s.txfifu_en = 1;
+               pcs_int_en_reg.s.an_err_en = 1;
+               /*pcs_int_en_reg.s.xmit_en = 1; // This happens during normal operation */
+               /*pcs_int_en_reg.s.lnkspd_en = 1; // This happens during normal operation */
+       }
+       cvmx_write_csr(CVMX_PCSX_INTX_EN_REG(index, block), pcs_int_en_reg.u64);
+}
+/**
+ * __cvmx_interrupt_pcsxx_int_en_reg_enable enables all interrupt bits in cvmx_pcsxx_int_en_reg_t
+ */
+void __cvmx_interrupt_pcsxx_int_en_reg_enable(int index)
+{
+       union cvmx_pcsxx_int_en_reg pcsx_int_en_reg;
+       cvmx_write_csr(CVMX_PCSXX_INT_REG(index),
+                      cvmx_read_csr(CVMX_PCSXX_INT_REG(index)));
+       pcsx_int_en_reg.u64 = 0;
+       if (OCTEON_IS_MODEL(OCTEON_CN56XX)) {
+               /* Skipping pcsx_int_en_reg.s.reserved_6_63 */
+               pcsx_int_en_reg.s.algnlos_en = 1;
+               pcsx_int_en_reg.s.synlos_en = 1;
+               pcsx_int_en_reg.s.bitlckls_en = 1;
+               pcsx_int_en_reg.s.rxsynbad_en = 1;
+               pcsx_int_en_reg.s.rxbad_en = 1;
+               pcsx_int_en_reg.s.txflt_en = 1;
+       }
+       if (OCTEON_IS_MODEL(OCTEON_CN52XX)) {
+               /* Skipping pcsx_int_en_reg.s.reserved_6_63 */
+               pcsx_int_en_reg.s.algnlos_en = 1;
+               pcsx_int_en_reg.s.synlos_en = 1;
+               pcsx_int_en_reg.s.bitlckls_en = 0;      /* Happens if XAUI module is not installed */
+               pcsx_int_en_reg.s.rxsynbad_en = 1;
+               pcsx_int_en_reg.s.rxbad_en = 1;
+               pcsx_int_en_reg.s.txflt_en = 1;
+       }
+       cvmx_write_csr(CVMX_PCSXX_INT_EN_REG(index), pcsx_int_en_reg.u64);
+}
+
+/**
+ * __cvmx_interrupt_spxx_int_msk_enable enables all interrupt bits in cvmx_spxx_int_msk_t
+ */
+void __cvmx_interrupt_spxx_int_msk_enable(int index)
+{
+       union cvmx_spxx_int_msk spx_int_msk;
+       cvmx_write_csr(CVMX_SPXX_INT_REG(index),
+                      cvmx_read_csr(CVMX_SPXX_INT_REG(index)));
+       spx_int_msk.u64 = 0;
+       if (OCTEON_IS_MODEL(OCTEON_CN38XX)) {
+               /* Skipping spx_int_msk.s.reserved_12_63 */
+               spx_int_msk.s.calerr = 1;
+               spx_int_msk.s.syncerr = 1;
+               spx_int_msk.s.diperr = 1;
+               spx_int_msk.s.tpaovr = 1;
+               spx_int_msk.s.rsverr = 1;
+               spx_int_msk.s.drwnng = 1;
+               spx_int_msk.s.clserr = 1;
+               spx_int_msk.s.spiovr = 1;
+               /* Skipping spx_int_msk.s.reserved_2_3 */
+               spx_int_msk.s.abnorm = 1;
+               spx_int_msk.s.prtnxa = 1;
+       }
+       if (OCTEON_IS_MODEL(OCTEON_CN58XX)) {
+               /* Skipping spx_int_msk.s.reserved_12_63 */
+               spx_int_msk.s.calerr = 1;
+               spx_int_msk.s.syncerr = 1;
+               spx_int_msk.s.diperr = 1;
+               spx_int_msk.s.tpaovr = 1;
+               spx_int_msk.s.rsverr = 1;
+               spx_int_msk.s.drwnng = 1;
+               spx_int_msk.s.clserr = 1;
+               spx_int_msk.s.spiovr = 1;
+               /* Skipping spx_int_msk.s.reserved_2_3 */
+               spx_int_msk.s.abnorm = 1;
+               spx_int_msk.s.prtnxa = 1;
+       }
+       cvmx_write_csr(CVMX_SPXX_INT_MSK(index), spx_int_msk.u64);
+}
+/**
+ * __cvmx_interrupt_stxx_int_msk_enable enables all interrupt bits in cvmx_stxx_int_msk_t
+ */
+void __cvmx_interrupt_stxx_int_msk_enable(int index)
+{
+       union cvmx_stxx_int_msk stx_int_msk;
+       cvmx_write_csr(CVMX_STXX_INT_REG(index),
+                      cvmx_read_csr(CVMX_STXX_INT_REG(index)));
+       stx_int_msk.u64 = 0;
+       if (OCTEON_IS_MODEL(OCTEON_CN38XX)) {
+               /* Skipping stx_int_msk.s.reserved_8_63 */
+               stx_int_msk.s.frmerr = 1;
+               stx_int_msk.s.unxfrm = 1;
+               stx_int_msk.s.nosync = 1;
+               stx_int_msk.s.diperr = 1;
+               stx_int_msk.s.datovr = 1;
+               stx_int_msk.s.ovrbst = 1;
+               stx_int_msk.s.calpar1 = 1;
+               stx_int_msk.s.calpar0 = 1;
+       }
+       if (OCTEON_IS_MODEL(OCTEON_CN58XX)) {
+               /* Skipping stx_int_msk.s.reserved_8_63 */
+               stx_int_msk.s.frmerr = 1;
+               stx_int_msk.s.unxfrm = 1;
+               stx_int_msk.s.nosync = 1;
+               stx_int_msk.s.diperr = 1;
+               stx_int_msk.s.datovr = 1;
+               stx_int_msk.s.ovrbst = 1;
+               stx_int_msk.s.calpar1 = 1;
+               stx_int_msk.s.calpar0 = 1;
+       }
+       cvmx_write_csr(CVMX_STXX_INT_MSK(index), stx_int_msk.u64);
+}
diff --git a/arch/mips/cavium-octeon/executive/cvmx-interrupt-rsl.c b/arch/mips/cavium-octeon/executive/cvmx-interrupt-rsl.c
new file mode 100644 (file)
index 0000000..bea7538
--- /dev/null
@@ -0,0 +1,140 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ * Utility functions to decode Octeon's RSL_INT_BLOCKS
+ * interrupts into error messages.
+ */
+
+#include <asm/octeon/octeon.h>
+
+#include <asm/octeon/cvmx-asxx-defs.h>
+#include <asm/octeon/cvmx-gmxx-defs.h>
+
+#ifndef PRINT_ERROR
+#define PRINT_ERROR(format, ...)
+#endif
+
+void __cvmx_interrupt_gmxx_rxx_int_en_enable(int index, int block);
+
+/**
+ * Enable ASX error interrupts that exist on CN3XXX, CN50XX, and
+ * CN58XX.
+ *
+ * @block:  Interface to enable 0-1
+ */
+void __cvmx_interrupt_asxx_enable(int block)
+{
+       int mask;
+       union cvmx_asxx_int_en csr;
+       /*
+        * CN38XX and CN58XX have two interfaces with 4 ports per
+        * interface. All other chips have a max of 3 ports on
+        * interface 0
+        */
+       if (OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))
+               mask = 0xf;     /* Set enables for 4 ports */
+       else
+               mask = 0x7;     /* Set enables for 3 ports */
+
+       /* Enable interface interrupts */
+       csr.u64 = cvmx_read_csr(CVMX_ASXX_INT_EN(block));
+       csr.s.txpsh = mask;
+       csr.s.txpop = mask;
+       csr.s.ovrflw = mask;
+       cvmx_write_csr(CVMX_ASXX_INT_EN(block), csr.u64);
+}
+/**
+ * Enable GMX error reporting for the supplied interface
+ *
+ * @interface: Interface to enable
+ */
+void __cvmx_interrupt_gmxx_enable(int interface)
+{
+       union cvmx_gmxx_inf_mode mode;
+       union cvmx_gmxx_tx_int_en gmx_tx_int_en;
+       int num_ports;
+       int index;
+
+       mode.u64 = cvmx_read_csr(CVMX_GMXX_INF_MODE(interface));
+
+       if (OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN52XX)) {
+               if (mode.s.en) {
+                       switch (mode.cn56xx.mode) {
+                       case 1: /* XAUI */
+                               num_ports = 1;
+                               break;
+                       case 2: /* SGMII */
+                       case 3: /* PICMG */
+                               num_ports = 4;
+                               break;
+                       default:        /* Disabled */
+                               num_ports = 0;
+                               break;
+                       }
+               } else
+                       num_ports = 0;
+       } else {
+               if (mode.s.en) {
+                       if (OCTEON_IS_MODEL(OCTEON_CN38XX)
+                           || OCTEON_IS_MODEL(OCTEON_CN58XX)) {
+                               /*
+                                * SPI on CN38XX and CN58XX report all
+                                * errors through port 0.  RGMII needs
+                                * to check all 4 ports
+                                */
+                               if (mode.s.type)
+                                       num_ports = 1;
+                               else
+                                       num_ports = 4;
+                       } else {
+                               /*
+                                * CN30XX, CN31XX, and CN50XX have two
+                                * or three ports. GMII and MII has 2,
+                                * RGMII has three
+                                */
+                               if (mode.s.type)
+                                       num_ports = 2;
+                               else
+                                       num_ports = 3;
+                       }
+               } else
+                       num_ports = 0;
+       }
+
+       gmx_tx_int_en.u64 = 0;
+       if (num_ports) {
+               if (OCTEON_IS_MODEL(OCTEON_CN38XX)
+                   || OCTEON_IS_MODEL(OCTEON_CN58XX))
+                       gmx_tx_int_en.s.ncb_nxa = 1;
+               gmx_tx_int_en.s.pko_nxa = 1;
+       }
+       gmx_tx_int_en.s.undflw = (1 << num_ports) - 1;
+       cvmx_write_csr(CVMX_GMXX_TX_INT_EN(interface), gmx_tx_int_en.u64);
+       for (index = 0; index < num_ports; index++)
+               __cvmx_interrupt_gmxx_rxx_int_en_enable(index, interface);
+}
diff --git a/arch/mips/cavium-octeon/executive/cvmx-pko.c b/arch/mips/cavium-octeon/executive/cvmx-pko.c
new file mode 100644 (file)
index 0000000..f557084
--- /dev/null
@@ -0,0 +1,506 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ * Support library for the hardware Packet Output unit.
+ */
+
+#include <asm/octeon/octeon.h>
+
+#include <asm/octeon/cvmx-config.h>
+#include <asm/octeon/cvmx-pko.h>
+#include <asm/octeon/cvmx-helper.h>
+
+/**
+ * Internal state of packet output
+ */
+
+/**
+ * Call before any other calls to initialize the packet
+ * output system.  This does chip global config, and should only be
+ * done by one core.
+ */
+
+void cvmx_pko_initialize_global(void)
+{
+       int i;
+       uint64_t priority = 8;
+       union cvmx_pko_reg_cmd_buf config;
+
+       /*
+        * Set the size of the PKO command buffers to an odd number of
+        * 64bit words. This allows the normal two word send to stay
+        * aligned and never span a comamnd word buffer.
+        */
+       config.u64 = 0;
+       config.s.pool = CVMX_FPA_OUTPUT_BUFFER_POOL;
+       config.s.size = CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE / 8 - 1;
+
+       cvmx_write_csr(CVMX_PKO_REG_CMD_BUF, config.u64);
+
+       for (i = 0; i < CVMX_PKO_MAX_OUTPUT_QUEUES; i++)
+               cvmx_pko_config_port(CVMX_PKO_MEM_QUEUE_PTRS_ILLEGAL_PID, i, 1,
+                                    &priority);
+
+       /*
+        * If we aren't using all of the queues optimize PKO's
+        * internal memory.
+        */
+       if (OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX)
+           || OCTEON_IS_MODEL(OCTEON_CN56XX)
+           || OCTEON_IS_MODEL(OCTEON_CN52XX)) {
+               int num_interfaces = cvmx_helper_get_number_of_interfaces();
+               int last_port =
+                   cvmx_helper_get_last_ipd_port(num_interfaces - 1);
+               int max_queues =
+                   cvmx_pko_get_base_queue(last_port) +
+                   cvmx_pko_get_num_queues(last_port);
+               if (OCTEON_IS_MODEL(OCTEON_CN38XX)) {
+                       if (max_queues <= 32)
+                               cvmx_write_csr(CVMX_PKO_REG_QUEUE_MODE, 2);
+                       else if (max_queues <= 64)
+                               cvmx_write_csr(CVMX_PKO_REG_QUEUE_MODE, 1);
+               } else {
+                       if (max_queues <= 64)
+                               cvmx_write_csr(CVMX_PKO_REG_QUEUE_MODE, 2);
+                       else if (max_queues <= 128)
+                               cvmx_write_csr(CVMX_PKO_REG_QUEUE_MODE, 1);
+               }
+       }
+}
+
+/**
+ * This function does per-core initialization required by the PKO routines.
+ * This must be called on all cores that will do packet output, and must
+ * be called after the FPA has been initialized and filled with pages.
+ *
+ * Returns 0 on success
+ *         !0 on failure
+ */
+int cvmx_pko_initialize_local(void)
+{
+       /* Nothing to do */
+       return 0;
+}
+
+/**
+ * Enables the packet output hardware. It must already be
+ * configured.
+ */
+void cvmx_pko_enable(void)
+{
+       union cvmx_pko_reg_flags flags;
+
+       flags.u64 = cvmx_read_csr(CVMX_PKO_REG_FLAGS);
+       if (flags.s.ena_pko)
+               cvmx_dprintf
+                   ("Warning: Enabling PKO when PKO already enabled.\n");
+
+       flags.s.ena_dwb = 1;
+       flags.s.ena_pko = 1;
+       /*
+        * always enable big endian for 3-word command. Does nothing
+        * for 2-word.
+        */
+       flags.s.store_be = 1;
+       cvmx_write_csr(CVMX_PKO_REG_FLAGS, flags.u64);
+}
+
+/**
+ * Disables the packet output. Does not affect any configuration.
+ */
+void cvmx_pko_disable(void)
+{
+       union cvmx_pko_reg_flags pko_reg_flags;
+       pko_reg_flags.u64 = cvmx_read_csr(CVMX_PKO_REG_FLAGS);
+       pko_reg_flags.s.ena_pko = 0;
+       cvmx_write_csr(CVMX_PKO_REG_FLAGS, pko_reg_flags.u64);
+}
+
+
+/**
+ * Reset the packet output.
+ */
+static void __cvmx_pko_reset(void)
+{
+       union cvmx_pko_reg_flags pko_reg_flags;
+       pko_reg_flags.u64 = cvmx_read_csr(CVMX_PKO_REG_FLAGS);
+       pko_reg_flags.s.reset = 1;
+       cvmx_write_csr(CVMX_PKO_REG_FLAGS, pko_reg_flags.u64);
+}
+
+/**
+ * Shutdown and free resources required by packet output.
+ */
+void cvmx_pko_shutdown(void)
+{
+       union cvmx_pko_mem_queue_ptrs config;
+       int queue;
+
+       cvmx_pko_disable();
+
+       for (queue = 0; queue < CVMX_PKO_MAX_OUTPUT_QUEUES; queue++) {
+               config.u64 = 0;
+               config.s.tail = 1;
+               config.s.index = 0;
+               config.s.port = CVMX_PKO_MEM_QUEUE_PTRS_ILLEGAL_PID;
+               config.s.queue = queue & 0x7f;
+               config.s.qos_mask = 0;
+               config.s.buf_ptr = 0;
+               if (!OCTEON_IS_MODEL(OCTEON_CN3XXX)) {
+                       union cvmx_pko_reg_queue_ptrs1 config1;
+                       config1.u64 = 0;
+                       config1.s.qid7 = queue >> 7;
+                       cvmx_write_csr(CVMX_PKO_REG_QUEUE_PTRS1, config1.u64);
+               }
+               cvmx_write_csr(CVMX_PKO_MEM_QUEUE_PTRS, config.u64);
+               cvmx_cmd_queue_shutdown(CVMX_CMD_QUEUE_PKO(queue));
+       }
+       __cvmx_pko_reset();
+}
+
+/**
+ * Configure a output port and the associated queues for use.
+ *
+ * @port:       Port to configure.
+ * @base_queue: First queue number to associate with this port.
+ * @num_queues: Number of queues to associate with this port
+ * @priority:   Array of priority levels for each queue. Values are
+ *                   allowed to be 0-8. A value of 8 get 8 times the traffic
+ *                   of a value of 1.  A value of 0 indicates that no rounds
+ *                   will be participated in. These priorities can be changed
+ *                   on the fly while the pko is enabled. A priority of 9
+ *                   indicates that static priority should be used.  If static
+ *                   priority is used all queues with static priority must be
+ *                   contiguous starting at the base_queue, and lower numbered
+ *                   queues have higher priority than higher numbered queues.
+ *                   There must be num_queues elements in the array.
+ */
+cvmx_pko_status_t cvmx_pko_config_port(uint64_t port, uint64_t base_queue,
+                                      uint64_t num_queues,
+                                      const uint64_t priority[])
+{
+       cvmx_pko_status_t result_code;
+       uint64_t queue;
+       union cvmx_pko_mem_queue_ptrs config;
+       union cvmx_pko_reg_queue_ptrs1 config1;
+       int static_priority_base = -1;
+       int static_priority_end = -1;
+
+       if ((port >= CVMX_PKO_NUM_OUTPUT_PORTS)
+           && (port != CVMX_PKO_MEM_QUEUE_PTRS_ILLEGAL_PID)) {
+               cvmx_dprintf("ERROR: cvmx_pko_config_port: Invalid port %llu\n",
+                            (unsigned long long)port);
+               return CVMX_PKO_INVALID_PORT;
+       }
+
+       if (base_queue + num_queues > CVMX_PKO_MAX_OUTPUT_QUEUES) {
+               cvmx_dprintf
+                   ("ERROR: cvmx_pko_config_port: Invalid queue range %llu\n",
+                    (unsigned long long)(base_queue + num_queues));
+               return CVMX_PKO_INVALID_QUEUE;
+       }
+
+       if (port != CVMX_PKO_MEM_QUEUE_PTRS_ILLEGAL_PID) {
+               /*
+                * Validate the static queue priority setup and set
+                * static_priority_base and static_priority_end
+                * accordingly.
+                */
+               for (queue = 0; queue < num_queues; queue++) {
+                       /* Find first queue of static priority */
+                       if (static_priority_base == -1
+                           && priority[queue] ==
+                           CVMX_PKO_QUEUE_STATIC_PRIORITY)
+                               static_priority_base = queue;
+                       /* Find last queue of static priority */
+                       if (static_priority_base != -1
+                           && static_priority_end == -1
+                           && priority[queue] != CVMX_PKO_QUEUE_STATIC_PRIORITY
+                           && queue)
+                               static_priority_end = queue - 1;
+                       else if (static_priority_base != -1
+                                && static_priority_end == -1
+                                && queue == num_queues - 1)
+                               /* all queues are static priority */
+                               static_priority_end = queue;
+                       /*
+                        * Check to make sure all static priority
+                        * queues are contiguous.  Also catches some
+                        * cases of static priorites not starting at
+                        * queue 0.
+                        */
+                       if (static_priority_end != -1
+                           && (int)queue > static_priority_end
+                           && priority[queue] ==
+                           CVMX_PKO_QUEUE_STATIC_PRIORITY) {
+                               cvmx_dprintf("ERROR: cvmx_pko_config_port: "
+                                            "Static priority queues aren't "
+                                            "contiguous or don't start at "
+                                            "base queue. q: %d, eq: %d\n",
+                                       (int)queue, static_priority_end);
+                               return CVMX_PKO_INVALID_PRIORITY;
+                       }
+               }
+               if (static_priority_base > 0) {
+                       cvmx_dprintf("ERROR: cvmx_pko_config_port: Static "
+                                    "priority queues don't start at base "
+                                    "queue. sq: %d\n",
+                               static_priority_base);
+                       return CVMX_PKO_INVALID_PRIORITY;
+               }
+#if 0
+               cvmx_dprintf("Port %d: Static priority queue base: %d, "
+                            "end: %d\n", port,
+                       static_priority_base, static_priority_end);
+#endif
+       }
+       /*
+        * At this point, static_priority_base and static_priority_end
+        * are either both -1, or are valid start/end queue
+        * numbers.
+        */
+
+       result_code = CVMX_PKO_SUCCESS;
+
+#ifdef PKO_DEBUG
+       cvmx_dprintf("num queues: %d (%lld,%lld)\n", num_queues,
+                    CVMX_PKO_QUEUES_PER_PORT_INTERFACE0,
+                    CVMX_PKO_QUEUES_PER_PORT_INTERFACE1);
+#endif
+
+       for (queue = 0; queue < num_queues; queue++) {
+               uint64_t *buf_ptr = NULL;
+
+               config1.u64 = 0;
+               config1.s.idx3 = queue >> 3;
+               config1.s.qid7 = (base_queue + queue) >> 7;
+
+               config.u64 = 0;
+               config.s.tail = queue == (num_queues - 1);
+               config.s.index = queue;
+               config.s.port = port;
+               config.s.queue = base_queue + queue;
+
+               if (!cvmx_octeon_is_pass1()) {
+                       config.s.static_p = static_priority_base >= 0;
+                       config.s.static_q = (int)queue <= static_priority_end;
+                       config.s.s_tail = (int)queue == static_priority_end;
+               }
+               /*
+                * Convert the priority into an enable bit field. Try
+                * to space the bits out evenly so the packet don't
+                * get grouped up
+                */
+               switch ((int)priority[queue]) {
+               case 0:
+                       config.s.qos_mask = 0x00;
+                       break;
+               case 1:
+                       config.s.qos_mask = 0x01;
+                       break;
+               case 2:
+                       config.s.qos_mask = 0x11;
+                       break;
+               case 3:
+                       config.s.qos_mask = 0x49;
+                       break;
+               case 4:
+                       config.s.qos_mask = 0x55;
+                       break;
+               case 5:
+                       config.s.qos_mask = 0x57;
+                       break;
+               case 6:
+                       config.s.qos_mask = 0x77;
+                       break;
+               case 7:
+                       config.s.qos_mask = 0x7f;
+                       break;
+               case 8:
+                       config.s.qos_mask = 0xff;
+                       break;
+               case CVMX_PKO_QUEUE_STATIC_PRIORITY:
+                       /* Pass 1 will fall through to the error case */
+                       if (!cvmx_octeon_is_pass1()) {
+                               config.s.qos_mask = 0xff;
+                               break;
+                       }
+               default:
+                       cvmx_dprintf("ERROR: cvmx_pko_config_port: Invalid "
+                                    "priority %llu\n",
+                               (unsigned long long)priority[queue]);
+                       config.s.qos_mask = 0xff;
+                       result_code = CVMX_PKO_INVALID_PRIORITY;
+                       break;
+               }
+
+               if (port != CVMX_PKO_MEM_QUEUE_PTRS_ILLEGAL_PID) {
+                       cvmx_cmd_queue_result_t cmd_res =
+                           cvmx_cmd_queue_initialize(CVMX_CMD_QUEUE_PKO
+                                                     (base_queue + queue),
+                                                     CVMX_PKO_MAX_QUEUE_DEPTH,
+                                                     CVMX_FPA_OUTPUT_BUFFER_POOL,
+                                                     CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE
+                                                     -
+                                                     CVMX_PKO_COMMAND_BUFFER_SIZE_ADJUST
+                                                     * 8);
+                       if (cmd_res != CVMX_CMD_QUEUE_SUCCESS) {
+                               switch (cmd_res) {
+                               case CVMX_CMD_QUEUE_NO_MEMORY:
+                                       cvmx_dprintf("ERROR: "
+                                                    "cvmx_pko_config_port: "
+                                                    "Unable to allocate "
+                                                    "output buffer.\n");
+                                       return CVMX_PKO_NO_MEMORY;
+                               case CVMX_CMD_QUEUE_ALREADY_SETUP:
+                                       cvmx_dprintf
+                                           ("ERROR: cvmx_pko_config_port: Port already setup.\n");
+                                       return CVMX_PKO_PORT_ALREADY_SETUP;
+                               case CVMX_CMD_QUEUE_INVALID_PARAM:
+                               default:
+                                       cvmx_dprintf
+                                           ("ERROR: cvmx_pko_config_port: Command queue initialization failed.\n");
+                                       return CVMX_PKO_CMD_QUEUE_INIT_ERROR;
+                               }
+                       }
+
+                       buf_ptr =
+                           (uint64_t *)
+                           cvmx_cmd_queue_buffer(CVMX_CMD_QUEUE_PKO
+                                                 (base_queue + queue));
+                       config.s.buf_ptr = cvmx_ptr_to_phys(buf_ptr);
+               } else
+                       config.s.buf_ptr = 0;
+
+               CVMX_SYNCWS;
+
+               if (!OCTEON_IS_MODEL(OCTEON_CN3XXX))
+                       cvmx_write_csr(CVMX_PKO_REG_QUEUE_PTRS1, config1.u64);
+               cvmx_write_csr(CVMX_PKO_MEM_QUEUE_PTRS, config.u64);
+       }
+
+       return result_code;
+}
+
+#ifdef PKO_DEBUG
+/**
+ * Show map of ports -> queues for different cores.
+ */
+void cvmx_pko_show_queue_map()
+{
+       int core, port;
+       int pko_output_ports = 36;
+
+       cvmx_dprintf("port");
+       for (port = 0; port < pko_output_ports; port++)
+               cvmx_dprintf("%3d ", port);
+       cvmx_dprintf("\n");
+
+       for (core = 0; core < CVMX_MAX_CORES; core++) {
+               cvmx_dprintf("\n%2d: ", core);
+               for (port = 0; port < pko_output_ports; port++) {
+                       cvmx_dprintf("%3d ",
+                                    cvmx_pko_get_base_queue_per_core(port,
+                                                                     core));
+               }
+       }
+       cvmx_dprintf("\n");
+}
+#endif
+
+/**
+ * Rate limit a PKO port to a max packets/sec. This function is only
+ * supported on CN51XX and higher, excluding CN58XX.
+ *
+ * @port:      Port to rate limit
+ * @packets_s: Maximum packet/sec
+ * @burst:     Maximum number of packets to burst in a row before rate
+ *                  limiting cuts in.
+ *
+ * Returns Zero on success, negative on failure
+ */
+int cvmx_pko_rate_limit_packets(int port, int packets_s, int burst)
+{
+       union cvmx_pko_mem_port_rate0 pko_mem_port_rate0;
+       union cvmx_pko_mem_port_rate1 pko_mem_port_rate1;
+
+       pko_mem_port_rate0.u64 = 0;
+       pko_mem_port_rate0.s.pid = port;
+       pko_mem_port_rate0.s.rate_pkt =
+           cvmx_sysinfo_get()->cpu_clock_hz / packets_s / 16;
+       /* No cost per word since we are limited by packets/sec, not bits/sec */
+       pko_mem_port_rate0.s.rate_word = 0;
+
+       pko_mem_port_rate1.u64 = 0;
+       pko_mem_port_rate1.s.pid = port;
+       pko_mem_port_rate1.s.rate_lim =
+           ((uint64_t) pko_mem_port_rate0.s.rate_pkt * burst) >> 8;
+
+       cvmx_write_csr(CVMX_PKO_MEM_PORT_RATE0, pko_mem_port_rate0.u64);
+       cvmx_write_csr(CVMX_PKO_MEM_PORT_RATE1, pko_mem_port_rate1.u64);
+       return 0;
+}
+
+/**
+ * Rate limit a PKO port to a max bits/sec. This function is only
+ * supported on CN51XX and higher, excluding CN58XX.
+ *
+ * @port:   Port to rate limit
+ * @bits_s: PKO rate limit in bits/sec
+ * @burst:  Maximum number of bits to burst before rate
+ *               limiting cuts in.
+ *
+ * Returns Zero on success, negative on failure
+ */
+int cvmx_pko_rate_limit_bits(int port, uint64_t bits_s, int burst)
+{
+       union cvmx_pko_mem_port_rate0 pko_mem_port_rate0;
+       union cvmx_pko_mem_port_rate1 pko_mem_port_rate1;
+       uint64_t clock_rate = cvmx_sysinfo_get()->cpu_clock_hz;
+       uint64_t tokens_per_bit = clock_rate * 16 / bits_s;
+
+       pko_mem_port_rate0.u64 = 0;
+       pko_mem_port_rate0.s.pid = port;
+       /*
+        * Each packet has a 12 bytes of interframe gap, an 8 byte
+        * preamble, and a 4 byte CRC. These are not included in the
+        * per word count. Multiply by 8 to covert to bits and divide
+        * by 256 for limit granularity.
+        */
+       pko_mem_port_rate0.s.rate_pkt = (12 + 8 + 4) * 8 * tokens_per_bit / 256;
+       /* Each 8 byte word has 64bits */
+       pko_mem_port_rate0.s.rate_word = 64 * tokens_per_bit;
+
+       pko_mem_port_rate1.u64 = 0;
+       pko_mem_port_rate1.s.pid = port;
+       pko_mem_port_rate1.s.rate_lim = tokens_per_bit * burst / 256;
+
+       cvmx_write_csr(CVMX_PKO_MEM_PORT_RATE0, pko_mem_port_rate0.u64);
+       cvmx_write_csr(CVMX_PKO_MEM_PORT_RATE1, pko_mem_port_rate1.u64);
+       return 0;
+}
diff --git a/arch/mips/cavium-octeon/executive/cvmx-spi.c b/arch/mips/cavium-octeon/executive/cvmx-spi.c
new file mode 100644 (file)
index 0000000..74afb17
--- /dev/null
@@ -0,0 +1,667 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ *
+ * Support library for the SPI
+ */
+#include <asm/octeon/octeon.h>
+
+#include <asm/octeon/cvmx-config.h>
+
+#include <asm/octeon/cvmx-pko.h>
+#include <asm/octeon/cvmx-spi.h>
+
+#include <asm/octeon/cvmx-spxx-defs.h>
+#include <asm/octeon/cvmx-stxx-defs.h>
+#include <asm/octeon/cvmx-srxx-defs.h>
+
+#define INVOKE_CB(function_p, args...)         \
+       do {                                    \
+               if (function_p) {               \
+                       res = function_p(args); \
+                       if (res)                \
+                               return res;     \
+               }                               \
+       } while (0)
+
+#if CVMX_ENABLE_DEBUG_PRINTS
+static const char *modes[] =
+    { "UNKNOWN", "TX Halfplex", "Rx Halfplex", "Duplex" };
+#endif
+
+/* Default callbacks, can be overridden
+ *  using cvmx_spi_get_callbacks/cvmx_spi_set_callbacks
+ */
+static cvmx_spi_callbacks_t cvmx_spi_callbacks = {
+       .reset_cb = cvmx_spi_reset_cb,
+       .calendar_setup_cb = cvmx_spi_calendar_setup_cb,
+       .clock_detect_cb = cvmx_spi_clock_detect_cb,
+       .training_cb = cvmx_spi_training_cb,
+       .calendar_sync_cb = cvmx_spi_calendar_sync_cb,
+       .interface_up_cb = cvmx_spi_interface_up_cb
+};
+
+/**
+ * Get current SPI4 initialization callbacks
+ *
+ * @callbacks:  Pointer to the callbacks structure.to fill
+ *
+ * Returns Pointer to cvmx_spi_callbacks_t structure.
+ */
+void cvmx_spi_get_callbacks(cvmx_spi_callbacks_t *callbacks)
+{
+       memcpy(callbacks, &cvmx_spi_callbacks, sizeof(cvmx_spi_callbacks));
+}
+
+/**
+ * Set new SPI4 initialization callbacks
+ *
+ * @new_callbacks:  Pointer to an updated callbacks structure.
+ */
+void cvmx_spi_set_callbacks(cvmx_spi_callbacks_t *new_callbacks)
+{
+       memcpy(&cvmx_spi_callbacks, new_callbacks, sizeof(cvmx_spi_callbacks));
+}
+
+/**
+ * Initialize and start the SPI interface.
+ *
+ * @interface: The identifier of the packet interface to configure and
+ *                  use as a SPI interface.
+ * @mode:      The operating mode for the SPI interface. The interface
+ *                  can operate as a full duplex (both Tx and Rx data paths
+ *                  active) or as a halfplex (either the Tx data path is
+ *                  active or the Rx data path is active, but not both).
+ * @timeout:   Timeout to wait for clock synchronization in seconds
+ * @num_ports: Number of SPI ports to configure
+ *
+ * Returns Zero on success, negative of failure.
+ */
+int cvmx_spi_start_interface(int interface, cvmx_spi_mode_t mode, int timeout,
+                            int num_ports)
+{
+       int res = -1;
+
+       if (!(OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX)))
+               return res;
+
+       /* Callback to perform SPI4 reset */
+       INVOKE_CB(cvmx_spi_callbacks.reset_cb, interface, mode);
+
+       /* Callback to perform calendar setup */
+       INVOKE_CB(cvmx_spi_callbacks.calendar_setup_cb, interface, mode,
+                 num_ports);
+
+       /* Callback to perform clock detection */
+       INVOKE_CB(cvmx_spi_callbacks.clock_detect_cb, interface, mode, timeout);
+
+       /* Callback to perform SPI4 link training */
+       INVOKE_CB(cvmx_spi_callbacks.training_cb, interface, mode, timeout);
+
+       /* Callback to perform calendar sync */
+       INVOKE_CB(cvmx_spi_callbacks.calendar_sync_cb, interface, mode,
+                 timeout);
+
+       /* Callback to handle interface coming up */
+       INVOKE_CB(cvmx_spi_callbacks.interface_up_cb, interface, mode);
+
+       return res;
+}
+
+/**
+ * This routine restarts the SPI interface after it has lost synchronization
+ * with its correspondent system.
+ *
+ * @interface: The identifier of the packet interface to configure and
+ *                  use as a SPI interface.
+ * @mode:      The operating mode for the SPI interface. The interface
+ *                  can operate as a full duplex (both Tx and Rx data paths
+ *                  active) or as a halfplex (either the Tx data path is
+ *                  active or the Rx data path is active, but not both).
+ * @timeout:   Timeout to wait for clock synchronization in seconds
+ *
+ * Returns Zero on success, negative of failure.
+ */
+int cvmx_spi_restart_interface(int interface, cvmx_spi_mode_t mode, int timeout)
+{
+       int res = -1;
+
+       if (!(OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX)))
+               return res;
+
+       cvmx_dprintf("SPI%d: Restart %s\n", interface, modes[mode]);
+
+       /* Callback to perform SPI4 reset */
+       INVOKE_CB(cvmx_spi_callbacks.reset_cb, interface, mode);
+
+       /* NOTE: Calendar setup is not performed during restart */
+       /*       Refer to cvmx_spi_start_interface() for the full sequence */
+
+       /* Callback to perform clock detection */
+       INVOKE_CB(cvmx_spi_callbacks.clock_detect_cb, interface, mode, timeout);
+
+       /* Callback to perform SPI4 link training */
+       INVOKE_CB(cvmx_spi_callbacks.training_cb, interface, mode, timeout);
+
+       /* Callback to perform calendar sync */
+       INVOKE_CB(cvmx_spi_callbacks.calendar_sync_cb, interface, mode,
+                 timeout);
+
+       /* Callback to handle interface coming up */
+       INVOKE_CB(cvmx_spi_callbacks.interface_up_cb, interface, mode);
+
+       return res;
+}
+
+/**
+ * Callback to perform SPI4 reset
+ *
+ * @interface: The identifier of the packet interface to configure and
+ *                  use as a SPI interface.
+ * @mode:      The operating mode for the SPI interface. The interface
+ *                  can operate as a full duplex (both Tx and Rx data paths
+ *                  active) or as a halfplex (either the Tx data path is
+ *                  active or the Rx data path is active, but not both).
+ *
+ * Returns Zero on success, non-zero error code on failure (will cause
+ * SPI initialization to abort)
+ */
+int cvmx_spi_reset_cb(int interface, cvmx_spi_mode_t mode)
+{
+       union cvmx_spxx_dbg_deskew_ctl spxx_dbg_deskew_ctl;
+       union cvmx_spxx_clk_ctl spxx_clk_ctl;
+       union cvmx_spxx_bist_stat spxx_bist_stat;
+       union cvmx_spxx_int_msk spxx_int_msk;
+       union cvmx_stxx_int_msk stxx_int_msk;
+       union cvmx_spxx_trn4_ctl spxx_trn4_ctl;
+       int index;
+       uint64_t MS = cvmx_sysinfo_get()->cpu_clock_hz / 1000;
+
+       /* Disable SPI error events while we run BIST */
+       spxx_int_msk.u64 = cvmx_read_csr(CVMX_SPXX_INT_MSK(interface));
+       cvmx_write_csr(CVMX_SPXX_INT_MSK(interface), 0);
+       stxx_int_msk.u64 = cvmx_read_csr(CVMX_STXX_INT_MSK(interface));
+       cvmx_write_csr(CVMX_STXX_INT_MSK(interface), 0);
+
+       /* Run BIST in the SPI interface */
+       cvmx_write_csr(CVMX_SRXX_COM_CTL(interface), 0);
+       cvmx_write_csr(CVMX_STXX_COM_CTL(interface), 0);
+       spxx_clk_ctl.u64 = 0;
+       spxx_clk_ctl.s.runbist = 1;
+       cvmx_write_csr(CVMX_SPXX_CLK_CTL(interface), spxx_clk_ctl.u64);
+       cvmx_wait(10 * MS);
+       spxx_bist_stat.u64 = cvmx_read_csr(CVMX_SPXX_BIST_STAT(interface));
+       if (spxx_bist_stat.s.stat0)
+               cvmx_dprintf
+                   ("ERROR SPI%d: BIST failed on receive datapath FIFO\n",
+                    interface);
+       if (spxx_bist_stat.s.stat1)
+               cvmx_dprintf("ERROR SPI%d: BIST failed on RX calendar table\n",
+                            interface);
+       if (spxx_bist_stat.s.stat2)
+               cvmx_dprintf("ERROR SPI%d: BIST failed on TX calendar table\n",
+                            interface);
+
+       /* Clear the calendar table after BIST to fix parity errors */
+       for (index = 0; index < 32; index++) {
+               union cvmx_srxx_spi4_calx srxx_spi4_calx;
+               union cvmx_stxx_spi4_calx stxx_spi4_calx;
+
+               srxx_spi4_calx.u64 = 0;
+               srxx_spi4_calx.s.oddpar = 1;
+               cvmx_write_csr(CVMX_SRXX_SPI4_CALX(index, interface),
+                              srxx_spi4_calx.u64);
+
+               stxx_spi4_calx.u64 = 0;
+               stxx_spi4_calx.s.oddpar = 1;
+               cvmx_write_csr(CVMX_STXX_SPI4_CALX(index, interface),
+                              stxx_spi4_calx.u64);
+       }
+
+       /* Re enable reporting of error interrupts */
+       cvmx_write_csr(CVMX_SPXX_INT_REG(interface),
+                      cvmx_read_csr(CVMX_SPXX_INT_REG(interface)));
+       cvmx_write_csr(CVMX_SPXX_INT_MSK(interface), spxx_int_msk.u64);
+       cvmx_write_csr(CVMX_STXX_INT_REG(interface),
+                      cvmx_read_csr(CVMX_STXX_INT_REG(interface)));
+       cvmx_write_csr(CVMX_STXX_INT_MSK(interface), stxx_int_msk.u64);
+
+       /* Setup the CLKDLY right in the middle */
+       spxx_clk_ctl.u64 = 0;
+       spxx_clk_ctl.s.seetrn = 0;
+       spxx_clk_ctl.s.clkdly = 0x10;
+       spxx_clk_ctl.s.runbist = 0;
+       spxx_clk_ctl.s.statdrv = 0;
+       /* This should always be on the opposite edge as statdrv */
+       spxx_clk_ctl.s.statrcv = 1;
+       spxx_clk_ctl.s.sndtrn = 0;
+       spxx_clk_ctl.s.drptrn = 0;
+       spxx_clk_ctl.s.rcvtrn = 0;
+       spxx_clk_ctl.s.srxdlck = 0;
+       cvmx_write_csr(CVMX_SPXX_CLK_CTL(interface), spxx_clk_ctl.u64);
+       cvmx_wait(100 * MS);
+
+       /* Reset SRX0 DLL */
+       spxx_clk_ctl.s.srxdlck = 1;
+       cvmx_write_csr(CVMX_SPXX_CLK_CTL(interface), spxx_clk_ctl.u64);
+
+       /* Waiting for Inf0 Spi4 RX DLL to lock */
+       cvmx_wait(100 * MS);
+
+       /* Enable dynamic alignment */
+       spxx_trn4_ctl.s.trntest = 0;
+       spxx_trn4_ctl.s.jitter = 1;
+       spxx_trn4_ctl.s.clr_boot = 1;
+       spxx_trn4_ctl.s.set_boot = 0;
+       if (OCTEON_IS_MODEL(OCTEON_CN58XX))
+               spxx_trn4_ctl.s.maxdist = 3;
+       else
+               spxx_trn4_ctl.s.maxdist = 8;
+       spxx_trn4_ctl.s.macro_en = 1;
+       spxx_trn4_ctl.s.mux_en = 1;
+       cvmx_write_csr(CVMX_SPXX_TRN4_CTL(interface), spxx_trn4_ctl.u64);
+
+       spxx_dbg_deskew_ctl.u64 = 0;
+       cvmx_write_csr(CVMX_SPXX_DBG_DESKEW_CTL(interface),
+                      spxx_dbg_deskew_ctl.u64);
+
+       return 0;
+}
+
+/**
+ * Callback to setup calendar and miscellaneous settings before clock detection
+ *
+ * @interface: The identifier of the packet interface to configure and
+ *                  use as a SPI interface.
+ * @mode:      The operating mode for the SPI interface. The interface
+ *                  can operate as a full duplex (both Tx and Rx data paths
+ *                  active) or as a halfplex (either the Tx data path is
+ *                  active or the Rx data path is active, but not both).
+ * @num_ports: Number of ports to configure on SPI
+ *
+ * Returns Zero on success, non-zero error code on failure (will cause
+ * SPI initialization to abort)
+ */
+int cvmx_spi_calendar_setup_cb(int interface, cvmx_spi_mode_t mode,
+                              int num_ports)
+{
+       int port;
+       int index;
+       if (mode & CVMX_SPI_MODE_RX_HALFPLEX) {
+               union cvmx_srxx_com_ctl srxx_com_ctl;
+               union cvmx_srxx_spi4_stat srxx_spi4_stat;
+
+               /* SRX0 number of Ports */
+               srxx_com_ctl.u64 = 0;
+               srxx_com_ctl.s.prts = num_ports - 1;
+               srxx_com_ctl.s.st_en = 0;
+               srxx_com_ctl.s.inf_en = 0;
+               cvmx_write_csr(CVMX_SRXX_COM_CTL(interface), srxx_com_ctl.u64);
+
+               /* SRX0 Calendar Table. This round robbins through all ports */
+               port = 0;
+               index = 0;
+               while (port < num_ports) {
+                       union cvmx_srxx_spi4_calx srxx_spi4_calx;
+                       srxx_spi4_calx.u64 = 0;
+                       srxx_spi4_calx.s.prt0 = port++;
+                       srxx_spi4_calx.s.prt1 = port++;
+                       srxx_spi4_calx.s.prt2 = port++;
+                       srxx_spi4_calx.s.prt3 = port++;
+                       srxx_spi4_calx.s.oddpar =
+                           ~(cvmx_dpop(srxx_spi4_calx.u64) & 1);
+                       cvmx_write_csr(CVMX_SRXX_SPI4_CALX(index, interface),
+                                      srxx_spi4_calx.u64);
+                       index++;
+               }
+               srxx_spi4_stat.u64 = 0;
+               srxx_spi4_stat.s.len = num_ports;
+               srxx_spi4_stat.s.m = 1;
+               cvmx_write_csr(CVMX_SRXX_SPI4_STAT(interface),
+                              srxx_spi4_stat.u64);
+       }
+
+       if (mode & CVMX_SPI_MODE_TX_HALFPLEX) {
+               union cvmx_stxx_arb_ctl stxx_arb_ctl;
+               union cvmx_gmxx_tx_spi_max gmxx_tx_spi_max;
+               union cvmx_gmxx_tx_spi_thresh gmxx_tx_spi_thresh;
+               union cvmx_gmxx_tx_spi_ctl gmxx_tx_spi_ctl;
+               union cvmx_stxx_spi4_stat stxx_spi4_stat;
+               union cvmx_stxx_spi4_dat stxx_spi4_dat;
+
+               /* STX0 Config */
+               stxx_arb_ctl.u64 = 0;
+               stxx_arb_ctl.s.igntpa = 0;
+               stxx_arb_ctl.s.mintrn = 0;
+               cvmx_write_csr(CVMX_STXX_ARB_CTL(interface), stxx_arb_ctl.u64);
+
+               gmxx_tx_spi_max.u64 = 0;
+               gmxx_tx_spi_max.s.max1 = 8;
+               gmxx_tx_spi_max.s.max2 = 4;
+               gmxx_tx_spi_max.s.slice = 0;
+               cvmx_write_csr(CVMX_GMXX_TX_SPI_MAX(interface),
+                              gmxx_tx_spi_max.u64);
+
+               gmxx_tx_spi_thresh.u64 = 0;
+               gmxx_tx_spi_thresh.s.thresh = 4;
+               cvmx_write_csr(CVMX_GMXX_TX_SPI_THRESH(interface),
+                              gmxx_tx_spi_thresh.u64);
+
+               gmxx_tx_spi_ctl.u64 = 0;
+               gmxx_tx_spi_ctl.s.tpa_clr = 0;
+               gmxx_tx_spi_ctl.s.cont_pkt = 0;
+               cvmx_write_csr(CVMX_GMXX_TX_SPI_CTL(interface),
+                              gmxx_tx_spi_ctl.u64);
+
+               /* STX0 Training Control */
+               stxx_spi4_dat.u64 = 0;
+               /*Minimum needed by dynamic alignment */
+               stxx_spi4_dat.s.alpha = 32;
+               stxx_spi4_dat.s.max_t = 0xFFFF; /*Minimum interval is 0x20 */
+               cvmx_write_csr(CVMX_STXX_SPI4_DAT(interface),
+                              stxx_spi4_dat.u64);
+
+               /* STX0 Calendar Table. This round robbins through all ports */
+               port = 0;
+               index = 0;
+               while (port < num_ports) {
+                       union cvmx_stxx_spi4_calx stxx_spi4_calx;
+                       stxx_spi4_calx.u64 = 0;
+                       stxx_spi4_calx.s.prt0 = port++;
+                       stxx_spi4_calx.s.prt1 = port++;
+                       stxx_spi4_calx.s.prt2 = port++;
+                       stxx_spi4_calx.s.prt3 = port++;
+                       stxx_spi4_calx.s.oddpar =
+                           ~(cvmx_dpop(stxx_spi4_calx.u64) & 1);
+                       cvmx_write_csr(CVMX_STXX_SPI4_CALX(index, interface),
+                                      stxx_spi4_calx.u64);
+                       index++;
+               }
+               stxx_spi4_stat.u64 = 0;
+               stxx_spi4_stat.s.len = num_ports;
+               stxx_spi4_stat.s.m = 1;
+               cvmx_write_csr(CVMX_STXX_SPI4_STAT(interface),
+                              stxx_spi4_stat.u64);
+       }
+
+       return 0;
+}
+
+/**
+ * Callback to perform clock detection
+ *
+ * @interface: The identifier of the packet interface to configure and
+ *                  use as a SPI interface.
+ * @mode:      The operating mode for the SPI interface. The interface
+ *                  can operate as a full duplex (both Tx and Rx data paths
+ *                  active) or as a halfplex (either the Tx data path is
+ *                  active or the Rx data path is active, but not both).
+ * @timeout:   Timeout to wait for clock synchronization in seconds
+ *
+ * Returns Zero on success, non-zero error code on failure (will cause
+ * SPI initialization to abort)
+ */
+int cvmx_spi_clock_detect_cb(int interface, cvmx_spi_mode_t mode, int timeout)
+{
+       int clock_transitions;
+       union cvmx_spxx_clk_stat stat;
+       uint64_t timeout_time;
+       uint64_t MS = cvmx_sysinfo_get()->cpu_clock_hz / 1000;
+
+       /*
+        * Regardless of operating mode, both Tx and Rx clocks must be
+        * present for the SPI interface to operate.
+        */
+       cvmx_dprintf("SPI%d: Waiting to see TsClk...\n", interface);
+       timeout_time = cvmx_get_cycle() + 1000ull * MS * timeout;
+       /*
+        * Require 100 clock transitions in order to avoid any noise
+        * in the beginning.
+        */
+       clock_transitions = 100;
+       do {
+               stat.u64 = cvmx_read_csr(CVMX_SPXX_CLK_STAT(interface));
+               if (stat.s.s4clk0 && stat.s.s4clk1 && clock_transitions) {
+                       /*
+                        * We've seen a clock transition, so decrement
+                        * the number we still need.
+                        */
+                       clock_transitions--;
+                       cvmx_write_csr(CVMX_SPXX_CLK_STAT(interface), stat.u64);
+                       stat.s.s4clk0 = 0;
+                       stat.s.s4clk1 = 0;
+               }
+               if (cvmx_get_cycle() > timeout_time) {
+                       cvmx_dprintf("SPI%d: Timeout\n", interface);
+                       return -1;
+               }
+       } while (stat.s.s4clk0 == 0 || stat.s.s4clk1 == 0);
+
+       cvmx_dprintf("SPI%d: Waiting to see RsClk...\n", interface);
+       timeout_time = cvmx_get_cycle() + 1000ull * MS * timeout;
+       /*
+        * Require 100 clock transitions in order to avoid any noise in the
+        * beginning.
+        */
+       clock_transitions = 100;
+       do {
+               stat.u64 = cvmx_read_csr(CVMX_SPXX_CLK_STAT(interface));
+               if (stat.s.d4clk0 && stat.s.d4clk1 && clock_transitions) {
+                       /*
+                        * We've seen a clock transition, so decrement
+                        * the number we still need
+                        */
+                       clock_transitions--;
+                       cvmx_write_csr(CVMX_SPXX_CLK_STAT(interface), stat.u64);
+                       stat.s.d4clk0 = 0;
+                       stat.s.d4clk1 = 0;
+               }
+               if (cvmx_get_cycle() > timeout_time) {
+                       cvmx_dprintf("SPI%d: Timeout\n", interface);
+                       return -1;
+               }
+       } while (stat.s.d4clk0 == 0 || stat.s.d4clk1 == 0);
+
+       return 0;
+}
+
+/**
+ * Callback to perform link training
+ *
+ * @interface: The identifier of the packet interface to configure and
+ *                  use as a SPI interface.
+ * @mode:      The operating mode for the SPI interface. The interface
+ *                  can operate as a full duplex (both Tx and Rx data paths
+ *                  active) or as a halfplex (either the Tx data path is
+ *                  active or the Rx data path is active, but not both).
+ * @timeout:   Timeout to wait for link to be trained (in seconds)
+ *
+ * Returns Zero on success, non-zero error code on failure (will cause
+ * SPI initialization to abort)
+ */
+int cvmx_spi_training_cb(int interface, cvmx_spi_mode_t mode, int timeout)
+{
+       union cvmx_spxx_trn4_ctl spxx_trn4_ctl;
+       union cvmx_spxx_clk_stat stat;
+       uint64_t MS = cvmx_sysinfo_get()->cpu_clock_hz / 1000;
+       uint64_t timeout_time = cvmx_get_cycle() + 1000ull * MS * timeout;
+       int rx_training_needed;
+
+       /* SRX0 & STX0 Inf0 Links are configured - begin training */
+       union cvmx_spxx_clk_ctl spxx_clk_ctl;
+       spxx_clk_ctl.u64 = 0;
+       spxx_clk_ctl.s.seetrn = 0;
+       spxx_clk_ctl.s.clkdly = 0x10;
+       spxx_clk_ctl.s.runbist = 0;
+       spxx_clk_ctl.s.statdrv = 0;
+       /* This should always be on the opposite edge as statdrv */
+       spxx_clk_ctl.s.statrcv = 1;
+       spxx_clk_ctl.s.sndtrn = 1;
+       spxx_clk_ctl.s.drptrn = 1;
+       spxx_clk_ctl.s.rcvtrn = 1;
+       spxx_clk_ctl.s.srxdlck = 1;
+       cvmx_write_csr(CVMX_SPXX_CLK_CTL(interface), spxx_clk_ctl.u64);
+       cvmx_wait(1000 * MS);
+
+       /* SRX0 clear the boot bit */
+       spxx_trn4_ctl.u64 = cvmx_read_csr(CVMX_SPXX_TRN4_CTL(interface));
+       spxx_trn4_ctl.s.clr_boot = 1;
+       cvmx_write_csr(CVMX_SPXX_TRN4_CTL(interface), spxx_trn4_ctl.u64);
+
+       /* Wait for the training sequence to complete */
+       cvmx_dprintf("SPI%d: Waiting for training\n", interface);
+       cvmx_wait(1000 * MS);
+       /* Wait a really long time here */
+       timeout_time = cvmx_get_cycle() + 1000ull * MS * 600;
+       /*
+        * The HRM says we must wait for 34 + 16 * MAXDIST training sequences.
+        * We'll be pessimistic and wait for a lot more.
+        */
+       rx_training_needed = 500;
+       do {
+               stat.u64 = cvmx_read_csr(CVMX_SPXX_CLK_STAT(interface));
+               if (stat.s.srxtrn && rx_training_needed) {
+                       rx_training_needed--;
+                       cvmx_write_csr(CVMX_SPXX_CLK_STAT(interface), stat.u64);
+                       stat.s.srxtrn = 0;
+               }
+               if (cvmx_get_cycle() > timeout_time) {
+                       cvmx_dprintf("SPI%d: Timeout\n", interface);
+                       return -1;
+               }
+       } while (stat.s.srxtrn == 0);
+
+       return 0;
+}
+
+/**
+ * Callback to perform calendar data synchronization
+ *
+ * @interface: The identifier of the packet interface to configure and
+ *                  use as a SPI interface.
+ * @mode:      The operating mode for the SPI interface. The interface
+ *                  can operate as a full duplex (both Tx and Rx data paths
+ *                  active) or as a halfplex (either the Tx data path is
+ *                  active or the Rx data path is active, but not both).
+ * @timeout:   Timeout to wait for calendar data in seconds
+ *
+ * Returns Zero on success, non-zero error code on failure (will cause
+ * SPI initialization to abort)
+ */
+int cvmx_spi_calendar_sync_cb(int interface, cvmx_spi_mode_t mode, int timeout)
+{
+       uint64_t MS = cvmx_sysinfo_get()->cpu_clock_hz / 1000;
+       if (mode & CVMX_SPI_MODE_RX_HALFPLEX) {
+               /* SRX0 interface should be good, send calendar data */
+               union cvmx_srxx_com_ctl srxx_com_ctl;
+               cvmx_dprintf
+                   ("SPI%d: Rx is synchronized, start sending calendar data\n",
+                    interface);
+               srxx_com_ctl.u64 = cvmx_read_csr(CVMX_SRXX_COM_CTL(interface));
+               srxx_com_ctl.s.inf_en = 1;
+               srxx_com_ctl.s.st_en = 1;
+               cvmx_write_csr(CVMX_SRXX_COM_CTL(interface), srxx_com_ctl.u64);
+       }
+
+       if (mode & CVMX_SPI_MODE_TX_HALFPLEX) {
+               /* STX0 has achieved sync */
+               /* The corespondant board should be sending calendar data */
+               /* Enable the STX0 STAT receiver. */
+               union cvmx_spxx_clk_stat stat;
+               uint64_t timeout_time;
+               union cvmx_stxx_com_ctl stxx_com_ctl;
+               stxx_com_ctl.u64 = 0;
+               stxx_com_ctl.s.st_en = 1;
+               cvmx_write_csr(CVMX_STXX_COM_CTL(interface), stxx_com_ctl.u64);
+
+               /* Waiting for calendar sync on STX0 STAT */
+               cvmx_dprintf("SPI%d: Waiting to sync on STX[%d] STAT\n",
+                            interface, interface);
+               timeout_time = cvmx_get_cycle() + 1000ull * MS * timeout;
+               /* SPX0_CLK_STAT - SPX0_CLK_STAT[STXCAL] should be 1 (bit10) */
+               do {
+                       stat.u64 = cvmx_read_csr(CVMX_SPXX_CLK_STAT(interface));
+                       if (cvmx_get_cycle() > timeout_time) {
+                               cvmx_dprintf("SPI%d: Timeout\n", interface);
+                               return -1;
+                       }
+               } while (stat.s.stxcal == 0);
+       }
+
+       return 0;
+}
+
+/**
+ * Callback to handle interface up
+ *
+ * @interface: The identifier of the packet interface to configure and
+ *                  use as a SPI interface.
+ * @mode:      The operating mode for the SPI interface. The interface
+ *                  can operate as a full duplex (both Tx and Rx data paths
+ *                  active) or as a halfplex (either the Tx data path is
+ *                  active or the Rx data path is active, but not both).
+ *
+ * Returns Zero on success, non-zero error code on failure (will cause
+ * SPI initialization to abort)
+ */
+int cvmx_spi_interface_up_cb(int interface, cvmx_spi_mode_t mode)
+{
+       union cvmx_gmxx_rxx_frm_min gmxx_rxx_frm_min;
+       union cvmx_gmxx_rxx_frm_max gmxx_rxx_frm_max;
+       union cvmx_gmxx_rxx_jabber gmxx_rxx_jabber;
+
+       if (mode & CVMX_SPI_MODE_RX_HALFPLEX) {
+               union cvmx_srxx_com_ctl srxx_com_ctl;
+               srxx_com_ctl.u64 = cvmx_read_csr(CVMX_SRXX_COM_CTL(interface));
+               srxx_com_ctl.s.inf_en = 1;
+               cvmx_write_csr(CVMX_SRXX_COM_CTL(interface), srxx_com_ctl.u64);
+               cvmx_dprintf("SPI%d: Rx is now up\n", interface);
+       }
+
+       if (mode & CVMX_SPI_MODE_TX_HALFPLEX) {
+               union cvmx_stxx_com_ctl stxx_com_ctl;
+               stxx_com_ctl.u64 = cvmx_read_csr(CVMX_STXX_COM_CTL(interface));
+               stxx_com_ctl.s.inf_en = 1;
+               cvmx_write_csr(CVMX_STXX_COM_CTL(interface), stxx_com_ctl.u64);
+               cvmx_dprintf("SPI%d: Tx is now up\n", interface);
+       }
+
+       gmxx_rxx_frm_min.u64 = 0;
+       gmxx_rxx_frm_min.s.len = 64;
+       cvmx_write_csr(CVMX_GMXX_RXX_FRM_MIN(0, interface),
+                      gmxx_rxx_frm_min.u64);
+       gmxx_rxx_frm_max.u64 = 0;
+       gmxx_rxx_frm_max.s.len = 64 * 1024 - 4;
+       cvmx_write_csr(CVMX_GMXX_RXX_FRM_MAX(0, interface),
+                      gmxx_rxx_frm_max.u64);
+       gmxx_rxx_jabber.u64 = 0;
+       gmxx_rxx_jabber.s.cnt = 64 * 1024 - 4;
+       cvmx_write_csr(CVMX_GMXX_RXX_JABBER(0, interface), gmxx_rxx_jabber.u64);
+
+       return 0;
+}
index c8d35684504e87860074694e876d214d6c932072..f4c1b36fdf65d503a13e23de6e2c88a1b8a7bae0 100644 (file)
@@ -4,7 +4,7 @@
  * Contact: support@caviumnetworks.com
  * This file is part of the OCTEON SDK
  *
- * Copyright (c) 2003-2008 Cavium Networks
+ * Copyright (c) 2003-2010 Cavium Networks
  *
  * This file is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License, Version 2, as
  * Contact Cavium Networks for more information
  ***********************license end**************************************/
 
-/*
- * File defining functions for working with different Octeon
- * models.
- */
 #include <asm/octeon/octeon.h>
 
 /**
@@ -69,11 +65,12 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer)
        char fuse_model[10];
        uint32_t fuse_data = 0;
 
-       fus3.u64 = cvmx_read_csr(CVMX_L2D_FUS3);
+       fus3.u64 = 0;
+       if (!OCTEON_IS_MODEL(OCTEON_CN6XXX))
+               fus3.u64 = cvmx_read_csr(CVMX_L2D_FUS3);
        fus_dat2.u64 = cvmx_read_csr(CVMX_MIO_FUS_DAT2);
        fus_dat3.u64 = cvmx_read_csr(CVMX_MIO_FUS_DAT3);
-
-       num_cores = cvmx_octeon_num_cores();
+       num_cores = cvmx_pop(cvmx_read_csr(CVMX_CIU_FUSE));
 
        /* Make sure the non existent devices look disabled */
        switch ((chip_id >> 8) & 0xff) {
@@ -108,7 +105,7 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer)
         * Assume pass number is encoded using <5:3><2:0>. Exceptions
         * will be fixed later.
         */
-       sprintf(pass, "%u.%u", ((chip_id >> 3) & 7) + 1, chip_id & 7);
+       sprintf(pass, "%d.%d", (int)((chip_id >> 3) & 7) + 1, (int)chip_id & 7);
 
        /*
         * Use the number of cores to determine the last 2 digits of
@@ -116,6 +113,12 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer)
         * later.
         */
        switch (num_cores) {
+       case 32:
+               core_model = "80";
+               break;
+       case 24:
+               core_model = "70";
+               break;
        case 16:
                core_model = "60";
                break;
@@ -246,8 +249,8 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer)
                break;
        case 3:         /* CN58XX */
                family = "58";
-               /* Special case. 4 core, no crypto */
-               if ((num_cores == 4) && fus_dat2.cn38xx.nocrypto)
+               /* Special case. 4 core, half cache (CP with half cache) */
+               if ((num_cores == 4) && fus3.cn58xx.crip_1024k && !strncmp(suffix, "CP", 2))
                        core_model = "29";
 
                /* Pass 1 uses different encodings for pass numbers */
@@ -285,6 +288,9 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer)
                                suffix = "NSP";
                                if (fus_dat3.s.nozip)
                                        suffix = "SCP";
+
+                               if (fus_dat3.s.bar2_en)
+                                       suffix = "NSPB2";
                        }
                        if (fus3.cn56xx.crip_1024k)
                                family = "54";
@@ -301,6 +307,60 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer)
                else
                        family = "52";
                break;
+       case 0x93:              /* CN61XX */
+               family = "61";
+               if (fus_dat2.cn61xx.nocrypto && fus_dat2.cn61xx.dorm_crypto)
+                       suffix = "AP";
+               if (fus_dat2.cn61xx.nocrypto)
+                       suffix = "CP";
+               else if (fus_dat2.cn61xx.dorm_crypto)
+                       suffix = "DAP";
+               else if (fus_dat3.cn61xx.nozip)
+                       suffix = "SCP";
+               break;
+       case 0x90:              /* CN63XX */
+               family = "63";
+               if (fus_dat3.s.l2c_crip == 2)
+                       family = "62";
+               if (num_cores == 6)     /* Other core counts match generic */
+                       core_model = "35";
+               if (fus_dat2.cn63xx.nocrypto)
+                       suffix = "CP";
+               else if (fus_dat2.cn63xx.dorm_crypto)
+                       suffix = "DAP";
+               else if (fus_dat3.cn63xx.nozip)
+                       suffix = "SCP";
+               else
+                       suffix = "AAP";
+               break;
+       case 0x92:              /* CN66XX */
+               family = "66";
+               if (num_cores == 6)     /* Other core counts match generic */
+                       core_model = "35";
+               if (fus_dat2.cn66xx.nocrypto && fus_dat2.cn66xx.dorm_crypto)
+                       suffix = "AP";
+               if (fus_dat2.cn66xx.nocrypto)
+                       suffix = "CP";
+               else if (fus_dat2.cn66xx.dorm_crypto)
+                       suffix = "DAP";
+               else if (fus_dat3.cn66xx.nozip)
+                       suffix = "SCP";
+               else
+                       suffix = "AAP";
+               break;
+       case 0x91:              /* CN68XX */
+               family = "68";
+               if (fus_dat2.cn68xx.nocrypto && fus_dat3.cn68xx.nozip)
+                       suffix = "CP";
+               else if (fus_dat2.cn68xx.dorm_crypto)
+                       suffix = "DAP";
+               else if (fus_dat3.cn68xx.nozip)
+                       suffix = "SCP";
+               else if (fus_dat2.cn68xx.nocrypto)
+                       suffix = "SP";
+               else
+                       suffix = "AAP";
+               break;
        default:
                family = "XX";
                core_model = "XX";
@@ -310,49 +370,40 @@ const char *octeon_model_get_string_buffer(uint32_t chip_id, char *buffer)
        }
 
        clock_mhz = octeon_get_clock_rate() / 1000000;
-
        if (family[0] != '3') {
+               int fuse_base = 384 / 8;
+               if (family[0] == '6')
+                       fuse_base = 832 / 8;
+
                /* Check for model in fuses, overrides normal decode */
                /* This is _not_ valid for Octeon CN3XXX models */
-               fuse_data |= cvmx_fuse_read_byte(51);
+               fuse_data |= cvmx_fuse_read_byte(fuse_base + 3);
                fuse_data = fuse_data << 8;
-               fuse_data |= cvmx_fuse_read_byte(50);
+               fuse_data |= cvmx_fuse_read_byte(fuse_base + 2);
                fuse_data = fuse_data << 8;
-               fuse_data |= cvmx_fuse_read_byte(49);
+               fuse_data |= cvmx_fuse_read_byte(fuse_base + 1);
                fuse_data = fuse_data << 8;
-               fuse_data |= cvmx_fuse_read_byte(48);
+               fuse_data |= cvmx_fuse_read_byte(fuse_base);
                if (fuse_data & 0x7ffff) {
                        int model = fuse_data & 0x3fff;
                        int suffix = (fuse_data >> 14) & 0x1f;
                        if (suffix && model) {
-                               /*
-                                * Have both number and suffix in
-                                * fuses, so both
-                                */
-                               sprintf(fuse_model, "%d%c",
-                                       model, 'A' + suffix - 1);
+                               /* Have both number and suffix in fuses, so both */
+                               sprintf(fuse_model, "%d%c", model, 'A' + suffix - 1);
                                core_model = "";
                                family = fuse_model;
                        } else if (suffix && !model) {
-                               /*
-                                * Only have suffix, so add suffix to
-                                * 'normal' model number.
-                                */
-                               sprintf(fuse_model, "%s%c", core_model,
-                                       'A' + suffix - 1);
+                               /* Only have suffix, so add suffix to 'normal' model number */
+                               sprintf(fuse_model, "%s%c", core_model, 'A' + suffix - 1);
                                core_model = fuse_model;
                        } else {
-                               /*
-                                * Don't have suffix, so just use
-                                * model from fuses.
-                                */
+                               /* Don't have suffix, so just use model from fuses */
                                sprintf(fuse_model, "%d", model);
                                core_model = "";
                                family = fuse_model;
                        }
                }
        }
-       sprintf(buffer, "CN%s%sp%s-%d-%s",
-               family, core_model, pass, clock_mhz, suffix);
+       sprintf(buffer, "CN%s%sp%s-%d-%s", family, core_model, pass, clock_mhz, suffix);
        return buffer;
 }
index b394552e5ca02c98995341f491424c94de630e48..260b27367347b1da080e4045f00a54fa87656754 100644 (file)
@@ -759,11 +759,11 @@ void prom_free_prom_memory(void)
                        : "=r" (insn) : : "$31", "memory");
 
                if ((insn >> 26) != 0x33)
-                       panic("No PREF instruction at Core-14449 probe point.\n");
+                       panic("No PREF instruction at Core-14449 probe point.");
 
                if (((insn >> 16) & 0x1f) != 28)
                        panic("Core-14449 WAR not in place (%04x).\n"
-                             "Please build kernel with proper options (CONFIG_CAVIUM_CN63XXP1).\n", insn);
+                             "Please build kernel with proper options (CONFIG_CAVIUM_CN63XXP1).", insn);
        }
 #ifdef CONFIG_CAVIUM_DECODE_RSL
        cvmx_interrupt_rsl_enable();
@@ -771,7 +771,7 @@ void prom_free_prom_memory(void)
        /* Add an interrupt handler for general failures. */
        if (request_irq(OCTEON_IRQ_RML, octeon_rlm_interrupt, IRQF_SHARED,
                        "RML/RSL", octeon_rlm_interrupt)) {
-               panic("Unable to request_irq(OCTEON_IRQ_RML)\n");
+               panic("Unable to request_irq(OCTEON_IRQ_RML)");
        }
 #endif
 }
index efcfff4d4627c55f4238bfd3361fe937be25465e..b1535fe409d4b50935654cf04634ab81139c2992 100644 (file)
@@ -210,7 +210,7 @@ void octeon_prepare_cpus(unsigned int max_cpus)
        if (request_irq(OCTEON_IRQ_MBOX0, mailbox_interrupt,
                        IRQF_PERCPU | IRQF_NO_THREAD, "SMP-IPI",
                        mailbox_interrupt)) {
-               panic("Cannot request_irq(OCTEON_IRQ_MBOX0)\n");
+               panic("Cannot request_irq(OCTEON_IRQ_MBOX0)");
        }
 }
 
index 4044c9e0fb737d9962ad17178b8c05e14ffeaa9a..17a36c12517296f95f772396670f0610a7f29b86 100644 (file)
+CONFIG_MIPS=y
 CONFIG_MIPS_ALCHEMY=y
+CONFIG_MIPS_DB1000=y
+CONFIG_SCHED_OMIT_FRAME_POINTER=y
+CONFIG_TICK_ONESHOT=y
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
 CONFIG_HZ_100=y
-# CONFIG_SECCOMP is not set
+CONFIG_HZ=100
+CONFIG_PREEMPT_NONE=y
 CONFIG_EXPERIMENTAL=y
-CONFIG_LOCALVERSION="-db1000"
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_CROSS_COMPILE=""
+CONFIG_LOCALVERSION="-db1x00"
+CONFIG_LOCALVERSION_AUTO=y
 CONFIG_KERNEL_LZMA=y
+CONFIG_DEFAULT_HOSTNAME="db1x00"
+CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
-CONFIG_POSIX_MQUEUE=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_FHANDLE=y
+CONFIG_AUDIT=y
 CONFIG_TINY_RCU=y
-CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_LOG_BUF_SHIFT=18
+CONFIG_NAMESPACES=y
+CONFIG_UTS_NS=y
+CONFIG_IPC_NS=y
+CONFIG_USER_NS=y
+CONFIG_PID_NS=y
+CONFIG_NET_NS=y
+CONFIG_SYSCTL=y
 CONFIG_EXPERT=y
-# CONFIG_KALLSYMS is not set
-# CONFIG_PCSPKR_PLATFORM is not set
-# CONFIG_VM_EVENT_COUNTERS is not set
-# CONFIG_COMPAT_BRK is not set
+CONFIG_KALLSYMS=y
+CONFIG_KALLSYMS_ALL=y
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+CONFIG_EMBEDDED=y
+CONFIG_HAVE_PERF_EVENTS=y
+CONFIG_PERF_USE_VMALLOC=y
+CONFIG_PCI_QUIRKS=y
 CONFIG_SLAB=y
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_LBDAF is not set
-# CONFIG_BLK_DEV_BSG is not set
-# CONFIG_IOSCHED_DEADLINE is not set
-# CONFIG_IOSCHED_CFQ is not set
+CONFIG_SLABINFO=y
+CONFIG_BLOCK=y
+CONFIG_LBDAF=y
+CONFIG_BLK_DEV_BSG=y
+CONFIG_BLK_DEV_BSGLIB=y
+CONFIG_IOSCHED_NOOP=y
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+CONFIG_FREEZER=y
+CONFIG_PCI=y
+CONFIG_PCI_DOMAINS=y
 CONFIG_PCCARD=y
+CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
 CONFIG_PCMCIA_ALCHEMY_DEVBOARD=y
-CONFIG_PM=y
+CONFIG_BINFMT_ELF=y
+CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
+CONFIG_SUSPEND=y
+CONFIG_SUSPEND_FREEZER=y
+CONFIG_PM_SLEEP=y
 CONFIG_PM_RUNTIME=y
+CONFIG_PM=y
 CONFIG_NET=y
 CONFIG_PACKET=y
 CONFIG_UNIX=y
+CONFIG_XFRM=y
 CONFIG_INET=y
 CONFIG_IP_MULTICAST=y
 CONFIG_IP_PNP=y
 CONFIG_IP_PNP_DHCP=y
 CONFIG_IP_PNP_BOOTP=y
 CONFIG_IP_PNP_RARP=y
-# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET_XFRM_MODE_BEET is not set
-# CONFIG_INET_DIAG is not set
-# CONFIG_IPV6 is not set
-# CONFIG_WIRELESS is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_NET_IPIP=y
+CONFIG_INET_TUNNEL=y
+CONFIG_INET_LRO=y
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+CONFIG_IPV6=y
+CONFIG_INET6_XFRM_MODE_TRANSPORT=y
+CONFIG_INET6_XFRM_MODE_TUNNEL=y
+CONFIG_INET6_XFRM_MODE_BEET=y
+CONFIG_IPV6_SIT=y
+CONFIG_IPV6_NDISC_NODETYPE=y
+CONFIG_STP=y
+CONFIG_GARP=y
+CONFIG_BRIDGE=y
+CONFIG_BRIDGE_IGMP_SNOOPING=y
+CONFIG_VLAN_8021Q=y
+CONFIG_VLAN_8021Q_GVRP=y
+CONFIG_LLC=y
+CONFIG_LLC2=y
+CONFIG_DNS_RESOLVER=y
+CONFIG_BT=y
+CONFIG_BT_L2CAP=y
+CONFIG_BT_SCO=y
+CONFIG_BT_RFCOMM=y
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=y
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=y
+CONFIG_BT_HCIBTUSB=y
+CONFIG_UEVENT_HELPER_PATH=""
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
 CONFIG_MTD=y
-CONFIG_MTD_PARTITIONS=y
 CONFIG_MTD_CMDLINE_PARTS=y
 CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=y
 CONFIG_MTD_BLOCK=y
 CONFIG_MTD_CFI=y
+CONFIG_MTD_GEN_PROBE=y
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_CFI_NOSWAP=y
+CONFIG_MTD_CFI_GEOMETRY=y
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+CONFIG_MTD_CFI_I4=y
+CONFIG_MTD_CFI_I8=y
+CONFIG_MTD_CFI_INTELEXT=y
 CONFIG_MTD_CFI_AMDSTD=y
+CONFIG_MTD_CFI_UTIL=y
 CONFIG_MTD_PHYSMAP=y
-# CONFIG_MISC_DEVICES is not set
+CONFIG_SCSI_MOD=y
+CONFIG_SCSI=y
+CONFIG_SCSI_DMA=y
+CONFIG_SCSI_PROC_FS=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_CHR_DEV_SG=y
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_SCSI_CONSTANTS=y
+CONFIG_ATA=y
+CONFIG_ATA_VERBOSE_ERROR=y
+CONFIG_ATA_SFF=y
+CONFIG_ATA_BMDMA=y
+CONFIG_PATA_HPT37X=y
+CONFIG_PATA_PCMCIA=y
+CONFIG_MD=y
+CONFIG_BLK_DEV_DM=y
+CONFIG_FIREWIRE=y
+CONFIG_FIREWIRE_OHCI=y
+CONFIG_FIREWIRE_OHCI_DEBUG=y
+CONFIG_FIREWIRE_NET=y
 CONFIG_NETDEVICES=y
-CONFIG_MARVELL_PHY=y
-CONFIG_DAVICOM_PHY=y
-CONFIG_QSEMI_PHY=y
-CONFIG_LXT_PHY=y
-CONFIG_CICADA_PHY=y
-CONFIG_VITESSE_PHY=y
-CONFIG_SMSC_PHY=y
-CONFIG_BROADCOM_PHY=y
-CONFIG_ICPLUS_PHY=y
-CONFIG_REALTEK_PHY=y
-CONFIG_NATIONAL_PHY=y
-CONFIG_STE10XP=y
-CONFIG_LSI_ET1011C_PHY=y
-CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
+CONFIG_PHYLIB=y
+CONFIG_NET_ETHERNET=y
 CONFIG_MIPS_AU1X00_ENET=y
-# CONFIG_NETDEV_1000 is not set
-# CONFIG_NETDEV_10000 is not set
-# CONFIG_WLAN is not set
-# CONFIG_INPUT_MOUSEDEV is not set
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_3C589=y
+CONFIG_PCMCIA_PCNET=y
+CONFIG_PPP=y
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPP_FILTER=y
+CONFIG_PPP_ASYNC=y
+CONFIG_PPP_SYNC_TTY=y
+CONFIG_PPP_DEFLATE=y
+CONFIG_PPP_BSDCOMP=y
+CONFIG_PPP_MPPE=y
+CONFIG_PPPOE=y
+CONFIG_INPUT=y
 CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_SERIO is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=y
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
+CONFIG_DEVKMEM=y
 CONFIG_SERIAL_8250=y
 CONFIG_SERIAL_8250_CONSOLE=y
-# CONFIG_LEGACY_PTYS is not set
-# CONFIG_HW_RANDOM is not set
-# CONFIG_HWMON is not set
-# CONFIG_VGA_CONSOLE is not set
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_TTY_PRINTK=y
+CONFIG_DEVPORT=y
+CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
+CONFIG_FB=y
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+CONFIG_FB_AU1100=y
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x16=y
+CONFIG_SOUND=y
+CONFIG_SND=y
+CONFIG_SND_TIMER=y
+CONFIG_SND_PCM=y
+CONFIG_SND_JACK=y
+CONFIG_SND_SEQUENCER=y
+CONFIG_SND_HRTIMER=y
+CONFIG_SND_SEQ_HRTIMER_DEFAULT=y
+CONFIG_SND_DYNAMIC_MINORS=y
+CONFIG_SND_VMASTER=y
+CONFIG_SND_AC97_CODEC=y
+CONFIG_SND_SOC=y
+CONFIG_SND_SOC_AC97_BUS=y
+CONFIG_SND_SOC_AU1XAUDIO=y
+CONFIG_SND_SOC_AU1XAC97C=y
+CONFIG_SND_SOC_DB1000=y
+CONFIG_SND_SOC_AC97_CODEC=y
+CONFIG_AC97_BUS=y
+CONFIG_HID_SUPPORT=y
+CONFIG_HID=y
+CONFIG_HIDRAW=y
+CONFIG_USB_HID=y
+CONFIG_USB_SUPPORT=y
 CONFIG_USB=y
-# CONFIG_USB_DEVICE_CLASS is not set
-CONFIG_USB_DYNAMIC_MINORS=y
 CONFIG_USB_SUSPEND=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_ROOT_HUB_TT=y
+CONFIG_USB_EHCI_TT_NEWSCHED=y
 CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_UHCI_HCD=y
+CONFIG_USB_STORAGE=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_RTC_LIB=y
 CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
 CONFIG_RTC_DRV_AU1XXX=y
-CONFIG_EXT2_FS=y
-CONFIG_EXT3_FS=y
-# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
-# CONFIG_EXT3_FS_XATTR is not set
-# CONFIG_PROC_PAGE_MONITOR is not set
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_USE_FOR_EXT23=y
+CONFIG_EXT4_FS_XATTR=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_EXT4_FS_SECURITY=y
+CONFIG_JBD2=y
+CONFIG_FS_MBCACHE=y
+CONFIG_FS_POSIX_ACL=y
+CONFIG_EXPORTFS=y
+CONFIG_FILE_LOCKING=y
+CONFIG_FSNOTIFY=y
+CONFIG_DNOTIFY=y
+CONFIG_INOTIFY_USER=y
+CONFIG_GENERIC_ACL=y
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_SYSFS=y
 CONFIG_TMPFS=y
-CONFIG_CRAMFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_TMPFS_XATTR=y
+CONFIG_MISC_FILESYSTEMS=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+CONFIG_JFFS2_SUMMARY=y
+CONFIG_JFFS2_FS_XATTR=y
+CONFIG_JFFS2_FS_POSIX_ACL=y
+CONFIG_JFFS2_FS_SECURITY=y
+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+CONFIG_JFFS2_ZLIB=y
+CONFIG_JFFS2_LZO=y
+CONFIG_JFFS2_RTIME=y
+CONFIG_JFFS2_RUBIN=y
+CONFIG_JFFS2_CMODE_PRIORITY=y
 CONFIG_SQUASHFS=y
+CONFIG_SQUASHFS_ZLIB=y
+CONFIG_SQUASHFS_LZO=y
+CONFIG_SQUASHFS_XZ=y
+CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
+CONFIG_NETWORK_FILESYSTEMS=y
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+CONFIG_NFS_V4_1=y
+CONFIG_PNFS_FILE_LAYOUT=y
+CONFIG_PNFS_BLOCK=y
 CONFIG_ROOT_NFS=y
+CONFIG_NFS_USE_KERNEL_DNS=y
+CONFIG_NFS_USE_NEW_IDMAPPER=y
+CONFIG_NFSD=y
+CONFIG_NFSD_V2_ACL=y
+CONFIG_NFSD_V3=y
+CONFIG_NFSD_V3_ACL=y
+CONFIG_NFSD_V4=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_ACL_SUPPORT=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+CONFIG_SUNRPC_BACKCHANNEL=y
+CONFIG_MSDOS_PARTITION=y
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
 CONFIG_NLS_CODEPAGE_437=y
 CONFIG_NLS_CODEPAGE_850=y
 CONFIG_NLS_CODEPAGE_1250=y
+CONFIG_NLS_ASCII=y
 CONFIG_NLS_ISO8859_1=y
 CONFIG_NLS_ISO8859_15=y
 CONFIG_NLS_UTF8=y
-# CONFIG_ENABLE_WARN_DEPRECATED is not set
-# CONFIG_ENABLE_MUST_CHECK is not set
-CONFIG_STRIP_ASM_SYMS=y
-CONFIG_DEBUG_KERNEL=y
-# CONFIG_SCHED_DEBUG is not set
-# CONFIG_FTRACE is not set
+CONFIG_HAVE_ARCH_KGDB=y
+CONFIG_EARLY_PRINTK=y
+CONFIG_CMDLINE_BOOL=y
+CONFIG_CMDLINE="noirqdebug rootwait root=/dev/sda1 rootfstype=ext4 console=ttyS0,115200 video=au1100fb:panel:CRT_800x600_16"
 CONFIG_DEBUG_ZBOOT=y
 CONFIG_KEYS=y
 CONFIG_KEYS_DEBUG_PROC_KEYS=y
+CONFIG_SECURITYFS=y
+CONFIG_DEFAULT_SECURITY_DAC=y
+CONFIG_DEFAULT_SECURITY=""
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_ALGAPI2=y
+CONFIG_CRYPTO_AEAD2=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_BLKCIPHER2=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_HASH2=y
+CONFIG_CRYPTO_RNG=y
+CONFIG_CRYPTO_RNG2=y
+CONFIG_CRYPTO_PCOMP2=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_MANAGER2=y
+CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
+CONFIG_CRYPTO_WORKQUEUE=y
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_SHA1=y
+CONFIG_CRYPTO_AES=y
+CONFIG_CRYPTO_ANSI_CPRNG=y
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+CONFIG_CRC16=y
+CONFIG_CRC_ITU_T=y
+CONFIG_CRC32=y
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_LZO_COMPRESS=y
+CONFIG_LZO_DECOMPRESS=y
+CONFIG_XZ_DEC=y
diff --git a/arch/mips/configs/db1100_defconfig b/arch/mips/configs/db1100_defconfig
deleted file mode 100644 (file)
index c6b4993..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-CONFIG_MIPS_ALCHEMY=y
-CONFIG_MIPS_DB1100=y
-CONFIG_NO_HZ=y
-CONFIG_HIGH_RES_TIMERS=y
-CONFIG_HZ_100=y
-# CONFIG_SECCOMP is not set
-CONFIG_EXPERIMENTAL=y
-CONFIG_LOCALVERSION="-db1100"
-CONFIG_KERNEL_LZMA=y
-CONFIG_SYSVIPC=y
-CONFIG_POSIX_MQUEUE=y
-CONFIG_TINY_RCU=y
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_EXPERT=y
-# CONFIG_SYSCTL_SYSCALL is not set
-# CONFIG_KALLSYMS is not set
-# CONFIG_PCSPKR_PLATFORM is not set
-# CONFIG_COMPAT_BRK is not set
-CONFIG_SLAB=y
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_LBDAF is not set
-# CONFIG_BLK_DEV_BSG is not set
-# CONFIG_IOSCHED_DEADLINE is not set
-# CONFIG_IOSCHED_CFQ is not set
-CONFIG_PCCARD=y
-CONFIG_PCMCIA_ALCHEMY_DEVBOARD=y
-CONFIG_PM=y
-CONFIG_PM_RUNTIME=y
-CONFIG_NET=y
-CONFIG_PACKET=y
-CONFIG_UNIX=y
-CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
-CONFIG_IP_PNP=y
-CONFIG_IP_PNP_DHCP=y
-CONFIG_IP_PNP_BOOTP=y
-CONFIG_IP_PNP_RARP=y
-# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET_XFRM_MODE_BEET is not set
-# CONFIG_INET_DIAG is not set
-# CONFIG_IPV6 is not set
-# CONFIG_WIRELESS is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-CONFIG_MTD=y
-CONFIG_MTD_PARTITIONS=y
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-CONFIG_MTD_CFI=y
-CONFIG_MTD_CFI_AMDSTD=y
-CONFIG_MTD_PHYSMAP=y
-# CONFIG_BLK_DEV is not set
-# CONFIG_MISC_DEVICES is not set
-CONFIG_IDE=y
-CONFIG_IDE_TASK_IOCTL=y
-CONFIG_NETDEVICES=y
-CONFIG_MARVELL_PHY=y
-CONFIG_DAVICOM_PHY=y
-CONFIG_QSEMI_PHY=y
-CONFIG_LXT_PHY=y
-CONFIG_CICADA_PHY=y
-CONFIG_VITESSE_PHY=y
-CONFIG_SMSC_PHY=y
-CONFIG_BROADCOM_PHY=y
-CONFIG_ICPLUS_PHY=y
-CONFIG_REALTEK_PHY=y
-CONFIG_NATIONAL_PHY=y
-CONFIG_STE10XP=y
-CONFIG_LSI_ET1011C_PHY=y
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=y
-CONFIG_MIPS_AU1X00_ENET=y
-# CONFIG_NETDEV_1000 is not set
-# CONFIG_NETDEV_10000 is not set
-# CONFIG_WLAN is not set
-# CONFIG_INPUT_MOUSEDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_SERIO is not set
-CONFIG_VT_HW_CONSOLE_BINDING=y
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_8250_CONSOLE=y
-# CONFIG_LEGACY_PTYS is not set
-# CONFIG_HW_RANDOM is not set
-# CONFIG_HWMON is not set
-CONFIG_FB=y
-CONFIG_FB_AU1100=y
-# CONFIG_VGA_CONSOLE is not set
-CONFIG_FRAMEBUFFER_CONSOLE=y
-CONFIG_FONTS=y
-CONFIG_FONT_8x16=y
-# CONFIG_HID_SUPPORT is not set
-CONFIG_USB=y
-# CONFIG_USB_DEVICE_CLASS is not set
-CONFIG_USB_DYNAMIC_MINORS=y
-CONFIG_USB_SUSPEND=y
-CONFIG_USB_OHCI_HCD=y
-CONFIG_RTC_CLASS=y
-CONFIG_RTC_DRV_AU1XXX=y
-CONFIG_EXT2_FS=y
-# CONFIG_PROC_PAGE_MONITOR is not set
-CONFIG_TMPFS=y
-CONFIG_JFFS2_FS=y
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_FS_XATTR=y
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_LZO=y
-CONFIG_JFFS2_RUBIN=y
-CONFIG_SQUASHFS=y
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-CONFIG_ROOT_NFS=y
-CONFIG_STRIP_ASM_SYMS=y
-CONFIG_DEBUG_KERNEL=y
-# CONFIG_SCHED_DEBUG is not set
-# CONFIG_FTRACE is not set
-CONFIG_DEBUG_ZBOOT=y
-CONFIG_KEYS=y
-CONFIG_KEYS_DEBUG_PROC_KEYS=y
-CONFIG_SECURITYFS=y
diff --git a/arch/mips/configs/db1300_defconfig b/arch/mips/configs/db1300_defconfig
new file mode 100644 (file)
index 0000000..c38b190
--- /dev/null
@@ -0,0 +1,391 @@
+CONFIG_MIPS=y
+CONFIG_MIPS_ALCHEMY=y
+CONFIG_ALCHEMY_GPIOINT_AU1300=y
+CONFIG_MIPS_DB1300=y
+CONFIG_SOC_AU1300=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_ARCH_SUPPORTS_OPROFILE=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_CMOS_UPDATE=y
+CONFIG_SCHED_OMIT_FRAME_POINTER=y
+CONFIG_CEVT_R4K_LIB=y
+CONFIG_CSRC_R4K_LIB=y
+CONFIG_DMA_COHERENT=y
+CONFIG_SYS_HAS_EARLY_PRINTK=y
+CONFIG_MIPS_DISABLE_OBSOLETE_IDE=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_CPU_LITTLE_ENDIAN=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
+CONFIG_IRQ_CPU=y
+CONFIG_MIPS_L1_CACHE_SHIFT=5
+CONFIG_CPU_MIPS32_R1=y
+CONFIG_SYS_SUPPORTS_ZBOOT=y
+CONFIG_SYS_HAS_CPU_MIPS32_R1=y
+CONFIG_CPU_MIPS32=y
+CONFIG_CPU_MIPSR1=y
+CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
+CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
+CONFIG_HARDWARE_WATCHPOINTS=y
+CONFIG_32BIT=y
+CONFIG_PAGE_SIZE_4KB=y
+CONFIG_FORCE_MAX_ZONEORDER=11
+CONFIG_CPU_HAS_PREFETCH=y
+CONFIG_MIPS_MT_DISABLED=y
+CONFIG_64BIT_PHYS_ADDR=y
+CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
+CONFIG_CPU_HAS_SYNC=y
+CONFIG_CPU_SUPPORTS_HIGHMEM=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_SPLIT_PTLOCK_CPUS=4
+CONFIG_COMPACTION=y
+CONFIG_MIGRATION=y
+CONFIG_PHYS_ADDR_T_64BIT=y
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_VIRT_TO_BUS=y
+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+CONFIG_NEED_PER_CPU_KM=y
+CONFIG_TICK_ONESHOT=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+CONFIG_HZ_100=y
+CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
+CONFIG_HZ=100
+CONFIG_PREEMPT_NONE=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+CONFIG_CONSTRUCTORS=y
+CONFIG_HAVE_IRQ_WORK=y
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_CROSS_COMPILE=""
+CONFIG_LOCALVERSION="-db1300"
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_HAVE_KERNEL_GZIP=y
+CONFIG_HAVE_KERNEL_BZIP2=y
+CONFIG_HAVE_KERNEL_LZMA=y
+CONFIG_HAVE_KERNEL_LZO=y
+CONFIG_KERNEL_LZMA=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_POSIX_MQUEUE_SYSCTL=y
+CONFIG_FHANDLE=y
+CONFIG_HAVE_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_GENERIC_IRQ_SHOW=y
+CONFIG_TINY_RCU=y
+CONFIG_LOG_BUF_SHIFT=19
+CONFIG_NAMESPACES=y
+CONFIG_UTS_NS=y
+CONFIG_IPC_NS=y
+CONFIG_USER_NS=y
+CONFIG_PID_NS=y
+CONFIG_NET_NS=y
+CONFIG_SYSCTL=y
+CONFIG_ANON_INODES=y
+CONFIG_EXPERT=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+CONFIG_KALLSYMS_ALL=y
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+CONFIG_EMBEDDED=y
+CONFIG_HAVE_PERF_EVENTS=y
+CONFIG_PERF_USE_VMALLOC=y
+CONFIG_SLAB=y
+CONFIG_HAVE_OPROFILE=y
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_DMA_ATTRS=y
+CONFIG_HAVE_DMA_API_DEBUG=y
+CONFIG_HAVE_ARCH_JUMP_LABEL=y
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
+CONFIG_BLOCK=y
+CONFIG_LBDAF=y
+CONFIG_BLK_DEV_BSG=y
+CONFIG_IOSCHED_NOOP=y
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+CONFIG_INLINE_SPIN_UNLOCK=y
+CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
+CONFIG_INLINE_READ_UNLOCK=y
+CONFIG_INLINE_READ_UNLOCK_IRQ=y
+CONFIG_INLINE_WRITE_UNLOCK=y
+CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
+CONFIG_MMU=y
+CONFIG_PCCARD=y
+CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
+CONFIG_PCMCIA_ALCHEMY_DEVBOARD=y
+CONFIG_BINFMT_ELF=y
+CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
+CONFIG_TRAD_SIGNALS=y
+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+CONFIG_IP_PNP_RARP=y
+CONFIG_INET_TUNNEL=y
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+CONFIG_IPV6=y
+CONFIG_INET6_XFRM_MODE_TRANSPORT=y
+CONFIG_INET6_XFRM_MODE_TUNNEL=y
+CONFIG_INET6_XFRM_MODE_BEET=y
+CONFIG_IPV6_SIT=y
+CONFIG_IPV6_NDISC_NODETYPE=y
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+CONFIG_FIRMWARE_IN_KERNEL=y
+CONFIG_EXTRA_FIRMWARE=""
+CONFIG_MTD=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_CFI=y
+CONFIG_MTD_GEN_PROBE=y
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+CONFIG_MTD_CFI_AMDSTD=y
+CONFIG_MTD_CFI_UTIL=y
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_NAND_ECC=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_IDS=y
+CONFIG_MTD_NAND_PLATFORM=y
+CONFIG_BLK_DEV=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_UB=y
+CONFIG_HAVE_IDE=y
+CONFIG_IDE=y
+CONFIG_IDE_GD=y
+CONFIG_IDE_GD_ATA=y
+CONFIG_BLK_DEV_IDECS=y
+CONFIG_IDE_TASK_IOCTL=y
+CONFIG_IDE_PROC_FS=y
+CONFIG_BLK_DEV_PLATFORM=y
+CONFIG_SCSI_MOD=y
+CONFIG_NETDEVICES=y
+CONFIG_MII=y
+CONFIG_PHYLIB=y
+CONFIG_SMSC_PHY=y
+CONFIG_NET_ETHERNET=y
+CONFIG_SMSC911X=y
+CONFIG_INPUT=y
+CONFIG_INPUT_EVDEV=y
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_WM97XX=y
+CONFIG_TOUCHSCREEN_WM9712=y
+CONFIG_TOUCHSCREEN_WM9713=y
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=y
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+CONFIG_VT_HW_CONSOLE_BINDING=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_I2C=y
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_SMBUS=y
+CONFIG_I2C_AU1550=y
+CONFIG_SPI=y
+CONFIG_SPI_MASTER=y
+CONFIG_SPI_AU1550=y
+CONFIG_SPI_BITBANG=y
+CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
+CONFIG_HWMON=y
+CONFIG_HWMON_VID=y
+CONFIG_SENSORS_ADM1025=y
+CONFIG_FB=y
+CONFIG_FB_AU1200=y
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FONTS=y
+CONFIG_FONT_ACORN_8x8=y
+CONFIG_LOGO=y
+CONFIG_LOGO_LINUX_CLUT224=y
+CONFIG_SOUND=y
+CONFIG_SND=y
+CONFIG_SND_TIMER=y
+CONFIG_SND_PCM=y
+CONFIG_SND_JACK=y
+CONFIG_SND_HRTIMER=y
+CONFIG_SND_DYNAMIC_MINORS=y
+CONFIG_SND_VERBOSE_PROCFS=y
+CONFIG_SND_VERBOSE_PRINTK=y
+CONFIG_SND_VMASTER=y
+CONFIG_SND_AC97_CODEC=y
+CONFIG_SND_SOC=y
+CONFIG_SND_SOC_CACHE_LZO=y
+CONFIG_SND_SOC_AC97_BUS=y
+CONFIG_SND_SOC_AU1XPSC=y
+CONFIG_SND_SOC_AU1XPSC_I2S=y
+CONFIG_SND_SOC_AU1XPSC_AC97=y
+CONFIG_SND_SOC_DB1300=y
+CONFIG_SND_SOC_I2C_AND_SPI=y
+CONFIG_SND_SOC_WM8731=y
+CONFIG_SND_SOC_WM9712=y
+CONFIG_AC97_BUS=y
+CONFIG_HID_SUPPORT=y
+CONFIG_HID=y
+CONFIG_HIDRAW=y
+CONFIG_USB_HID=y
+CONFIG_USB_HIDDEV=y
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_EHCI=y
+CONFIG_USB=y
+CONFIG_USB_DYNAMIC_MINORS=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_ROOT_HUB_TT=y
+CONFIG_USB_EHCI_TT_NEWSCHED=y
+CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+CONFIG_RTC_INTF_DEV_UIE_EMUL=y
+CONFIG_RTC_DRV_AU1XXX=y
+CONFIG_EXT2_FS=y
+CONFIG_FS_POSIX_ACL=y
+CONFIG_EXPORTFS=y
+CONFIG_FILE_LOCKING=y
+CONFIG_FSNOTIFY=y
+CONFIG_DNOTIFY=y
+CONFIG_INOTIFY_USER=y
+CONFIG_GENERIC_ACL=y
+CONFIG_FAT_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_TMPFS_XATTR=y
+CONFIG_MISC_FILESYSTEMS=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+CONFIG_JFFS2_SUMMARY=y
+CONFIG_JFFS2_FS_XATTR=y
+CONFIG_JFFS2_FS_POSIX_ACL=y
+CONFIG_JFFS2_FS_SECURITY=y
+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+CONFIG_JFFS2_ZLIB=y
+CONFIG_JFFS2_LZO=y
+CONFIG_JFFS2_RTIME=y
+CONFIG_JFFS2_RUBIN=y
+CONFIG_JFFS2_CMODE_PRIORITY=y
+CONFIG_SQUASHFS=y
+CONFIG_SQUASHFS_XZ=y
+CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
+CONFIG_NETWORK_FILESYSTEMS=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+CONFIG_MSDOS_PARTITION=y
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_850=y
+CONFIG_NLS_ASCII=y
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_15=y
+CONFIG_NLS_UTF8=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_PRINTK_TIME=y
+CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=1024
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_STRIP_ASM_SYMS=y
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
+CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
+CONFIG_HAVE_DYNAMIC_FTRACE=y
+CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+CONFIG_HAVE_C_RECORDMCOUNT=y
+CONFIG_TRACING_SUPPORT=y
+CONFIG_HAVE_ARCH_KGDB=y
+CONFIG_EARLY_PRINTK=y
+CONFIG_CMDLINE_BOOL=y
+CONFIG_CMDLINE="video=au1200fb:panel:bs console=tty console=ttyS2,115200"
+CONFIG_DEBUG_ZBOOT=y
+CONFIG_DEFAULT_SECURITY_DAC=y
+CONFIG_DEFAULT_SECURITY=""
+CONFIG_CRYPTO=y
+CONFIG_BITREVERSE=y
+CONFIG_CRC32=y
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_LZO_COMPRESS=y
+CONFIG_LZO_DECOMPRESS=y
+CONFIG_XZ_DEC=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+CONFIG_NLATTR=y
+CONFIG_GENERIC_ATOMIC64=y
diff --git a/arch/mips/configs/db1500_defconfig b/arch/mips/configs/db1500_defconfig
deleted file mode 100644 (file)
index b6e21c7..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-CONFIG_MIPS_ALCHEMY=y
-CONFIG_MIPS_DB1500=y
-CONFIG_CPU_LITTLE_ENDIAN=y
-CONFIG_NO_HZ=y
-CONFIG_HIGH_RES_TIMERS=y
-CONFIG_HZ_100=y
-# CONFIG_SECCOMP is not set
-CONFIG_EXPERIMENTAL=y
-CONFIG_LOCALVERSION="-db1500"
-CONFIG_KERNEL_LZMA=y
-CONFIG_SYSVIPC=y
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_EXPERT=y
-# CONFIG_KALLSYMS is not set
-# CONFIG_PCSPKR_PLATFORM is not set
-# CONFIG_VM_EVENT_COUNTERS is not set
-# CONFIG_COMPAT_BRK is not set
-CONFIG_SLAB=y
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_IOSCHED_DEADLINE is not set
-# CONFIG_IOSCHED_CFQ is not set
-CONFIG_PCI=y
-CONFIG_PCCARD=y
-# CONFIG_CARDBUS is not set
-CONFIG_PCMCIA_ALCHEMY_DEVBOARD=y
-CONFIG_PM=y
-CONFIG_PM_RUNTIME=y
-CONFIG_NET=y
-CONFIG_PACKET=y
-CONFIG_UNIX=y
-CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
-CONFIG_IP_PNP=y
-CONFIG_IP_PNP_DHCP=y
-CONFIG_IP_PNP_BOOTP=y
-CONFIG_IP_PNP_RARP=y
-# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET_XFRM_MODE_BEET is not set
-# CONFIG_INET_DIAG is not set
-# CONFIG_IPV6 is not set
-# CONFIG_WIRELESS is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-CONFIG_MTD=y
-CONFIG_MTD_PARTITIONS=y
-CONFIG_MTD_CMDLINE_PARTS=y
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-CONFIG_MTD_CFI=y
-CONFIG_MTD_CFI_INTELEXT=y
-CONFIG_MTD_CFI_AMDSTD=y
-CONFIG_MTD_PHYSMAP=y
-# CONFIG_MISC_DEVICES is not set
-CONFIG_IDE=y
-CONFIG_BLK_DEV_IDECS=y
-# CONFIG_IDEPCI_PCIBUS_ORDER is not set
-CONFIG_BLK_DEV_HPT366=y
-CONFIG_NETDEVICES=y
-CONFIG_MARVELL_PHY=y
-CONFIG_DAVICOM_PHY=y
-CONFIG_QSEMI_PHY=y
-CONFIG_LXT_PHY=y
-CONFIG_CICADA_PHY=y
-CONFIG_VITESSE_PHY=y
-CONFIG_SMSC_PHY=y
-CONFIG_BROADCOM_PHY=y
-CONFIG_ICPLUS_PHY=y
-CONFIG_REALTEK_PHY=y
-CONFIG_NATIONAL_PHY=y
-CONFIG_STE10XP=y
-CONFIG_LSI_ET1011C_PHY=y
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=y
-CONFIG_MIPS_AU1X00_ENET=y
-# CONFIG_NETDEV_1000 is not set
-# CONFIG_NETDEV_10000 is not set
-# CONFIG_WLAN is not set
-# CONFIG_INPUT_MOUSEDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_SERIO is not set
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_8250_CONSOLE=y
-# CONFIG_SERIAL_8250_PCI is not set
-# CONFIG_LEGACY_PTYS is not set
-# CONFIG_HW_RANDOM is not set
-# CONFIG_HWMON is not set
-# CONFIG_VGA_ARB is not set
-# CONFIG_VGA_CONSOLE is not set
-# CONFIG_HID_SUPPORT is not set
-CONFIG_USB=y
-# CONFIG_USB_DEVICE_CLASS is not set
-CONFIG_USB_DYNAMIC_MINORS=y
-CONFIG_USB_SUSPEND=y
-CONFIG_USB_OHCI_HCD=y
-CONFIG_RTC_CLASS=y
-CONFIG_RTC_DRV_AU1XXX=y
-CONFIG_EXT2_FS=y
-# CONFIG_PROC_PAGE_MONITOR is not set
-CONFIG_TMPFS=y
-CONFIG_JFFS2_FS=y
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_FS_XATTR=y
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_LZO=y
-CONFIG_JFFS2_RUBIN=y
-CONFIG_SQUASHFS=y
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-CONFIG_ROOT_NFS=y
-CONFIG_NLS_CODEPAGE_437=y
-CONFIG_NLS_CODEPAGE_850=y
-CONFIG_NLS_CODEPAGE_1250=y
-CONFIG_NLS_ASCII=y
-CONFIG_NLS_ISO8859_1=y
-CONFIG_NLS_ISO8859_15=y
-CONFIG_NLS_UTF8=y
-CONFIG_STRIP_ASM_SYMS=y
-CONFIG_DEBUG_KERNEL=y
-# CONFIG_SCHED_DEBUG is not set
-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
-# CONFIG_FTRACE is not set
-CONFIG_DEBUG_ZBOOT=y
-CONFIG_KEYS=y
-CONFIG_KEYS_DEBUG_PROC_KEYS=y
-CONFIG_SECURITYFS=y
index 798a553c9e80fb7154df4e42dcb06e1d9c7d7382..36cda27725e7e23c1745a960478bbc3edff0662c 100644 (file)
+CONFIG_MIPS=y
 CONFIG_MIPS_ALCHEMY=y
 CONFIG_MIPS_DB1550=y
+CONFIG_SCHED_OMIT_FRAME_POINTER=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_TICK_ONESHOT=y
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
 CONFIG_HZ_100=y
-# CONFIG_SECCOMP is not set
+CONFIG_HZ=100
 CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 CONFIG_LOCALVERSION="-db1550"
+CONFIG_LOCALVERSION_AUTO=y
 CONFIG_KERNEL_LZMA=y
+CONFIG_DEFAULT_HOSTNAME="db1550"
+CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
 CONFIG_POSIX_MQUEUE=y
+CONFIG_POSIX_MQUEUE_SYSCTL=y
+CONFIG_FHANDLE=y
+CONFIG_AUDIT=y
 CONFIG_TINY_RCU=y
-CONFIG_LOG_BUF_SHIFT=14
+CONFIG_LOG_BUF_SHIFT=18
+CONFIG_NAMESPACES=y
+CONFIG_UTS_NS=y
+CONFIG_IPC_NS=y
+CONFIG_USER_NS=y
+CONFIG_PID_NS=y
+CONFIG_NET_NS=y
 CONFIG_EXPERT=y
-# CONFIG_SYSCTL_SYSCALL is not set
-# CONFIG_KALLSYMS is not set
-# CONFIG_PCSPKR_PLATFORM is not set
-# CONFIG_VM_EVENT_COUNTERS is not set
-# CONFIG_COMPAT_BRK is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+CONFIG_EMBEDDED=y
+CONFIG_PCI_QUIRKS=y
 CONFIG_SLAB=y
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_IOSCHED_DEADLINE is not set
-# CONFIG_IOSCHED_CFQ is not set
+CONFIG_BLOCK=y
+CONFIG_LBDAF=y
+CONFIG_BLK_DEV_BSG=y
+CONFIG_BLK_DEV_BSGLIB=y
+CONFIG_IOSCHED_NOOP=y
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
 CONFIG_PCI=y
 CONFIG_PCCARD=y
-# CONFIG_CARDBUS is not set
+CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
 CONFIG_PCMCIA_ALCHEMY_DEVBOARD=y
-CONFIG_PM=y
+CONFIG_BINFMT_ELF=y
+CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
+CONFIG_BINFMT_MISC=y
+CONFIG_SUSPEND=y
+CONFIG_SUSPEND_FREEZER=y
+CONFIG_PM_SLEEP=y
 CONFIG_PM_RUNTIME=y
+CONFIG_PM=y
 CONFIG_NET=y
 CONFIG_PACKET=y
 CONFIG_UNIX=y
+CONFIG_XFRM=y
 CONFIG_INET=y
 CONFIG_IP_MULTICAST=y
 CONFIG_IP_PNP=y
 CONFIG_IP_PNP_DHCP=y
 CONFIG_IP_PNP_BOOTP=y
 CONFIG_IP_PNP_RARP=y
-# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET_XFRM_MODE_BEET is not set
-# CONFIG_INET_DIAG is not set
-# CONFIG_IPV6 is not set
-# CONFIG_WIRELESS is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_INET_TUNNEL=y
+CONFIG_INET_LRO=y
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+CONFIG_IPV6=y
+CONFIG_INET6_XFRM_MODE_TRANSPORT=y
+CONFIG_INET6_XFRM_MODE_TUNNEL=y
+CONFIG_INET6_XFRM_MODE_BEET=y
+CONFIG_IPV6_SIT=y
+CONFIG_IPV6_NDISC_NODETYPE=y
+CONFIG_DNS_RESOLVER=y
+CONFIG_UEVENT_HELPER_PATH=""
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+CONFIG_FIRMWARE_IN_KERNEL=y
 CONFIG_MTD=y
-CONFIG_MTD_PARTITIONS=y
 CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=y
 CONFIG_MTD_BLOCK=y
 CONFIG_MTD_CFI=y
+CONFIG_MTD_GEN_PROBE=y
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
 CONFIG_MTD_CFI_AMDSTD=y
+CONFIG_MTD_CFI_UTIL=y
 CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_M25P80=y
+CONFIG_MTD_NAND_ECC=y
 CONFIG_MTD_NAND=y
-CONFIG_MTD_NAND_AU1550=y
-CONFIG_BLK_DEV_UB=y
-# CONFIG_MISC_DEVICES is not set
-CONFIG_IDE=y
-CONFIG_BLK_DEV_IDECS=y
-CONFIG_BLK_DEV_IDECD=y
-# CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS is not set
-CONFIG_IDE_TASK_IOCTL=y
-# CONFIG_IDEPCI_PCIBUS_ORDER is not set
-CONFIG_BLK_DEV_HPT366=y
+CONFIG_MTD_NAND_IDS=y
+CONFIG_MTD_NAND_PLATFORM=y
+CONFIG_MISC_DEVICES=y
+CONFIG_EEPROM_AT24=y
+CONFIG_SCSI_MOD=y
+CONFIG_SCSI=y
+CONFIG_SCSI_DMA=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_CHR_DEV_SG=y
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_SCSI_SCAN_ASYNC=y
+CONFIG_ATA=y
+CONFIG_ATA_SFF=y
+CONFIG_ATA_BMDMA=y
+CONFIG_PATA_HPT37X=y
+CONFIG_PATA_PCMCIA=y
+CONFIG_MD=y
+CONFIG_BLK_DEV_DM=y
 CONFIG_NETDEVICES=y
-CONFIG_MARVELL_PHY=y
-CONFIG_DAVICOM_PHY=y
-CONFIG_QSEMI_PHY=y
-CONFIG_LXT_PHY=y
-CONFIG_CICADA_PHY=y
-CONFIG_VITESSE_PHY=y
-CONFIG_SMSC_PHY=y
-CONFIG_BROADCOM_PHY=y
-CONFIG_ICPLUS_PHY=y
-CONFIG_REALTEK_PHY=y
-CONFIG_NATIONAL_PHY=y
-CONFIG_STE10XP=y
-CONFIG_LSI_ET1011C_PHY=y
-CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
+CONFIG_PHYLIB=y
+CONFIG_NET_ETHERNET=y
 CONFIG_MIPS_AU1X00_ENET=y
-# CONFIG_NETDEV_1000 is not set
-# CONFIG_NETDEV_10000 is not set
-# CONFIG_WLAN is not set
-# CONFIG_INPUT_MOUSEDEV is not set
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_3C589=y
+CONFIG_PCMCIA_PCNET=y
+CONFIG_INPUT=y
 CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_SERIO is not set
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
+CONFIG_DEVKMEM=y
 CONFIG_SERIAL_8250=y
 CONFIG_SERIAL_8250_CONSOLE=y
-# CONFIG_LEGACY_PTYS is not set
-# CONFIG_HW_RANDOM is not set
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_DEVPORT=y
 CONFIG_I2C=y
-# CONFIG_I2C_COMPAT is not set
+CONFIG_I2C_BOARDINFO=y
 CONFIG_I2C_CHARDEV=y
-# CONFIG_I2C_HELPER_AUTO is not set
 CONFIG_I2C_AU1550=y
 CONFIG_SPI=y
+CONFIG_SPI_MASTER=y
 CONFIG_SPI_AU1550=y
-# CONFIG_HWMON is not set
-# CONFIG_VGA_ARB is not set
-# CONFIG_VGA_CONSOLE is not set
+CONFIG_SPI_BITBANG=y
+CONFIG_HWMON=y
+CONFIG_SENSORS_ADM1025=y
+CONFIG_SENSORS_LM70=y
+CONFIG_DUMMY_CONSOLE=y
 CONFIG_SOUND=y
 CONFIG_SND=y
-CONFIG_SND_HRTIMER=y
-CONFIG_SND_DYNAMIC_MINORS=y
-# CONFIG_SND_SUPPORT_OLD_API is not set
-# CONFIG_SND_VERBOSE_PROCFS is not set
-# CONFIG_SND_DRIVERS is not set
-# CONFIG_SND_PCI is not set
-# CONFIG_SND_SPI is not set
-# CONFIG_SND_MIPS is not set
-# CONFIG_SND_PCMCIA is not set
+CONFIG_SND_TIMER=y
+CONFIG_SND_PCM=y
+CONFIG_SND_JACK=y
+CONFIG_SND_VMASTER=y
+CONFIG_SND_AC97_CODEC=y
 CONFIG_SND_SOC=y
+CONFIG_SND_SOC_AC97_BUS=y
 CONFIG_SND_SOC_AU1XPSC=y
-# CONFIG_HID_SUPPORT is not set
+CONFIG_SND_SOC_AU1XPSC_I2S=y
+CONFIG_SND_SOC_AU1XPSC_AC97=y
+CONFIG_SND_SOC_DB1200=y
+CONFIG_SND_SOC_I2C_AND_SPI=y
+CONFIG_SND_SOC_AC97_CODEC=y
+CONFIG_SND_SOC_WM8731=y
+CONFIG_SND_SOC_WM9712=y
+CONFIG_AC97_BUS=y
 CONFIG_USB=y
-# CONFIG_USB_DEVICE_CLASS is not set
 CONFIG_USB_DYNAMIC_MINORS=y
-CONFIG_USB_SUSPEND=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_EHCI_ROOT_HUB_TT=y
+CONFIG_USB_EHCI_TT_NEWSCHED=y
 CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+CONFIG_USB_UHCI_HCD=y
+CONFIG_USB_STORAGE=y
+CONFIG_RTC_LIB=y
 CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
 CONFIG_RTC_DRV_AU1XXX=y
-CONFIG_EXT2_FS=y
-# CONFIG_PROC_PAGE_MONITOR is not set
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_USE_FOR_EXT23=y
+CONFIG_EXT4_FS_XATTR=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_EXT4_FS_SECURITY=y
+CONFIG_JBD2=y
+CONFIG_FS_MBCACHE=y
+CONFIG_FS_POSIX_ACL=y
+CONFIG_EXPORTFS=y
+CONFIG_FILE_LOCKING=y
+CONFIG_FSNOTIFY=y
+CONFIG_DNOTIFY=y
+CONFIG_INOTIFY_USER=y
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_SYSFS=y
 CONFIG_TMPFS=y
 CONFIG_CONFIGFS_FS=y
+CONFIG_MISC_FILESYSTEMS=y
 CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+CONFIG_JFFS2_FS_WRITEBUFFER=y
 CONFIG_JFFS2_SUMMARY=y
 CONFIG_JFFS2_FS_XATTR=y
-# CONFIG_JFFS2_FS_POSIX_ACL is not set
-# CONFIG_JFFS2_FS_SECURITY is not set
 CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+CONFIG_JFFS2_ZLIB=y
 CONFIG_JFFS2_LZO=y
+CONFIG_JFFS2_RTIME=y
 CONFIG_JFFS2_RUBIN=y
+CONFIG_JFFS2_CMODE_PRIORITY=y
 CONFIG_SQUASHFS=y
+CONFIG_SQUASHFS_ZLIB=y
+CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
+CONFIG_NETWORK_FILESYSTEMS=y
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
+CONFIG_NFS_V3_ACL=y
+CONFIG_NFS_V4=y
+CONFIG_NFS_V4_1=y
+CONFIG_PNFS_FILE_LAYOUT=y
+CONFIG_PNFS_BLOCK=y
 CONFIG_ROOT_NFS=y
+CONFIG_NFS_USE_KERNEL_DNS=y
+CONFIG_NFS_USE_NEW_IDMAPPER=y
+CONFIG_NFSD=y
+CONFIG_NFSD_V2_ACL=y
+CONFIG_NFSD_V3=y
+CONFIG_NFSD_V3_ACL=y
+CONFIG_NFSD_V4=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_ACL_SUPPORT=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+CONFIG_SUNRPC_BACKCHANNEL=y
+CONFIG_MSDOS_PARTITION=y
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
 CONFIG_NLS_CODEPAGE_437=y
 CONFIG_NLS_CODEPAGE_850=y
 CONFIG_NLS_CODEPAGE_852=y
@@ -148,10 +265,21 @@ CONFIG_NLS_ASCII=y
 CONFIG_NLS_ISO8859_1=y
 CONFIG_NLS_ISO8859_15=y
 CONFIG_NLS_UTF8=y
-CONFIG_DEBUG_KERNEL=y
-# CONFIG_SCHED_DEBUG is not set
-# CONFIG_FTRACE is not set
-CONFIG_DEBUG_ZBOOT=y
+CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4
+CONFIG_FRAME_WARN=1024
+CONFIG_CMDLINE_BOOL=y
+CONFIG_CMDLINE="noirqdebug console=ttyS0,115200 root=/dev/sda1 rootfstype=ext4"
 CONFIG_KEYS=y
-CONFIG_KEYS_DEBUG_PROC_KEYS=y
 CONFIG_SECURITYFS=y
+CONFIG_DEFAULT_SECURITY_DAC=y
+CONFIG_BITREVERSE=y
+CONFIG_CRC16=y
+CONFIG_CRC_ITU_T=y
+CONFIG_CRC32=y
+CONFIG_AUDIT_GENERIC=y
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_LZO_COMPRESS=y
+CONFIG_LZO_DECOMPRESS=y
+CONFIG_BCH=y
+CONFIG_NLATTR=y
diff --git a/arch/mips/configs/nlm_xlp_defconfig b/arch/mips/configs/nlm_xlp_defconfig
new file mode 100644 (file)
index 0000000..4479fd6
--- /dev/null
@@ -0,0 +1,570 @@
+CONFIG_NLM_XLP_BOARD=y
+CONFIG_64BIT=y
+CONFIG_KSM=y
+CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
+CONFIG_SMP=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+# CONFIG_SECCOMP is not set
+CONFIG_USE_OF=y
+CONFIG_EXPERIMENTAL=y
+CONFIG_CROSS_COMPILE="mips-linux-gnu-"
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_TASKSTATS=y
+CONFIG_TASK_DELAY_ACCT=y
+CONFIG_TASK_XACCT=y
+CONFIG_TASK_IO_ACCOUNTING=y
+CONFIG_AUDIT=y
+CONFIG_CGROUPS=y
+CONFIG_NAMESPACES=y
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE="usr/dev_file_list usr/rootfs.xlp"
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_INITRAMFS_COMPRESSION_LZMA=y
+CONFIG_KALLSYMS_ALL=y
+CONFIG_EMBEDDED=y
+# CONFIG_COMPAT_BRK is not set
+CONFIG_PROFILING=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODVERSIONS=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_BLK_DEV_INTEGRITY=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_BINFMT_MISC=y
+CONFIG_MIPS32_COMPAT=y
+CONFIG_MIPS32_O32=y
+CONFIG_MIPS32_N32=y
+CONFIG_PM_RUNTIME=y
+CONFIG_PM_DEBUG=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=m
+CONFIG_NET_KEY=m
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_ROUTE_MULTIPATH=y
+CONFIG_IP_ROUTE_VERBOSE=y
+CONFIG_NET_IPIP=m
+CONFIG_IP_MROUTE=y
+CONFIG_IP_PIMSM_V1=y
+CONFIG_IP_PIMSM_V2=y
+CONFIG_SYN_COOKIES=y
+CONFIG_INET_AH=m
+CONFIG_INET_ESP=m
+CONFIG_INET_IPCOMP=m
+CONFIG_INET_XFRM_MODE_TRANSPORT=m
+CONFIG_INET_XFRM_MODE_TUNNEL=m
+CONFIG_INET_XFRM_MODE_BEET=m
+CONFIG_TCP_CONG_ADVANCED=y
+CONFIG_TCP_CONG_HSTCP=m
+CONFIG_TCP_CONG_HYBLA=m
+CONFIG_TCP_CONG_SCALABLE=m
+CONFIG_TCP_CONG_LP=m
+CONFIG_TCP_CONG_VENO=m
+CONFIG_TCP_CONG_YEAH=m
+CONFIG_TCP_CONG_ILLINOIS=m
+CONFIG_TCP_MD5SIG=y
+CONFIG_IPV6=y
+CONFIG_IPV6_PRIVACY=y
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m
+CONFIG_IPV6_SIT=m
+CONFIG_IPV6_TUNNEL=m
+CONFIG_IPV6_MULTIPLE_TABLES=y
+CONFIG_NETLABEL=y
+CONFIG_NETFILTER=y
+CONFIG_NF_CONNTRACK=m
+CONFIG_NF_CONNTRACK_SECMARK=y
+CONFIG_NF_CONNTRACK_EVENTS=y
+CONFIG_NF_CT_PROTO_UDPLITE=m
+CONFIG_NF_CONNTRACK_AMANDA=m
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_H323=m
+CONFIG_NF_CONNTRACK_IRC=m
+CONFIG_NF_CONNTRACK_NETBIOS_NS=m
+CONFIG_NF_CONNTRACK_PPTP=m
+CONFIG_NF_CONNTRACK_SANE=m
+CONFIG_NF_CONNTRACK_SIP=m
+CONFIG_NF_CONNTRACK_TFTP=m
+CONFIG_NF_CT_NETLINK=m
+CONFIG_NETFILTER_TPROXY=m
+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
+CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
+CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m
+CONFIG_NETFILTER_XT_TARGET_DSCP=m
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+CONFIG_NETFILTER_XT_TARGET_NFLOG=m
+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
+CONFIG_NETFILTER_XT_TARGET_NOTRACK=m
+CONFIG_NETFILTER_XT_TARGET_TPROXY=m
+CONFIG_NETFILTER_XT_TARGET_TRACE=m
+CONFIG_NETFILTER_XT_TARGET_SECMARK=m
+CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
+CONFIG_NETFILTER_XT_MATCH_CLUSTER=m
+CONFIG_NETFILTER_XT_MATCH_COMMENT=m
+CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
+CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
+CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
+CONFIG_NETFILTER_XT_MATCH_DSCP=m
+CONFIG_NETFILTER_XT_MATCH_ESP=m
+CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
+CONFIG_NETFILTER_XT_MATCH_HELPER=m
+CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
+CONFIG_NETFILTER_XT_MATCH_OSF=m
+CONFIG_NETFILTER_XT_MATCH_OWNER=m
+CONFIG_NETFILTER_XT_MATCH_POLICY=m
+CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
+CONFIG_NETFILTER_XT_MATCH_QUOTA=m
+CONFIG_NETFILTER_XT_MATCH_RATEEST=m
+CONFIG_NETFILTER_XT_MATCH_REALM=m
+CONFIG_NETFILTER_XT_MATCH_RECENT=m
+CONFIG_NETFILTER_XT_MATCH_SOCKET=m
+CONFIG_NETFILTER_XT_MATCH_STATE=m
+CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
+CONFIG_NETFILTER_XT_MATCH_STRING=m
+CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
+CONFIG_NETFILTER_XT_MATCH_TIME=m
+CONFIG_NETFILTER_XT_MATCH_U32=m
+CONFIG_IP_VS=m
+CONFIG_IP_VS_IPV6=y
+CONFIG_IP_VS_PROTO_TCP=y
+CONFIG_IP_VS_PROTO_UDP=y
+CONFIG_IP_VS_PROTO_ESP=y
+CONFIG_IP_VS_PROTO_AH=y
+CONFIG_IP_VS_RR=m
+CONFIG_IP_VS_WRR=m
+CONFIG_IP_VS_LC=m
+CONFIG_IP_VS_WLC=m
+CONFIG_IP_VS_LBLC=m
+CONFIG_IP_VS_LBLCR=m
+CONFIG_IP_VS_DH=m
+CONFIG_IP_VS_SH=m
+CONFIG_IP_VS_SED=m
+CONFIG_IP_VS_NQ=m
+CONFIG_IP_VS_FTP=m
+CONFIG_NF_CONNTRACK_IPV4=m
+CONFIG_IP_NF_QUEUE=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_NF_NAT=m
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_CLUSTERIP=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_TTL=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_SECURITY=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+CONFIG_NF_CONNTRACK_IPV6=m
+CONFIG_IP6_NF_QUEUE=m
+CONFIG_IP6_NF_IPTABLES=m
+CONFIG_IP6_NF_MATCH_AH=m
+CONFIG_IP6_NF_MATCH_EUI64=m
+CONFIG_IP6_NF_MATCH_FRAG=m
+CONFIG_IP6_NF_MATCH_OPTS=m
+CONFIG_IP6_NF_MATCH_HL=m
+CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+CONFIG_IP6_NF_MATCH_MH=m
+CONFIG_IP6_NF_MATCH_RT=m
+CONFIG_IP6_NF_TARGET_HL=m
+CONFIG_IP6_NF_TARGET_LOG=m
+CONFIG_IP6_NF_FILTER=m
+CONFIG_IP6_NF_TARGET_REJECT=m
+CONFIG_IP6_NF_MANGLE=m
+CONFIG_IP6_NF_RAW=m
+CONFIG_IP6_NF_SECURITY=m
+CONFIG_DECNET_NF_GRABULATOR=m
+CONFIG_BRIDGE_NF_EBTABLES=m
+CONFIG_BRIDGE_EBT_BROUTE=m
+CONFIG_BRIDGE_EBT_T_FILTER=m
+CONFIG_BRIDGE_EBT_T_NAT=m
+CONFIG_BRIDGE_EBT_802_3=m
+CONFIG_BRIDGE_EBT_AMONG=m
+CONFIG_BRIDGE_EBT_ARP=m
+CONFIG_BRIDGE_EBT_IP=m
+CONFIG_BRIDGE_EBT_IP6=m
+CONFIG_BRIDGE_EBT_LIMIT=m
+CONFIG_BRIDGE_EBT_MARK=m
+CONFIG_BRIDGE_EBT_PKTTYPE=m
+CONFIG_BRIDGE_EBT_STP=m
+CONFIG_BRIDGE_EBT_VLAN=m
+CONFIG_BRIDGE_EBT_ARPREPLY=m
+CONFIG_BRIDGE_EBT_DNAT=m
+CONFIG_BRIDGE_EBT_MARK_T=m
+CONFIG_BRIDGE_EBT_REDIRECT=m
+CONFIG_BRIDGE_EBT_SNAT=m
+CONFIG_BRIDGE_EBT_LOG=m
+CONFIG_BRIDGE_EBT_ULOG=m
+CONFIG_BRIDGE_EBT_NFLOG=m
+CONFIG_IP_DCCP=m
+CONFIG_RDS=m
+CONFIG_RDS_TCP=m
+CONFIG_TIPC=m
+CONFIG_ATM=m
+CONFIG_ATM_CLIP=m
+CONFIG_ATM_LANE=m
+CONFIG_ATM_MPOA=m
+CONFIG_ATM_BR2684=m
+CONFIG_BRIDGE=m
+CONFIG_VLAN_8021Q=m
+CONFIG_VLAN_8021Q_GVRP=y
+CONFIG_DECNET=m
+CONFIG_LLC2=m
+CONFIG_IPX=m
+CONFIG_ATALK=m
+CONFIG_DEV_APPLETALK=m
+CONFIG_IPDDP=m
+CONFIG_IPDDP_ENCAP=y
+CONFIG_IPDDP_DECAP=y
+CONFIG_X25=m
+CONFIG_LAPB=m
+CONFIG_ECONET=m
+CONFIG_ECONET_AUNUDP=y
+CONFIG_ECONET_NATIVE=y
+CONFIG_WAN_ROUTER=m
+CONFIG_PHONET=m
+CONFIG_IEEE802154=m
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_CBQ=m
+CONFIG_NET_SCH_HTB=m
+CONFIG_NET_SCH_HFSC=m
+CONFIG_NET_SCH_ATM=m
+CONFIG_NET_SCH_PRIO=m
+CONFIG_NET_SCH_MULTIQ=m
+CONFIG_NET_SCH_RED=m
+CONFIG_NET_SCH_SFQ=m
+CONFIG_NET_SCH_TEQL=m
+CONFIG_NET_SCH_TBF=m
+CONFIG_NET_SCH_GRED=m
+CONFIG_NET_SCH_DSMARK=m
+CONFIG_NET_SCH_NETEM=m
+CONFIG_NET_SCH_DRR=m
+CONFIG_NET_SCH_INGRESS=m
+CONFIG_NET_CLS_BASIC=m
+CONFIG_NET_CLS_TCINDEX=m
+CONFIG_NET_CLS_ROUTE4=m
+CONFIG_NET_CLS_FW=m
+CONFIG_NET_CLS_U32=m
+CONFIG_CLS_U32_MARK=y
+CONFIG_NET_CLS_RSVP=m
+CONFIG_NET_CLS_RSVP6=m
+CONFIG_NET_CLS_FLOW=m
+CONFIG_NET_EMATCH=y
+CONFIG_NET_EMATCH_CMP=m
+CONFIG_NET_EMATCH_NBYTE=m
+CONFIG_NET_EMATCH_U32=m
+CONFIG_NET_EMATCH_META=m
+CONFIG_NET_EMATCH_TEXT=m
+CONFIG_NET_CLS_ACT=y
+CONFIG_NET_ACT_POLICE=m
+CONFIG_NET_ACT_GACT=m
+CONFIG_GACT_PROB=y
+CONFIG_NET_ACT_MIRRED=m
+CONFIG_NET_ACT_IPT=m
+CONFIG_NET_ACT_NAT=m
+CONFIG_NET_ACT_PEDIT=m
+CONFIG_NET_ACT_SIMP=m
+CONFIG_NET_ACT_SKBEDIT=m
+CONFIG_DCB=y
+CONFIG_NET_PKTGEN=m
+# CONFIG_WIRELESS is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+# CONFIG_STANDALONE is not set
+CONFIG_CONNECTOR=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_CRYPTOLOOP=m
+CONFIG_BLK_DEV_NBD=m
+CONFIG_BLK_DEV_OSD=m
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=65536
+CONFIG_CDROM_PKTCDVD=y
+CONFIG_RAID_ATTRS=m
+CONFIG_SCSI=y
+CONFIG_SCSI_TGT=m
+CONFIG_BLK_DEV_SD=y
+CONFIG_CHR_DEV_ST=m
+CONFIG_CHR_DEV_OSST=m
+CONFIG_BLK_DEV_SR=y
+CONFIG_CHR_DEV_SG=y
+CONFIG_CHR_DEV_SCH=m
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_SCSI_CONSTANTS=y
+CONFIG_SCSI_LOGGING=y
+CONFIG_SCSI_SCAN_ASYNC=y
+CONFIG_SCSI_SPI_ATTRS=m
+CONFIG_SCSI_FC_TGT_ATTRS=y
+CONFIG_SCSI_SAS_LIBSAS=m
+CONFIG_SCSI_SRP_ATTRS=m
+CONFIG_SCSI_SRP_TGT_ATTRS=y
+CONFIG_ISCSI_TCP=m
+CONFIG_LIBFCOE=m
+CONFIG_SCSI_DEBUG=m
+CONFIG_SCSI_DH=y
+CONFIG_SCSI_DH_RDAC=m
+CONFIG_SCSI_DH_HP_SW=m
+CONFIG_SCSI_DH_EMC=m
+CONFIG_SCSI_DH_ALUA=m
+CONFIG_SCSI_OSD_INITIATOR=m
+CONFIG_SCSI_OSD_ULD=m
+# CONFIG_INPUT_MOUSEDEV is not set
+CONFIG_INPUT_EVDEV=y
+CONFIG_INPUT_EVBUG=m
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_SERIO_I8042 is not set
+CONFIG_SERIO_SERPORT=m
+CONFIG_SERIO_LIBPS2=y
+CONFIG_SERIO_RAW=m
+CONFIG_VT_HW_CONSOLE_BINDING=y
+CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
+CONFIG_LEGACY_PTY_COUNT=0
+CONFIG_SERIAL_NONSTANDARD=y
+CONFIG_N_HDLC=m
+# CONFIG_DEVKMEM is not set
+CONFIG_STALDRV=y
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=48
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+CONFIG_SERIAL_8250_RSA=y
+CONFIG_HW_RANDOM=y
+CONFIG_HW_RANDOM_TIMERIOMEM=m
+CONFIG_RAW_DRIVER=m
+# CONFIG_HWMON is not set
+# CONFIG_VGA_CONSOLE is not set
+# CONFIG_HID_SUPPORT is not set
+# CONFIG_USB_SUPPORT is not set
+CONFIG_UIO=y
+CONFIG_UIO_PDRV=m
+CONFIG_UIO_PDRV_GENIRQ=m
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+CONFIG_EXT2_FS_SECURITY=y
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_POSIX_ACL=y
+CONFIG_EXT3_FS_SECURITY=y
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_EXT4_FS_SECURITY=y
+CONFIG_GFS2_FS=m
+CONFIG_GFS2_FS_LOCKING_DLM=y
+CONFIG_OCFS2_FS=m
+CONFIG_BTRFS_FS=m
+CONFIG_BTRFS_FS_POSIX_ACL=y
+CONFIG_NILFS2_FS=m
+CONFIG_QUOTA_NETLINK_INTERFACE=y
+# CONFIG_PRINT_QUOTA_WARNING is not set
+CONFIG_QFMT_V1=m
+CONFIG_QFMT_V2=m
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=y
+CONFIG_CUSE=m
+CONFIG_FSCACHE=m
+CONFIG_FSCACHE_STATS=y
+CONFIG_FSCACHE_HISTOGRAM=y
+CONFIG_CACHEFILES=m
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_UDF_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+CONFIG_NTFS_FS=m
+CONFIG_PROC_KCORE=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_ADFS_FS=m
+CONFIG_AFFS_FS=m
+CONFIG_ECRYPT_FS=y
+CONFIG_HFS_FS=m
+CONFIG_HFSPLUS_FS=m
+CONFIG_BEFS_FS=m
+CONFIG_BFS_FS=m
+CONFIG_EFS_FS=m
+CONFIG_CRAMFS=m
+CONFIG_SQUASHFS=m
+CONFIG_VXFS_FS=m
+CONFIG_MINIX_FS=m
+CONFIG_OMFS_FS=m
+CONFIG_HPFS_FS=m
+CONFIG_QNX4FS_FS=m
+CONFIG_ROMFS_FS=m
+CONFIG_SYSV_FS=m
+CONFIG_UFS_FS=m
+CONFIG_EXOFS_FS=m
+CONFIG_NFS_FS=m
+CONFIG_NFS_V3=y
+CONFIG_NFS_V3_ACL=y
+CONFIG_NFS_V4=y
+CONFIG_NFS_FSCACHE=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V3_ACL=y
+CONFIG_NFSD_V4=y
+CONFIG_CIFS=m
+CONFIG_CIFS_WEAK_PW_HASH=y
+CONFIG_CIFS_UPCALL=y
+CONFIG_CIFS_XATTR=y
+CONFIG_CIFS_POSIX=y
+CONFIG_CIFS_DFS_UPCALL=y
+CONFIG_NCP_FS=m
+CONFIG_NCPFS_PACKET_SIGNING=y
+CONFIG_NCPFS_IOCTL_LOCKING=y
+CONFIG_NCPFS_STRONG=y
+CONFIG_NCPFS_NFS_NS=y
+CONFIG_NCPFS_OS2_NS=y
+CONFIG_NCPFS_NLS=y
+CONFIG_NCPFS_EXTRAS=y
+CONFIG_CODA_FS=m
+CONFIG_AFS_FS=m
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_ACORN_PARTITION=y
+CONFIG_ACORN_PARTITION_ICS=y
+CONFIG_ACORN_PARTITION_RISCIX=y
+CONFIG_OSF_PARTITION=y
+CONFIG_AMIGA_PARTITION=y
+CONFIG_ATARI_PARTITION=y
+CONFIG_MAC_PARTITION=y
+CONFIG_BSD_DISKLABEL=y
+CONFIG_MINIX_SUBPARTITION=y
+CONFIG_SOLARIS_X86_PARTITION=y
+CONFIG_UNIXWARE_DISKLABEL=y
+CONFIG_LDM_PARTITION=y
+CONFIG_SGI_PARTITION=y
+CONFIG_ULTRIX_PARTITION=y
+CONFIG_SUN_PARTITION=y
+CONFIG_KARMA_PARTITION=y
+CONFIG_EFI_PARTITION=y
+CONFIG_SYSV68_PARTITION=y
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="cp437"
+CONFIG_NLS_CODEPAGE_437=m
+CONFIG_NLS_CODEPAGE_737=m
+CONFIG_NLS_CODEPAGE_775=m
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_852=m
+CONFIG_NLS_CODEPAGE_855=m
+CONFIG_NLS_CODEPAGE_857=m
+CONFIG_NLS_CODEPAGE_860=m
+CONFIG_NLS_CODEPAGE_861=m
+CONFIG_NLS_CODEPAGE_862=m
+CONFIG_NLS_CODEPAGE_863=m
+CONFIG_NLS_CODEPAGE_864=m
+CONFIG_NLS_CODEPAGE_865=m
+CONFIG_NLS_CODEPAGE_866=m
+CONFIG_NLS_CODEPAGE_869=m
+CONFIG_NLS_CODEPAGE_936=m
+CONFIG_NLS_CODEPAGE_950=m
+CONFIG_NLS_CODEPAGE_932=m
+CONFIG_NLS_CODEPAGE_949=m
+CONFIG_NLS_CODEPAGE_874=m
+CONFIG_NLS_ISO8859_8=m
+CONFIG_NLS_CODEPAGE_1250=m
+CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=m
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+CONFIG_NLS_KOI8_R=m
+CONFIG_NLS_KOI8_U=m
+CONFIG_PRINTK_TIME=y
+# CONFIG_ENABLE_WARN_DEPRECATED is not set
+# CONFIG_ENABLE_MUST_CHECK is not set
+CONFIG_FRAME_WARN=1024
+CONFIG_UNUSED_SYMBOLS=y
+CONFIG_DETECT_HUNG_TASK=y
+CONFIG_SCHEDSTATS=y
+CONFIG_TIMER_STATS=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_MEMORY_INIT=y
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+CONFIG_SCHED_TRACER=y
+CONFIG_BLK_DEV_IO_TRACE=y
+CONFIG_KGDB=y
+CONFIG_SECURITY=y
+CONFIG_SECURITY_NETWORK=y
+CONFIG_LSM_MMAP_MIN_ADDR=0
+CONFIG_SECURITY_SELINUX=y
+CONFIG_SECURITY_SELINUX_BOOTPARAM=y
+CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=0
+CONFIG_SECURITY_SELINUX_DISABLE=y
+CONFIG_SECURITY_SMACK=y
+CONFIG_SECURITY_TOMOYO=y
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_CRYPTD=m
+CONFIG_CRYPTO_TEST=m
+CONFIG_CRYPTO_CCM=m
+CONFIG_CRYPTO_GCM=m
+CONFIG_CRYPTO_CTS=m
+CONFIG_CRYPTO_LRW=m
+CONFIG_CRYPTO_PCBC=m
+CONFIG_CRYPTO_XTS=m
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_XCBC=m
+CONFIG_CRYPTO_VMAC=m
+CONFIG_CRYPTO_MICHAEL_MIC=m
+CONFIG_CRYPTO_RMD128=m
+CONFIG_CRYPTO_RMD160=m
+CONFIG_CRYPTO_RMD256=m
+CONFIG_CRYPTO_RMD320=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_TGR192=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_CAMELLIA=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_FCRYPT=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_SALSA20=m
+CONFIG_CRYPTO_SEED=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_TWOFISH=m
+CONFIG_CRYPTO_ZLIB=m
+CONFIG_CRYPTO_LZO=m
+CONFIG_CRC_CCITT=m
+CONFIG_CRC7=m
index e4b399fdaa619d7f5a9f247b3ee094e4f1a0fda2..7c68666fdd646c3354f872ffc91eeeecfa4785d3 100644 (file)
@@ -8,7 +8,7 @@ CONFIG_HIGH_RES_TIMERS=y
 CONFIG_PREEMPT_VOLUNTARY=y
 CONFIG_KEXEC=y
 CONFIG_EXPERIMENTAL=y
-CONFIG_CROSS_COMPILE="mips64-unknown-linux-gnu-"
+CONFIG_CROSS_COMPILE="mips-linux-gnu-"
 # CONFIG_LOCALVERSION_AUTO is not set
 CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
@@ -22,15 +22,13 @@ CONFIG_AUDIT=y
 CONFIG_NAMESPACES=y
 CONFIG_SCHED_AUTOGROUP=y
 CONFIG_BLK_DEV_INITRD=y
-CONFIG_INITRAMFS_SOURCE="usr/dev_file_list usr/rootfs"
+CONFIG_INITRAMFS_SOURCE="usr/dev_file_list usr/rootfs.xlr"
 CONFIG_RD_BZIP2=y
 CONFIG_RD_LZMA=y
 CONFIG_INITRAMFS_COMPRESSION_GZIP=y
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_EXPERT=y
 CONFIG_KALLSYMS_ALL=y
 # CONFIG_ELF_CORE is not set
-# CONFIG_PCSPKR_PLATFORM is not set
 # CONFIG_PERF_EVENTS is not set
 # CONFIG_COMPAT_BRK is not set
 CONFIG_PROFILING=y
@@ -39,6 +37,9 @@ CONFIG_MODULE_UNLOAD=y
 CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_BLK_DEV_INTEGRITY=y
+CONFIG_PCI=y
+CONFIG_PCI_MSI=y
+CONFIG_PCI_DEBUG=y
 CONFIG_BINFMT_MISC=m
 CONFIG_PM_RUNTIME=y
 CONFIG_PM_DEBUG=y
@@ -297,12 +298,10 @@ CONFIG_NET_ACT_SIMP=m
 CONFIG_NET_ACT_SKBEDIT=m
 CONFIG_DCB=y
 CONFIG_NET_PKTGEN=m
-# CONFIG_WIRELESS is not set
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 # CONFIG_STANDALONE is not set
 CONFIG_CONNECTOR=y
-CONFIG_MTD=m
 CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_CRYPTOLOOP=m
 CONFIG_BLK_DEV_NBD=m
@@ -339,6 +338,9 @@ CONFIG_SCSI_DH_EMC=m
 CONFIG_SCSI_DH_ALUA=m
 CONFIG_SCSI_OSD_INITIATOR=m
 CONFIG_SCSI_OSD_ULD=m
+CONFIG_NETDEVICES=y
+CONFIG_E1000E=y
+CONFIG_SKY2=y
 # CONFIG_INPUT_MOUSEDEV is not set
 CONFIG_INPUT_EVDEV=y
 CONFIG_INPUT_EVBUG=m
@@ -443,7 +445,6 @@ CONFIG_CIFS_UPCALL=y
 CONFIG_CIFS_XATTR=y
 CONFIG_CIFS_POSIX=y
 CONFIG_CIFS_DFS_UPCALL=y
-CONFIG_CIFS_EXPERIMENTAL=y
 CONFIG_NCP_FS=m
 CONFIG_NCPFS_PACKET_SIGNING=y
 CONFIG_NCPFS_IOCTL_LOCKING=y
@@ -516,7 +517,6 @@ CONFIG_PRINTK_TIME=y
 # CONFIG_ENABLE_WARN_DEPRECATED is not set
 # CONFIG_ENABLE_MUST_CHECK is not set
 CONFIG_UNUSED_SYMBOLS=y
-CONFIG_DEBUG_KERNEL=y
 CONFIG_DETECT_HUNG_TASK=y
 CONFIG_SCHEDSTATS=y
 CONFIG_TIMER_STATS=y
diff --git a/arch/mips/configs/pb1200_defconfig b/arch/mips/configs/pb1200_defconfig
deleted file mode 100644 (file)
index dcbe270..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-CONFIG_MIPS_ALCHEMY=y
-CONFIG_MIPS_PB1200=y
-CONFIG_KSM=y
-CONFIG_NO_HZ=y
-CONFIG_HIGH_RES_TIMERS=y
-CONFIG_HZ_100=y
-# CONFIG_SECCOMP is not set
-CONFIG_EXPERIMENTAL=y
-CONFIG_LOCALVERSION="-pb1200"
-CONFIG_KERNEL_LZMA=y
-CONFIG_SYSVIPC=y
-CONFIG_POSIX_MQUEUE=y
-CONFIG_TINY_RCU=y
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_EXPERT=y
-# CONFIG_SYSCTL_SYSCALL is not set
-# CONFIG_KALLSYMS is not set
-# CONFIG_PCSPKR_PLATFORM is not set
-# CONFIG_VM_EVENT_COUNTERS is not set
-# CONFIG_COMPAT_BRK is not set
-CONFIG_SLAB=y
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_LBDAF is not set
-# CONFIG_BLK_DEV_BSG is not set
-# CONFIG_IOSCHED_DEADLINE is not set
-# CONFIG_IOSCHED_CFQ is not set
-CONFIG_PCCARD=y
-CONFIG_PCMCIA_ALCHEMY_DEVBOARD=y
-CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
-CONFIG_BINFMT_MISC=y
-CONFIG_NET=y
-CONFIG_PACKET=y
-CONFIG_UNIX=y
-CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
-CONFIG_IP_PNP=y
-# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET_XFRM_MODE_BEET is not set
-# CONFIG_INET_DIAG is not set
-# CONFIG_IPV6 is not set
-# CONFIG_WIRELESS is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-CONFIG_MTD=y
-CONFIG_MTD_PARTITIONS=y
-CONFIG_MTD_CMDLINE_PARTS=y
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-CONFIG_MTD_CFI=y
-CONFIG_MTD_CFI_AMDSTD=y
-CONFIG_MTD_PHYSMAP=y
-CONFIG_MTD_NAND=y
-CONFIG_MTD_NAND_PLATFORM=y
-CONFIG_BLK_DEV_LOOP=y
-CONFIG_BLK_DEV_UB=y
-# CONFIG_MISC_DEVICES is not set
-CONFIG_IDE=y
-CONFIG_BLK_DEV_IDECS=y
-CONFIG_BLK_DEV_IDECD=y
-CONFIG_IDE_TASK_IOCTL=y
-# CONFIG_IDE_PROC_FS is not set
-CONFIG_BLK_DEV_IDE_AU1XXX=y
-CONFIG_NETDEVICES=y
-CONFIG_NET_ETHERNET=y
-CONFIG_SMC91X=y
-# CONFIG_NETDEV_1000 is not set
-# CONFIG_NETDEV_10000 is not set
-# CONFIG_WLAN is not set
-# CONFIG_INPUT_MOUSEDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_SERIO is not set
-CONFIG_VT_HW_CONSOLE_BINDING=y
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_8250_NR_UARTS=2
-CONFIG_SERIAL_8250_RUNTIME_UARTS=2
-# CONFIG_LEGACY_PTYS is not set
-# CONFIG_HW_RANDOM is not set
-CONFIG_I2C=y
-# CONFIG_I2C_COMPAT is not set
-CONFIG_I2C_CHARDEV=y
-# CONFIG_I2C_HELPER_AUTO is not set
-CONFIG_I2C_AU1550=y
-CONFIG_SPI=y
-CONFIG_SPI_AU1550=y
-CONFIG_GPIOLIB=y
-CONFIG_GPIO_SYSFS=y
-CONFIG_SENSORS_ADM1025=y
-CONFIG_SENSORS_LM70=y
-CONFIG_FB=y
-CONFIG_FB_AU1200=y
-# CONFIG_VGA_CONSOLE is not set
-CONFIG_FRAMEBUFFER_CONSOLE=y
-CONFIG_FONTS=y
-CONFIG_FONT_8x16=y
-CONFIG_SOUND=y
-CONFIG_SND=y
-CONFIG_SND_DYNAMIC_MINORS=y
-# CONFIG_SND_SUPPORT_OLD_API is not set
-# CONFIG_SND_VERBOSE_PROCFS is not set
-# CONFIG_SND_DRIVERS is not set
-# CONFIG_SND_SPI is not set
-# CONFIG_SND_MIPS is not set
-# CONFIG_SND_USB is not set
-# CONFIG_SND_PCMCIA is not set
-CONFIG_SND_SOC=y
-CONFIG_SND_SOC_AU1XPSC=y
-CONFIG_SND_SOC_DB1200=y
-CONFIG_HIDRAW=y
-CONFIG_USB_HIDDEV=y
-CONFIG_USB=y
-CONFIG_USB_DEBUG=y
-CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
-# CONFIG_USB_DEVICE_CLASS is not set
-CONFIG_USB_DYNAMIC_MINORS=y
-CONFIG_USB_EHCI_HCD=y
-CONFIG_USB_EHCI_ROOT_HUB_TT=y
-CONFIG_USB_OHCI_HCD=y
-CONFIG_MMC=y
-# CONFIG_MMC_BLOCK_BOUNCE is not set
-CONFIG_MMC_AU1X=y
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_RTC_CLASS=y
-CONFIG_RTC_DRV_AU1XXX=y
-CONFIG_EXT2_FS=y
-CONFIG_ISO9660_FS=y
-CONFIG_JOLIET=y
-CONFIG_ZISOFS=y
-CONFIG_UDF_FS=y
-CONFIG_VFAT_FS=y
-# CONFIG_PROC_PAGE_MONITOR is not set
-CONFIG_TMPFS=y
-CONFIG_JFFS2_FS=y
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_LZO=y
-CONFIG_JFFS2_RUBIN=y
-CONFIG_SQUASHFS=y
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-CONFIG_ROOT_NFS=y
-CONFIG_PARTITION_ADVANCED=y
-CONFIG_EFI_PARTITION=y
-CONFIG_NLS_CODEPAGE_437=y
-CONFIG_NLS_CODEPAGE_850=y
-CONFIG_NLS_CODEPAGE_852=y
-CONFIG_NLS_CODEPAGE_1250=y
-CONFIG_NLS_ASCII=y
-CONFIG_NLS_ISO8859_1=y
-CONFIG_NLS_ISO8859_2=y
-CONFIG_NLS_ISO8859_15=y
-CONFIG_NLS_UTF8=y
-# CONFIG_ENABLE_WARN_DEPRECATED is not set
-# CONFIG_ENABLE_MUST_CHECK is not set
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_STRIP_ASM_SYMS=y
-CONFIG_DEBUG_KERNEL=y
-# CONFIG_SCHED_DEBUG is not set
-# CONFIG_FTRACE is not set
-CONFIG_CMDLINE_BOOL=y
-CONFIG_CMDLINE="console=ttyS0,115200"
-CONFIG_DEBUG_ZBOOT=y
-CONFIG_KEYS=y
-CONFIG_KEYS_DEBUG_PROC_KEYS=y
-CONFIG_SECURITYFS=y
diff --git a/arch/mips/include/asm/bmips.h b/arch/mips/include/asm/bmips.h
new file mode 100644 (file)
index 0000000..552a65a
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2011 by Kevin Cernekee (cernekee@gmail.com)
+ *
+ * Definitions for BMIPS processors
+ */
+#ifndef _ASM_BMIPS_H
+#define _ASM_BMIPS_H
+
+#include <linux/compiler.h>
+#include <linux/linkage.h>
+#include <asm/addrspace.h>
+#include <asm/mipsregs.h>
+#include <asm/hazards.h>
+
+/* NOTE: the CBR register returns a PA, and it can be above 0xff00_0000 */
+#define BMIPS_GET_CBR()                        ((void __iomem *)(CKSEG1 | \
+                                        (unsigned long) \
+                                        ((read_c0_brcm_cbr() >> 18) << 18)))
+
+#define BMIPS_RAC_CONFIG               0x00000000
+#define BMIPS_RAC_ADDRESS_RANGE                0x00000004
+#define BMIPS_RAC_CONFIG_1             0x00000008
+#define BMIPS_L2_CONFIG                        0x0000000c
+#define BMIPS_LMB_CONTROL              0x0000001c
+#define BMIPS_SYSTEM_BASE              0x00000020
+#define BMIPS_PERF_GLOBAL_CONTROL      0x00020000
+#define BMIPS_PERF_CONTROL_0           0x00020004
+#define BMIPS_PERF_CONTROL_1           0x00020008
+#define BMIPS_PERF_COUNTER_0           0x00020010
+#define BMIPS_PERF_COUNTER_1           0x00020014
+#define BMIPS_PERF_COUNTER_2           0x00020018
+#define BMIPS_PERF_COUNTER_3           0x0002001c
+#define BMIPS_RELO_VECTOR_CONTROL_0    0x00030000
+#define BMIPS_RELO_VECTOR_CONTROL_1    0x00038000
+
+#define BMIPS_NMI_RESET_VEC            0x80000000
+#define BMIPS_WARM_RESTART_VEC         0x80000380
+
+#define ZSCM_REG_BASE                  0x97000000
+
+#if !defined(__ASSEMBLY__)
+
+#include <linux/cpumask.h>
+#include <asm/r4kcache.h>
+
+extern struct plat_smp_ops bmips_smp_ops;
+extern char bmips_reset_nmi_vec;
+extern char bmips_reset_nmi_vec_end;
+extern char bmips_smp_movevec;
+extern char bmips_smp_int_vec;
+extern char bmips_smp_int_vec_end;
+
+extern int bmips_smp_enabled;
+extern int bmips_cpu_offset;
+extern cpumask_t bmips_booted_mask;
+
+extern void bmips_ebase_setup(void);
+extern asmlinkage void plat_wired_tlb_setup(void);
+
+static inline unsigned long bmips_read_zscm_reg(unsigned int offset)
+{
+       unsigned long ret;
+
+       __asm__ __volatile__(
+               ".set push\n"
+               ".set noreorder\n"
+               "cache %1, 0(%2)\n"
+               "sync\n"
+               "_ssnop\n"
+               "_ssnop\n"
+               "_ssnop\n"
+               "_ssnop\n"
+               "_ssnop\n"
+               "_ssnop\n"
+               "_ssnop\n"
+               "mfc0 %0, $28, 3\n"
+               "_ssnop\n"
+               ".set pop\n"
+               : "=&r" (ret)
+               : "i" (Index_Load_Tag_S), "r" (ZSCM_REG_BASE + offset)
+               : "memory");
+       return ret;
+}
+
+static inline void bmips_write_zscm_reg(unsigned int offset, unsigned long data)
+{
+       __asm__ __volatile__(
+               ".set push\n"
+               ".set noreorder\n"
+               "mtc0 %0, $28, 3\n"
+               "_ssnop\n"
+               "_ssnop\n"
+               "_ssnop\n"
+               "cache %1, 0(%2)\n"
+               "_ssnop\n"
+               "_ssnop\n"
+               "_ssnop\n"
+               : /* no outputs */
+               : "r" (data),
+                 "i" (Index_Store_Tag_S), "r" (ZSCM_REG_BASE + offset)
+               : "memory");
+}
+
+#endif /* !defined(__ASSEMBLY__) */
+
+#endif /* _ASM_BMIPS_H */
index 37c6857c8d4a322e3d4a9c68502b7a946ccb50e9..888766ae1f8598f1ff98373c6dbc7a6658307fc8 100644 (file)
@@ -9,6 +9,7 @@
 #define _ASM_BRANCH_H
 
 #include <asm/ptrace.h>
+#include <asm/inst.h>
 
 static inline int delay_slot(struct pt_regs *regs)
 {
@@ -23,7 +24,11 @@ static inline unsigned long exception_epc(struct pt_regs *regs)
        return regs->cp0_epc + 4;
 }
 
+#define BRANCH_LIKELY_TAKEN 0x0001
+
 extern int __compute_return_epc(struct pt_regs *regs);
+extern int __compute_return_epc_for_insn(struct pt_regs *regs,
+                                        union mips_instruction insn);
 
 static inline int compute_return_epc(struct pt_regs *regs)
 {
index 2f7f41873f242ef9abd77002976ebced8cbdea3c..f9fa2a479dd0e175ae7fc839d833b15695103f04 100644 (file)
 #define PRID_IMP_NETLOGIC_XLS412B      0x4c00
 #define PRID_IMP_NETLOGIC_XLS408B      0x4e00
 #define PRID_IMP_NETLOGIC_XLS404B      0x4f00
+#define PRID_IMP_NETLOGIC_AU13XX       0x8000
+
+#define PRID_IMP_NETLOGIC_XLP8XX       0x1000
+#define PRID_IMP_NETLOGIC_XLP3XX       0x1100
 
 /*
  * Definitions for 7:0 on legacy processors
@@ -263,7 +267,7 @@ enum cpu_type_enum {
         */
        CPU_5KC, CPU_20KC, CPU_25KF, CPU_SB1, CPU_SB1A, CPU_LOONGSON2,
        CPU_CAVIUM_OCTEON, CPU_CAVIUM_OCTEON_PLUS, CPU_CAVIUM_OCTEON2,
-       CPU_XLR,
+       CPU_XLR, CPU_XLP,
 
        CPU_LAST
 };
index 4e332165d7b710a8e4327c7d820c66883d12b89c..b4c20e4f87cd63f0718b785470478fdb74b5f8fd 100644 (file)
@@ -87,7 +87,8 @@ do {                                                                  \
        : "=r" (tmp));                                                  \
 } while (0)
 
-#elif defined(CONFIG_CPU_MIPSR1) && !defined(CONFIG_MIPS_ALCHEMY)
+#elif (defined(CONFIG_CPU_MIPSR1) && !defined(CONFIG_MIPS_ALCHEMY)) || \
+       defined(CONFIG_CPU_BMIPS)
 
 /*
  * These are slightly complicated by the fact that we guarantee R1 kernels to
@@ -139,8 +140,8 @@ do {                                                                        \
 } while (0)
 
 #elif defined(CONFIG_MIPS_ALCHEMY) || defined(CONFIG_CPU_CAVIUM_OCTEON) || \
-      defined(CONFIG_CPU_LOONGSON2) || defined(CONFIG_CPU_R10000) || \
-      defined(CONFIG_CPU_R5500)
+       defined(CONFIG_CPU_LOONGSON2) || defined(CONFIG_CPU_R10000) || \
+       defined(CONFIG_CPU_R5500)
 
 /*
  * R10000 rocks - all hazards handled in hardware, so this becomes a nobrainer.
index e6ea4d4d720545c1746a575436aef03308d28b30..1fbbca01e681976027044e8697603ef28f224755 100644 (file)
@@ -74,6 +74,8 @@ struct prev_kprobe {
                : MAX_JPROBES_STACK_SIZE)
 
 
+#define SKIP_DELAYSLOT 0x0001
+
 /* per-cpu kprobe control block */
 struct kprobe_ctlblk {
        unsigned long kprobe_status;
@@ -82,6 +84,9 @@ struct kprobe_ctlblk {
        unsigned long kprobe_saved_epc;
        unsigned long jprobe_saved_sp;
        struct pt_regs jprobe_saved_regs;
+       /* Per-thread fields, used while emulating branches */
+       unsigned long flags;
+       unsigned long target_epc;
        u8 jprobes_stack[MAX_JPROBES_STACK_SIZE];
        struct prev_kprobe prev_kprobe;
 };
index cda1c8070b27a4c0aa6afeea96fe24474e5026ba..2f0becb4ec8f490283ce1c22e1af3ae44d05c0f7 100644 (file)
 #include <linux/bitops.h>
 
 #define AR71XX_APB_BASE                0x18000000
+#define AR71XX_EHCI_BASE       0x1b000000
+#define AR71XX_EHCI_SIZE       0x1000
+#define AR71XX_OHCI_BASE       0x1c000000
+#define AR71XX_OHCI_SIZE       0x1000
 #define AR71XX_SPI_BASE                0x1f000000
 #define AR71XX_SPI_SIZE                0x01000000
 
@@ -27,6 +31,8 @@
 #define AR71XX_DDR_CTRL_SIZE   0x100
 #define AR71XX_UART_BASE       (AR71XX_APB_BASE + 0x00020000)
 #define AR71XX_UART_SIZE       0x100
+#define AR71XX_USB_CTRL_BASE   (AR71XX_APB_BASE + 0x00030000)
+#define AR71XX_USB_CTRL_SIZE   0x100
 #define AR71XX_GPIO_BASE        (AR71XX_APB_BASE + 0x00040000)
 #define AR71XX_GPIO_SIZE        0x100
 #define AR71XX_PLL_BASE                (AR71XX_APB_BASE + 0x00050000)
 #define AR71XX_RESET_BASE      (AR71XX_APB_BASE + 0x00060000)
 #define AR71XX_RESET_SIZE      0x100
 
+#define AR7240_USB_CTRL_BASE   (AR71XX_APB_BASE + 0x00030000)
+#define AR7240_USB_CTRL_SIZE   0x100
+#define AR7240_OHCI_BASE       0x1b000000
+#define AR7240_OHCI_SIZE       0x1000
+
+#define AR724X_EHCI_BASE       0x1b000000
+#define AR724X_EHCI_SIZE       0x1000
+
+#define AR913X_EHCI_BASE       0x1b000000
+#define AR913X_EHCI_SIZE       0x1000
 #define AR913X_WMAC_BASE       (AR71XX_APB_BASE + 0x000C0000)
 #define AR913X_WMAC_SIZE       0x30000
 
+#define AR933X_UART_BASE       (AR71XX_APB_BASE + 0x00020000)
+#define AR933X_UART_SIZE       0x14
+#define AR933X_WMAC_BASE       (AR71XX_APB_BASE + 0x00100000)
+#define AR933X_WMAC_SIZE       0x20000
+#define AR933X_EHCI_BASE       0x1b000000
+#define AR933X_EHCI_SIZE       0x1000
+
 /*
  * DDR_CTRL block
  */
 #define AR913X_DDR_REG_FLUSH_USB       0x84
 #define AR913X_DDR_REG_FLUSH_WMAC      0x88
 
+#define AR933X_DDR_REG_FLUSH_GE0       0x7c
+#define AR933X_DDR_REG_FLUSH_GE1       0x80
+#define AR933X_DDR_REG_FLUSH_USB       0x84
+#define AR933X_DDR_REG_FLUSH_WMAC      0x88
+
 /*
  * PLL block
  */
 #define AR913X_AHB_DIV_SHIFT           19
 #define AR913X_AHB_DIV_MASK            0x1
 
+#define AR933X_PLL_CPU_CONFIG_REG      0x00
+#define AR933X_PLL_CLOCK_CTRL_REG      0x08
+
+#define AR933X_PLL_CPU_CONFIG_NINT_SHIFT       10
+#define AR933X_PLL_CPU_CONFIG_NINT_MASK                0x3f
+#define AR933X_PLL_CPU_CONFIG_REFDIV_SHIFT     16
+#define AR933X_PLL_CPU_CONFIG_REFDIV_MASK      0x1f
+#define AR933X_PLL_CPU_CONFIG_OUTDIV_SHIFT     23
+#define AR933X_PLL_CPU_CONFIG_OUTDIV_MASK      0x7
+
+#define AR933X_PLL_CLOCK_CTRL_BYPASS           BIT(2)
+#define AR933X_PLL_CLOCK_CTRL_CPU_DIV_SHIFT    5
+#define AR933X_PLL_CLOCK_CTRL_CPU_DIV_MASK     0x3
+#define AR933X_PLL_CLOCK_CTRL_DDR_DIV_SHIFT    10
+#define AR933X_PLL_CLOCK_CTRL_DDR_DIV_MASK     0x3
+#define AR933X_PLL_CLOCK_CTRL_AHB_DIV_SHIFT    15
+#define AR933X_PLL_CLOCK_CTRL_AHB_DIV_MASK     0x7
+
+/*
+ * USB_CONFIG block
+ */
+#define AR71XX_USB_CTRL_REG_FLADJ      0x00
+#define AR71XX_USB_CTRL_REG_CONFIG     0x04
+
 /*
  * RESET block
  */
 
 #define AR724X_RESET_REG_RESET_MODULE          0x1c
 
+#define AR933X_RESET_REG_RESET_MODULE          0x1c
+#define AR933X_RESET_REG_BOOTSTRAP             0xac
+
+#define MISC_INT_ETHSW                 BIT(12)
+#define MISC_INT_TIMER4                        BIT(10)
+#define MISC_INT_TIMER3                        BIT(9)
+#define MISC_INT_TIMER2                        BIT(8)
 #define MISC_INT_DMA                   BIT(7)
 #define MISC_INT_OHCI                  BIT(6)
 #define MISC_INT_PERFC                 BIT(5)
 #define AR71XX_RESET_PCI_BUS           BIT(1)
 #define AR71XX_RESET_PCI_CORE          BIT(0)
 
+#define AR7240_RESET_USB_HOST          BIT(5)
+#define AR7240_RESET_OHCI_DLL          BIT(3)
+
 #define AR724X_RESET_GE1_MDIO          BIT(23)
 #define AR724X_RESET_GE0_MDIO          BIT(22)
 #define AR724X_RESET_PCIE_PHY_SERIAL   BIT(10)
 #define AR724X_RESET_PCIE_PHY          BIT(7)
 #define AR724X_RESET_PCIE              BIT(6)
-#define AR724X_RESET_OHCI_DLL          BIT(3)
+#define AR724X_RESET_USB_HOST          BIT(5)
+#define AR724X_RESET_USB_PHY           BIT(4)
+#define AR724X_RESET_USBSUS_OVERRIDE   BIT(3)
 
 #define AR913X_RESET_AMBA2WMAC         BIT(22)
+#define AR913X_RESET_USBSUS_OVERRIDE   BIT(10)
+#define AR913X_RESET_USB_HOST          BIT(5)
+#define AR913X_RESET_USB_PHY           BIT(4)
+
+#define AR933X_RESET_WMAC              BIT(11)
+#define AR933X_RESET_USB_HOST          BIT(5)
+#define AR933X_RESET_USB_PHY           BIT(4)
+#define AR933X_RESET_USBSUS_OVERRIDE   BIT(3)
+
+#define AR933X_BOOTSTRAP_REF_CLK_40    BIT(0)
 
 #define REV_ID_MAJOR_MASK              0xfff0
 #define REV_ID_MAJOR_AR71XX            0x00a0
 #define REV_ID_MAJOR_AR7240            0x00c0
 #define REV_ID_MAJOR_AR7241            0x0100
 #define REV_ID_MAJOR_AR7242            0x1100
+#define REV_ID_MAJOR_AR9330            0x0110
+#define REV_ID_MAJOR_AR9331            0x1110
 
 #define AR71XX_REV_ID_MINOR_MASK       0x3
 #define AR71XX_REV_ID_MINOR_AR7130     0x0
 #define AR913X_REV_ID_REVISION_MASK    0x3
 #define AR913X_REV_ID_REVISION_SHIFT   2
 
+#define AR933X_REV_ID_REVISION_MASK    0x3
+
 #define AR724X_REV_ID_REVISION_MASK    0x3
 
 /*
 #define AR71XX_GPIO_COUNT              16
 #define AR724X_GPIO_COUNT              18
 #define AR913X_GPIO_COUNT              22
+#define AR933X_GPIO_COUNT              30
 
 #endif /* __ASM_MACH_AR71XX_REGS_H */
diff --git a/arch/mips/include/asm/mach-ath79/ar933x_uart.h b/arch/mips/include/asm/mach-ath79/ar933x_uart.h
new file mode 100644 (file)
index 0000000..5273055
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ *  Atheros AR933X UART defines
+ *
+ *  Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License version 2 as published
+ *  by the Free Software Foundation.
+ */
+
+#ifndef __AR933X_UART_H
+#define __AR933X_UART_H
+
+#define AR933X_UART_REGS_SIZE          20
+#define AR933X_UART_FIFO_SIZE          16
+
+#define AR933X_UART_DATA_REG           0x00
+#define AR933X_UART_CS_REG             0x04
+#define AR933X_UART_CLOCK_REG          0x08
+#define AR933X_UART_INT_REG            0x0c
+#define AR933X_UART_INT_EN_REG         0x10
+
+#define AR933X_UART_DATA_TX_RX_MASK    0xff
+#define AR933X_UART_DATA_RX_CSR                BIT(8)
+#define AR933X_UART_DATA_TX_CSR                BIT(9)
+
+#define AR933X_UART_CS_PARITY_S                0
+#define AR933X_UART_CS_PARITY_M                0x3
+#define   AR933X_UART_CS_PARITY_NONE   0
+#define   AR933X_UART_CS_PARITY_ODD    1
+#define   AR933X_UART_CS_PARITY_EVEN   2
+#define AR933X_UART_CS_IF_MODE_S       2
+#define AR933X_UART_CS_IF_MODE_M       0x3
+#define   AR933X_UART_CS_IF_MODE_NONE  0
+#define   AR933X_UART_CS_IF_MODE_DTE   1
+#define   AR933X_UART_CS_IF_MODE_DCE   2
+#define AR933X_UART_CS_FLOW_CTRL_S     4
+#define AR933X_UART_CS_FLOW_CTRL_M     0x3
+#define AR933X_UART_CS_DMA_EN          BIT(6)
+#define AR933X_UART_CS_TX_READY_ORIDE  BIT(7)
+#define AR933X_UART_CS_RX_READY_ORIDE  BIT(8)
+#define AR933X_UART_CS_TX_READY                BIT(9)
+#define AR933X_UART_CS_RX_BREAK                BIT(10)
+#define AR933X_UART_CS_TX_BREAK                BIT(11)
+#define AR933X_UART_CS_HOST_INT                BIT(12)
+#define AR933X_UART_CS_HOST_INT_EN     BIT(13)
+#define AR933X_UART_CS_TX_BUSY         BIT(14)
+#define AR933X_UART_CS_RX_BUSY         BIT(15)
+
+#define AR933X_UART_CLOCK_STEP_M       0xffff
+#define AR933X_UART_CLOCK_SCALE_M      0xfff
+#define AR933X_UART_CLOCK_SCALE_S      16
+#define AR933X_UART_CLOCK_STEP_M       0xffff
+
+#define AR933X_UART_INT_RX_VALID       BIT(0)
+#define AR933X_UART_INT_TX_READY       BIT(1)
+#define AR933X_UART_INT_RX_FRAMING_ERR BIT(2)
+#define AR933X_UART_INT_RX_OFLOW_ERR   BIT(3)
+#define AR933X_UART_INT_TX_OFLOW_ERR   BIT(4)
+#define AR933X_UART_INT_RX_PARITY_ERR  BIT(5)
+#define AR933X_UART_INT_RX_BREAK_ON    BIT(6)
+#define AR933X_UART_INT_RX_BREAK_OFF   BIT(7)
+#define AR933X_UART_INT_RX_FULL                BIT(8)
+#define AR933X_UART_INT_TX_EMPTY       BIT(9)
+#define AR933X_UART_INT_ALLINTS                0x3ff
+
+#endif /* __AR933X_UART_H */
diff --git a/arch/mips/include/asm/mach-ath79/ar933x_uart_platform.h b/arch/mips/include/asm/mach-ath79/ar933x_uart_platform.h
new file mode 100644 (file)
index 0000000..6cb30f2
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ *  Platform data definition for Atheros AR933X UART
+ *
+ *  Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License version 2 as published
+ *  by the Free Software Foundation.
+ */
+
+#ifndef _AR933X_UART_PLATFORM_H
+#define _AR933X_UART_PLATFORM_H
+
+struct ar933x_uart_platform_data {
+       unsigned        uartclk;
+};
+
+#endif /* _AR933X_UART_PLATFORM_H */
index 6a9f168506fe061cb85f517c04e4605cc9f54208..6d0c6c9d5622fbe7890add97b200e4e6ced76d02 100644 (file)
@@ -26,10 +26,13 @@ enum ath79_soc_type {
        ATH79_SOC_AR7241,
        ATH79_SOC_AR7242,
        ATH79_SOC_AR9130,
-       ATH79_SOC_AR9132
+       ATH79_SOC_AR9132,
+       ATH79_SOC_AR9330,
+       ATH79_SOC_AR9331,
 };
 
 extern enum ath79_soc_type ath79_soc;
+extern unsigned int ath79_soc_rev;
 
 static inline int soc_is_ar71xx(void)
 {
@@ -66,6 +69,12 @@ static inline int soc_is_ar913x(void)
                ath79_soc == ATH79_SOC_AR9132);
 }
 
+static inline int soc_is_ar933x(void)
+{
+       return (ath79_soc == ATH79_SOC_AR9330 ||
+               ath79_soc == ATH79_SOC_AR9331);
+}
+
 extern void __iomem *ath79_ddr_base;
 extern void __iomem *ath79_pll_base;
 extern void __iomem *ath79_reset_base;
index 189bc6eb9c10d1884fe51c3d22da31272d3ca04a..519958fe4e3c7d0532c6b639148e9aa2b9522e74 100644 (file)
 #define __ASM_MACH_ATH79_IRQ_H
 
 #define MIPS_CPU_IRQ_BASE      0
-#define NR_IRQS                        16
+#define NR_IRQS                        40
 
 #define ATH79_MISC_IRQ_BASE    8
-#define ATH79_MISC_IRQ_COUNT   8
+#define ATH79_MISC_IRQ_COUNT   32
 
 #define ATH79_CPU_IRQ_IP2      (MIPS_CPU_IRQ_BASE + 2)
 #define ATH79_CPU_IRQ_USB      (MIPS_CPU_IRQ_BASE + 3)
 #define ATH79_MISC_IRQ_PERFC   (ATH79_MISC_IRQ_BASE + 5)
 #define ATH79_MISC_IRQ_OHCI    (ATH79_MISC_IRQ_BASE + 6)
 #define ATH79_MISC_IRQ_DMA     (ATH79_MISC_IRQ_BASE + 7)
+#define ATH79_MISC_IRQ_TIMER2  (ATH79_MISC_IRQ_BASE + 8)
+#define ATH79_MISC_IRQ_TIMER3  (ATH79_MISC_IRQ_BASE + 9)
+#define ATH79_MISC_IRQ_TIMER4  (ATH79_MISC_IRQ_BASE + 10)
+#define ATH79_MISC_IRQ_ETHSW   (ATH79_MISC_IRQ_BASE + 12)
 
 #include_next <irq.h>
 
diff --git a/arch/mips/include/asm/mach-ath79/pci-ath724x.h b/arch/mips/include/asm/mach-ath79/pci-ath724x.h
new file mode 100644 (file)
index 0000000..454885f
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ *  Atheros 724x PCI support
+ *
+ *  Copyright (C) 2011 René Bolldorf <xsecute@googlemail.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License version 2 as published
+ *  by the Free Software Foundation.
+ */
+
+#ifndef __ASM_MACH_ATH79_PCI_ATH724X_H
+#define __ASM_MACH_ATH79_PCI_ATH724X_H
+
+struct ath724x_pci_data {
+       int irq;
+       void *pdata;
+};
+
+void ath724x_pci_add_data(struct ath724x_pci_data *data, int size);
+
+#endif /* __ASM_MACH_ATH79_PCI_ATH724X_H */
index de24ec57dd2f6181200caa0be4136c45c1066748..569828d3ccab48a9581743542849e0931044792e 100644 (file)
@@ -136,6 +136,7 @@ static inline int au1xxx_cpu_needs_config_od(void)
 #define ALCHEMY_CPU_AU1100     2
 #define ALCHEMY_CPU_AU1550     3
 #define ALCHEMY_CPU_AU1200     4
+#define ALCHEMY_CPU_AU1300     5
 
 static inline int alchemy_get_cputype(void)
 {
@@ -156,6 +157,9 @@ static inline int alchemy_get_cputype(void)
        case 0x05030000:
                return ALCHEMY_CPU_AU1200;
                break;
+       case 0x800c0000:
+               return ALCHEMY_CPU_AU1300;
+               break;
        }
 
        return ALCHEMY_CPU_UNKNOWN;
@@ -166,6 +170,7 @@ static inline int alchemy_get_uarts(int type)
 {
        switch (type) {
        case ALCHEMY_CPU_AU1000:
+       case ALCHEMY_CPU_AU1300:
                return 4;
        case ALCHEMY_CPU_AU1500:
        case ALCHEMY_CPU_AU1200:
@@ -243,6 +248,7 @@ extern unsigned long au1xxx_calc_clock(void);
 /* PM: arch/mips/alchemy/common/sleeper.S, power.c, irq.c */
 void alchemy_sleep_au1000(void);
 void alchemy_sleep_au1550(void);
+void alchemy_sleep_au1300(void);
 void au_sleep(void);
 
 /* USB: drivers/usb/host/alchemy-common.c */
@@ -251,6 +257,7 @@ enum alchemy_usb_block {
        ALCHEMY_USB_UDC0,
        ALCHEMY_USB_EHCI0,
        ALCHEMY_USB_OTG0,
+       ALCHEMY_USB_OHCI1,
 };
 int alchemy_usb_control(int block, int enable);
 
@@ -263,14 +270,92 @@ struct alchemy_pci_platdata {
        unsigned long pci_cfg_clr;
 };
 
-/* SOC Interrupt numbers */
+/* Multifunction pins: Each of these pins can either be assigned to the
+ * GPIO controller or a on-chip peripheral.
+ * Call "au1300_pinfunc_to_dev()" or "au1300_pinfunc_to_gpio()" to
+ * assign one of these to either the GPIO controller or the device.
+ */
+enum au1300_multifunc_pins {
+       /* wake-from-str pins 0-3 */
+       AU1300_PIN_WAKE0 = 0, AU1300_PIN_WAKE1, AU1300_PIN_WAKE2,
+       AU1300_PIN_WAKE3,
+       /* external clock sources for PSCs: 4-5 */
+       AU1300_PIN_EXTCLK0, AU1300_PIN_EXTCLK1,
+       /* 8bit MMC interface on SD0: 6-9 */
+       AU1300_PIN_SD0DAT4, AU1300_PIN_SD0DAT5, AU1300_PIN_SD0DAT6,
+       AU1300_PIN_SD0DAT7,
+       /* aux clk input for freqgen 3: 10 */
+       AU1300_PIN_FG3AUX,
+       /* UART1 pins: 11-18 */
+       AU1300_PIN_U1RI, AU1300_PIN_U1DCD, AU1300_PIN_U1DSR,
+       AU1300_PIN_U1CTS, AU1300_PIN_U1RTS, AU1300_PIN_U1DTR,
+       AU1300_PIN_U1RX, AU1300_PIN_U1TX,
+       /* UART0 pins: 19-24 */
+       AU1300_PIN_U0RI, AU1300_PIN_U0DCD, AU1300_PIN_U0DSR,
+       AU1300_PIN_U0CTS, AU1300_PIN_U0RTS, AU1300_PIN_U0DTR,
+       /* UART2: 25-26 */
+       AU1300_PIN_U2RX, AU1300_PIN_U2TX,
+       /* UART3: 27-28 */
+       AU1300_PIN_U3RX, AU1300_PIN_U3TX,
+       /* LCD controller PWMs, ext pixclock: 29-31 */
+       AU1300_PIN_LCDPWM0, AU1300_PIN_LCDPWM1, AU1300_PIN_LCDCLKIN,
+       /* SD1 interface: 32-37 */
+       AU1300_PIN_SD1DAT0, AU1300_PIN_SD1DAT1, AU1300_PIN_SD1DAT2,
+       AU1300_PIN_SD1DAT3, AU1300_PIN_SD1CMD, AU1300_PIN_SD1CLK,
+       /* SD2 interface: 38-43 */
+       AU1300_PIN_SD2DAT0, AU1300_PIN_SD2DAT1, AU1300_PIN_SD2DAT2,
+       AU1300_PIN_SD2DAT3, AU1300_PIN_SD2CMD, AU1300_PIN_SD2CLK,
+       /* PSC0/1 clocks: 44-45 */
+       AU1300_PIN_PSC0CLK, AU1300_PIN_PSC1CLK,
+       /* PSCs: 46-49/50-53/54-57/58-61 */
+       AU1300_PIN_PSC0SYNC0, AU1300_PIN_PSC0SYNC1, AU1300_PIN_PSC0D0,
+       AU1300_PIN_PSC0D1,
+       AU1300_PIN_PSC1SYNC0, AU1300_PIN_PSC1SYNC1, AU1300_PIN_PSC1D0,
+       AU1300_PIN_PSC1D1,
+       AU1300_PIN_PSC2SYNC0, AU1300_PIN_PSC2SYNC1, AU1300_PIN_PSC2D0,
+       AU1300_PIN_PSC2D1,
+       AU1300_PIN_PSC3SYNC0, AU1300_PIN_PSC3SYNC1, AU1300_PIN_PSC3D0,
+       AU1300_PIN_PSC3D1,
+       /* PCMCIA interface: 62-70 */
+       AU1300_PIN_PCE2, AU1300_PIN_PCE1, AU1300_PIN_PIOS16,
+       AU1300_PIN_PIOR, AU1300_PIN_PWE, AU1300_PIN_PWAIT,
+       AU1300_PIN_PREG, AU1300_PIN_POE, AU1300_PIN_PIOW,
+       /* camera interface H/V sync inputs: 71-72 */
+       AU1300_PIN_CIMLS, AU1300_PIN_CIMFS,
+       /* PSC2/3 clocks: 73-74 */
+       AU1300_PIN_PSC2CLK, AU1300_PIN_PSC3CLK,
+};
+
+/* GPIC (Au1300) pin management: arch/mips/alchemy/common/gpioint.c */
+extern void au1300_pinfunc_to_gpio(enum au1300_multifunc_pins gpio);
+extern void au1300_pinfunc_to_dev(enum au1300_multifunc_pins gpio);
+extern void au1300_set_irq_priority(unsigned int irq, int p);
+extern void au1300_set_dbdma_gpio(int dchan, unsigned int gpio);
+
+/* Au1300 allows to disconnect certain blocks from internal power supply */
+enum au1300_vss_block {
+       AU1300_VSS_MPE = 0,
+       AU1300_VSS_BSA,
+       AU1300_VSS_GPE,
+       AU1300_VSS_MGP,
+};
 
+extern void au1300_vss_block_control(int block, int enable);
+
+
+/* SOC Interrupt numbers */
+/* Au1000-style (IC0/1): 2 controllers with 32 sources each */
 #define AU1000_INTC0_INT_BASE  (MIPS_CPU_IRQ_BASE + 8)
 #define AU1000_INTC0_INT_LAST  (AU1000_INTC0_INT_BASE + 31)
 #define AU1000_INTC1_INT_BASE  (AU1000_INTC0_INT_LAST + 1)
 #define AU1000_INTC1_INT_LAST  (AU1000_INTC1_INT_BASE + 31)
 #define AU1000_MAX_INTR        AU1000_INTC1_INT_LAST
 
+/* Au1300-style (GPIC): 1 controller with up to 128 sources */
+#define ALCHEMY_GPIC_INT_BASE  (MIPS_CPU_IRQ_BASE + 8)
+#define ALCHEMY_GPIC_INT_NUM   128
+#define ALCHEMY_GPIC_INT_LAST  (ALCHEMY_GPIC_INT_BASE + ALCHEMY_GPIC_INT_NUM - 1)
+
 enum soc_au1000_ints {
        AU1000_FIRST_INT        = AU1000_INTC0_INT_BASE,
        AU1000_UART0_INT        = AU1000_FIRST_INT,
@@ -591,24 +676,77 @@ enum soc_au1200_ints {
 
 #endif /* !defined (_LANGUAGE_ASSEMBLY) */
 
+/* Au1300 peripheral interrupt numbers */
+#define AU1300_FIRST_INT       (ALCHEMY_GPIC_INT_BASE)
+#define AU1300_UART1_INT       (AU1300_FIRST_INT + 17)
+#define AU1300_UART2_INT       (AU1300_FIRST_INT + 25)
+#define AU1300_UART3_INT       (AU1300_FIRST_INT + 27)
+#define AU1300_SD1_INT         (AU1300_FIRST_INT + 32)
+#define AU1300_SD2_INT         (AU1300_FIRST_INT + 38)
+#define AU1300_PSC0_INT                (AU1300_FIRST_INT + 48)
+#define AU1300_PSC1_INT                (AU1300_FIRST_INT + 52)
+#define AU1300_PSC2_INT                (AU1300_FIRST_INT + 56)
+#define AU1300_PSC3_INT                (AU1300_FIRST_INT + 60)
+#define AU1300_NAND_INT                (AU1300_FIRST_INT + 62)
+#define AU1300_DDMA_INT                (AU1300_FIRST_INT + 75)
+#define AU1300_MMU_INT         (AU1300_FIRST_INT + 76)
+#define AU1300_MPU_INT         (AU1300_FIRST_INT + 77)
+#define AU1300_GPU_INT         (AU1300_FIRST_INT + 78)
+#define AU1300_UDMA_INT                (AU1300_FIRST_INT + 79)
+#define AU1300_TOY_INT         (AU1300_FIRST_INT + 80)
+#define AU1300_TOY_MATCH0_INT  (AU1300_FIRST_INT + 81)
+#define AU1300_TOY_MATCH1_INT  (AU1300_FIRST_INT + 82)
+#define AU1300_TOY_MATCH2_INT  (AU1300_FIRST_INT + 83)
+#define AU1300_RTC_INT         (AU1300_FIRST_INT + 84)
+#define AU1300_RTC_MATCH0_INT  (AU1300_FIRST_INT + 85)
+#define AU1300_RTC_MATCH1_INT  (AU1300_FIRST_INT + 86)
+#define AU1300_RTC_MATCH2_INT  (AU1300_FIRST_INT + 87)
+#define AU1300_UART0_INT       (AU1300_FIRST_INT + 88)
+#define AU1300_SD0_INT         (AU1300_FIRST_INT + 89)
+#define AU1300_USB_INT         (AU1300_FIRST_INT + 90)
+#define AU1300_LCD_INT         (AU1300_FIRST_INT + 91)
+#define AU1300_BSA_INT         (AU1300_FIRST_INT + 92)
+#define AU1300_MPE_INT         (AU1300_FIRST_INT + 93)
+#define AU1300_ITE_INT         (AU1300_FIRST_INT + 94)
+#define AU1300_AES_INT         (AU1300_FIRST_INT + 95)
+#define AU1300_CIM_INT         (AU1300_FIRST_INT + 96)
+
+/**********************************************************************/
+
 /*
  * Physical base addresses for integrated peripherals
- * 0..au1000 1..au1500 2..au1100 3..au1550 4..au1200
+ * 0..au1000 1..au1500 2..au1100 3..au1550 4..au1200 5..au1300
  */
 
 #define AU1000_AC97_PHYS_ADDR          0x10000000 /* 012 */
+#define AU1300_ROM_PHYS_ADDR           0x10000000 /* 5 */
+#define AU1300_OTP_PHYS_ADDR           0x10002000 /* 5 */
+#define AU1300_VSS_PHYS_ADDR           0x10003000 /* 5 */
+#define AU1300_UART0_PHYS_ADDR         0x10100000 /* 5 */
+#define AU1300_UART1_PHYS_ADDR         0x10101000 /* 5 */
+#define AU1300_UART2_PHYS_ADDR         0x10102000 /* 5 */
+#define AU1300_UART3_PHYS_ADDR         0x10103000 /* 5 */
 #define AU1000_USB_OHCI_PHYS_ADDR      0x10100000 /* 012 */
 #define AU1000_USB_UDC_PHYS_ADDR       0x10200000 /* 0123 */
+#define AU1300_GPIC_PHYS_ADDR          0x10200000 /* 5 */
 #define AU1000_IRDA_PHYS_ADDR          0x10300000 /* 02 */
-#define AU1200_AES_PHYS_ADDR           0x10300000 /* 4 */
+#define AU1200_AES_PHYS_ADDR           0x10300000 /* 45 */
 #define AU1000_IC0_PHYS_ADDR           0x10400000 /* 01234 */
+#define AU1300_GPU_PHYS_ADDR           0x10500000 /* 5 */
 #define AU1000_MAC0_PHYS_ADDR          0x10500000 /* 023 */
 #define AU1000_MAC1_PHYS_ADDR          0x10510000 /* 023 */
 #define AU1000_MACEN_PHYS_ADDR         0x10520000 /* 023 */
-#define AU1100_SD0_PHYS_ADDR           0x10600000 /* 24 */
+#define AU1100_SD0_PHYS_ADDR           0x10600000 /* 245 */
+#define AU1300_SD1_PHYS_ADDR           0x10601000 /* 5 */
+#define AU1300_SD2_PHYS_ADDR           0x10602000 /* 5 */
 #define AU1100_SD1_PHYS_ADDR           0x10680000 /* 24 */
+#define AU1300_SYS_PHYS_ADDR           0x10900000 /* 5 */
 #define AU1550_PSC2_PHYS_ADDR          0x10A00000 /* 3 */
 #define AU1550_PSC3_PHYS_ADDR          0x10B00000 /* 3 */
+#define AU1300_PSC0_PHYS_ADDR          0x10A00000 /* 5 */
+#define AU1300_PSC1_PHYS_ADDR          0x10A01000 /* 5 */
+#define AU1300_PSC2_PHYS_ADDR          0x10A02000 /* 5 */
+#define AU1300_PSC3_PHYS_ADDR          0x10A03000 /* 5 */
 #define AU1000_I2S_PHYS_ADDR           0x11000000 /* 02 */
 #define AU1500_MAC0_PHYS_ADDR          0x11500000 /* 1 */
 #define AU1500_MAC1_PHYS_ADDR          0x11510000 /* 1 */
@@ -622,37 +760,96 @@ enum soc_au1200_ints {
 #define AU1000_SSI1_PHYS_ADDR          0x11680000 /* 02 */
 #define AU1500_GPIO2_PHYS_ADDR         0x11700000 /* 1234 */
 #define AU1000_IC1_PHYS_ADDR           0x11800000 /* 01234 */
-#define AU1000_SYS_PHYS_ADDR           0x11900000 /* 01234 */
+#define AU1000_SYS_PHYS_ADDR           0x11900000 /* 012345 */
 #define AU1550_PSC0_PHYS_ADDR          0x11A00000 /* 34 */
 #define AU1550_PSC1_PHYS_ADDR          0x11B00000 /* 34 */
 #define AU1000_MEM_PHYS_ADDR           0x14000000 /* 01234 */
 #define AU1000_STATIC_MEM_PHYS_ADDR    0x14001000 /* 01234 */
+#define AU1300_UDMA_PHYS_ADDR          0x14001800 /* 5 */
 #define AU1000_DMA_PHYS_ADDR           0x14002000 /* 012 */
-#define AU1550_DBDMA_PHYS_ADDR         0x14002000 /* 34 */
-#define AU1550_DBDMA_CONF_PHYS_ADDR    0x14003000 /* 34 */
+#define AU1550_DBDMA_PHYS_ADDR         0x14002000 /* 345 */
+#define AU1550_DBDMA_CONF_PHYS_ADDR    0x14003000 /* 345 */
 #define AU1000_MACDMA0_PHYS_ADDR       0x14004000 /* 0123 */
 #define AU1000_MACDMA1_PHYS_ADDR       0x14004200 /* 0123 */
-#define AU1200_CIM_PHYS_ADDR           0x14004000 /* 4 */
+#define AU1200_CIM_PHYS_ADDR           0x14004000 /* 45 */
 #define AU1500_PCI_PHYS_ADDR           0x14005000 /* 13 */
 #define AU1550_PE_PHYS_ADDR            0x14008000 /* 3 */
 #define AU1200_MAEBE_PHYS_ADDR         0x14010000 /* 4 */
 #define AU1200_MAEFE_PHYS_ADDR         0x14012000 /* 4 */
+#define AU1300_MAEITE_PHYS_ADDR                0x14010000 /* 5 */
+#define AU1300_MAEMPE_PHYS_ADDR                0x14014000 /* 5 */
 #define AU1550_USB_OHCI_PHYS_ADDR      0x14020000 /* 3 */
 #define AU1200_USB_CTL_PHYS_ADDR       0x14020000 /* 4 */
 #define AU1200_USB_OTG_PHYS_ADDR       0x14020020 /* 4 */
 #define AU1200_USB_OHCI_PHYS_ADDR      0x14020100 /* 4 */
 #define AU1200_USB_EHCI_PHYS_ADDR      0x14020200 /* 4 */
 #define AU1200_USB_UDC_PHYS_ADDR       0x14022000 /* 4 */
+#define AU1300_USB_EHCI_PHYS_ADDR      0x14020000 /* 5 */
+#define AU1300_USB_OHCI0_PHYS_ADDR     0x14020400 /* 5 */
+#define AU1300_USB_OHCI1_PHYS_ADDR     0x14020800 /* 5 */
+#define AU1300_USB_CTL_PHYS_ADDR       0x14021000 /* 5 */
+#define AU1300_USB_OTG_PHYS_ADDR       0x14022000 /* 5 */
+#define AU1300_MAEBSA_PHYS_ADDR                0x14030000 /* 5 */
 #define AU1100_LCD_PHYS_ADDR           0x15000000 /* 2 */
-#define AU1200_LCD_PHYS_ADDR           0x15000000 /* 4 */
+#define AU1200_LCD_PHYS_ADDR           0x15000000 /* 45 */
 #define AU1500_PCI_MEM_PHYS_ADDR       0x400000000ULL /* 13 */
 #define AU1500_PCI_IO_PHYS_ADDR                0x500000000ULL /* 13 */
 #define AU1500_PCI_CONFIG0_PHYS_ADDR   0x600000000ULL /* 13 */
 #define AU1500_PCI_CONFIG1_PHYS_ADDR   0x680000000ULL /* 13 */
-#define AU1000_PCMCIA_IO_PHYS_ADDR     0xF00000000ULL /* 01234 */
-#define AU1000_PCMCIA_ATTR_PHYS_ADDR   0xF40000000ULL /* 01234 */
-#define AU1000_PCMCIA_MEM_PHYS_ADDR    0xF80000000ULL /* 01234 */
+#define AU1000_PCMCIA_IO_PHYS_ADDR     0xF00000000ULL /* 012345 */
+#define AU1000_PCMCIA_ATTR_PHYS_ADDR   0xF40000000ULL /* 012345 */
+#define AU1000_PCMCIA_MEM_PHYS_ADDR    0xF80000000ULL /* 012345 */
 
+/**********************************************************************/
+
+
+/*
+ * Au1300 GPIO+INT controller (GPIC) register offsets and bits
+ * Registers are 128bits (0x10 bytes), divided into 4 "banks".
+ */
+#define AU1300_GPIC_PINVAL     0x0000
+#define AU1300_GPIC_PINVALCLR  0x0010
+#define AU1300_GPIC_IPEND      0x0020
+#define AU1300_GPIC_PRIENC     0x0030
+#define AU1300_GPIC_IEN                0x0040  /* int_mask in manual */
+#define AU1300_GPIC_IDIS       0x0050  /* int_maskclr in manual */
+#define AU1300_GPIC_DMASEL     0x0060
+#define AU1300_GPIC_DEVSEL     0x0080
+#define AU1300_GPIC_DEVCLR     0x0090
+#define AU1300_GPIC_RSTVAL     0x00a0
+/* pin configuration space. one 32bit register for up to 128 IRQs */
+#define AU1300_GPIC_PINCFG     0x1000
+
+#define GPIC_GPIO_TO_BIT(gpio) \
+       (1 << ((gpio) & 0x1f))
+
+#define GPIC_GPIO_BANKOFF(gpio)        \
+       (((gpio) >> 5) * 4)
+
+/* Pin Control bits: who owns the pin, what does it do */
+#define GPIC_CFG_PC_GPIN               0
+#define GPIC_CFG_PC_DEV                        1
+#define GPIC_CFG_PC_GPOLOW             2
+#define GPIC_CFG_PC_GPOHIGH            3
+#define GPIC_CFG_PC_MASK               3
+
+/* assign pin to MIPS IRQ line */
+#define GPIC_CFG_IL_SET(x)     (((x) & 3) << 2)
+#define GPIC_CFG_IL_MASK       (3 << 2)
+
+/* pin interrupt type setup */
+#define GPIC_CFG_IC_OFF                (0 << 4)
+#define GPIC_CFG_IC_LEVEL_LOW  (1 << 4)
+#define GPIC_CFG_IC_LEVEL_HIGH (2 << 4)
+#define GPIC_CFG_IC_EDGE_FALL  (5 << 4)
+#define GPIC_CFG_IC_EDGE_RISE  (6 << 4)
+#define GPIC_CFG_IC_EDGE_BOTH  (7 << 4)
+#define GPIC_CFG_IC_MASK       (7 << 4)
+
+/* allow interrupt to wake cpu from 'wait' */
+#define GPIC_CFG_IDLEWAKE      (1 << 7)
+
+/***********************************************************************/
 
 /* Au1000 SDRAM memory controller register offsets */
 #define AU1000_MEM_SDMODE0             0x0000
@@ -1068,44 +1265,20 @@ enum soc_au1200_ints {
 #define SSI_ENABLE_CD          (1 << 1)
 #define SSI_ENABLE_E           (1 << 0)
 
-/* IrDA Controller */
-#define IRDA_BASE              0xB0300000
-#define IR_RING_PTR_STATUS     (IRDA_BASE + 0x00)
-#define IR_RING_BASE_ADDR_H    (IRDA_BASE + 0x04)
-#define IR_RING_BASE_ADDR_L    (IRDA_BASE + 0x08)
-#define IR_RING_SIZE           (IRDA_BASE + 0x0C)
-#define IR_RING_PROMPT         (IRDA_BASE + 0x10)
-#define IR_RING_ADDR_CMPR      (IRDA_BASE + 0x14)
-#define IR_INT_CLEAR           (IRDA_BASE + 0x18)
-#define IR_CONFIG_1            (IRDA_BASE + 0x20)
-#  define IR_RX_INVERT_LED     (1 << 0)
-#  define IR_TX_INVERT_LED     (1 << 1)
-#  define IR_ST                (1 << 2)
-#  define IR_SF                (1 << 3)
-#  define IR_SIR               (1 << 4)
-#  define IR_MIR               (1 << 5)
-#  define IR_FIR               (1 << 6)
-#  define IR_16CRC             (1 << 7)
-#  define IR_TD                (1 << 8)
-#  define IR_RX_ALL            (1 << 9)
-#  define IR_DMA_ENABLE        (1 << 10)
-#  define IR_RX_ENABLE         (1 << 11)
-#  define IR_TX_ENABLE         (1 << 12)
-#  define IR_LOOPBACK          (1 << 14)
-#  define IR_SIR_MODE          (IR_SIR | IR_DMA_ENABLE | \
-                                IR_RX_ALL | IR_RX_ENABLE | IR_SF | IR_16CRC)
-#define IR_SIR_FLAGS           (IRDA_BASE + 0x24)
-#define IR_ENABLE              (IRDA_BASE + 0x28)
-#  define IR_RX_STATUS         (1 << 9)
-#  define IR_TX_STATUS         (1 << 10)
-#define IR_READ_PHY_CONFIG     (IRDA_BASE + 0x2C)
-#define IR_WRITE_PHY_CONFIG    (IRDA_BASE + 0x30)
-#define IR_MAX_PKT_LEN         (IRDA_BASE + 0x34)
-#define IR_RX_BYTE_CNT         (IRDA_BASE + 0x38)
-#define IR_CONFIG_2            (IRDA_BASE + 0x3C)
-#  define IR_MODE_INV          (1 << 0)
-#  define IR_ONE_PIN           (1 << 1)
-#define IR_INTERFACE_CONFIG    (IRDA_BASE + 0x40)
+
+/*
+ * The IrDA peripheral has an IRFIRSEL pin, but on the DB/PB boards it's not
+ * used to select FIR/SIR mode on the transceiver but as a GPIO.  Instead a
+ * CPLD has to be told about the mode.
+ */
+#define AU1000_IRDA_PHY_MODE_OFF       0
+#define AU1000_IRDA_PHY_MODE_SIR       1
+#define AU1000_IRDA_PHY_MODE_FIR       2
+
+struct au1k_irda_platform_data {
+       void(*set_phy_mode)(int mode);
+};
+
 
 /* GPIO */
 #define SYS_PINFUNC            0xB190002C
index 94000a3b6f0b7c7e07feab37f33a74c82c40d535..e221659f1bca5ae0f788b554b80d188a561b5eee 100644 (file)
@@ -130,8 +130,10 @@ struct au1xmmc_platform_data {
 #define SD_CONFIG2_DF  (0x00000008)
 #define SD_CONFIG2_DC  (0x00000010)
 #define SD_CONFIG2_xx2 (0x000000e0)
+#define SD_CONFIG2_BB  (0x00000080)
 #define SD_CONFIG2_WB  (0x00000100)
 #define SD_CONFIG2_RW  (0x00000200)
+#define SD_CONFIG2_DP  (0x00000400)
 
 
 /*
diff --git a/arch/mips/include/asm/mach-au1x00/au1200fb.h b/arch/mips/include/asm/mach-au1x00/au1200fb.h
new file mode 100644 (file)
index 0000000..b3c87cc
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * platform data for au1200fb driver.
+ */
+
+#ifndef _AU1200FB_PLAT_H_
+#define _AU1200FB_PLAT_H_
+
+struct au1200fb_platdata {
+       int (*panel_index)(void);
+       int (*panel_init)(void);
+       int (*panel_shutdown)(void);
+};
+
+#endif
diff --git a/arch/mips/include/asm/mach-au1x00/au1550nd.h b/arch/mips/include/asm/mach-au1x00/au1550nd.h
new file mode 100644 (file)
index 0000000..ad4c0a0
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * platform data for the Au1550 NAND driver
+ */
+
+#ifndef _AU1550ND_H_
+#define _AU1550ND_H_
+
+#include <linux/mtd/partitions.h>
+
+struct au1550nd_platdata {
+       struct mtd_partition *parts;
+       int num_parts;
+       int devwidth;   /* 0 = 8bit device, 1 = 16bit device */
+};
+
+#endif
index 323ce2d145f29e064c3daa87e936214778421c25..217810e18361c3e31e351efd11a5bde15cc9fc70 100644 (file)
@@ -183,6 +183,37 @@ typedef volatile struct au1xxx_ddma_desc {
 #define AU1200_DSCR_CMD0_PSC1_SYNC     25
 #define AU1200_DSCR_CMD0_CIM_SYNC      26
 
+#define AU1300_DSCR_CMD0_UART0_TX      0
+#define AU1300_DSCR_CMD0_UART0_RX      1
+#define AU1300_DSCR_CMD0_UART1_TX      2
+#define AU1300_DSCR_CMD0_UART1_RX      3
+#define AU1300_DSCR_CMD0_UART2_TX      4
+#define AU1300_DSCR_CMD0_UART2_RX      5
+#define AU1300_DSCR_CMD0_UART3_TX      6
+#define AU1300_DSCR_CMD0_UART3_RX      7
+#define AU1300_DSCR_CMD0_SDMS_TX0      8
+#define AU1300_DSCR_CMD0_SDMS_RX0      9
+#define AU1300_DSCR_CMD0_SDMS_TX1      10
+#define AU1300_DSCR_CMD0_SDMS_RX1      11
+#define AU1300_DSCR_CMD0_AES_TX        12
+#define AU1300_DSCR_CMD0_AES_RX        13
+#define AU1300_DSCR_CMD0_PSC0_TX       14
+#define AU1300_DSCR_CMD0_PSC0_RX       15
+#define AU1300_DSCR_CMD0_PSC1_TX       16
+#define AU1300_DSCR_CMD0_PSC1_RX       17
+#define AU1300_DSCR_CMD0_PSC2_TX       18
+#define AU1300_DSCR_CMD0_PSC2_RX       19
+#define AU1300_DSCR_CMD0_PSC3_TX       20
+#define AU1300_DSCR_CMD0_PSC3_RX       21
+#define AU1300_DSCR_CMD0_LCD           22
+#define AU1300_DSCR_CMD0_NAND_FLASH    23
+#define AU1300_DSCR_CMD0_SDMS_TX2      24
+#define AU1300_DSCR_CMD0_SDMS_RX2      25
+#define AU1300_DSCR_CMD0_CIM_SYNC      26
+#define AU1300_DSCR_CMD0_UDMA          27
+#define AU1300_DSCR_CMD0_DMA_REQ0      28
+#define AU1300_DSCR_CMD0_DMA_REQ1      29
+
 #define DSCR_CMD0_THROTTLE     30
 #define DSCR_CMD0_ALWAYS       31
 #define DSCR_NDEV_IDS          32
index d5df0cab9b8799774387b08ba447a5e3f5d7145e..3f741af37d47cf8153aabe49a8e435e7f7fa4257 100644 (file)
 #define cpu_has_4k_cache               1
 #define cpu_has_tx39_cache             0
 #define cpu_has_fpu                    0
+#define cpu_has_32fpr                  0
 #define cpu_has_counter                        1
 #define cpu_has_watch                  1
 #define cpu_has_divec                  1
 #define cpu_has_vce                    0
 #define cpu_has_cache_cdex_p           0
 #define cpu_has_cache_cdex_s           0
+#define cpu_has_prefetch               1
 #define cpu_has_mcheck                 1
 #define cpu_has_ejtag                  1
 #define cpu_has_llsc                   1
@@ -29,6 +31,7 @@
 #define cpu_has_vtag_icache            0
 #define cpu_has_dc_aliases             0
 #define cpu_has_ic_fills_f_dc          1
+#define cpu_has_pindexed_dcache                0
 #define cpu_has_mips32r1               1
 #define cpu_has_mips32r2               0
 #define cpu_has_mips64r1               0
diff --git a/arch/mips/include/asm/mach-au1x00/gpio-au1300.h b/arch/mips/include/asm/mach-au1x00/gpio-au1300.h
new file mode 100644 (file)
index 0000000..556e1be
--- /dev/null
@@ -0,0 +1,241 @@
+/*
+ * gpio-au1300.h -- GPIO control for Au1300 GPIC and compatibles.
+ *
+ * Copyright (c) 2009-2011 Manuel Lauss <manuel.lauss@googlemail.com>
+ */
+
+#ifndef _GPIO_AU1300_H_
+#define _GPIO_AU1300_H_
+
+#include <asm/addrspace.h>
+#include <asm/io.h>
+#include <asm/mach-au1x00/au1000.h>
+
+/* with the current GPIC design, up to 128 GPIOs are possible.
+ * The only implementation so far is in the Au1300, which has 75 externally
+ * available GPIOs.
+ */
+#define AU1300_GPIO_BASE       0
+#define AU1300_GPIO_NUM                75
+#define AU1300_GPIO_MAX                (AU1300_GPIO_BASE + AU1300_GPIO_NUM - 1)
+
+#define AU1300_GPIC_ADDR       \
+       (void __iomem *)KSEG1ADDR(AU1300_GPIC_PHYS_ADDR)
+
+static inline int au1300_gpio_get_value(unsigned int gpio)
+{
+       void __iomem *roff = AU1300_GPIC_ADDR;
+       int bit;
+
+       gpio -= AU1300_GPIO_BASE;
+       roff += GPIC_GPIO_BANKOFF(gpio);
+       bit = GPIC_GPIO_TO_BIT(gpio);
+       return __raw_readl(roff + AU1300_GPIC_PINVAL) & bit;
+}
+
+static inline int au1300_gpio_direction_input(unsigned int gpio)
+{
+       void __iomem *roff = AU1300_GPIC_ADDR;
+       unsigned long bit;
+
+       gpio -= AU1300_GPIO_BASE;
+
+       roff += GPIC_GPIO_BANKOFF(gpio);
+       bit = GPIC_GPIO_TO_BIT(gpio);
+       __raw_writel(bit, roff + AU1300_GPIC_DEVCLR);
+       wmb();
+
+       return 0;
+}
+
+static inline int au1300_gpio_set_value(unsigned int gpio, int v)
+{
+       void __iomem *roff = AU1300_GPIC_ADDR;
+       unsigned long bit;
+
+       gpio -= AU1300_GPIO_BASE;
+
+       roff += GPIC_GPIO_BANKOFF(gpio);
+       bit = GPIC_GPIO_TO_BIT(gpio);
+       __raw_writel(bit, roff + (v ? AU1300_GPIC_PINVAL
+                                   : AU1300_GPIC_PINVALCLR));
+       wmb();
+
+       return 0;
+}
+
+static inline int au1300_gpio_direction_output(unsigned int gpio, int v)
+{
+       /* hw switches to output automatically */
+       return au1300_gpio_set_value(gpio, v);
+}
+
+static inline int au1300_gpio_to_irq(unsigned int gpio)
+{
+       return AU1300_FIRST_INT + (gpio - AU1300_GPIO_BASE);
+}
+
+static inline int au1300_irq_to_gpio(unsigned int irq)
+{
+       return (irq - AU1300_FIRST_INT) + AU1300_GPIO_BASE;
+}
+
+static inline int au1300_gpio_is_valid(unsigned int gpio)
+{
+       int ret;
+
+       switch (alchemy_get_cputype()) {
+       case ALCHEMY_CPU_AU1300:
+               ret = ((gpio >= AU1300_GPIO_BASE) && (gpio <= AU1300_GPIO_MAX));
+               break;
+       default:
+               ret = 0;
+       }
+       return ret;
+}
+
+static inline int au1300_gpio_cansleep(unsigned int gpio)
+{
+       return 0;
+}
+
+/* hardware remembers gpio 0-63 levels on powerup */
+static inline int au1300_gpio_getinitlvl(unsigned int gpio)
+{
+       void __iomem *roff = AU1300_GPIC_ADDR;
+       unsigned long v;
+
+       if (unlikely(gpio > 63))
+               return 0;
+       else if (gpio > 31) {
+               gpio -= 32;
+               roff += 4;
+       }
+
+       v = __raw_readl(roff + AU1300_GPIC_RSTVAL);
+       return (v >> gpio) & 1;
+}
+
+/**********************************************************************/
+
+/* Linux gpio framework integration.
+*
+* 4 use cases of Alchemy GPIOS:
+*(1) GPIOLIB=y, ALCHEMY_GPIO_INDIRECT=y:
+*      Board must register gpiochips.
+*(2) GPIOLIB=y, ALCHEMY_GPIO_INDIRECT=n:
+*      A gpiochip for the 75 GPIOs is registered.
+*
+*(3) GPIOLIB=n, ALCHEMY_GPIO_INDIRECT=y:
+*      the boards' gpio.h must provide the linux gpio wrapper functions,
+*
+*(4) GPIOLIB=n, ALCHEMY_GPIO_INDIRECT=n:
+*      inlinable gpio functions are provided which enable access to the
+*      Au1300 gpios only by using the numbers straight out of the data-
+*      sheets.
+
+* Cases 1 and 3 are intended for boards which want to provide their own
+* GPIO namespace and -operations (i.e. for example you have 8 GPIOs
+* which are in part provided by spare Au1300 GPIO pins and in part by
+* an external FPGA but you still want them to be accssible in linux
+* as gpio0-7. The board can of course use the alchemy_gpioX_* functions
+* as required).
+*/
+
+#ifndef CONFIG_GPIOLIB
+
+#ifdef CONFIG_ALCHEMY_GPIOINT_AU1300
+
+#ifndef CONFIG_ALCHEMY_GPIO_INDIRECT   /* case (4) */
+
+static inline int gpio_direction_input(unsigned int gpio)
+{
+       return au1300_gpio_direction_input(gpio);
+}
+
+static inline int gpio_direction_output(unsigned int gpio, int v)
+{
+       return au1300_gpio_direction_output(gpio, v);
+}
+
+static inline int gpio_get_value(unsigned int gpio)
+{
+       return au1300_gpio_get_value(gpio);
+}
+
+static inline void gpio_set_value(unsigned int gpio, int v)
+{
+       au1300_gpio_set_value(gpio, v);
+}
+
+static inline int gpio_get_value_cansleep(unsigned gpio)
+{
+       return gpio_get_value(gpio);
+}
+
+static inline void gpio_set_value_cansleep(unsigned gpio, int value)
+{
+       gpio_set_value(gpio, value);
+}
+
+static inline int gpio_is_valid(unsigned int gpio)
+{
+       return au1300_gpio_is_valid(gpio);
+}
+
+static inline int gpio_cansleep(unsigned int gpio)
+{
+       return au1300_gpio_cansleep(gpio);
+}
+
+static inline int gpio_to_irq(unsigned int gpio)
+{
+       return au1300_gpio_to_irq(gpio);
+}
+
+static inline int irq_to_gpio(unsigned int irq)
+{
+       return au1300_irq_to_gpio(irq);
+}
+
+static inline int gpio_request(unsigned int gpio, const char *label)
+{
+       return 0;
+}
+
+static inline void gpio_free(unsigned int gpio)
+{
+}
+
+static inline int gpio_set_debounce(unsigned gpio, unsigned debounce)
+{
+       return -ENOSYS;
+}
+
+static inline void gpio_unexport(unsigned gpio)
+{
+}
+
+static inline int gpio_export(unsigned gpio, bool direction_may_change)
+{
+       return -ENOSYS;
+}
+
+static inline int gpio_sysfs_set_active_low(unsigned gpio, int value)
+{
+       return -ENOSYS;
+}
+
+static inline int gpio_export_link(struct device *dev, const char *name,
+                                  unsigned gpio)
+{
+       return -ENOSYS;
+}
+
+#endif /* !CONFIG_ALCHEMY_GPIO_INDIRECT */
+
+#endif /* CONFIG_ALCHEMY_GPIOINT_AU1300 */
+
+#endif /* CONFIG GPIOLIB */
+
+#endif /* _GPIO_AU1300_H_ */
index fcdc8c4809db523617cefd3ef46c93cf26ee5e4c..22e7ff17fc48298752bffef99d69cc48ac3ca598 100644 (file)
@@ -12,6 +12,7 @@
 
 #include <asm/mach-au1x00/au1000.h>
 #include <asm/mach-au1x00/gpio-au1000.h>
+#include <asm/mach-au1x00/gpio-au1300.h>
 
 /* On Au1000, Au1500 and Au1100 GPIOs won't work as inputs before
  * SYS_PININPUTEN is written to at least once.  On Au1550/Au1200/Au1300 this
@@ -58,6 +59,8 @@ static inline int __au_irq_to_gpio(unsigned int irq)
        switch (alchemy_get_cputype()) {
        case ALCHEMY_CPU_AU1000...ALCHEMY_CPU_AU1200:
                return alchemy_irq_to_gpio(irq);
+       case ALCHEMY_CPU_AU1300:
+               return au1300_irq_to_gpio(irq);
        }
        return -EINVAL;
 }
index 96a2391ad85be96a4d4d8e2c9b95ca35c9af6244..5b8d15bb5fe85a4b6d234f6aaf006d9e451efb8d 100644 (file)
@@ -13,6 +13,7 @@
 #define BCM6345_CPU_ID         0x6345
 #define BCM6348_CPU_ID         0x6348
 #define BCM6358_CPU_ID         0x6358
+#define BCM6368_CPU_ID         0x6368
 
 void __init bcm63xx_cpu_init(void);
 u16 __bcm63xx_get_cpu_id(void);
@@ -71,6 +72,19 @@ unsigned int bcm63xx_get_cpu_freq(void);
 # define BCMCPU_IS_6358()      (0)
 #endif
 
+#ifdef CONFIG_BCM63XX_CPU_6368
+# ifdef bcm63xx_get_cpu_id
+#  undef bcm63xx_get_cpu_id
+#  define bcm63xx_get_cpu_id() __bcm63xx_get_cpu_id()
+#  define BCMCPU_RUNTIME_DETECT
+# else
+#  define bcm63xx_get_cpu_id() BCM6368_CPU_ID
+# endif
+# define BCMCPU_IS_6368()      (bcm63xx_get_cpu_id() == BCM6368_CPU_ID)
+#else
+# define BCMCPU_IS_6368()      (0)
+#endif
+
 #ifndef bcm63xx_get_cpu_id
 #error "No CPU support configured"
 #endif
@@ -88,6 +102,7 @@ enum bcm63xx_regs_set {
        RSET_UART1,
        RSET_GPIO,
        RSET_SPI,
+       RSET_SPI2,
        RSET_UDC0,
        RSET_OHCI0,
        RSET_OHCI_PRIV,
@@ -98,10 +113,23 @@ enum bcm63xx_regs_set {
        RSET_ENET0,
        RSET_ENET1,
        RSET_ENETDMA,
+       RSET_ENETDMAC,
+       RSET_ENETDMAS,
+       RSET_ENETSW,
        RSET_EHCI0,
        RSET_SDRAM,
        RSET_MEMC,
        RSET_DDR,
+       RSET_M2M,
+       RSET_ATM,
+       RSET_XTM,
+       RSET_XTMDMA,
+       RSET_XTMDMAC,
+       RSET_XTMDMAS,
+       RSET_PCM,
+       RSET_PCMDMA,
+       RSET_PCMDMAC,
+       RSET_PCMDMAS,
 };
 
 #define RSET_DSL_LMEM_SIZE             (64 * 1024 * 4)
@@ -109,11 +137,18 @@ enum bcm63xx_regs_set {
 #define RSET_WDT_SIZE                  12
 #define RSET_ENET_SIZE                 2048
 #define RSET_ENETDMA_SIZE              2048
+#define RSET_ENETSW_SIZE               65536
 #define RSET_UART_SIZE                 24
 #define RSET_UDC_SIZE                  256
 #define RSET_OHCI_SIZE                 256
 #define RSET_EHCI_SIZE                 256
 #define RSET_PCMCIA_SIZE               12
+#define RSET_M2M_SIZE                  256
+#define RSET_ATM_SIZE                  4096
+#define RSET_XTM_SIZE                  10240
+#define RSET_XTMDMA_SIZE               256
+#define RSET_XTMDMAC_SIZE(chans)       (16 * (chans))
+#define RSET_XTMDMAS_SIZE(chans)       (16 * (chans))
 
 /*
  * 6338 register sets base address
@@ -127,6 +162,7 @@ enum bcm63xx_regs_set {
 #define BCM_6338_UART1_BASE            (0xdeadbeef)
 #define BCM_6338_GPIO_BASE             (0xfffe0400)
 #define BCM_6338_SPI_BASE              (0xfffe0c00)
+#define BCM_6338_SPI2_BASE             (0xdeadbeef)
 #define BCM_6338_UDC0_BASE             (0xdeadbeef)
 #define BCM_6338_USBDMA_BASE           (0xfffe2400)
 #define BCM_6338_OHCI0_BASE            (0xdeadbeef)
@@ -136,15 +172,27 @@ enum bcm63xx_regs_set {
 #define BCM_6338_PCMCIA_BASE           (0xdeadbeef)
 #define BCM_6338_SDRAM_REGS_BASE       (0xfffe3100)
 #define BCM_6338_DSL_BASE              (0xfffe1000)
-#define BCM_6338_SAR_BASE              (0xfffe2000)
 #define BCM_6338_UBUS_BASE             (0xdeadbeef)
 #define BCM_6338_ENET0_BASE            (0xfffe2800)
 #define BCM_6338_ENET1_BASE            (0xdeadbeef)
 #define BCM_6338_ENETDMA_BASE          (0xfffe2400)
+#define BCM_6338_ENETDMAC_BASE         (0xfffe2500)
+#define BCM_6338_ENETDMAS_BASE         (0xfffe2600)
+#define BCM_6338_ENETSW_BASE           (0xdeadbeef)
 #define BCM_6338_EHCI0_BASE            (0xdeadbeef)
 #define BCM_6338_SDRAM_BASE            (0xfffe3100)
 #define BCM_6338_MEMC_BASE             (0xdeadbeef)
 #define BCM_6338_DDR_BASE              (0xdeadbeef)
+#define BCM_6338_M2M_BASE              (0xdeadbeef)
+#define BCM_6338_ATM_BASE              (0xfffe2000)
+#define BCM_6338_XTM_BASE              (0xdeadbeef)
+#define BCM_6338_XTMDMA_BASE           (0xdeadbeef)
+#define BCM_6338_XTMDMAC_BASE          (0xdeadbeef)
+#define BCM_6338_XTMDMAS_BASE          (0xdeadbeef)
+#define BCM_6338_PCM_BASE              (0xdeadbeef)
+#define BCM_6338_PCMDMA_BASE           (0xdeadbeef)
+#define BCM_6338_PCMDMAC_BASE          (0xdeadbeef)
+#define BCM_6338_PCMDMAS_BASE          (0xdeadbeef)
 
 /*
  * 6345 register sets base address
@@ -158,24 +206,37 @@ enum bcm63xx_regs_set {
 #define BCM_6345_UART1_BASE            (0xdeadbeef)
 #define BCM_6345_GPIO_BASE             (0xfffe0400)
 #define BCM_6345_SPI_BASE              (0xdeadbeef)
+#define BCM_6345_SPI2_BASE             (0xdeadbeef)
 #define BCM_6345_UDC0_BASE             (0xdeadbeef)
 #define BCM_6345_USBDMA_BASE           (0xfffe2800)
 #define BCM_6345_ENET0_BASE            (0xfffe1800)
 #define BCM_6345_ENETDMA_BASE          (0xfffe2800)
+#define BCM_6345_ENETDMAC_BASE         (0xfffe2900)
+#define BCM_6345_ENETDMAS_BASE         (0xfffe2a00)
+#define BCM_6345_ENETSW_BASE           (0xdeadbeef)
 #define BCM_6345_PCMCIA_BASE           (0xfffe2028)
-#define BCM_6345_MPI_BASE              (0xdeadbeef)
+#define BCM_6345_MPI_BASE              (0xfffe2000)
 #define BCM_6345_OHCI0_BASE            (0xfffe2100)
 #define BCM_6345_OHCI_PRIV_BASE                (0xfffe2200)
 #define BCM_6345_USBH_PRIV_BASE                (0xdeadbeef)
 #define BCM_6345_SDRAM_REGS_BASE       (0xfffe2300)
 #define BCM_6345_DSL_BASE              (0xdeadbeef)
-#define BCM_6345_SAR_BASE              (0xdeadbeef)
 #define BCM_6345_UBUS_BASE             (0xdeadbeef)
 #define BCM_6345_ENET1_BASE            (0xdeadbeef)
 #define BCM_6345_EHCI0_BASE            (0xdeadbeef)
 #define BCM_6345_SDRAM_BASE            (0xfffe2300)
 #define BCM_6345_MEMC_BASE             (0xdeadbeef)
 #define BCM_6345_DDR_BASE              (0xdeadbeef)
+#define BCM_6345_M2M_BASE              (0xdeadbeef)
+#define BCM_6345_ATM_BASE              (0xfffe4000)
+#define BCM_6345_XTM_BASE              (0xdeadbeef)
+#define BCM_6345_XTMDMA_BASE           (0xdeadbeef)
+#define BCM_6345_XTMDMAC_BASE          (0xdeadbeef)
+#define BCM_6345_XTMDMAS_BASE          (0xdeadbeef)
+#define BCM_6345_PCM_BASE              (0xdeadbeef)
+#define BCM_6345_PCMDMA_BASE           (0xdeadbeef)
+#define BCM_6345_PCMDMAC_BASE          (0xdeadbeef)
+#define BCM_6345_PCMDMAS_BASE          (0xdeadbeef)
 
 /*
  * 6348 register sets base address
@@ -188,6 +249,7 @@ enum bcm63xx_regs_set {
 #define BCM_6348_UART1_BASE            (0xdeadbeef)
 #define BCM_6348_GPIO_BASE             (0xfffe0400)
 #define BCM_6348_SPI_BASE              (0xfffe0c00)
+#define BCM_6348_SPI2_BASE             (0xdeadbeef)
 #define BCM_6348_UDC0_BASE             (0xfffe1000)
 #define BCM_6348_OHCI0_BASE            (0xfffe1b00)
 #define BCM_6348_OHCI_PRIV_BASE                (0xfffe1c00)
@@ -195,14 +257,27 @@ enum bcm63xx_regs_set {
 #define BCM_6348_MPI_BASE              (0xfffe2000)
 #define BCM_6348_PCMCIA_BASE           (0xfffe2054)
 #define BCM_6348_SDRAM_REGS_BASE       (0xfffe2300)
+#define BCM_6348_M2M_BASE              (0xfffe2800)
 #define BCM_6348_DSL_BASE              (0xfffe3000)
 #define BCM_6348_ENET0_BASE            (0xfffe6000)
 #define BCM_6348_ENET1_BASE            (0xfffe6800)
 #define BCM_6348_ENETDMA_BASE          (0xfffe7000)
+#define BCM_6348_ENETDMAC_BASE         (0xfffe7100)
+#define BCM_6348_ENETDMAS_BASE         (0xfffe7200)
+#define BCM_6348_ENETSW_BASE           (0xdeadbeef)
 #define BCM_6348_EHCI0_BASE            (0xdeadbeef)
 #define BCM_6348_SDRAM_BASE            (0xfffe2300)
 #define BCM_6348_MEMC_BASE             (0xdeadbeef)
 #define BCM_6348_DDR_BASE              (0xdeadbeef)
+#define BCM_6348_ATM_BASE              (0xfffe4000)
+#define BCM_6348_XTM_BASE              (0xdeadbeef)
+#define BCM_6348_XTMDMA_BASE           (0xdeadbeef)
+#define BCM_6348_XTMDMAC_BASE          (0xdeadbeef)
+#define BCM_6348_XTMDMAS_BASE          (0xdeadbeef)
+#define BCM_6348_PCM_BASE              (0xdeadbeef)
+#define BCM_6348_PCMDMA_BASE           (0xdeadbeef)
+#define BCM_6348_PCMDMAC_BASE          (0xdeadbeef)
+#define BCM_6348_PCMDMAS_BASE          (0xdeadbeef)
 
 /*
  * 6358 register sets base address
@@ -215,6 +290,7 @@ enum bcm63xx_regs_set {
 #define BCM_6358_UART1_BASE            (0xfffe0120)
 #define BCM_6358_GPIO_BASE             (0xfffe0080)
 #define BCM_6358_SPI_BASE              (0xdeadbeef)
+#define BCM_6358_SPI2_BASE             (0xfffe0800)
 #define BCM_6358_UDC0_BASE             (0xfffe0800)
 #define BCM_6358_OHCI0_BASE            (0xfffe1400)
 #define BCM_6358_OHCI_PRIV_BASE                (0xdeadbeef)
@@ -222,214 +298,175 @@ enum bcm63xx_regs_set {
 #define BCM_6358_MPI_BASE              (0xfffe1000)
 #define BCM_6358_PCMCIA_BASE           (0xfffe1054)
 #define BCM_6358_SDRAM_REGS_BASE       (0xfffe2300)
+#define BCM_6358_M2M_BASE              (0xdeadbeef)
 #define BCM_6358_DSL_BASE              (0xfffe3000)
 #define BCM_6358_ENET0_BASE            (0xfffe4000)
 #define BCM_6358_ENET1_BASE            (0xfffe4800)
 #define BCM_6358_ENETDMA_BASE          (0xfffe5000)
+#define BCM_6358_ENETDMAC_BASE         (0xfffe5100)
+#define BCM_6358_ENETDMAS_BASE         (0xfffe5200)
+#define BCM_6358_ENETSW_BASE           (0xdeadbeef)
 #define BCM_6358_EHCI0_BASE            (0xfffe1300)
 #define BCM_6358_SDRAM_BASE            (0xdeadbeef)
 #define BCM_6358_MEMC_BASE             (0xfffe1200)
 #define BCM_6358_DDR_BASE              (0xfffe12a0)
+#define BCM_6358_ATM_BASE              (0xfffe2000)
+#define BCM_6358_XTM_BASE              (0xdeadbeef)
+#define BCM_6358_XTMDMA_BASE           (0xdeadbeef)
+#define BCM_6358_XTMDMAC_BASE          (0xdeadbeef)
+#define BCM_6358_XTMDMAS_BASE          (0xdeadbeef)
+#define BCM_6358_PCM_BASE              (0xfffe1600)
+#define BCM_6358_PCMDMA_BASE           (0xfffe1800)
+#define BCM_6358_PCMDMAC_BASE          (0xfffe1900)
+#define BCM_6358_PCMDMAS_BASE          (0xfffe1a00)
+
+
+/*
+ * 6368 register sets base address
+ */
+#define BCM_6368_DSL_LMEM_BASE         (0xdeadbeef)
+#define BCM_6368_PERF_BASE             (0xb0000000)
+#define BCM_6368_TIMER_BASE            (0xb0000040)
+#define BCM_6368_WDT_BASE              (0xb000005c)
+#define BCM_6368_UART0_BASE            (0xb0000100)
+#define BCM_6368_UART1_BASE            (0xb0000120)
+#define BCM_6368_GPIO_BASE             (0xb0000080)
+#define BCM_6368_SPI_BASE              (0xdeadbeef)
+#define BCM_6368_SPI2_BASE             (0xb0000800)
+#define BCM_6368_UDC0_BASE             (0xdeadbeef)
+#define BCM_6368_OHCI0_BASE            (0xb0001600)
+#define BCM_6368_OHCI_PRIV_BASE                (0xdeadbeef)
+#define BCM_6368_USBH_PRIV_BASE                (0xb0001700)
+#define BCM_6368_MPI_BASE              (0xb0001000)
+#define BCM_6368_PCMCIA_BASE           (0xb0001054)
+#define BCM_6368_SDRAM_REGS_BASE       (0xdeadbeef)
+#define BCM_6368_M2M_BASE              (0xdeadbeef)
+#define BCM_6368_DSL_BASE              (0xdeadbeef)
+#define BCM_6368_ENET0_BASE            (0xdeadbeef)
+#define BCM_6368_ENET1_BASE            (0xdeadbeef)
+#define BCM_6368_ENETDMA_BASE          (0xb0006800)
+#define BCM_6368_ENETDMAC_BASE         (0xb0006a00)
+#define BCM_6368_ENETDMAS_BASE         (0xb0006c00)
+#define BCM_6368_ENETSW_BASE           (0xb0f00000)
+#define BCM_6368_EHCI0_BASE            (0xb0001500)
+#define BCM_6368_SDRAM_BASE            (0xdeadbeef)
+#define BCM_6368_MEMC_BASE             (0xb0001200)
+#define BCM_6368_DDR_BASE              (0xb0001280)
+#define BCM_6368_ATM_BASE              (0xdeadbeef)
+#define BCM_6368_XTM_BASE              (0xb0001800)
+#define BCM_6368_XTMDMA_BASE           (0xb0005000)
+#define BCM_6368_XTMDMAC_BASE          (0xb0005200)
+#define BCM_6368_XTMDMAS_BASE          (0xb0005400)
+#define BCM_6368_PCM_BASE              (0xb0004000)
+#define BCM_6368_PCMDMA_BASE           (0xb0005800)
+#define BCM_6368_PCMDMAC_BASE          (0xb0005a00)
+#define BCM_6368_PCMDMAS_BASE          (0xb0005c00)
 
 
 extern const unsigned long *bcm63xx_regs_base;
 
+#define __GEN_RSET_BASE(__cpu, __rset)                                 \
+       case RSET_## __rset :                                           \
+               return BCM_## __cpu ##_## __rset ##_BASE;
+
+#define __GEN_RSET(__cpu)                                              \
+       switch (set) {                                                  \
+       __GEN_RSET_BASE(__cpu, DSL_LMEM)                                \
+       __GEN_RSET_BASE(__cpu, PERF)                                    \
+       __GEN_RSET_BASE(__cpu, TIMER)                                   \
+       __GEN_RSET_BASE(__cpu, WDT)                                     \
+       __GEN_RSET_BASE(__cpu, UART0)                                   \
+       __GEN_RSET_BASE(__cpu, UART1)                                   \
+       __GEN_RSET_BASE(__cpu, GPIO)                                    \
+       __GEN_RSET_BASE(__cpu, SPI)                                     \
+       __GEN_RSET_BASE(__cpu, SPI2)                                    \
+       __GEN_RSET_BASE(__cpu, UDC0)                                    \
+       __GEN_RSET_BASE(__cpu, OHCI0)                                   \
+       __GEN_RSET_BASE(__cpu, OHCI_PRIV)                               \
+       __GEN_RSET_BASE(__cpu, USBH_PRIV)                               \
+       __GEN_RSET_BASE(__cpu, MPI)                                     \
+       __GEN_RSET_BASE(__cpu, PCMCIA)                                  \
+       __GEN_RSET_BASE(__cpu, DSL)                                     \
+       __GEN_RSET_BASE(__cpu, ENET0)                                   \
+       __GEN_RSET_BASE(__cpu, ENET1)                                   \
+       __GEN_RSET_BASE(__cpu, ENETDMA)                                 \
+       __GEN_RSET_BASE(__cpu, ENETDMAC)                                \
+       __GEN_RSET_BASE(__cpu, ENETDMAS)                                \
+       __GEN_RSET_BASE(__cpu, ENETSW)                                  \
+       __GEN_RSET_BASE(__cpu, EHCI0)                                   \
+       __GEN_RSET_BASE(__cpu, SDRAM)                                   \
+       __GEN_RSET_BASE(__cpu, MEMC)                                    \
+       __GEN_RSET_BASE(__cpu, DDR)                                     \
+       __GEN_RSET_BASE(__cpu, M2M)                                     \
+       __GEN_RSET_BASE(__cpu, ATM)                                     \
+       __GEN_RSET_BASE(__cpu, XTM)                                     \
+       __GEN_RSET_BASE(__cpu, XTMDMA)                                  \
+       __GEN_RSET_BASE(__cpu, XTMDMAC)                                 \
+       __GEN_RSET_BASE(__cpu, XTMDMAS)                                 \
+       __GEN_RSET_BASE(__cpu, PCM)                                     \
+       __GEN_RSET_BASE(__cpu, PCMDMA)                                  \
+       __GEN_RSET_BASE(__cpu, PCMDMAC)                                 \
+       __GEN_RSET_BASE(__cpu, PCMDMAS)                                 \
+       }
+
+#define __GEN_CPU_REGS_TABLE(__cpu)                                    \
+       [RSET_DSL_LMEM]         = BCM_## __cpu ##_DSL_LMEM_BASE,        \
+       [RSET_PERF]             = BCM_## __cpu ##_PERF_BASE,            \
+       [RSET_TIMER]            = BCM_## __cpu ##_TIMER_BASE,           \
+       [RSET_WDT]              = BCM_## __cpu ##_WDT_BASE,             \
+       [RSET_UART0]            = BCM_## __cpu ##_UART0_BASE,           \
+       [RSET_UART1]            = BCM_## __cpu ##_UART1_BASE,           \
+       [RSET_GPIO]             = BCM_## __cpu ##_GPIO_BASE,            \
+       [RSET_SPI]              = BCM_## __cpu ##_SPI_BASE,             \
+       [RSET_SPI2]             = BCM_## __cpu ##_SPI2_BASE,            \
+       [RSET_UDC0]             = BCM_## __cpu ##_UDC0_BASE,            \
+       [RSET_OHCI0]            = BCM_## __cpu ##_OHCI0_BASE,           \
+       [RSET_OHCI_PRIV]        = BCM_## __cpu ##_OHCI_PRIV_BASE,       \
+       [RSET_USBH_PRIV]        = BCM_## __cpu ##_USBH_PRIV_BASE,       \
+       [RSET_MPI]              = BCM_## __cpu ##_MPI_BASE,             \
+       [RSET_PCMCIA]           = BCM_## __cpu ##_PCMCIA_BASE,          \
+       [RSET_DSL]              = BCM_## __cpu ##_DSL_BASE,             \
+       [RSET_ENET0]            = BCM_## __cpu ##_ENET0_BASE,           \
+       [RSET_ENET1]            = BCM_## __cpu ##_ENET1_BASE,           \
+       [RSET_ENETDMA]          = BCM_## __cpu ##_ENETDMA_BASE,         \
+       [RSET_ENETDMAC]         = BCM_## __cpu ##_ENETDMAC_BASE,        \
+       [RSET_ENETDMAS]         = BCM_## __cpu ##_ENETDMAS_BASE,        \
+       [RSET_ENETSW]           = BCM_## __cpu ##_ENETSW_BASE,          \
+       [RSET_EHCI0]            = BCM_## __cpu ##_EHCI0_BASE,           \
+       [RSET_SDRAM]            = BCM_## __cpu ##_SDRAM_BASE,           \
+       [RSET_MEMC]             = BCM_## __cpu ##_MEMC_BASE,            \
+       [RSET_DDR]              = BCM_## __cpu ##_DDR_BASE,             \
+       [RSET_M2M]              = BCM_## __cpu ##_M2M_BASE,             \
+       [RSET_ATM]              = BCM_## __cpu ##_ATM_BASE,             \
+       [RSET_XTM]              = BCM_## __cpu ##_XTM_BASE,             \
+       [RSET_XTMDMA]           = BCM_## __cpu ##_XTMDMA_BASE,          \
+       [RSET_XTMDMAC]          = BCM_## __cpu ##_XTMDMAC_BASE,         \
+       [RSET_XTMDMAS]          = BCM_## __cpu ##_XTMDMAS_BASE,         \
+       [RSET_PCM]              = BCM_## __cpu ##_PCM_BASE,             \
+       [RSET_PCMDMA]           = BCM_## __cpu ##_PCMDMA_BASE,          \
+       [RSET_PCMDMAC]          = BCM_## __cpu ##_PCMDMAC_BASE,         \
+       [RSET_PCMDMAS]          = BCM_## __cpu ##_PCMDMAS_BASE,         \
+
+
 static inline unsigned long bcm63xx_regset_address(enum bcm63xx_regs_set set)
 {
 #ifdef BCMCPU_RUNTIME_DETECT
        return bcm63xx_regs_base[set];
 #else
 #ifdef CONFIG_BCM63XX_CPU_6338
-       switch (set) {
-       case RSET_DSL_LMEM:
-               return BCM_6338_DSL_LMEM_BASE;
-       case RSET_PERF:
-               return BCM_6338_PERF_BASE;
-       case RSET_TIMER:
-               return BCM_6338_TIMER_BASE;
-       case RSET_WDT:
-               return BCM_6338_WDT_BASE;
-       case RSET_UART0:
-               return BCM_6338_UART0_BASE;
-       case RSET_UART1:
-               return BCM_6338_UART1_BASE;
-       case RSET_GPIO:
-               return BCM_6338_GPIO_BASE;
-       case RSET_SPI:
-               return BCM_6338_SPI_BASE;
-       case RSET_UDC0:
-               return BCM_6338_UDC0_BASE;
-       case RSET_OHCI0:
-               return BCM_6338_OHCI0_BASE;
-       case RSET_OHCI_PRIV:
-               return BCM_6338_OHCI_PRIV_BASE;
-       case RSET_USBH_PRIV:
-               return BCM_6338_USBH_PRIV_BASE;
-       case RSET_MPI:
-               return BCM_6338_MPI_BASE;
-       case RSET_PCMCIA:
-               return BCM_6338_PCMCIA_BASE;
-       case RSET_DSL:
-               return BCM_6338_DSL_BASE;
-       case RSET_ENET0:
-               return BCM_6338_ENET0_BASE;
-       case RSET_ENET1:
-               return BCM_6338_ENET1_BASE;
-       case RSET_ENETDMA:
-               return BCM_6338_ENETDMA_BASE;
-       case RSET_EHCI0:
-               return BCM_6338_EHCI0_BASE;
-       case RSET_SDRAM:
-               return BCM_6338_SDRAM_BASE;
-       case RSET_MEMC:
-               return BCM_6338_MEMC_BASE;
-       case RSET_DDR:
-               return BCM_6338_DDR_BASE;
-       }
+       __GEN_RSET(6338)
 #endif
 #ifdef CONFIG_BCM63XX_CPU_6345
-       switch (set) {
-       case RSET_DSL_LMEM:
-               return BCM_6345_DSL_LMEM_BASE;
-       case RSET_PERF:
-               return BCM_6345_PERF_BASE;
-       case RSET_TIMER:
-               return BCM_6345_TIMER_BASE;
-       case RSET_WDT:
-               return BCM_6345_WDT_BASE;
-       case RSET_UART0:
-               return BCM_6345_UART0_BASE;
-       case RSET_UART1:
-               return BCM_6345_UART1_BASE;
-       case RSET_GPIO:
-               return BCM_6345_GPIO_BASE;
-       case RSET_SPI:
-               return BCM_6345_SPI_BASE;
-       case RSET_UDC0:
-               return BCM_6345_UDC0_BASE;
-       case RSET_OHCI0:
-               return BCM_6345_OHCI0_BASE;
-       case RSET_OHCI_PRIV:
-               return BCM_6345_OHCI_PRIV_BASE;
-       case RSET_USBH_PRIV:
-               return BCM_6345_USBH_PRIV_BASE;
-       case RSET_MPI:
-               return BCM_6345_MPI_BASE;
-       case RSET_PCMCIA:
-               return BCM_6345_PCMCIA_BASE;
-       case RSET_DSL:
-               return BCM_6345_DSL_BASE;
-       case RSET_ENET0:
-               return BCM_6345_ENET0_BASE;
-       case RSET_ENET1:
-               return BCM_6345_ENET1_BASE;
-       case RSET_ENETDMA:
-               return BCM_6345_ENETDMA_BASE;
-       case RSET_EHCI0:
-               return BCM_6345_EHCI0_BASE;
-       case RSET_SDRAM:
-               return BCM_6345_SDRAM_BASE;
-       case RSET_MEMC:
-               return BCM_6345_MEMC_BASE;
-       case RSET_DDR:
-               return BCM_6345_DDR_BASE;
-       }
+       __GEN_RSET(6345)
 #endif
 #ifdef CONFIG_BCM63XX_CPU_6348
-       switch (set) {
-       case RSET_DSL_LMEM:
-               return BCM_6348_DSL_LMEM_BASE;
-       case RSET_PERF:
-               return BCM_6348_PERF_BASE;
-       case RSET_TIMER:
-               return BCM_6348_TIMER_BASE;
-       case RSET_WDT:
-               return BCM_6348_WDT_BASE;
-       case RSET_UART0:
-               return BCM_6348_UART0_BASE;
-       case RSET_UART1:
-               return BCM_6348_UART1_BASE;
-       case RSET_GPIO:
-               return BCM_6348_GPIO_BASE;
-       case RSET_SPI:
-               return BCM_6348_SPI_BASE;
-       case RSET_UDC0:
-               return BCM_6348_UDC0_BASE;
-       case RSET_OHCI0:
-               return BCM_6348_OHCI0_BASE;
-       case RSET_OHCI_PRIV:
-               return BCM_6348_OHCI_PRIV_BASE;
-       case RSET_USBH_PRIV:
-               return BCM_6348_USBH_PRIV_BASE;
-       case RSET_MPI:
-               return BCM_6348_MPI_BASE;
-       case RSET_PCMCIA:
-               return BCM_6348_PCMCIA_BASE;
-       case RSET_DSL:
-               return BCM_6348_DSL_BASE;
-       case RSET_ENET0:
-               return BCM_6348_ENET0_BASE;
-       case RSET_ENET1:
-               return BCM_6348_ENET1_BASE;
-       case RSET_ENETDMA:
-               return BCM_6348_ENETDMA_BASE;
-       case RSET_EHCI0:
-               return BCM_6348_EHCI0_BASE;
-       case RSET_SDRAM:
-               return BCM_6348_SDRAM_BASE;
-       case RSET_MEMC:
-               return BCM_6348_MEMC_BASE;
-       case RSET_DDR:
-               return BCM_6348_DDR_BASE;
-       }
+       __GEN_RSET(6348)
 #endif
 #ifdef CONFIG_BCM63XX_CPU_6358
-       switch (set) {
-       case RSET_DSL_LMEM:
-               return BCM_6358_DSL_LMEM_BASE;
-       case RSET_PERF:
-               return BCM_6358_PERF_BASE;
-       case RSET_TIMER:
-               return BCM_6358_TIMER_BASE;
-       case RSET_WDT:
-               return BCM_6358_WDT_BASE;
-       case RSET_UART0:
-               return BCM_6358_UART0_BASE;
-       case RSET_UART1:
-               return BCM_6358_UART1_BASE;
-       case RSET_GPIO:
-               return BCM_6358_GPIO_BASE;
-       case RSET_SPI:
-               return BCM_6358_SPI_BASE;
-       case RSET_UDC0:
-               return BCM_6358_UDC0_BASE;
-       case RSET_OHCI0:
-               return BCM_6358_OHCI0_BASE;
-       case RSET_OHCI_PRIV:
-               return BCM_6358_OHCI_PRIV_BASE;
-       case RSET_USBH_PRIV:
-               return BCM_6358_USBH_PRIV_BASE;
-       case RSET_MPI:
-               return BCM_6358_MPI_BASE;
-       case RSET_PCMCIA:
-               return BCM_6358_PCMCIA_BASE;
-       case RSET_ENET0:
-               return BCM_6358_ENET0_BASE;
-       case RSET_ENET1:
-               return BCM_6358_ENET1_BASE;
-       case RSET_ENETDMA:
-               return BCM_6358_ENETDMA_BASE;
-       case RSET_DSL:
-               return BCM_6358_DSL_BASE;
-       case RSET_EHCI0:
-               return BCM_6358_EHCI0_BASE;
-       case RSET_SDRAM:
-               return BCM_6358_SDRAM_BASE;
-       case RSET_MEMC:
-               return BCM_6358_MEMC_BASE;
-       case RSET_DDR:
-               return BCM_6358_DDR_BASE;
-       }
+       __GEN_RSET(6358)
+#endif
+#ifdef CONFIG_BCM63XX_CPU_6368
+       __GEN_RSET(6368)
 #endif
 #endif
        /* unreached */
@@ -449,75 +486,114 @@ enum bcm63xx_irq {
        IRQ_ENET_PHY,
        IRQ_OHCI0,
        IRQ_EHCI0,
-       IRQ_PCMCIA0,
        IRQ_ENET0_RXDMA,
        IRQ_ENET0_TXDMA,
        IRQ_ENET1_RXDMA,
        IRQ_ENET1_TXDMA,
        IRQ_PCI,
        IRQ_PCMCIA,
+       IRQ_ATM,
+       IRQ_ENETSW_RXDMA0,
+       IRQ_ENETSW_RXDMA1,
+       IRQ_ENETSW_RXDMA2,
+       IRQ_ENETSW_RXDMA3,
+       IRQ_ENETSW_TXDMA0,
+       IRQ_ENETSW_TXDMA1,
+       IRQ_ENETSW_TXDMA2,
+       IRQ_ENETSW_TXDMA3,
+       IRQ_XTM,
+       IRQ_XTM_DMA0,
 };
 
 /*
  * 6338 irqs
  */
 #define BCM_6338_TIMER_IRQ             (IRQ_INTERNAL_BASE + 0)
-#define BCM_6338_SPI_IRQ               (IRQ_INTERNAL_BASE + 1)
 #define BCM_6338_UART0_IRQ             (IRQ_INTERNAL_BASE + 2)
-#define BCM_6338_DG_IRQ                        (IRQ_INTERNAL_BASE + 4)
+#define BCM_6338_UART1_IRQ             0
 #define BCM_6338_DSL_IRQ               (IRQ_INTERNAL_BASE + 5)
-#define BCM_6338_ATM_IRQ               (IRQ_INTERNAL_BASE + 6)
-#define BCM_6338_UDC0_IRQ              (IRQ_INTERNAL_BASE + 7)
 #define BCM_6338_ENET0_IRQ             (IRQ_INTERNAL_BASE + 8)
+#define BCM_6338_ENET1_IRQ             0
 #define BCM_6338_ENET_PHY_IRQ          (IRQ_INTERNAL_BASE + 9)
-#define BCM_6338_SDRAM_IRQ             (IRQ_INTERNAL_BASE + 10)
-#define BCM_6338_USB_CNTL_RX_DMA_IRQ   (IRQ_INTERNAL_BASE + 11)
-#define BCM_6338_USB_CNTL_TX_DMA_IRQ   (IRQ_INTERNAL_BASE + 12)
-#define BCM_6338_USB_BULK_RX_DMA_IRQ   (IRQ_INTERNAL_BASE + 13)
-#define BCM_6338_USB_BULK_TX_DMA_IRQ   (IRQ_INTERNAL_BASE + 14)
+#define BCM_6338_OHCI0_IRQ             0
+#define BCM_6338_EHCI0_IRQ             0
 #define BCM_6338_ENET0_RXDMA_IRQ       (IRQ_INTERNAL_BASE + 15)
 #define BCM_6338_ENET0_TXDMA_IRQ       (IRQ_INTERNAL_BASE + 16)
-#define BCM_6338_SDIO_IRQ              (IRQ_INTERNAL_BASE + 17)
+#define BCM_6338_ENET1_RXDMA_IRQ       0
+#define BCM_6338_ENET1_TXDMA_IRQ       0
+#define BCM_6338_PCI_IRQ               0
+#define BCM_6338_PCMCIA_IRQ            0
+#define BCM_6338_ATM_IRQ               0
+#define BCM_6338_ENETSW_RXDMA0_IRQ     0
+#define BCM_6338_ENETSW_RXDMA1_IRQ     0
+#define BCM_6338_ENETSW_RXDMA2_IRQ     0
+#define BCM_6338_ENETSW_RXDMA3_IRQ     0
+#define BCM_6338_ENETSW_TXDMA0_IRQ     0
+#define BCM_6338_ENETSW_TXDMA1_IRQ     0
+#define BCM_6338_ENETSW_TXDMA2_IRQ     0
+#define BCM_6338_ENETSW_TXDMA3_IRQ     0
+#define BCM_6338_XTM_IRQ               0
+#define BCM_6338_XTM_DMA0_IRQ          0
 
 /*
  * 6345 irqs
  */
 #define BCM_6345_TIMER_IRQ             (IRQ_INTERNAL_BASE + 0)
 #define BCM_6345_UART0_IRQ             (IRQ_INTERNAL_BASE + 2)
+#define BCM_6345_UART1_IRQ             0
 #define BCM_6345_DSL_IRQ               (IRQ_INTERNAL_BASE + 3)
-#define BCM_6345_ATM_IRQ               (IRQ_INTERNAL_BASE + 4)
-#define BCM_6345_USB_IRQ               (IRQ_INTERNAL_BASE + 5)
 #define BCM_6345_ENET0_IRQ             (IRQ_INTERNAL_BASE + 8)
+#define BCM_6345_ENET1_IRQ             0
 #define BCM_6345_ENET_PHY_IRQ          (IRQ_INTERNAL_BASE + 12)
+#define BCM_6345_OHCI0_IRQ             0
+#define BCM_6345_EHCI0_IRQ             0
 #define BCM_6345_ENET0_RXDMA_IRQ       (IRQ_INTERNAL_BASE + 13 + 1)
 #define BCM_6345_ENET0_TXDMA_IRQ       (IRQ_INTERNAL_BASE + 13 + 2)
-#define BCM_6345_EBI_RX_IRQ            (IRQ_INTERNAL_BASE + 13 + 5)
-#define BCM_6345_EBI_TX_IRQ            (IRQ_INTERNAL_BASE + 13 + 6)
-#define BCM_6345_RESERVED_RX_IRQ       (IRQ_INTERNAL_BASE + 13 + 9)
-#define BCM_6345_RESERVED_TX_IRQ       (IRQ_INTERNAL_BASE + 13 + 10)
-#define BCM_6345_USB_BULK_RX_DMA_IRQ   (IRQ_INTERNAL_BASE + 13 + 13)
-#define BCM_6345_USB_BULK_TX_DMA_IRQ   (IRQ_INTERNAL_BASE + 13 + 14)
-#define BCM_6345_USB_CNTL_RX_DMA_IRQ   (IRQ_INTERNAL_BASE + 13 + 15)
-#define BCM_6345_USB_CNTL_TX_DMA_IRQ   (IRQ_INTERNAL_BASE + 13 + 16)
-#define BCM_6345_USB_ISO_RX_DMA_IRQ    (IRQ_INTERNAL_BASE + 13 + 17)
-#define BCM_6345_USB_ISO_TX_DMA_IRQ    (IRQ_INTERNAL_BASE + 13 + 18)
+#define BCM_6345_ENET1_RXDMA_IRQ       0
+#define BCM_6345_ENET1_TXDMA_IRQ       0
+#define BCM_6345_PCI_IRQ               0
+#define BCM_6345_PCMCIA_IRQ            0
+#define BCM_6345_ATM_IRQ               0
+#define BCM_6345_ENETSW_RXDMA0_IRQ     0
+#define BCM_6345_ENETSW_RXDMA1_IRQ     0
+#define BCM_6345_ENETSW_RXDMA2_IRQ     0
+#define BCM_6345_ENETSW_RXDMA3_IRQ     0
+#define BCM_6345_ENETSW_TXDMA0_IRQ     0
+#define BCM_6345_ENETSW_TXDMA1_IRQ     0
+#define BCM_6345_ENETSW_TXDMA2_IRQ     0
+#define BCM_6345_ENETSW_TXDMA3_IRQ     0
+#define BCM_6345_XTM_IRQ               0
+#define BCM_6345_XTM_DMA0_IRQ          0
 
 /*
  * 6348 irqs
  */
 #define BCM_6348_TIMER_IRQ             (IRQ_INTERNAL_BASE + 0)
 #define BCM_6348_UART0_IRQ             (IRQ_INTERNAL_BASE + 2)
+#define BCM_6348_UART1_IRQ             0
 #define BCM_6348_DSL_IRQ               (IRQ_INTERNAL_BASE + 4)
-#define BCM_6348_ENET1_IRQ             (IRQ_INTERNAL_BASE + 7)
 #define BCM_6348_ENET0_IRQ             (IRQ_INTERNAL_BASE + 8)
+#define BCM_6348_ENET1_IRQ             (IRQ_INTERNAL_BASE + 7)
 #define BCM_6348_ENET_PHY_IRQ          (IRQ_INTERNAL_BASE + 9)
 #define BCM_6348_OHCI0_IRQ             (IRQ_INTERNAL_BASE + 12)
+#define BCM_6348_EHCI0_IRQ             0
 #define BCM_6348_ENET0_RXDMA_IRQ       (IRQ_INTERNAL_BASE + 20)
 #define BCM_6348_ENET0_TXDMA_IRQ       (IRQ_INTERNAL_BASE + 21)
 #define BCM_6348_ENET1_RXDMA_IRQ       (IRQ_INTERNAL_BASE + 22)
 #define BCM_6348_ENET1_TXDMA_IRQ       (IRQ_INTERNAL_BASE + 23)
-#define BCM_6348_PCMCIA_IRQ            (IRQ_INTERNAL_BASE + 24)
 #define BCM_6348_PCI_IRQ               (IRQ_INTERNAL_BASE + 24)
+#define BCM_6348_PCMCIA_IRQ            (IRQ_INTERNAL_BASE + 24)
+#define BCM_6348_ATM_IRQ               (IRQ_INTERNAL_BASE + 5)
+#define BCM_6348_ENETSW_RXDMA0_IRQ     0
+#define BCM_6348_ENETSW_RXDMA1_IRQ     0
+#define BCM_6348_ENETSW_RXDMA2_IRQ     0
+#define BCM_6348_ENETSW_RXDMA3_IRQ     0
+#define BCM_6348_ENETSW_TXDMA0_IRQ     0
+#define BCM_6348_ENETSW_TXDMA1_IRQ     0
+#define BCM_6348_ENETSW_TXDMA2_IRQ     0
+#define BCM_6348_ENETSW_TXDMA3_IRQ     0
+#define BCM_6348_XTM_IRQ               0
+#define BCM_6348_XTM_DMA0_IRQ          0
 
 /*
  * 6358 irqs
@@ -525,21 +601,108 @@ enum bcm63xx_irq {
 #define BCM_6358_TIMER_IRQ             (IRQ_INTERNAL_BASE + 0)
 #define BCM_6358_UART0_IRQ             (IRQ_INTERNAL_BASE + 2)
 #define BCM_6358_UART1_IRQ             (IRQ_INTERNAL_BASE + 3)
-#define BCM_6358_OHCI0_IRQ             (IRQ_INTERNAL_BASE + 5)
-#define BCM_6358_ENET1_IRQ             (IRQ_INTERNAL_BASE + 6)
+#define BCM_6358_DSL_IRQ               (IRQ_INTERNAL_BASE + 29)
 #define BCM_6358_ENET0_IRQ             (IRQ_INTERNAL_BASE + 8)
+#define BCM_6358_ENET1_IRQ             (IRQ_INTERNAL_BASE + 6)
 #define BCM_6358_ENET_PHY_IRQ          (IRQ_INTERNAL_BASE + 9)
+#define BCM_6358_OHCI0_IRQ             (IRQ_INTERNAL_BASE + 5)
 #define BCM_6358_EHCI0_IRQ             (IRQ_INTERNAL_BASE + 10)
 #define BCM_6358_ENET0_RXDMA_IRQ       (IRQ_INTERNAL_BASE + 15)
 #define BCM_6358_ENET0_TXDMA_IRQ       (IRQ_INTERNAL_BASE + 16)
 #define BCM_6358_ENET1_RXDMA_IRQ       (IRQ_INTERNAL_BASE + 17)
 #define BCM_6358_ENET1_TXDMA_IRQ       (IRQ_INTERNAL_BASE + 18)
-#define BCM_6358_DSL_IRQ               (IRQ_INTERNAL_BASE + 29)
 #define BCM_6358_PCI_IRQ               (IRQ_INTERNAL_BASE + 31)
 #define BCM_6358_PCMCIA_IRQ            (IRQ_INTERNAL_BASE + 24)
+#define BCM_6358_ATM_IRQ               (IRQ_INTERNAL_BASE + 19)
+#define BCM_6358_ENETSW_RXDMA0_IRQ     0
+#define BCM_6358_ENETSW_RXDMA1_IRQ     0
+#define BCM_6358_ENETSW_RXDMA2_IRQ     0
+#define BCM_6358_ENETSW_RXDMA3_IRQ     0
+#define BCM_6358_ENETSW_TXDMA0_IRQ     0
+#define BCM_6358_ENETSW_TXDMA1_IRQ     0
+#define BCM_6358_ENETSW_TXDMA2_IRQ     0
+#define BCM_6358_ENETSW_TXDMA3_IRQ     0
+#define BCM_6358_XTM_IRQ               0
+#define BCM_6358_XTM_DMA0_IRQ          0
+
+#define BCM_6358_PCM_DMA0_IRQ          (IRQ_INTERNAL_BASE + 23)
+#define BCM_6358_PCM_DMA1_IRQ          (IRQ_INTERNAL_BASE + 24)
+#define BCM_6358_EXT_IRQ0              (IRQ_INTERNAL_BASE + 25)
+#define BCM_6358_EXT_IRQ1              (IRQ_INTERNAL_BASE + 26)
+#define BCM_6358_EXT_IRQ2              (IRQ_INTERNAL_BASE + 27)
+#define BCM_6358_EXT_IRQ3              (IRQ_INTERNAL_BASE + 28)
+
+/*
+ * 6368 irqs
+ */
+#define BCM_6368_HIGH_IRQ_BASE         (IRQ_INTERNAL_BASE + 32)
+
+#define BCM_6368_TIMER_IRQ             (IRQ_INTERNAL_BASE + 0)
+#define BCM_6368_UART0_IRQ             (IRQ_INTERNAL_BASE + 2)
+#define BCM_6368_UART1_IRQ             (IRQ_INTERNAL_BASE + 3)
+#define BCM_6368_DSL_IRQ               (IRQ_INTERNAL_BASE + 4)
+#define BCM_6368_ENET0_IRQ             0
+#define BCM_6368_ENET1_IRQ             0
+#define BCM_6368_ENET_PHY_IRQ          (IRQ_INTERNAL_BASE + 15)
+#define BCM_6368_OHCI0_IRQ             (IRQ_INTERNAL_BASE + 5)
+#define BCM_6368_EHCI0_IRQ             (IRQ_INTERNAL_BASE + 7)
+#define BCM_6368_PCMCIA_IRQ            0
+#define BCM_6368_ENET0_RXDMA_IRQ       0
+#define BCM_6368_ENET0_TXDMA_IRQ       0
+#define BCM_6368_ENET1_RXDMA_IRQ       0
+#define BCM_6368_ENET1_TXDMA_IRQ       0
+#define BCM_6368_PCI_IRQ               (IRQ_INTERNAL_BASE + 13)
+#define BCM_6368_ATM_IRQ               0
+#define BCM_6368_ENETSW_RXDMA0_IRQ     (BCM_6368_HIGH_IRQ_BASE + 0)
+#define BCM_6368_ENETSW_RXDMA1_IRQ     (BCM_6368_HIGH_IRQ_BASE + 1)
+#define BCM_6368_ENETSW_RXDMA2_IRQ     (BCM_6368_HIGH_IRQ_BASE + 2)
+#define BCM_6368_ENETSW_RXDMA3_IRQ     (BCM_6368_HIGH_IRQ_BASE + 3)
+#define BCM_6368_ENETSW_TXDMA0_IRQ     (BCM_6368_HIGH_IRQ_BASE + 4)
+#define BCM_6368_ENETSW_TXDMA1_IRQ     (BCM_6368_HIGH_IRQ_BASE + 5)
+#define BCM_6368_ENETSW_TXDMA2_IRQ     (BCM_6368_HIGH_IRQ_BASE + 6)
+#define BCM_6368_ENETSW_TXDMA3_IRQ     (BCM_6368_HIGH_IRQ_BASE + 7)
+#define BCM_6368_XTM_IRQ               (IRQ_INTERNAL_BASE + 11)
+#define BCM_6368_XTM_DMA0_IRQ          (BCM_6368_HIGH_IRQ_BASE + 8)
+
+#define BCM_6368_PCM_DMA0_IRQ          (BCM_6368_HIGH_IRQ_BASE + 30)
+#define BCM_6368_PCM_DMA1_IRQ          (BCM_6368_HIGH_IRQ_BASE + 31)
+#define BCM_6368_EXT_IRQ0              (IRQ_INTERNAL_BASE + 20)
+#define BCM_6368_EXT_IRQ1              (IRQ_INTERNAL_BASE + 21)
+#define BCM_6368_EXT_IRQ2              (IRQ_INTERNAL_BASE + 22)
+#define BCM_6368_EXT_IRQ3              (IRQ_INTERNAL_BASE + 23)
+#define BCM_6368_EXT_IRQ4              (IRQ_INTERNAL_BASE + 24)
+#define BCM_6368_EXT_IRQ5              (IRQ_INTERNAL_BASE + 25)
 
 extern const int *bcm63xx_irqs;
 
+#define __GEN_CPU_IRQ_TABLE(__cpu)                                     \
+       [IRQ_TIMER]             = BCM_## __cpu ##_TIMER_IRQ,            \
+       [IRQ_UART0]             = BCM_## __cpu ##_UART0_IRQ,            \
+       [IRQ_UART1]             = BCM_## __cpu ##_UART1_IRQ,            \
+       [IRQ_DSL]               = BCM_## __cpu ##_DSL_IRQ,              \
+       [IRQ_ENET0]             = BCM_## __cpu ##_ENET0_IRQ,            \
+       [IRQ_ENET1]             = BCM_## __cpu ##_ENET1_IRQ,            \
+       [IRQ_ENET_PHY]          = BCM_## __cpu ##_ENET_PHY_IRQ,         \
+       [IRQ_OHCI0]             = BCM_## __cpu ##_OHCI0_IRQ,            \
+       [IRQ_EHCI0]             = BCM_## __cpu ##_EHCI0_IRQ,            \
+       [IRQ_ENET0_RXDMA]       = BCM_## __cpu ##_ENET0_RXDMA_IRQ,      \
+       [IRQ_ENET0_TXDMA]       = BCM_## __cpu ##_ENET0_TXDMA_IRQ,      \
+       [IRQ_ENET1_RXDMA]       = BCM_## __cpu ##_ENET1_RXDMA_IRQ,      \
+       [IRQ_ENET1_TXDMA]       = BCM_## __cpu ##_ENET1_TXDMA_IRQ,      \
+       [IRQ_PCI]               = BCM_## __cpu ##_PCI_IRQ,              \
+       [IRQ_PCMCIA]            = BCM_## __cpu ##_PCMCIA_IRQ,           \
+       [IRQ_ATM]               = BCM_## __cpu ##_ATM_IRQ,              \
+       [IRQ_ENETSW_RXDMA0]     = BCM_## __cpu ##_ENETSW_RXDMA0_IRQ,    \
+       [IRQ_ENETSW_RXDMA1]     = BCM_## __cpu ##_ENETSW_RXDMA1_IRQ,    \
+       [IRQ_ENETSW_RXDMA2]     = BCM_## __cpu ##_ENETSW_RXDMA2_IRQ,    \
+       [IRQ_ENETSW_RXDMA3]     = BCM_## __cpu ##_ENETSW_RXDMA3_IRQ,    \
+       [IRQ_ENETSW_TXDMA0]     = BCM_## __cpu ##_ENETSW_TXDMA0_IRQ,    \
+       [IRQ_ENETSW_TXDMA1]     = BCM_## __cpu ##_ENETSW_TXDMA1_IRQ,    \
+       [IRQ_ENETSW_TXDMA2]     = BCM_## __cpu ##_ENETSW_TXDMA2_IRQ,    \
+       [IRQ_ENETSW_TXDMA3]     = BCM_## __cpu ##_ENETSW_TXDMA3_IRQ,    \
+       [IRQ_XTM]               = BCM_## __cpu ##_XTM_IRQ,              \
+       [IRQ_XTM_DMA0]          = BCM_## __cpu ##_XTM_DMA0_IRQ,         \
+
 static inline int bcm63xx_get_irq_number(enum bcm63xx_irq irq)
 {
        return bcm63xx_irqs[irq];
@@ -550,4 +713,8 @@ static inline int bcm63xx_get_irq_number(enum bcm63xx_irq irq)
  */
 unsigned int bcm63xx_get_memory_size(void);
 
+void bcm63xx_machine_halt(void);
+
+void bcm63xx_machine_reboot(void);
+
 #endif /* !BCM63XX_CPU_H_ */
index 3999ec0aa7f5b99c2d57e06cb20a876a372ff06b..3d5de96d40369523940662c3400302ef9a0e48fb 100644 (file)
@@ -14,6 +14,8 @@ static inline unsigned long bcm63xx_gpio_count(void)
                return 8;
        case BCM6345_CPU_ID:
                return 16;
+       case BCM6368_CPU_ID:
+               return 38;
        case BCM6348_CPU_ID:
        default:
                return 37;
index 91180fac6ed9ce82ba5eb731e0ccb37f6f367613..72477a6441ddb9a39c769c47809878f120de027a 100644 (file)
 #define bcm_readb(a)   (*(volatile unsigned char *)    BCM_REGS_VA(a))
 #define bcm_readw(a)   (*(volatile unsigned short *)   BCM_REGS_VA(a))
 #define bcm_readl(a)   (*(volatile unsigned int *)     BCM_REGS_VA(a))
+#define bcm_readq(a)   (*(volatile u64 *)              BCM_REGS_VA(a))
 #define bcm_writeb(v, a) (*(volatile unsigned char *) BCM_REGS_VA((a)) = (v))
 #define bcm_writew(v, a) (*(volatile unsigned short *) BCM_REGS_VA((a)) = (v))
 #define bcm_writel(v, a) (*(volatile unsigned int *) BCM_REGS_VA((a)) = (v))
+#define bcm_writeq(v, a) (*(volatile u64 *) BCM_REGS_VA((a)) = (v))
 
 /*
  * IO helpers to access register set for current CPU
index 5f95577c82136ac9719b799e06cbd2eef719dfa1..0c3074b871b828efe027b57327d28d11acf47cf7 100644 (file)
@@ -3,13 +3,11 @@
 
 #include <bcm63xx_cpu.h>
 
-#define IRQ_MIPS_BASE                  0
 #define IRQ_INTERNAL_BASE              8
-
-#define IRQ_EXT_BASE                   (IRQ_MIPS_BASE + 3)
-#define IRQ_EXT_0                      (IRQ_EXT_BASE + 0)
-#define IRQ_EXT_1                      (IRQ_EXT_BASE + 1)
-#define IRQ_EXT_2                      (IRQ_EXT_BASE + 2)
-#define IRQ_EXT_3                      (IRQ_EXT_BASE + 3)
+#define IRQ_EXTERNAL_BASE              100
+#define IRQ_EXT_0                      (IRQ_EXTERNAL_BASE + 0)
+#define IRQ_EXT_1                      (IRQ_EXTERNAL_BASE + 1)
+#define IRQ_EXT_2                      (IRQ_EXTERNAL_BASE + 2)
+#define IRQ_EXT_3                      (IRQ_EXTERNAL_BASE + 3)
 
 #endif /* ! BCM63XX_IRQ_H_ */
index 0ed5230243c9efee9f010c1d12b0af620a0c2a5f..94d4faad29a1a4286c934d28e76175ca97eee935 100644 (file)
                                        CKCTL_6358_USBSU_EN |           \
                                        CKCTL_6358_EPHY_EN)
 
+#define CKCTL_6368_VDSL_QPROC_EN       (1 << 2)
+#define CKCTL_6368_VDSL_AFE_EN         (1 << 3)
+#define CKCTL_6368_VDSL_BONDING_EN     (1 << 4)
+#define CKCTL_6368_VDSL_EN             (1 << 5)
+#define CKCTL_6368_PHYMIPS_EN          (1 << 6)
+#define CKCTL_6368_SWPKT_USB_EN                (1 << 7)
+#define CKCTL_6368_SWPKT_SAR_EN                (1 << 8)
+#define CKCTL_6368_SPI_CLK_EN          (1 << 9)
+#define CKCTL_6368_USBD_CLK_EN         (1 << 10)
+#define CKCTL_6368_SAR_CLK_EN          (1 << 11)
+#define CKCTL_6368_ROBOSW_CLK_EN       (1 << 12)
+#define CKCTL_6368_UTOPIA_CLK_EN       (1 << 13)
+#define CKCTL_6368_PCM_CLK_EN          (1 << 14)
+#define CKCTL_6368_USBH_CLK_EN         (1 << 15)
+#define CKCTL_6368_DISABLE_GLESS_EN    (1 << 16)
+#define CKCTL_6368_NAND_CLK_EN         (1 << 17)
+#define CKCTL_6368_IPSEC_CLK_EN                (1 << 17)
+
+#define CKCTL_6368_ALL_SAFE_EN         (CKCTL_6368_SWPKT_USB_EN |      \
+                                       CKCTL_6368_SWPKT_SAR_EN |       \
+                                       CKCTL_6368_SPI_CLK_EN |         \
+                                       CKCTL_6368_USBD_CLK_EN |        \
+                                       CKCTL_6368_SAR_CLK_EN |         \
+                                       CKCTL_6368_ROBOSW_CLK_EN |      \
+                                       CKCTL_6368_UTOPIA_CLK_EN |      \
+                                       CKCTL_6368_PCM_CLK_EN |         \
+                                       CKCTL_6368_USBH_CLK_EN |        \
+                                       CKCTL_6368_DISABLE_GLESS_EN |   \
+                                       CKCTL_6368_NAND_CLK_EN |        \
+                                       CKCTL_6368_IPSEC_CLK_EN)
+
 /* System PLL Control register  */
 #define PERF_SYS_PLL_CTL_REG           0x8
 #define SYS_PLL_SOFT_RESET             0x1
 
 /* Interrupt Mask register */
-#define PERF_IRQMASK_REG               0xc
+#define PERF_IRQMASK_6338_REG          0xc
+#define PERF_IRQMASK_6345_REG          0xc
+#define PERF_IRQMASK_6348_REG          0xc
+#define PERF_IRQMASK_6358_REG          0xc
+#define PERF_IRQMASK_6368_REG          0x20
 
 /* Interrupt Status register */
-#define PERF_IRQSTAT_REG               0x10
+#define PERF_IRQSTAT_6338_REG          0x10
+#define PERF_IRQSTAT_6345_REG          0x10
+#define PERF_IRQSTAT_6348_REG          0x10
+#define PERF_IRQSTAT_6358_REG          0x10
+#define PERF_IRQSTAT_6368_REG          0x28
 
 /* External Interrupt Configuration register */
-#define PERF_EXTIRQ_CFG_REG            0x14
+#define PERF_EXTIRQ_CFG_REG_6338       0x14
+#define PERF_EXTIRQ_CFG_REG_6348       0x14
+#define PERF_EXTIRQ_CFG_REG_6358       0x14
+#define PERF_EXTIRQ_CFG_REG_6368       0x18
+
+#define PERF_EXTIRQ_CFG_REG2_6368      0x1c
+
+/* for 6348 only */
+#define EXTIRQ_CFG_SENSE_6348(x)       (1 << (x))
+#define EXTIRQ_CFG_STAT_6348(x)                (1 << (x + 5))
+#define EXTIRQ_CFG_CLEAR_6348(x)       (1 << (x + 10))
+#define EXTIRQ_CFG_MASK_6348(x)                (1 << (x + 15))
+#define EXTIRQ_CFG_BOTHEDGE_6348(x)    (1 << (x + 20))
+#define EXTIRQ_CFG_LEVELSENSE_6348(x)  (1 << (x + 25))
+#define EXTIRQ_CFG_CLEAR_ALL_6348      (0xf << 10)
+#define EXTIRQ_CFG_MASK_ALL_6348       (0xf << 15)
+
+/* for all others */
 #define EXTIRQ_CFG_SENSE(x)            (1 << (x))
-#define EXTIRQ_CFG_STAT(x)             (1 << (x + 5))
-#define EXTIRQ_CFG_CLEAR(x)            (1 << (x + 10))
-#define EXTIRQ_CFG_MASK(x)             (1 << (x + 15))
-#define EXTIRQ_CFG_BOTHEDGE(x)         (1 << (x + 20))
-#define EXTIRQ_CFG_LEVELSENSE(x)       (1 << (x + 25))
-
-#define EXTIRQ_CFG_CLEAR_ALL           (0xf << 10)
-#define EXTIRQ_CFG_MASK_ALL            (0xf << 15)
+#define EXTIRQ_CFG_STAT(x)             (1 << (x + 4))
+#define EXTIRQ_CFG_CLEAR(x)            (1 << (x + 8))
+#define EXTIRQ_CFG_MASK(x)             (1 << (x + 12))
+#define EXTIRQ_CFG_BOTHEDGE(x)         (1 << (x + 16))
+#define EXTIRQ_CFG_LEVELSENSE(x)       (1 << (x + 20))
+#define EXTIRQ_CFG_CLEAR_ALL           (0xf << 8)
+#define EXTIRQ_CFG_MASK_ALL            (0xf << 12)
 
 /* Soft Reset register */
 #define PERF_SOFTRESET_REG             0x28
+#define PERF_SOFTRESET_6368_REG                0x10
 
 #define SOFTRESET_6338_SPI_MASK                (1 << 0)
 #define SOFTRESET_6338_ENET_MASK       (1 << 2)
                                  SOFTRESET_6348_ACLC_MASK |            \
                                  SOFTRESET_6348_ADSLMIPSPLL_MASK)
 
+#define SOFTRESET_6368_SPI_MASK                (1 << 0)
+#define SOFTRESET_6368_MPI_MASK                (1 << 3)
+#define SOFTRESET_6368_EPHY_MASK       (1 << 6)
+#define SOFTRESET_6368_SAR_MASK                (1 << 7)
+#define SOFTRESET_6368_ENETSW_MASK     (1 << 10)
+#define SOFTRESET_6368_USBS_MASK       (1 << 11)
+#define SOFTRESET_6368_USBH_MASK       (1 << 12)
+#define SOFTRESET_6368_PCM_MASK                (1 << 13)
+
 /* MIPS PLL control register */
 #define PERF_MIPSPLLCTL_REG            0x34
 #define MIPSPLLCTL_N1_SHIFT            20
 #define GPIO_CTL_LO_REG                        0x4
 #define GPIO_DATA_HI_REG               0x8
 #define GPIO_DATA_LO_REG               0xC
+#define GPIO_DATA_LO_REG_6345          0x8
 
 /* GPIO mux registers and constants */
 #define GPIO_MODE_REG                  0x18
 #define GPIO_MODE_6358_SERIAL_LED      (1 << 10)
 #define GPIO_MODE_6358_UTOPIA          (1 << 12)
 
+#define GPIO_MODE_6368_ANALOG_AFE_0    (1 << 0)
+#define GPIO_MODE_6368_ANALOG_AFE_1    (1 << 1)
+#define GPIO_MODE_6368_SYS_IRQ         (1 << 2)
+#define GPIO_MODE_6368_SERIAL_LED_DATA (1 << 3)
+#define GPIO_MODE_6368_SERIAL_LED_CLK  (1 << 4)
+#define GPIO_MODE_6368_INET_LED                (1 << 5)
+#define GPIO_MODE_6368_EPHY0_LED       (1 << 6)
+#define GPIO_MODE_6368_EPHY1_LED       (1 << 7)
+#define GPIO_MODE_6368_EPHY2_LED       (1 << 8)
+#define GPIO_MODE_6368_EPHY3_LED       (1 << 9)
+#define GPIO_MODE_6368_ROBOSW_LED_DAT  (1 << 10)
+#define GPIO_MODE_6368_ROBOSW_LED_CLK  (1 << 11)
+#define GPIO_MODE_6368_ROBOSW_LED0     (1 << 12)
+#define GPIO_MODE_6368_ROBOSW_LED1     (1 << 13)
+#define GPIO_MODE_6368_USBD_LED                (1 << 14)
+#define GPIO_MODE_6368_NTR_PULSE       (1 << 15)
+#define GPIO_MODE_6368_PCI_REQ1                (1 << 16)
+#define GPIO_MODE_6368_PCI_GNT1                (1 << 17)
+#define GPIO_MODE_6368_PCI_INTB                (1 << 18)
+#define GPIO_MODE_6368_PCI_REQ0                (1 << 19)
+#define GPIO_MODE_6368_PCI_GNT0                (1 << 20)
+#define GPIO_MODE_6368_PCMCIA_CD1      (1 << 22)
+#define GPIO_MODE_6368_PCMCIA_CD2      (1 << 23)
+#define GPIO_MODE_6368_PCMCIA_VS1      (1 << 24)
+#define GPIO_MODE_6368_PCMCIA_VS2      (1 << 25)
+#define GPIO_MODE_6368_EBI_CS2         (1 << 26)
+#define GPIO_MODE_6368_EBI_CS3         (1 << 27)
+#define GPIO_MODE_6368_SPI_SSN2                (1 << 28)
+#define GPIO_MODE_6368_SPI_SSN3                (1 << 29)
+#define GPIO_MODE_6368_SPI_SSN4                (1 << 30)
+#define GPIO_MODE_6368_SPI_SSN5                (1 << 31)
+
+
+#define GPIO_BASEMODE_6368_REG         0x38
+#define GPIO_BASEMODE_6368_UART2       0x1
+#define GPIO_BASEMODE_6368_GPIO                0x0
+#define GPIO_BASEMODE_6368_MASK                0x7
+/* those bits must be kept as read in gpio basemode register*/
 
 /*************************************************************************
  * _REG relative to RSET_ENET
 #define ENETDMA_SRAM4_REG(x)           (0x20c + (x) * 0x10)
 
 
+/*************************************************************************
+ * _REG relative to RSET_ENETDMAC
+ *************************************************************************/
+
+/* Channel Configuration register */
+#define ENETDMAC_CHANCFG_REG(x)                ((x) * 0x10)
+#define ENETDMAC_CHANCFG_EN_SHIFT      0
+#define ENETDMAC_CHANCFG_EN_MASK       (1 << ENETDMA_CHANCFG_EN_SHIFT)
+#define ENETDMAC_CHANCFG_PKTHALT_SHIFT 1
+#define ENETDMAC_CHANCFG_PKTHALT_MASK  (1 << ENETDMA_CHANCFG_PKTHALT_SHIFT)
+
+/* Interrupt Control/Status register */
+#define ENETDMAC_IR_REG(x)             (0x4 + (x) * 0x10)
+#define ENETDMAC_IR_BUFDONE_MASK       (1 << 0)
+#define ENETDMAC_IR_PKTDONE_MASK       (1 << 1)
+#define ENETDMAC_IR_NOTOWNER_MASK      (1 << 2)
+
+/* Interrupt Mask register */
+#define ENETDMAC_IRMASK_REG(x)         (0x8 + (x) * 0x10)
+
+/* Maximum Burst Length */
+#define ENETDMAC_MAXBURST_REG(x)       (0xc + (x) * 0x10)
+
+
+/*************************************************************************
+ * _REG relative to RSET_ENETDMAS
+ *************************************************************************/
+
+/* Ring Start Address register */
+#define ENETDMAS_RSTART_REG(x)         ((x) * 0x10)
+
+/* State Ram Word 2 */
+#define ENETDMAS_SRAM2_REG(x)          (0x4 + (x) * 0x10)
+
+/* State Ram Word 3 */
+#define ENETDMAS_SRAM3_REG(x)          (0x8 + (x) * 0x10)
+
+/* State Ram Word 4 */
+#define ENETDMAS_SRAM4_REG(x)          (0xc + (x) * 0x10)
+
+
+/*************************************************************************
+ * _REG relative to RSET_ENETSW
+ *************************************************************************/
+
+/* MIB register */
+#define ENETSW_MIB_REG(x)              (0x2800 + (x) * 4)
+#define ENETSW_MIB_REG_COUNT           47
+
+
 /*************************************************************************
  * _REG relative to RSET_OHCI_PRIV
  *************************************************************************/
  * _REG relative to RSET_USBH_PRIV
  *************************************************************************/
 
-#define USBH_PRIV_SWAP_REG             0x0
+#define USBH_PRIV_SWAP_6358_REG                0x0
+#define USBH_PRIV_SWAP_6368_REG                0x1c
+
 #define USBH_PRIV_SWAP_EHCI_ENDN_SHIFT 4
 #define USBH_PRIV_SWAP_EHCI_ENDN_MASK  (1 << USBH_PRIV_SWAP_EHCI_ENDN_SHIFT)
 #define USBH_PRIV_SWAP_EHCI_DATA_SHIFT 3
 #define USBH_PRIV_SWAP_OHCI_DATA_SHIFT 0
 #define USBH_PRIV_SWAP_OHCI_DATA_MASK  (1 << USBH_PRIV_SWAP_OHCI_DATA_SHIFT)
 
-#define USBH_PRIV_TEST_REG             0x24
+#define USBH_PRIV_TEST_6358_REG                0x24
+#define USBH_PRIV_TEST_6368_REG                0x14
+
+#define USBH_PRIV_SETUP_6368_REG       0x28
+#define USBH_PRIV_SETUP_IOC_SHIFT      4
+#define USBH_PRIV_SETUP_IOC_MASK       (1 << USBH_PRIV_SETUP_IOC_SHIFT)
+
 
 
 /*************************************************************************
 #define SDRAM_CFG_BANK_SHIFT           13
 #define SDRAM_CFG_BANK_MASK            (1 << SDRAM_CFG_BANK_SHIFT)
 
+#define SDRAM_MBASE_REG                        0xc
+
 #define SDRAM_PRIO_REG                 0x2C
 #define SDRAM_PRIO_MIPS_SHIFT          29
 #define SDRAM_PRIO_MIPS_MASK           (1 << SDRAM_PRIO_MIPS_SHIFT)
 #define DMIPSPLLCFG_N2_SHIFT           29
 #define DMIPSPLLCFG_N2_MASK            (0x7 << DMIPSPLLCFG_N2_SHIFT)
 
+#define DDR_DMIPSPLLCFG_6368_REG       0x20
+#define DMIPSPLLCFG_6368_P1_SHIFT      0
+#define DMIPSPLLCFG_6368_P1_MASK       (0xf << DMIPSPLLCFG_6368_P1_SHIFT)
+#define DMIPSPLLCFG_6368_P2_SHIFT      4
+#define DMIPSPLLCFG_6368_P2_MASK       (0xf << DMIPSPLLCFG_6368_P2_SHIFT)
+#define DMIPSPLLCFG_6368_NDIV_SHIFT    16
+#define DMIPSPLLCFG_6368_NDIV_MASK     (0x1ff << DMIPSPLLCFG_6368_NDIV_SHIFT)
+
+#define DDR_DMIPSPLLDIV_6368_REG       0x24
+#define DMIPSPLLDIV_6368_MDIV_SHIFT    0
+#define DMIPSPLLDIV_6368_MDIV_MASK     (0xff << DMIPSPLLDIV_6368_MDIV_SHIFT)
+
+
+/*************************************************************************
+ * _REG relative to RSET_M2M
+ *************************************************************************/
+
+#define M2M_RX                         0
+#define M2M_TX                         1
+
+#define M2M_SRC_REG(x)                 ((x) * 0x40 + 0x00)
+#define M2M_DST_REG(x)                 ((x) * 0x40 + 0x04)
+#define M2M_SIZE_REG(x)                        ((x) * 0x40 + 0x08)
+
+#define M2M_CTRL_REG(x)                        ((x) * 0x40 + 0x0c)
+#define M2M_CTRL_ENABLE_MASK           (1 << 0)
+#define M2M_CTRL_IRQEN_MASK            (1 << 1)
+#define M2M_CTRL_ERROR_CLR_MASK                (1 << 6)
+#define M2M_CTRL_DONE_CLR_MASK         (1 << 7)
+#define M2M_CTRL_NOINC_MASK            (1 << 8)
+#define M2M_CTRL_PCMCIASWAP_MASK       (1 << 9)
+#define M2M_CTRL_SWAPBYTE_MASK         (1 << 10)
+#define M2M_CTRL_ENDIAN_MASK           (1 << 11)
+
+#define M2M_STAT_REG(x)                        ((x) * 0x40 + 0x10)
+#define M2M_STAT_DONE                  (1 << 0)
+#define M2M_STAT_ERROR                 (1 << 1)
+
+#define M2M_SRCID_REG(x)               ((x) * 0x40 + 0x14)
+#define M2M_DSTID_REG(x)               ((x) * 0x40 + 0x18)
+
 #endif /* BCM63XX_REGS_H_ */
diff --git a/arch/mips/include/asm/mach-bcm63xx/ioremap.h b/arch/mips/include/asm/mach-bcm63xx/ioremap.h
new file mode 100644 (file)
index 0000000..ef94ba7
--- /dev/null
@@ -0,0 +1,42 @@
+#ifndef BCM63XX_IOREMAP_H_
+#define BCM63XX_IOREMAP_H_
+
+#include <bcm63xx_cpu.h>
+
+static inline phys_t fixup_bigphys_addr(phys_t phys_addr, phys_t size)
+{
+       return phys_addr;
+}
+
+static inline int is_bcm63xx_internal_registers(phys_t offset)
+{
+       switch (bcm63xx_get_cpu_id()) {
+       case BCM6338_CPU_ID:
+       case BCM6345_CPU_ID:
+       case BCM6348_CPU_ID:
+       case BCM6358_CPU_ID:
+               if (offset >= 0xfff00000)
+                       return 1;
+               break;
+       case BCM6368_CPU_ID:
+               if (offset >= 0xb0000000 && offset < 0xb1000000)
+                       return 1;
+               break;
+       }
+       return 0;
+}
+
+static inline void __iomem *plat_ioremap(phys_t offset, unsigned long size,
+                                        unsigned long flags)
+{
+       if (is_bcm63xx_internal_registers(offset))
+               return (void __iomem *)offset;
+       return NULL;
+}
+
+static inline int plat_iounmap(const volatile void __iomem *addr)
+{
+       return is_bcm63xx_internal_registers((unsigned long)addr);
+}
+
+#endif /* BCM63XX_IOREMAP_H_ */
diff --git a/arch/mips/include/asm/mach-bcm63xx/irq.h b/arch/mips/include/asm/mach-bcm63xx/irq.h
new file mode 100644 (file)
index 0000000..9332e78
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef __ASM_MACH_BCM63XX_IRQ_H
+#define __ASM_MACH_BCM63XX_IRQ_H
+
+#define NR_IRQS        128
+#define MIPS_CPU_IRQ_BASE 0
+
+#endif
index 618d2de02ed35c638a7fa28d97823ca439f83bea..bb9fc23d853a675e8aa978eb1a4bd26f4919782d 100644 (file)
@@ -34,6 +34,8 @@
 #define PB1200_BCSR_PHYS_ADDR  0x0D800000
 #define PB1200_BCSR_HEXLED_OFS 0x00400000
 
+#define DB1300_BCSR_PHYS_ADDR  0x19800000
+#define DB1300_BCSR_HEXLED_OFS 0x00400000
 
 enum bcsr_id {
        /* BCSR base 1 */
@@ -105,6 +107,7 @@ enum bcsr_whoami_boards {
        BCSR_WHOAMI_PB1200 = BCSR_WHOAMI_PB1200_DDR1,
        BCSR_WHOAMI_PB1200_DDR2,
        BCSR_WHOAMI_DB1200,
+       BCSR_WHOAMI_DB1300,
 };
 
 /* STATUS reg.  Unless otherwise noted, they're valid on all boards.
@@ -118,12 +121,12 @@ enum bcsr_whoami_boards {
 #define BCSR_STATUS_SRAMWIDTH          0x0080
 #define BCSR_STATUS_FLASHBUSY          0x0100
 #define BCSR_STATUS_ROMBUSY            0x0400
-#define BCSR_STATUS_SD0WP              0x0400  /* DB1200 */
+#define BCSR_STATUS_SD0WP              0x0400  /* DB1200/DB1300:SD1 */
 #define BCSR_STATUS_SD1WP              0x0800
 #define BCSR_STATUS_USBOTGID           0x0800  /* PB/DB1550 */
 #define BCSR_STATUS_DB1000_SWAPBOOT    0x2000
-#define BCSR_STATUS_DB1200_SWAPBOOT    0x0040  /* DB1200 */
-#define BCSR_STATUS_IDECBLID           0x0200  /* DB1200 */
+#define BCSR_STATUS_DB1200_SWAPBOOT    0x0040  /* DB1200/1300 */
+#define BCSR_STATUS_IDECBLID           0x0200  /* DB1200/1300 */
 #define BCSR_STATUS_DB1200_U0RXD       0x1000  /* DB1200 */
 #define BCSR_STATUS_DB1200_U1RXD       0x2000  /* DB1200 */
 #define BCSR_STATUS_FLASHDEN           0xC000
@@ -133,6 +136,11 @@ enum bcsr_whoami_boards {
 #define BCSR_STATUS_PB1550_U1RXD       0x2000  /* PB1550 */
 #define BCSR_STATUS_PB1550_U3RXD       0x8000  /* PB1550 */
 
+#define BCSR_STATUS_CFWP               0x4000  /* DB1300 */
+#define BCSR_STATUS_USBOCn             0x2000  /* DB1300 */
+#define BCSR_STATUS_OTGOCn             0x1000  /* DB1300 */
+#define BCSR_STATUS_DCDMARQ            0x0010  /* DB1300 */
+#define BCSR_STATUS_IDEDMARQ           0x0020  /* DB1300 */
 
 /* DB/PB1000,1100,1500,1550 */
 #define BCSR_RESETS_PHY0               0x0001
@@ -155,17 +163,17 @@ enum bcsr_whoami_boards {
 #define BCSR_BOARD_GPIO200RST          0x0400
 #define BCSR_BOARD_PCICLKOUT           0x0800
 #define BCSR_BOARD_PCICFG              0x1000
-#define BCSR_BOARD_SPISEL              0x4000  /* PB/DB1550 */
+#define BCSR_BOARD_SPISEL              0x2000  /* PB/DB1550 */
 #define BCSR_BOARD_SD0WP               0x4000  /* DB1100 */
 #define BCSR_BOARD_SD1WP               0x8000  /* DB1100 */
 
 
-/* DB/PB1200 */
+/* DB/PB1200/1300 */
 #define BCSR_RESETS_ETH                        0x0001
 #define BCSR_RESETS_CAMERA             0x0002
 #define BCSR_RESETS_DC                 0x0004
 #define BCSR_RESETS_IDE                        0x0008
-#define BCSR_RESETS_TV                 0x0010  /* DB1200 */
+#define BCSR_RESETS_TV                 0x0010  /* DB1200/1300 */
 /* Not resets but in the same register */
 #define BCSR_RESETS_PWMR1MUX           0x0800  /* DB1200 */
 #define BCSR_RESETS_PB1200_WSCFSM      0x0800  /* PB1200 */
@@ -174,13 +182,22 @@ enum bcsr_whoami_boards {
 #define BCSR_RESETS_SPISEL             0x4000
 #define BCSR_RESETS_SD1MUX             0x8000  /* PB1200 */
 
+#define BCSR_RESETS_VDDQSHDN           0x0200  /* DB1300 */
+#define BCSR_RESETS_OTPPGM             0x0400  /* DB1300 */
+#define BCSR_RESETS_OTPSCLK            0x0800  /* DB1300 */
+#define BCSR_RESETS_OTPWRPROT          0x1000  /* DB1300 */
+#define BCSR_RESETS_OTPCSB             0x2000  /* DB1300 */
+#define BCSR_RESETS_OTGPWR             0x4000  /* DB1300 */
+#define BCSR_RESETS_USBHPWR            0x8000  /* DB1300 */
+
 #define BCSR_BOARD_LCDVEE              0x0001
 #define BCSR_BOARD_LCDVDD              0x0002
 #define BCSR_BOARD_LCDBL               0x0004
 #define BCSR_BOARD_CAMSNAP             0x0010
 #define BCSR_BOARD_CAMPWR              0x0020
 #define BCSR_BOARD_SD0PWR              0x0040
-
+#define BCSR_BOARD_CAMCS               0x0010  /* DB1300 */
+#define BCSR_BOARD_HDMI_DE             0x0040  /* DB1300 */
 
 #define BCSR_SWITCHES_DIP              0x00FF
 #define BCSR_SWITCHES_DIP_1            0x0080
@@ -214,7 +231,10 @@ enum bcsr_whoami_boards {
 #define BCSR_SYSTEM_RESET              0x8000  /* clear to reset */
 #define BCSR_SYSTEM_PWROFF             0x4000  /* set to power off */
 #define BCSR_SYSTEM_VDDI               0x001F  /* PB1xxx boards */
-
+#define BCSR_SYSTEM_DEBUGCSMASK                0x003F  /* DB1300 */
+#define BCSR_SYSTEM_UDMAMODE           0x0100  /* DB1300 */
+#define BCSR_SYSTEM_WAKEONIRQ          0x0200  /* DB1300 */
+#define BCSR_SYSTEM_VDDI1300           0x3C00  /* DB1300 */
 
 
 
index 7a39657108c4a5d7f5ee2d8dba99d6a1b9713f1c..b2a8319521e5ed253d4f18d6c513968dd8cd1b7d 100644 (file)
 #define BCSR_INT_PC1EJECT      0x0800
 #define BCSR_INT_SD0INSERT     0x1000
 #define BCSR_INT_SD0EJECT      0x2000
+#define BCSR_INT_SD1INSERT     0x4000
+#define BCSR_INT_SD1EJECT      0x8000
 
-#define IDE_PHYS_ADDR          0x18800000
 #define IDE_REG_SHIFT          5
 
-#define DB1200_IDE_PHYS_ADDR   IDE_PHYS_ADDR
+#define DB1200_IDE_PHYS_ADDR   0x18800000
 #define DB1200_IDE_PHYS_LEN    (16 << IDE_REG_SHIFT)
 #define DB1200_ETH_PHYS_ADDR   0x19000300
 #define DB1200_NAND_PHYS_ADDR  0x20000000
 
+#define PB1200_IDE_PHYS_ADDR   0x0C800000
+#define PB1200_ETH_PHYS_ADDR   0x0D000300
+#define PB1200_NAND_PHYS_ADDR  0x1C000000
+
 /*
  * External Interrupts for DBAu1200 as of 8/6/2004.
  * Bit positions in the CPLD registers can be calculated by taking
@@ -77,6 +82,8 @@ enum external_db1200_ints {
        DB1200_PC1_EJECT_INT,
        DB1200_SD0_INSERT_INT,
        DB1200_SD0_EJECT_INT,
+       PB1200_SD1_INSERT_INT,
+       PB1200_SD1_EJECT_INT,
 
        DB1200_INT_END          = DB1200_INT_BEGIN + 15,
 };
diff --git a/arch/mips/include/asm/mach-db1x00/db1300.h b/arch/mips/include/asm/mach-db1x00/db1300.h
new file mode 100644 (file)
index 0000000..7fe5fb3
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * NetLogic DB1300 board constants
+ */
+
+#ifndef _DB1300_H_
+#define _DB1300_H_
+
+/* FPGA (external mux) interrupt sources */
+#define DB1300_FIRST_INT       (ALCHEMY_GPIC_INT_LAST + 1)
+#define DB1300_IDE_INT         (DB1300_FIRST_INT + 0)
+#define DB1300_ETH_INT         (DB1300_FIRST_INT + 1)
+#define DB1300_CF_INT          (DB1300_FIRST_INT + 2)
+#define DB1300_VIDEO_INT       (DB1300_FIRST_INT + 4)
+#define DB1300_HDMI_INT                (DB1300_FIRST_INT + 5)
+#define DB1300_DC_INT          (DB1300_FIRST_INT + 6)
+#define DB1300_FLASH_INT       (DB1300_FIRST_INT + 7)
+#define DB1300_CF_INSERT_INT   (DB1300_FIRST_INT + 8)
+#define DB1300_CF_EJECT_INT    (DB1300_FIRST_INT + 9)
+#define DB1300_AC97_INT                (DB1300_FIRST_INT + 10)
+#define DB1300_AC97_PEN_INT    (DB1300_FIRST_INT + 11)
+#define DB1300_SD1_INSERT_INT  (DB1300_FIRST_INT + 12)
+#define DB1300_SD1_EJECT_INT   (DB1300_FIRST_INT + 13)
+#define DB1300_OTG_VBUS_OC_INT (DB1300_FIRST_INT + 14)
+#define DB1300_HOST_VBUS_OC_INT        (DB1300_FIRST_INT + 15)
+#define DB1300_LAST_INT                (DB1300_FIRST_INT + 15)
+
+/* SMSC9210 CS */
+#define DB1300_ETH_PHYS_ADDR   0x19000000
+#define DB1300_ETH_PHYS_END    0x197fffff
+
+/* ATA CS */
+#define DB1300_IDE_PHYS_ADDR   0x18800000
+#define DB1300_IDE_REG_SHIFT   5
+#define DB1300_IDE_PHYS_LEN    (16 << DB1300_IDE_REG_SHIFT)
+
+/* NAND CS */
+#define DB1300_NAND_PHYS_ADDR  0x20000000
+#define DB1300_NAND_PHYS_END   0x20000fff
+
+#endif /* _DB1300_H_ */
diff --git a/arch/mips/include/asm/mach-db1x00/db1x00.h b/arch/mips/include/asm/mach-db1x00/db1x00.h
deleted file mode 100644 (file)
index a5affb0..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * AMD Alchemy DBAu1x00 Reference Boards
- *
- * Copyright 2001, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- * Copyright (C) 2005 Ralf Baechle (ralf@linux-mips.org)
- *
- * ########################################################################
- *
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * ########################################################################
- *
- *
- */
-#ifndef __ASM_DB1X00_H
-#define __ASM_DB1X00_H
-
-#include <asm/mach-au1x00/au1xxx_psc.h>
-
-#ifdef CONFIG_MIPS_DB1550
-
-#define DBDMA_AC97_TX_CHAN     AU1550_DSCR_CMD0_PSC1_TX
-#define DBDMA_AC97_RX_CHAN     AU1550_DSCR_CMD0_PSC1_RX
-#define DBDMA_I2S_TX_CHAN      AU1550_DSCR_CMD0_PSC3_TX
-#define DBDMA_I2S_RX_CHAN      AU1550_DSCR_CMD0_PSC3_RX
-
-#define SPI_PSC_BASE           AU1550_PSC0_PHYS_ADDR
-#define AC97_PSC_BASE          AU1550_PSC1_PHYS_ADDR
-#define SMBUS_PSC_BASE         AU1550_PSC2_PHYS_ADDR
-#define I2S_PSC_BASE           AU1550_PSC3_PHYS_ADDR
-
-#define NAND_PHYS_ADDR         0x20000000
-
-#endif
-
-/*
- * NAND defines
- *
- * Timing values as described in databook, * ns value stripped of the
- * lower 2 bits.
- * These defines are here rather than an Au1550 generic file because
- * the parts chosen on another board may be different and may require
- * different timings.
- */
-#define NAND_T_H               (18 >> 2)
-#define NAND_T_PUL             (30 >> 2)
-#define NAND_T_SU              (30 >> 2)
-#define NAND_T_WH              (30 >> 2)
-
-/* Bitfield shift amounts */
-#define NAND_T_H_SHIFT         0
-#define NAND_T_PUL_SHIFT       4
-#define NAND_T_SU_SHIFT                8
-#define NAND_T_WH_SHIFT                12
-
-#define NAND_TIMING    (((NAND_T_H   & 0xF) << NAND_T_H_SHIFT)   | \
-                        ((NAND_T_PUL & 0xF) << NAND_T_PUL_SHIFT) | \
-                        ((NAND_T_SU  & 0xF) << NAND_T_SU_SHIFT)  | \
-                        ((NAND_T_WH  & 0xF) << NAND_T_WH_SHIFT))
-#define NAND_CS        1
-
-/* Should be done by YAMON */
-#define NAND_STCFG     0x00400005 /* 8-bit NAND */
-#define NAND_STTIME    0x00007774 /* valid for 396 MHz SD=2 only */
-#define NAND_STADDR    0x12000FFF /* physical address 0x20000000 */
-
-#endif /* __ASM_DB1X00_H */
diff --git a/arch/mips/include/asm/mach-db1x00/irq.h b/arch/mips/include/asm/mach-db1x00/irq.h
new file mode 100644 (file)
index 0000000..15b2669
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2003 by Ralf Baechle
+ */
+#ifndef __ASM_MACH_GENERIC_IRQ_H
+#define __ASM_MACH_GENERIC_IRQ_H
+
+
+#ifdef NR_IRQS
+#undef NR_IRQS
+#endif
+
+#ifndef MIPS_CPU_IRQ_BASE
+#define MIPS_CPU_IRQ_BASE 0
+#endif
+
+/* 8 (MIPS) + 128 (au1300) + 16 (cpld) */
+#define NR_IRQS 152
+
+#endif /* __ASM_MACH_GENERIC_IRQ_H */
index 3b728275b9b0bf1a004fdf40bacf119650f9428e..d193fb68cf270d66e734fc7ef88613417cdb94be 100644 (file)
 
 #define cpu_has_llsc           1
 #define cpu_has_vtag_icache    0
-#define cpu_has_dc_aliases     0
-#define cpu_has_ic_fills_f_dc  0
+#define cpu_has_ic_fills_f_dc  1
 #define cpu_has_dsp            0
 #define cpu_has_mipsmt         0
-#define cpu_has_userlocal      0
-#define cpu_icache_snoops_remote_store 0
+#define cpu_icache_snoops_remote_store 1
 
-#define cpu_has_nofpuex                0
 #define cpu_has_64bits         1
 
 #define cpu_has_mips32r1       1
-#define cpu_has_mips32r2       0
 #define cpu_has_mips64r1       1
-#define cpu_has_mips64r2       0
 
 #define cpu_has_inclusive_pcaches      0
 
 #define cpu_dcache_line_size() 32
 #define cpu_icache_line_size() 32
 
+#if defined(CONFIG_CPU_XLR)
+#define cpu_has_userlocal      0
+#define cpu_has_dc_aliases     0
+#define cpu_has_mips32r2       0
+#define cpu_has_mips64r2       0
+#elif defined(CONFIG_CPU_XLP)
+#define cpu_has_userlocal      1
+#define cpu_has_mips32r2       1
+#define cpu_has_mips64r2       1
+#define cpu_has_dc_aliases     1
+#else
+#error "Unknown Netlogic CPU"
+#endif
+
 #endif /* __ASM_MACH_NETLOGIC_CPU_FEATURE_OVERRIDES_H */
diff --git a/arch/mips/include/asm/mach-pb1x00/mc146818rtc.h b/arch/mips/include/asm/mach-pb1x00/mc146818rtc.h
deleted file mode 100644 (file)
index 622c587..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 1998, 2001, 03 by Ralf Baechle
- *
- * RTC routines for PC style attached Dallas chip.
- */
-#ifndef __ASM_MACH_AU1XX_MC146818RTC_H
-#define __ASM_MACH_AU1XX_MC146818RTC_H
-
-#include <asm/io.h>
-#include <asm/mach-au1x00/au1000.h>
-
-#define RTC_PORT(x)    (0x0c000000 + (x))
-#define RTC_IRQ                8
-#define PB1500_RTC_ADDR 0x0c000000
-
-static inline unsigned char CMOS_READ(unsigned long offset)
-{
-       offset <<= 2;
-       return (u8)(au_readl(offset + PB1500_RTC_ADDR) & 0xff);
-}
-
-static inline void CMOS_WRITE(unsigned char data, unsigned long offset)
-{
-       offset <<= 2;
-       au_writel(data, offset + PB1500_RTC_ADDR);
-}
-
-#define RTC_ALWAYS_BCD 1
-
-#endif /* __ASM_MACH_AU1XX_MC146818RTC_H */
diff --git a/arch/mips/include/asm/mach-pb1x00/pb1000.h b/arch/mips/include/asm/mach-pb1x00/pb1000.h
deleted file mode 100644 (file)
index 6505925..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Alchemy Semi Pb1000 Reference Board
- *
- * Copyright 2001, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- * ########################################################################
- *
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * ########################################################################
- *
- *
- */
-#ifndef __ASM_PB1000_H
-#define __ASM_PB1000_H
-
-/* PCMCIA PB1000 specific defines */
-#define PCMCIA_MAX_SOCK  1
-#define PCMCIA_NUM_SOCKS (PCMCIA_MAX_SOCK + 1)
-
-#define PB1000_PCR             0xBE000000
-#  define PCR_SLOT_0_VPP0      (1 << 0)
-#  define PCR_SLOT_0_VPP1      (1 << 1)
-#  define PCR_SLOT_0_VCC0      (1 << 2)
-#  define PCR_SLOT_0_VCC1      (1 << 3)
-#  define PCR_SLOT_0_RST       (1 << 4)
-#  define PCR_SLOT_1_VPP0      (1 << 8)
-#  define PCR_SLOT_1_VPP1      (1 << 9)
-#  define PCR_SLOT_1_VCC0      (1 << 10)
-#  define PCR_SLOT_1_VCC1      (1 << 11)
-#  define PCR_SLOT_1_RST       (1 << 12)
-
-#define PB1000_MDR             0xBE000004
-#  define MDR_PI               (1 << 5)        /* PCMCIA int latch  */
-#  define MDR_EPI              (1 << 14)       /* enable PCMCIA int */
-#  define MDR_CPI              (1 << 15)       /* clear  PCMCIA int  */
-
-#define PB1000_ACR1            0xBE000008
-#  define ACR1_SLOT_0_CD1      (1 << 0)        /* card detect 1        */
-#  define ACR1_SLOT_0_CD2      (1 << 1)        /* card detect 2        */
-#  define ACR1_SLOT_0_READY    (1 << 2)        /* ready                */
-#  define ACR1_SLOT_0_STATUS   (1 << 3)        /* status change        */
-#  define ACR1_SLOT_0_VS1      (1 << 4)        /* voltage sense 1      */
-#  define ACR1_SLOT_0_VS2      (1 << 5)        /* voltage sense 2      */
-#  define ACR1_SLOT_0_INPACK   (1 << 6)        /* inpack pin status    */
-#  define ACR1_SLOT_1_CD1      (1 << 8)        /* card detect 1        */
-#  define ACR1_SLOT_1_CD2      (1 << 9)        /* card detect 2        */
-#  define ACR1_SLOT_1_READY    (1 << 10)       /* ready                */
-#  define ACR1_SLOT_1_STATUS   (1 << 11)       /* status change        */
-#  define ACR1_SLOT_1_VS1      (1 << 12)       /* voltage sense 1      */
-#  define ACR1_SLOT_1_VS2      (1 << 13)       /* voltage sense 2      */
-#  define ACR1_SLOT_1_INPACK   (1 << 14)       /* inpack pin status    */
-
-#define CPLD_AUX0              0xBE00000C
-#define CPLD_AUX1              0xBE000010
-#define CPLD_AUX2              0xBE000014
-
-/* Voltage levels */
-
-/* VPPEN1 - VPPEN0 */
-#define VPP_GND ((0 << 1) | (0 << 0))
-#define VPP_5V ((1 << 1) | (0 << 0))
-#define VPP_3V ((0 << 1) | (1 << 0))
-#define VPP_12V ((0 << 1) | (1 << 0))
-#define VPP_HIZ ((1 << 1) | (1 << 0))
-
-/* VCCEN1 - VCCEN0 */
-#define VCC_3V ((0 << 1) | (1 << 0))
-#define VCC_5V ((1 << 1) | (0 << 0))
-#define VCC_HIZ ((0 << 1) | (0 << 0))
-
-/* VPP/VCC */
-#define SET_VCC_VPP(VCC, VPP, SLOT) \
-       ((((VCC) << 2) | ((VPP) << 0)) << ((SLOT) * 8))
-#endif /* __ASM_PB1000_H */
diff --git a/arch/mips/include/asm/mach-pb1x00/pb1200.h b/arch/mips/include/asm/mach-pb1x00/pb1200.h
deleted file mode 100644 (file)
index 374416a..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * AMD Alchemy Pb1200 Reference Board
- * Board Registers defines.
- *
- * ########################################################################
- *
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * ########################################################################
- *
- *
- */
-#ifndef __ASM_PB1200_H
-#define __ASM_PB1200_H
-
-#include <linux/types.h>
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-au1x00/au1xxx_psc.h>
-
-#define DBDMA_AC97_TX_CHAN     AU1200_DSCR_CMD0_PSC1_TX
-#define DBDMA_AC97_RX_CHAN     AU1200_DSCR_CMD0_PSC1_RX
-#define DBDMA_I2S_TX_CHAN      AU1200_DSCR_CMD0_PSC1_TX
-#define DBDMA_I2S_RX_CHAN      AU1200_DSCR_CMD0_PSC1_RX
-
-/*
- * SPI and SMB are muxed on the Pb1200 board.
- * Refer to board documentation.
- */
-#define SPI_PSC_BASE           AU1550_PSC0_PHYS_ADDR
-#define SMBUS_PSC_BASE         AU1550_PSC0_PHYS_ADDR
-/*
- * AC97 and I2S are muxed on the Pb1200 board.
- * Refer to board documentation.
- */
-#define AC97_PSC_BASE       AU1550_PSC1_PHYS_ADDR
-#define I2S_PSC_BASE   AU1550_PSC1_PHYS_ADDR
-
-
-#define BCSR_SYSTEM_VDDI       0x001F
-#define BCSR_SYSTEM_POWEROFF   0x4000
-#define BCSR_SYSTEM_RESET      0x8000
-
-/* Bit positions for the different interrupt sources */
-#define BCSR_INT_IDE           0x0001
-#define BCSR_INT_ETH           0x0002
-#define BCSR_INT_PC0           0x0004
-#define BCSR_INT_PC0STSCHG     0x0008
-#define BCSR_INT_PC1           0x0010
-#define BCSR_INT_PC1STSCHG     0x0020
-#define BCSR_INT_DC            0x0040
-#define BCSR_INT_FLASHBUSY     0x0080
-#define BCSR_INT_PC0INSERT     0x0100
-#define BCSR_INT_PC0EJECT      0x0200
-#define BCSR_INT_PC1INSERT     0x0400
-#define BCSR_INT_PC1EJECT      0x0800
-#define BCSR_INT_SD0INSERT     0x1000
-#define BCSR_INT_SD0EJECT      0x2000
-#define BCSR_INT_SD1INSERT     0x4000
-#define BCSR_INT_SD1EJECT      0x8000
-
-#define SMC91C111_PHYS_ADDR    0x0D000300
-#define SMC91C111_INT          PB1200_ETH_INT
-
-#define IDE_PHYS_ADDR          0x0C800000
-#define IDE_REG_SHIFT          5
-#define IDE_PHYS_LEN           (16 << IDE_REG_SHIFT)
-#define IDE_INT                PB1200_IDE_INT
-
-#define NAND_PHYS_ADDR         0x1C000000
-
-/*
- * Timing values as described in databook, * ns value stripped of
- * lower 2 bits.
- * These defines are here rather than an Au1200 generic file because
- * the parts chosen on another board may be different and may require
- * different timings.
- */
-#define NAND_T_H               (18 >> 2)
-#define NAND_T_PUL             (30 >> 2)
-#define NAND_T_SU              (30 >> 2)
-#define NAND_T_WH              (30 >> 2)
-
-/* Bitfield shift amounts */
-#define NAND_T_H_SHIFT         0
-#define NAND_T_PUL_SHIFT       4
-#define NAND_T_SU_SHIFT                8
-#define NAND_T_WH_SHIFT                12
-
-#define NAND_TIMING    (((NAND_T_H   & 0xF) << NAND_T_H_SHIFT)   | \
-                        ((NAND_T_PUL & 0xF) << NAND_T_PUL_SHIFT) | \
-                        ((NAND_T_SU  & 0xF) << NAND_T_SU_SHIFT)  | \
-                        ((NAND_T_WH  & 0xF) << NAND_T_WH_SHIFT))
-
-/*
- * External Interrupts for Pb1200 as of 8/6/2004.
- * Bit positions in the CPLD registers can be calculated by taking
- * the interrupt define and subtracting the PB1200_INT_BEGIN value.
- *
- *   Example: IDE bis pos is  = 64 - 64
- *            ETH bit pos is  = 65 - 64
- */
-enum external_pb1200_ints {
-       PB1200_INT_BEGIN        = AU1000_MAX_INTR + 1,
-
-       PB1200_IDE_INT          = PB1200_INT_BEGIN,
-       PB1200_ETH_INT,
-       PB1200_PC0_INT,
-       PB1200_PC0_STSCHG_INT,
-       PB1200_PC1_INT,
-       PB1200_PC1_STSCHG_INT,
-       PB1200_DC_INT,
-       PB1200_FLASHBUSY_INT,
-       PB1200_PC0_INSERT_INT,
-       PB1200_PC0_EJECT_INT,
-       PB1200_PC1_INSERT_INT,
-       PB1200_PC1_EJECT_INT,
-       PB1200_SD0_INSERT_INT,
-       PB1200_SD0_EJECT_INT,
-       PB1200_SD1_INSERT_INT,
-       PB1200_SD1_EJECT_INT,
-
-       PB1200_INT_END          = PB1200_INT_BEGIN + 15
-};
-
-/* NAND chip select */
-#define NAND_CS 1
-
-#endif /* __ASM_PB1200_H */
diff --git a/arch/mips/include/asm/mach-pb1x00/pb1550.h b/arch/mips/include/asm/mach-pb1x00/pb1550.h
deleted file mode 100644 (file)
index 443b88a..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * AMD Alchemy Semi PB1550 Reference Board
- * Board Registers defines.
- *
- * Copyright 2004 Embedded Edge LLC.
- * Copyright 2005 Ralf Baechle (ralf@linux-mips.org)
- *
- * ########################################################################
- *
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * ########################################################################
- *
- *
- */
-#ifndef __ASM_PB1550_H
-#define __ASM_PB1550_H
-
-#include <linux/types.h>
-#include <asm/mach-au1x00/au1xxx_psc.h>
-
-#define DBDMA_AC97_TX_CHAN     AU1550_DSCR_CMD0_PSC1_TX
-#define DBDMA_AC97_RX_CHAN     AU1550_DSCR_CMD0_PSC1_RX
-#define DBDMA_I2S_TX_CHAN      AU1550_DSCR_CMD0_PSC3_TX
-#define DBDMA_I2S_RX_CHAN      AU1550_DSCR_CMD0_PSC3_RX
-
-#define SPI_PSC_BASE           AU1550_PSC0_PHYS_ADDR
-#define AC97_PSC_BASE          AU1550_PSC1_PHYS_ADDR
-#define SMBUS_PSC_BASE         AU1550_PSC2_PHYS_ADDR
-#define I2S_PSC_BASE           AU1550_PSC3_PHYS_ADDR
-
-/*
- * Timing values as described in databook, * ns value stripped of
- * lower 2 bits.
- * These defines are here rather than an SOC1550 generic file because
- * the parts chosen on another board may be different and may require
- * different timings.
- */
-#define NAND_T_H               (18 >> 2)
-#define NAND_T_PUL             (30 >> 2)
-#define NAND_T_SU              (30 >> 2)
-#define NAND_T_WH              (30 >> 2)
-
-/* Bitfield shift amounts */
-#define NAND_T_H_SHIFT         0
-#define NAND_T_PUL_SHIFT       4
-#define NAND_T_SU_SHIFT                8
-#define NAND_T_WH_SHIFT                12
-
-#define NAND_TIMING    (((NAND_T_H   & 0xF) << NAND_T_H_SHIFT)   | \
-                        ((NAND_T_PUL & 0xF) << NAND_T_PUL_SHIFT) | \
-                        ((NAND_T_SU  & 0xF) << NAND_T_SU_SHIFT)  | \
-                        ((NAND_T_WH  & 0xF) << NAND_T_WH_SHIFT))
-
-#define NAND_CS 1
-
-/* Should be done by YAMON */
-#define NAND_STCFG     0x00400005 /* 8-bit NAND */
-#define NAND_STTIME    0x00007774 /* valid for 396 MHz SD=2 only */
-#define NAND_STADDR    0x12000FFF /* physical address 0x20000000 */
-
-#endif /* __ASM_PB1550_H */
index 2ea7b817feb87988c09711d63f5c02f570ea0ee1..7f87d824eeb089ca3be7aa4f56efa889ec98c40d 100644 (file)
@@ -1106,7 +1106,7 @@ do {                                                                      \
 #define read_c0_brcm_reset()           __read_32bit_c0_register($22, 5)
 #define write_c0_brcm_reset(val)       __write_32bit_c0_register($22, 5, val)
 
-/* BMIPS4380 */
+/* BMIPS43xx */
 #define read_c0_brcm_cmt_intr()                __read_32bit_c0_register($22, 1)
 #define write_c0_brcm_cmt_intr(val)    __write_32bit_c0_register($22, 1, val)
 
@@ -1667,6 +1667,13 @@ __BUILD_SET_C0(config)
 __BUILD_SET_C0(intcontrol)
 __BUILD_SET_C0(intctl)
 __BUILD_SET_C0(srsmap)
+__BUILD_SET_C0(brcm_config_0)
+__BUILD_SET_C0(brcm_bus_pll)
+__BUILD_SET_C0(brcm_reset)
+__BUILD_SET_C0(brcm_cmt_intr)
+__BUILD_SET_C0(brcm_cmt_ctrl)
+__BUILD_SET_C0(brcm_config)
+__BUILD_SET_C0(brcm_mode)
 
 #endif /* !__ASSEMBLY__ */
 
index bc01a02cacd8fd95ee3ab50378ae64aee3c701bb..7467d1d933d54a0eba29fe93465b78c26ade6108 100644 (file)
@@ -74,7 +74,9 @@ search_module_dbetables(unsigned long addr)
 }
 #endif
 
-#ifdef CONFIG_CPU_MIPS32_R1
+#ifdef CONFIG_CPU_BMIPS
+#define MODULE_PROC_FAMILY "BMIPS "
+#elif defined CONFIG_CPU_MIPS32_R1
 #define MODULE_PROC_FAMILY "MIPS32_R1 "
 #elif defined CONFIG_CPU_MIPS32_R2
 #define MODULE_PROC_FAMILY "MIPS32_R2 "
@@ -120,6 +122,8 @@ search_module_dbetables(unsigned long addr)
 #define MODULE_PROC_FAMILY "OCTEON "
 #elif defined CONFIG_CPU_XLR
 #define MODULE_PROC_FAMILY "XLR "
+#elif defined CONFIG_CPU_XLP
+#define MODULE_PROC_FAMILY "XLP "
 #else
 #error MODULE_PROC_FAMILY undefined for your processor configuration
 #endif
diff --git a/arch/mips/include/asm/netlogic/common.h b/arch/mips/include/asm/netlogic/common.h
new file mode 100644 (file)
index 0000000..fdd2f44
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
+ * reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the NetLogic
+ * license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _NETLOGIC_COMMON_H_
+#define _NETLOGIC_COMMON_H_
+
+/*
+ * Common SMP definitions
+ */
+#define        RESET_VEC_PHYS          0x1fc00000
+#define        RESET_DATA_PHYS         (RESET_VEC_PHYS + (1<<10))
+#define        BOOT_THREAD_MODE        0
+#define        BOOT_NMI_LOCK           4
+#define        BOOT_NMI_HANDLER        8
+
+#ifndef __ASSEMBLY__
+struct irq_desc;
+extern struct plat_smp_ops nlm_smp_ops;
+extern char nlm_reset_entry[], nlm_reset_entry_end[];
+void nlm_smp_function_ipi_handler(unsigned int irq, struct irq_desc *desc);
+void nlm_smp_resched_ipi_handler(unsigned int irq, struct irq_desc *desc);
+void nlm_smp_irq_init(void);
+void nlm_boot_secondary_cpus(void);
+int nlm_wakeup_secondary_cpus(u32 wakeup_mask);
+void nlm_rmiboot_preboot(void);
+
+static inline void
+nlm_set_nmi_handler(void *handler)
+{
+       char *reset_data;
+
+       reset_data = (char *)CKSEG1ADDR(RESET_DATA_PHYS);
+       *(int64_t *)(reset_data + BOOT_NMI_HANDLER) = (long)handler;
+}
+
+/*
+ * Misc.
+ */
+unsigned int nlm_get_cpu_frequency(void);
+
+extern unsigned long nlm_common_ebase;
+extern int nlm_threads_per_core;
+extern uint32_t nlm_cpumask, nlm_coremask;
+#endif
+#endif /* _NETLOGIC_COMMON_H_ */
diff --git a/arch/mips/include/asm/netlogic/haldefs.h b/arch/mips/include/asm/netlogic/haldefs.h
new file mode 100644 (file)
index 0000000..72a0c78
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
+ * reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the NetLogic
+ * license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __NLM_HAL_HALDEFS_H__
+#define __NLM_HAL_HALDEFS_H__
+
+/*
+ * This file contains platform specific memory mapped IO implementation
+ * and will provide a way to read 32/64 bit memory mapped registers in
+ * all ABIs
+ */
+#if !defined(CONFIG_64BIT) && defined(CONFIG_CPU_XLP)
+#error "o32 compile not supported on XLP yet"
+#endif
+/*
+ * For o32 compilation, we have to disable interrupts and enable KX bit to
+ * access 64 bit addresses or data.
+ *
+ * We need to disable interrupts because we save just the lower 32 bits of
+ * registers in  interrupt handling. So if we get hit by an interrupt while
+ * using the upper 32 bits of a register, we lose.
+ */
+static inline uint32_t nlm_save_flags_kx(void)
+{
+       return change_c0_status(ST0_KX | ST0_IE, ST0_KX);
+}
+
+static inline uint32_t nlm_save_flags_cop2(void)
+{
+       return change_c0_status(ST0_CU2 | ST0_IE, ST0_CU2);
+}
+
+static inline void nlm_restore_flags(uint32_t sr)
+{
+       write_c0_status(sr);
+}
+
+/*
+ * The n64 implementations are simple, the o32 implementations when they
+ * are added, will have to disable interrupts and enable KX before doing
+ * 64 bit ops.
+ */
+static inline uint32_t
+nlm_read_reg(uint64_t base, uint32_t reg)
+{
+       volatile uint32_t *addr = (volatile uint32_t *)(long)base + reg;
+
+       return *addr;
+}
+
+static inline void
+nlm_write_reg(uint64_t base, uint32_t reg, uint32_t val)
+{
+       volatile uint32_t *addr = (volatile uint32_t *)(long)base + reg;
+
+       *addr = val;
+}
+
+static inline uint64_t
+nlm_read_reg64(uint64_t base, uint32_t reg)
+{
+       uint64_t addr = base + (reg >> 1) * sizeof(uint64_t);
+       volatile uint64_t *ptr = (volatile uint64_t *)(long)addr;
+
+       return *ptr;
+}
+
+static inline void
+nlm_write_reg64(uint64_t base, uint32_t reg, uint64_t val)
+{
+       uint64_t addr = base + (reg >> 1) * sizeof(uint64_t);
+       volatile uint64_t *ptr = (volatile uint64_t *)(long)addr;
+
+       *ptr = val;
+}
+
+/*
+ * Routines to store 32/64 bit values to 64 bit addresses,
+ * used when going thru XKPHYS to access registers
+ */
+static inline uint32_t
+nlm_read_reg_xkphys(uint64_t base, uint32_t reg)
+{
+       return nlm_read_reg(base, reg);
+}
+
+static inline void
+nlm_write_reg_xkphys(uint64_t base, uint32_t reg, uint32_t val)
+{
+       nlm_write_reg(base, reg, val);
+}
+
+static inline uint64_t
+nlm_read_reg64_xkphys(uint64_t base, uint32_t reg)
+{
+       return nlm_read_reg64(base, reg);
+}
+
+static inline void
+nlm_write_reg64_xkphys(uint64_t base, uint32_t reg, uint64_t val)
+{
+       nlm_write_reg64(base, reg, val);
+}
+
+/* Location where IO base is mapped */
+extern uint64_t nlm_io_base;
+
+#if defined(CONFIG_CPU_XLP)
+static inline uint64_t
+nlm_pcicfg_base(uint32_t devoffset)
+{
+       return nlm_io_base + devoffset;
+}
+
+static inline uint64_t
+nlm_xkphys_map_pcibar0(uint64_t pcibase)
+{
+       uint64_t paddr;
+
+       paddr = nlm_read_reg(pcibase, 0x4) & ~0xfu;
+       return (uint64_t)0x9000000000000000 | paddr;
+}
+#elif defined(CONFIG_CPU_XLR)
+
+static inline uint64_t
+nlm_mmio_base(uint32_t devoffset)
+{
+       return nlm_io_base + devoffset;
+}
+#endif
+
+#endif
diff --git a/arch/mips/include/asm/netlogic/xlp-hal/bridge.h b/arch/mips/include/asm/netlogic/xlp-hal/bridge.h
new file mode 100644 (file)
index 0000000..ca95133
--- /dev/null
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
+ * reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the NetLogic
+ * license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __NLM_HAL_BRIDGE_H__
+#define __NLM_HAL_BRIDGE_H__
+
+/**
+* @file_name mio.h
+* @author Netlogic Microsystems
+* @brief Basic definitions of XLP memory and io subsystem
+*/
+
+/*
+ * BRIDGE specific registers
+ *
+ * These registers start after the PCIe header, which has 0x40
+ * standard entries
+ */
+#define BRIDGE_MODE                    0x00
+#define BRIDGE_PCI_CFG_BASE            0x01
+#define BRIDGE_PCI_CFG_LIMIT           0x02
+#define BRIDGE_PCIE_CFG_BASE           0x03
+#define BRIDGE_PCIE_CFG_LIMIT          0x04
+#define BRIDGE_BUSNUM_BAR0             0x05
+#define BRIDGE_BUSNUM_BAR1             0x06
+#define BRIDGE_BUSNUM_BAR2             0x07
+#define BRIDGE_BUSNUM_BAR3             0x08
+#define BRIDGE_BUSNUM_BAR4             0x09
+#define BRIDGE_BUSNUM_BAR5             0x0a
+#define BRIDGE_BUSNUM_BAR6             0x0b
+#define BRIDGE_FLASH_BAR0              0x0c
+#define BRIDGE_FLASH_BAR1              0x0d
+#define BRIDGE_FLASH_BAR2              0x0e
+#define BRIDGE_FLASH_BAR3              0x0f
+#define BRIDGE_FLASH_LIMIT0            0x10
+#define BRIDGE_FLASH_LIMIT1            0x11
+#define BRIDGE_FLASH_LIMIT2            0x12
+#define BRIDGE_FLASH_LIMIT3            0x13
+
+#define BRIDGE_DRAM_BAR(i)             (0x14 + (i))
+#define BRIDGE_DRAM_BAR0               0x14
+#define BRIDGE_DRAM_BAR1               0x15
+#define BRIDGE_DRAM_BAR2               0x16
+#define BRIDGE_DRAM_BAR3               0x17
+#define BRIDGE_DRAM_BAR4               0x18
+#define BRIDGE_DRAM_BAR5               0x19
+#define BRIDGE_DRAM_BAR6               0x1a
+#define BRIDGE_DRAM_BAR7               0x1b
+
+#define BRIDGE_DRAM_LIMIT(i)           (0x1c + (i))
+#define BRIDGE_DRAM_LIMIT0             0x1c
+#define BRIDGE_DRAM_LIMIT1             0x1d
+#define BRIDGE_DRAM_LIMIT2             0x1e
+#define BRIDGE_DRAM_LIMIT3             0x1f
+#define BRIDGE_DRAM_LIMIT4             0x20
+#define BRIDGE_DRAM_LIMIT5             0x21
+#define BRIDGE_DRAM_LIMIT6             0x22
+#define BRIDGE_DRAM_LIMIT7             0x23
+
+#define BRIDGE_DRAM_NODE_TRANSLN0      0x24
+#define BRIDGE_DRAM_NODE_TRANSLN1      0x25
+#define BRIDGE_DRAM_NODE_TRANSLN2      0x26
+#define BRIDGE_DRAM_NODE_TRANSLN3      0x27
+#define BRIDGE_DRAM_NODE_TRANSLN4      0x28
+#define BRIDGE_DRAM_NODE_TRANSLN5      0x29
+#define BRIDGE_DRAM_NODE_TRANSLN6      0x2a
+#define BRIDGE_DRAM_NODE_TRANSLN7      0x2b
+#define BRIDGE_DRAM_CHNL_TRANSLN0      0x2c
+#define BRIDGE_DRAM_CHNL_TRANSLN1      0x2d
+#define BRIDGE_DRAM_CHNL_TRANSLN2      0x2e
+#define BRIDGE_DRAM_CHNL_TRANSLN3      0x2f
+#define BRIDGE_DRAM_CHNL_TRANSLN4      0x30
+#define BRIDGE_DRAM_CHNL_TRANSLN5      0x31
+#define BRIDGE_DRAM_CHNL_TRANSLN6      0x32
+#define BRIDGE_DRAM_CHNL_TRANSLN7      0x33
+#define BRIDGE_PCIEMEM_BASE0           0x34
+#define BRIDGE_PCIEMEM_BASE1           0x35
+#define BRIDGE_PCIEMEM_BASE2           0x36
+#define BRIDGE_PCIEMEM_BASE3           0x37
+#define BRIDGE_PCIEMEM_LIMIT0          0x38
+#define BRIDGE_PCIEMEM_LIMIT1          0x39
+#define BRIDGE_PCIEMEM_LIMIT2          0x3a
+#define BRIDGE_PCIEMEM_LIMIT3          0x3b
+#define BRIDGE_PCIEIO_BASE0            0x3c
+#define BRIDGE_PCIEIO_BASE1            0x3d
+#define BRIDGE_PCIEIO_BASE2            0x3e
+#define BRIDGE_PCIEIO_BASE3            0x3f
+#define BRIDGE_PCIEIO_LIMIT0           0x40
+#define BRIDGE_PCIEIO_LIMIT1           0x41
+#define BRIDGE_PCIEIO_LIMIT2           0x42
+#define BRIDGE_PCIEIO_LIMIT3           0x43
+#define BRIDGE_PCIEMEM_BASE4           0x44
+#define BRIDGE_PCIEMEM_BASE5           0x45
+#define BRIDGE_PCIEMEM_BASE6           0x46
+#define BRIDGE_PCIEMEM_LIMIT4          0x47
+#define BRIDGE_PCIEMEM_LIMIT5          0x48
+#define BRIDGE_PCIEMEM_LIMIT6          0x49
+#define BRIDGE_PCIEIO_BASE4            0x4a
+#define BRIDGE_PCIEIO_BASE5            0x4b
+#define BRIDGE_PCIEIO_BASE6            0x4c
+#define BRIDGE_PCIEIO_LIMIT4           0x4d
+#define BRIDGE_PCIEIO_LIMIT5           0x4e
+#define BRIDGE_PCIEIO_LIMIT6           0x4f
+#define BRIDGE_NBU_EVENT_CNT_CTL       0x50
+#define BRIDGE_EVNTCTR1_LOW            0x51
+#define BRIDGE_EVNTCTR1_HI             0x52
+#define BRIDGE_EVNT_CNT_CTL2           0x53
+#define BRIDGE_EVNTCTR2_LOW            0x54
+#define BRIDGE_EVNTCTR2_HI             0x55
+#define BRIDGE_TRACEBUF_MATCH0         0x56
+#define BRIDGE_TRACEBUF_MATCH1         0x57
+#define BRIDGE_TRACEBUF_MATCH_LOW      0x58
+#define BRIDGE_TRACEBUF_MATCH_HI       0x59
+#define BRIDGE_TRACEBUF_CTRL           0x5a
+#define BRIDGE_TRACEBUF_INIT           0x5b
+#define BRIDGE_TRACEBUF_ACCESS         0x5c
+#define BRIDGE_TRACEBUF_READ_DATA0     0x5d
+#define BRIDGE_TRACEBUF_READ_DATA1     0x5d
+#define BRIDGE_TRACEBUF_READ_DATA2     0x5f
+#define BRIDGE_TRACEBUF_READ_DATA3     0x60
+#define BRIDGE_TRACEBUF_STATUS         0x61
+#define BRIDGE_ADDRESS_ERROR0          0x62
+#define BRIDGE_ADDRESS_ERROR1          0x63
+#define BRIDGE_ADDRESS_ERROR2          0x64
+#define BRIDGE_TAG_ECC_ADDR_ERROR0     0x65
+#define BRIDGE_TAG_ECC_ADDR_ERROR1     0x66
+#define BRIDGE_TAG_ECC_ADDR_ERROR2     0x67
+#define BRIDGE_LINE_FLUSH0             0x68
+#define BRIDGE_LINE_FLUSH1             0x69
+#define BRIDGE_NODE_ID                 0x6a
+#define BRIDGE_ERROR_INTERRUPT_EN      0x6b
+#define BRIDGE_PCIE0_WEIGHT            0x2c0
+#define BRIDGE_PCIE1_WEIGHT            0x2c1
+#define BRIDGE_PCIE2_WEIGHT            0x2c2
+#define BRIDGE_PCIE3_WEIGHT            0x2c3
+#define BRIDGE_USB_WEIGHT              0x2c4
+#define BRIDGE_NET_WEIGHT              0x2c5
+#define BRIDGE_POE_WEIGHT              0x2c6
+#define BRIDGE_CMS_WEIGHT              0x2c7
+#define BRIDGE_DMAENG_WEIGHT           0x2c8
+#define BRIDGE_SEC_WEIGHT              0x2c9
+#define BRIDGE_COMP_WEIGHT             0x2ca
+#define BRIDGE_GIO_WEIGHT              0x2cb
+#define BRIDGE_FLASH_WEIGHT            0x2cc
+
+#ifndef __ASSEMBLY__
+
+#define nlm_read_bridge_reg(b, r)      nlm_read_reg(b, r)
+#define nlm_write_bridge_reg(b, r, v)  nlm_write_reg(b, r, v)
+#define        nlm_get_bridge_pcibase(node)    \
+                       nlm_pcicfg_base(XLP_IO_BRIDGE_OFFSET(node))
+#define        nlm_get_bridge_regbase(node)    \
+                       (nlm_get_bridge_pcibase(node) + XLP_IO_PCI_HDRSZ)
+
+#endif /* __ASSEMBLY__ */
+#endif /* __NLM_HAL_BRIDGE_H__ */
diff --git a/arch/mips/include/asm/netlogic/xlp-hal/cpucontrol.h b/arch/mips/include/asm/netlogic/xlp-hal/cpucontrol.h
new file mode 100644 (file)
index 0000000..bf7d41d
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
+ * reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the NetLogic
+ * license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __NLM_HAL_CPUCONTROL_H__
+#define __NLM_HAL_CPUCONTROL_H__
+
+#define CPU_BLOCKID_IFU                0
+#define CPU_BLOCKID_ICU                1
+#define CPU_BLOCKID_IEU                2
+#define CPU_BLOCKID_LSU                3
+#define CPU_BLOCKID_MMU                4
+#define CPU_BLOCKID_PRF                5
+#define CPU_BLOCKID_SCH                7
+#define CPU_BLOCKID_SCU                8
+#define CPU_BLOCKID_FPU                9
+#define CPU_BLOCKID_MAP                10
+
+#define LSU_DEFEATURE          0x304
+#define LSU_CERRLOG_REGID      0x09
+#define SCHED_DEFEATURE                0x700
+
+/* Offsets of interest from the 'MAP' Block */
+#define MAP_THREADMODE                 0x00
+#define MAP_EXT_EBASE_ENABLE           0x04
+#define MAP_CCDI_CONFIG                        0x08
+#define MAP_THRD0_CCDI_STATUS          0x0c
+#define MAP_THRD1_CCDI_STATUS          0x10
+#define MAP_THRD2_CCDI_STATUS          0x14
+#define MAP_THRD3_CCDI_STATUS          0x18
+#define MAP_THRD0_DEBUG_MODE           0x1c
+#define MAP_THRD1_DEBUG_MODE           0x20
+#define MAP_THRD2_DEBUG_MODE           0x24
+#define MAP_THRD3_DEBUG_MODE           0x28
+#define MAP_MISC_STATE                 0x60
+#define MAP_DEBUG_READ_CTL             0x64
+#define MAP_DEBUG_READ_REG0            0x68
+#define MAP_DEBUG_READ_REG1            0x6c
+
+#define MMU_SETUP              0x400
+#define MMU_LFSRSEED           0x401
+#define MMU_HPW_NUM_PAGE_LVL   0x410
+#define MMU_PGWKR_PGDBASE      0x411
+#define MMU_PGWKR_PGDSHFT      0x412
+#define MMU_PGWKR_PGDMASK      0x413
+#define MMU_PGWKR_PUDSHFT      0x414
+#define MMU_PGWKR_PUDMASK      0x415
+#define MMU_PGWKR_PMDSHFT      0x416
+#define MMU_PGWKR_PMDMASK      0x417
+#define MMU_PGWKR_PTESHFT      0x418
+#define MMU_PGWKR_PTEMASK      0x419
+
+#endif /* __NLM_CPUCONTROL_H__ */
diff --git a/arch/mips/include/asm/netlogic/xlp-hal/iomap.h b/arch/mips/include/asm/netlogic/xlp-hal/iomap.h
new file mode 100644 (file)
index 0000000..86cc339
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
+ * reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the NetLogic
+ * license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __NLM_HAL_IOMAP_H__
+#define __NLM_HAL_IOMAP_H__
+
+#define XLP_DEFAULT_IO_BASE             0x18000000
+#define NMI_BASE                       0xbfc00000
+#define        XLP_IO_CLK                      133333333
+
+#define XLP_PCIE_CFG_SIZE              0x1000          /* 4K */
+#define XLP_PCIE_DEV_BLK_SIZE          (8 * XLP_PCIE_CFG_SIZE)
+#define XLP_PCIE_BUS_BLK_SIZE          (256 * XLP_PCIE_DEV_BLK_SIZE)
+#define XLP_IO_SIZE                    (64 << 20)      /* ECFG space size */
+#define XLP_IO_PCI_HDRSZ               0x100
+#define XLP_IO_DEV(node, dev)          ((dev) + (node) * 8)
+#define XLP_HDR_OFFSET(node, bus, dev, fn)     (((bus) << 20) | \
+                               ((XLP_IO_DEV(node, dev)) << 15) | ((fn) << 12))
+
+#define XLP_IO_BRIDGE_OFFSET(node)     XLP_HDR_OFFSET(node, 0, 0, 0)
+/* coherent inter chip */
+#define XLP_IO_CIC0_OFFSET(node)       XLP_HDR_OFFSET(node, 0, 0, 1)
+#define XLP_IO_CIC1_OFFSET(node)       XLP_HDR_OFFSET(node, 0, 0, 2)
+#define XLP_IO_CIC2_OFFSET(node)       XLP_HDR_OFFSET(node, 0, 0, 3)
+#define XLP_IO_PIC_OFFSET(node)                XLP_HDR_OFFSET(node, 0, 0, 4)
+
+#define XLP_IO_PCIE_OFFSET(node, i)    XLP_HDR_OFFSET(node, 0, 1, i)
+#define XLP_IO_PCIE0_OFFSET(node)      XLP_HDR_OFFSET(node, 0, 1, 0)
+#define XLP_IO_PCIE1_OFFSET(node)      XLP_HDR_OFFSET(node, 0, 1, 1)
+#define XLP_IO_PCIE2_OFFSET(node)      XLP_HDR_OFFSET(node, 0, 1, 2)
+#define XLP_IO_PCIE3_OFFSET(node)      XLP_HDR_OFFSET(node, 0, 1, 3)
+
+#define XLP_IO_USB_OFFSET(node, i)     XLP_HDR_OFFSET(node, 0, 2, i)
+#define XLP_IO_USB_EHCI0_OFFSET(node)  XLP_HDR_OFFSET(node, 0, 2, 0)
+#define XLP_IO_USB_OHCI0_OFFSET(node)  XLP_HDR_OFFSET(node, 0, 2, 1)
+#define XLP_IO_USB_OHCI1_OFFSET(node)  XLP_HDR_OFFSET(node, 0, 2, 2)
+#define XLP_IO_USB_EHCI1_OFFSET(node)  XLP_HDR_OFFSET(node, 0, 2, 3)
+#define XLP_IO_USB_OHCI2_OFFSET(node)  XLP_HDR_OFFSET(node, 0, 2, 4)
+#define XLP_IO_USB_OHCI3_OFFSET(node)  XLP_HDR_OFFSET(node, 0, 2, 5)
+
+#define XLP_IO_NAE_OFFSET(node)                XLP_HDR_OFFSET(node, 0, 3, 0)
+#define XLP_IO_POE_OFFSET(node)                XLP_HDR_OFFSET(node, 0, 3, 1)
+
+#define XLP_IO_CMS_OFFSET(node)                XLP_HDR_OFFSET(node, 0, 4, 0)
+
+#define XLP_IO_DMA_OFFSET(node)                XLP_HDR_OFFSET(node, 0, 5, 1)
+#define XLP_IO_SEC_OFFSET(node)                XLP_HDR_OFFSET(node, 0, 5, 2)
+#define XLP_IO_CMP_OFFSET(node)                XLP_HDR_OFFSET(node, 0, 5, 3)
+
+#define XLP_IO_UART_OFFSET(node, i)    XLP_HDR_OFFSET(node, 0, 6, i)
+#define XLP_IO_UART0_OFFSET(node)      XLP_HDR_OFFSET(node, 0, 6, 0)
+#define XLP_IO_UART1_OFFSET(node)      XLP_HDR_OFFSET(node, 0, 6, 1)
+#define XLP_IO_I2C_OFFSET(node, i)     XLP_HDR_OFFSET(node, 0, 6, 2 + i)
+#define XLP_IO_I2C0_OFFSET(node)       XLP_HDR_OFFSET(node, 0, 6, 2)
+#define XLP_IO_I2C1_OFFSET(node)       XLP_HDR_OFFSET(node, 0, 6, 3)
+#define XLP_IO_GPIO_OFFSET(node)       XLP_HDR_OFFSET(node, 0, 6, 4)
+/* system management */
+#define XLP_IO_SYS_OFFSET(node)                XLP_HDR_OFFSET(node, 0, 6, 5)
+#define XLP_IO_JTAG_OFFSET(node)       XLP_HDR_OFFSET(node, 0, 6, 6)
+
+#define XLP_IO_NOR_OFFSET(node)                XLP_HDR_OFFSET(node, 0, 7, 0)
+#define XLP_IO_NAND_OFFSET(node)       XLP_HDR_OFFSET(node, 0, 7, 1)
+#define XLP_IO_SPI_OFFSET(node)                XLP_HDR_OFFSET(node, 0, 7, 2)
+/* SD flash */
+#define XLP_IO_SD_OFFSET(node)          XLP_HDR_OFFSET(node, 0, 7, 3)
+#define XLP_IO_MMC_OFFSET(node, slot)   \
+               ((XLP_IO_SD_OFFSET(node))+(slot*0x100)+XLP_IO_PCI_HDRSZ)
+
+/* PCI config header register id's */
+#define XLP_PCI_CFGREG0                        0x00
+#define XLP_PCI_CFGREG1                        0x01
+#define XLP_PCI_CFGREG2                        0x02
+#define XLP_PCI_CFGREG3                        0x03
+#define XLP_PCI_CFGREG4                        0x04
+#define XLP_PCI_CFGREG5                        0x05
+#define XLP_PCI_DEVINFO_REG0           0x30
+#define XLP_PCI_DEVINFO_REG1           0x31
+#define XLP_PCI_DEVINFO_REG2           0x32
+#define XLP_PCI_DEVINFO_REG3           0x33
+#define XLP_PCI_DEVINFO_REG4           0x34
+#define XLP_PCI_DEVINFO_REG5           0x35
+#define XLP_PCI_DEVINFO_REG6           0x36
+#define XLP_PCI_DEVINFO_REG7           0x37
+#define XLP_PCI_DEVSCRATCH_REG0                0x38
+#define XLP_PCI_DEVSCRATCH_REG1                0x39
+#define XLP_PCI_DEVSCRATCH_REG2                0x3a
+#define XLP_PCI_DEVSCRATCH_REG3                0x3b
+#define XLP_PCI_MSGSTN_REG             0x3c
+#define XLP_PCI_IRTINFO_REG            0x3d
+#define XLP_PCI_UCODEINFO_REG          0x3e
+#define XLP_PCI_SBB_WT_REG             0x3f
+
+/* PCI IDs for SoC device */
+#define        PCI_VENDOR_NETLOGIC             0x184e
+
+#define        PCI_DEVICE_ID_NLM_ROOT          0x1001
+#define        PCI_DEVICE_ID_NLM_ICI           0x1002
+#define        PCI_DEVICE_ID_NLM_PIC           0x1003
+#define        PCI_DEVICE_ID_NLM_PCIE          0x1004
+#define        PCI_DEVICE_ID_NLM_EHCI          0x1007
+#define        PCI_DEVICE_ID_NLM_ILK           0x1008
+#define        PCI_DEVICE_ID_NLM_NAE           0x1009
+#define        PCI_DEVICE_ID_NLM_POE           0x100A
+#define        PCI_DEVICE_ID_NLM_FMN           0x100B
+#define        PCI_DEVICE_ID_NLM_RAID          0x100D
+#define        PCI_DEVICE_ID_NLM_SAE           0x100D
+#define        PCI_DEVICE_ID_NLM_RSA           0x100E
+#define        PCI_DEVICE_ID_NLM_CMP           0x100F
+#define        PCI_DEVICE_ID_NLM_UART          0x1010
+#define        PCI_DEVICE_ID_NLM_I2C           0x1011
+#define        PCI_DEVICE_ID_NLM_NOR           0x1015
+#define        PCI_DEVICE_ID_NLM_NAND          0x1016
+#define        PCI_DEVICE_ID_NLM_MMC           0x1018
+
+#ifndef __ASSEMBLY__
+
+#define nlm_read_pci_reg(b, r)         nlm_read_reg(b, r)
+#define nlm_write_pci_reg(b, r, v)     nlm_write_reg(b, r, v)
+
+#endif /* !__ASSEMBLY */
+
+#endif /* __NLM_HAL_IOMAP_H__ */
diff --git a/arch/mips/include/asm/netlogic/xlp-hal/pic.h b/arch/mips/include/asm/netlogic/xlp-hal/pic.h
new file mode 100644 (file)
index 0000000..b6628f7
--- /dev/null
@@ -0,0 +1,411 @@
+/*
+ * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
+ * reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the NetLogic
+ * license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _NLM_HAL_PIC_H
+#define _NLM_HAL_PIC_H
+
+/* PIC Specific registers */
+#define PIC_CTRL                0x00
+
+/* PIC control register defines */
+#define PIC_CTRL_ITV           32 /* interrupt timeout value */
+#define PIC_CTRL_ICI           19 /* ICI interrupt timeout enable */
+#define PIC_CTRL_ITE           18 /* interrupt timeout enable */
+#define PIC_CTRL_STE           10 /* system timer interrupt enable */
+#define PIC_CTRL_WWR1          8  /* watchdog 1 wraparound count for reset */
+#define PIC_CTRL_WWR0          6  /* watchdog 0 wraparound count for reset */
+#define PIC_CTRL_WWN1          4  /* watchdog 1 wraparound count for NMI */
+#define PIC_CTRL_WWN0          2  /* watchdog 0 wraparound count for NMI */
+#define PIC_CTRL_WTE           0  /* watchdog timer enable */
+
+/* PIC Status register defines */
+#define PIC_ICI_STATUS         33 /* ICI interrupt timeout status */
+#define PIC_ITE_STATUS         32 /* interrupt timeout status */
+#define PIC_STS_STATUS         4  /* System timer interrupt status */
+#define PIC_WNS_STATUS         2  /* NMI status for watchdog timers */
+#define PIC_WIS_STATUS         0  /* Interrupt status for watchdog timers */
+
+/* PIC IPI control register offsets */
+#define PIC_IPICTRL_NMI                32
+#define PIC_IPICTRL_RIV                20 /* received interrupt vector */
+#define PIC_IPICTRL_IDB                16 /* interrupt destination base */
+#define PIC_IPICTRL_DTE                 0 /* interrupt destination thread enables */
+
+/* PIC IRT register offsets */
+#define PIC_IRT_ENABLE         31
+#define PIC_IRT_NMI            29
+#define PIC_IRT_SCH            28 /* Scheduling scheme */
+#define PIC_IRT_RVEC           20 /* Interrupt receive vectors */
+#define PIC_IRT_DT             19 /* Destination type */
+#define PIC_IRT_DB             16 /* Destination base */
+#define PIC_IRT_DTE            0  /* Destination thread enables */
+
+#define PIC_BYTESWAP            0x02
+#define PIC_STATUS              0x04
+#define PIC_INTR_TIMEOUT       0x06
+#define PIC_ICI0_INTR_TIMEOUT  0x08
+#define PIC_ICI1_INTR_TIMEOUT  0x0a
+#define PIC_ICI2_INTR_TIMEOUT  0x0c
+#define PIC_IPI_CTL            0x0e
+#define PIC_INT_ACK             0x10
+#define PIC_INT_PENDING0        0x12
+#define PIC_INT_PENDING1        0x14
+#define PIC_INT_PENDING2        0x16
+
+#define PIC_WDOG0_MAXVAL        0x18
+#define PIC_WDOG0_COUNT         0x1a
+#define PIC_WDOG0_ENABLE0       0x1c
+#define PIC_WDOG0_ENABLE1       0x1e
+#define PIC_WDOG0_BEATCMD       0x20
+#define PIC_WDOG0_BEAT0         0x22
+#define PIC_WDOG0_BEAT1         0x24
+
+#define PIC_WDOG1_MAXVAL        0x26
+#define PIC_WDOG1_COUNT         0x28
+#define PIC_WDOG1_ENABLE0       0x2a
+#define PIC_WDOG1_ENABLE1       0x2c
+#define PIC_WDOG1_BEATCMD       0x2e
+#define PIC_WDOG1_BEAT0         0x30
+#define PIC_WDOG1_BEAT1         0x32
+
+#define PIC_WDOG_MAXVAL(i)      (PIC_WDOG0_MAXVAL + ((i) ? 7 : 0))
+#define PIC_WDOG_COUNT(i)       (PIC_WDOG0_COUNT + ((i) ? 7 : 0))
+#define PIC_WDOG_ENABLE0(i)     (PIC_WDOG0_ENABLE0 + ((i) ? 7 : 0))
+#define PIC_WDOG_ENABLE1(i)     (PIC_WDOG0_ENABLE1 + ((i) ? 7 : 0))
+#define PIC_WDOG_BEATCMD(i)     (PIC_WDOG0_BEATCMD + ((i) ? 7 : 0))
+#define PIC_WDOG_BEAT0(i)       (PIC_WDOG0_BEAT0 + ((i) ? 7 : 0))
+#define PIC_WDOG_BEAT1(i)       (PIC_WDOG0_BEAT1 + ((i) ? 7 : 0))
+
+#define PIC_TIMER0_MAXVAL    0x34
+#define PIC_TIMER1_MAXVAL    0x36
+#define PIC_TIMER2_MAXVAL    0x38
+#define PIC_TIMER3_MAXVAL    0x3a
+#define PIC_TIMER4_MAXVAL    0x3c
+#define PIC_TIMER5_MAXVAL    0x3e
+#define PIC_TIMER6_MAXVAL    0x40
+#define PIC_TIMER7_MAXVAL    0x42
+#define PIC_TIMER_MAXVAL(i)  (PIC_TIMER0_MAXVAL + ((i) * 2))
+
+#define PIC_TIMER0_COUNT     0x44
+#define PIC_TIMER1_COUNT     0x46
+#define PIC_TIMER2_COUNT     0x48
+#define PIC_TIMER3_COUNT     0x4a
+#define PIC_TIMER4_COUNT     0x4c
+#define PIC_TIMER5_COUNT     0x4e
+#define PIC_TIMER6_COUNT     0x50
+#define PIC_TIMER7_COUNT     0x52
+#define PIC_TIMER_COUNT(i)   (PIC_TIMER0_COUNT + ((i) * 2))
+
+#define PIC_ITE0_N0_N1          0x54
+#define PIC_ITE1_N0_N1          0x58
+#define PIC_ITE2_N0_N1          0x5c
+#define PIC_ITE3_N0_N1          0x60
+#define PIC_ITE4_N0_N1          0x64
+#define PIC_ITE5_N0_N1          0x68
+#define PIC_ITE6_N0_N1          0x6c
+#define PIC_ITE7_N0_N1          0x70
+#define PIC_ITE_N0_N1(i)        (PIC_ITE0_N0_N1 + ((i) * 4))
+
+#define PIC_ITE0_N2_N3          0x56
+#define PIC_ITE1_N2_N3          0x5a
+#define PIC_ITE2_N2_N3          0x5e
+#define PIC_ITE3_N2_N3          0x62
+#define PIC_ITE4_N2_N3          0x66
+#define PIC_ITE5_N2_N3          0x6a
+#define PIC_ITE6_N2_N3          0x6e
+#define PIC_ITE7_N2_N3          0x72
+#define PIC_ITE_N2_N3(i)        (PIC_ITE0_N2_N3 + ((i) * 4))
+
+#define PIC_IRT0                0x74
+#define PIC_IRT(i)              (PIC_IRT0 + ((i) * 2))
+
+#define TIMER_CYCLES_MAXVAL    0xffffffffffffffffULL
+
+/*
+ *    IRT Map
+ */
+#define PIC_NUM_IRTS           160
+
+#define PIC_IRT_WD_0_INDEX     0
+#define PIC_IRT_WD_1_INDEX     1
+#define PIC_IRT_WD_NMI_0_INDEX 2
+#define PIC_IRT_WD_NMI_1_INDEX 3
+#define PIC_IRT_TIMER_0_INDEX  4
+#define PIC_IRT_TIMER_1_INDEX  5
+#define PIC_IRT_TIMER_2_INDEX  6
+#define PIC_IRT_TIMER_3_INDEX  7
+#define PIC_IRT_TIMER_4_INDEX  8
+#define PIC_IRT_TIMER_5_INDEX  9
+#define PIC_IRT_TIMER_6_INDEX  10
+#define PIC_IRT_TIMER_7_INDEX  11
+#define PIC_IRT_CLOCK_INDEX    PIC_IRT_TIMER_7_INDEX
+#define PIC_IRT_TIMER_INDEX(num)       ((num) + PIC_IRT_TIMER_0_INDEX)
+
+
+/* 11 and 12 */
+#define PIC_NUM_MSG_Q_IRTS     32
+#define PIC_IRT_MSG_Q0_INDEX   12
+#define PIC_IRT_MSG_Q_INDEX(qid)       ((qid) + PIC_IRT_MSG_Q0_INDEX)
+/* 12 to 43 */
+#define PIC_IRT_MSG_0_INDEX    44
+#define PIC_IRT_MSG_1_INDEX    45
+/* 44 and 45 */
+#define PIC_NUM_PCIE_MSIX_IRTS 32
+#define PIC_IRT_PCIE_MSIX_0_INDEX      46
+#define PIC_IRT_PCIE_MSIX_INDEX(num)   ((num) + PIC_IRT_PCIE_MSIX_0_INDEX)
+/* 46 to 77 */
+#define PIC_NUM_PCIE_LINK_IRTS         4
+#define PIC_IRT_PCIE_LINK_0_INDEX      78
+#define PIC_IRT_PCIE_LINK_1_INDEX      79
+#define PIC_IRT_PCIE_LINK_2_INDEX      80
+#define PIC_IRT_PCIE_LINK_3_INDEX      81
+#define PIC_IRT_PCIE_LINK_INDEX(num)   ((num) + PIC_IRT_PCIE_LINK_0_INDEX)
+/* 78 to 81 */
+#define PIC_NUM_NA_IRTS                        32
+/* 82 to 113 */
+#define PIC_IRT_NA_0_INDEX             82
+#define PIC_IRT_NA_INDEX(num)          ((num) + PIC_IRT_NA_0_INDEX)
+#define PIC_IRT_POE_INDEX              114
+
+#define PIC_NUM_USB_IRTS               6
+#define PIC_IRT_USB_0_INDEX            115
+#define PIC_IRT_EHCI_0_INDEX           115
+#define PIC_IRT_EHCI_1_INDEX           118
+#define PIC_IRT_USB_INDEX(num)         ((num) + PIC_IRT_USB_0_INDEX)
+/* 115 to 120 */
+#define PIC_IRT_GDX_INDEX              121
+#define PIC_IRT_SEC_INDEX              122
+#define PIC_IRT_RSA_INDEX              123
+
+#define PIC_NUM_COMP_IRTS              4
+#define PIC_IRT_COMP_0_INDEX           124
+#define PIC_IRT_COMP_INDEX(num)                ((num) + PIC_IRT_COMP_0_INDEX)
+/* 124 to 127 */
+#define PIC_IRT_GBU_INDEX              128
+#define PIC_IRT_ICC_0_INDEX            129 /* ICC - Inter Chip Coherency */
+#define PIC_IRT_ICC_1_INDEX            130
+#define PIC_IRT_ICC_2_INDEX            131
+#define PIC_IRT_CAM_INDEX              132
+#define PIC_IRT_UART_0_INDEX           133
+#define PIC_IRT_UART_1_INDEX           134
+#define PIC_IRT_I2C_0_INDEX            135
+#define PIC_IRT_I2C_1_INDEX            136
+#define PIC_IRT_SYS_0_INDEX            137
+#define PIC_IRT_SYS_1_INDEX            138
+#define PIC_IRT_JTAG_INDEX             139
+#define PIC_IRT_PIC_INDEX              140
+#define PIC_IRT_NBU_INDEX              141
+#define PIC_IRT_TCU_INDEX              142
+#define PIC_IRT_GCU_INDEX              143 /* GBC - Global Coherency */
+#define PIC_IRT_DMC_0_INDEX            144
+#define PIC_IRT_DMC_1_INDEX            145
+
+#define PIC_NUM_GPIO_IRTS              4
+#define PIC_IRT_GPIO_0_INDEX           146
+#define PIC_IRT_GPIO_INDEX(num)                ((num) + PIC_IRT_GPIO_0_INDEX)
+
+/* 146 to 149 */
+#define PIC_IRT_NOR_INDEX              150
+#define PIC_IRT_NAND_INDEX             151
+#define PIC_IRT_SPI_INDEX              152
+#define PIC_IRT_MMC_INDEX              153
+
+#define PIC_CLOCK_TIMER                        7
+#define PIC_IRQ_BASE                   8
+
+#if !defined(LOCORE) && !defined(__ASSEMBLY__)
+
+#define PIC_IRT_FIRST_IRQ              (PIC_IRQ_BASE)
+#define PIC_IRT_LAST_IRQ               63
+#define PIC_IRQ_IS_IRT(irq)            ((irq) >= PIC_IRT_FIRST_IRQ)
+
+/*
+ *   Misc
+ */
+#define PIC_IRT_VALID                  1
+#define PIC_LOCAL_SCHEDULING           1
+#define PIC_GLOBAL_SCHEDULING          0
+
+#define nlm_read_pic_reg(b, r) nlm_read_reg64(b, r)
+#define nlm_write_pic_reg(b, r, v) nlm_write_reg64(b, r, v)
+#define nlm_get_pic_pcibase(node) nlm_pcicfg_base(XLP_IO_PIC_OFFSET(node))
+#define nlm_get_pic_regbase(node) (nlm_get_pic_pcibase(node) + XLP_IO_PCI_HDRSZ)
+
+/* IRT and h/w interrupt routines */
+static inline int
+nlm_pic_read_irt(uint64_t base, int irt_index)
+{
+       return nlm_read_pic_reg(base, PIC_IRT(irt_index));
+}
+
+static inline uint64_t
+nlm_pic_read_control(uint64_t base)
+{
+       return nlm_read_pic_reg(base, PIC_CTRL);
+}
+
+static inline void
+nlm_pic_write_control(uint64_t base, uint64_t control)
+{
+       nlm_write_pic_reg(base, PIC_CTRL, control);
+}
+
+static inline void
+nlm_pic_update_control(uint64_t base, uint64_t control)
+{
+       uint64_t val;
+
+       val = nlm_read_pic_reg(base, PIC_CTRL);
+       nlm_write_pic_reg(base, PIC_CTRL, control | val);
+}
+
+static inline void
+nlm_set_irt_to_cpu(uint64_t base, int irt, int cpu)
+{
+       uint64_t val;
+
+       val = nlm_read_pic_reg(base, PIC_IRT(irt));
+       val |= cpu & 0xf;
+       if (cpu > 15)
+               val |= 1 << 16;
+       nlm_write_pic_reg(base, PIC_IRT(irt), val);
+}
+
+static inline void
+nlm_pic_write_irt(uint64_t base, int irt_num, int en, int nmi,
+       int sch, int vec, int dt, int db, int dte)
+{
+       uint64_t val;
+
+       val = (((uint64_t)en & 0x1) << 31) | ((nmi & 0x1) << 29) |
+                       ((sch & 0x1) << 28) | ((vec & 0x3f) << 20) |
+                       ((dt & 0x1) << 19) | ((db & 0x7) << 16) |
+                       (dte & 0xffff);
+
+       nlm_write_pic_reg(base, PIC_IRT(irt_num), val);
+}
+
+static inline void
+nlm_pic_write_irt_direct(uint64_t base, int irt_num, int en, int nmi,
+       int sch, int vec, int cpu)
+{
+       nlm_pic_write_irt(base, irt_num, en, nmi, sch, vec, 1,
+               (cpu >> 4),             /* thread group */
+               1 << (cpu & 0xf));      /* thread mask */
+}
+
+static inline uint64_t
+nlm_pic_read_timer(uint64_t base, int timer)
+{
+       return nlm_read_pic_reg(base, PIC_TIMER_COUNT(timer));
+}
+
+static inline void
+nlm_pic_write_timer(uint64_t base, int timer, uint64_t value)
+{
+       nlm_write_pic_reg(base, PIC_TIMER_COUNT(timer), value);
+}
+
+static inline void
+nlm_pic_set_timer(uint64_t base, int timer, uint64_t value, int irq, int cpu)
+{
+       uint64_t pic_ctrl = nlm_read_pic_reg(base, PIC_CTRL);
+       int en;
+
+       en = (irq > 0);
+       nlm_write_pic_reg(base, PIC_TIMER_MAXVAL(timer), value);
+       nlm_pic_write_irt_direct(base, PIC_IRT_TIMER_INDEX(timer),
+               en, 0, 0, irq, cpu);
+
+       /* enable the timer */
+       pic_ctrl |= (1 << (PIC_CTRL_STE + timer));
+       nlm_write_pic_reg(base, PIC_CTRL, pic_ctrl);
+}
+
+static inline void
+nlm_pic_enable_irt(uint64_t base, int irt)
+{
+       uint64_t reg;
+
+       reg = nlm_read_pic_reg(base, PIC_IRT(irt));
+       nlm_write_pic_reg(base, PIC_IRT(irt), reg | (1u << 31));
+}
+
+static inline void
+nlm_pic_disable_irt(uint64_t base, int irt)
+{
+       uint32_t reg;
+
+       reg = nlm_read_pic_reg(base, PIC_IRT(irt));
+       nlm_write_pic_reg(base, PIC_IRT(irt), reg & ~((uint64_t)1 << 31));
+}
+
+static inline void
+nlm_pic_send_ipi(uint64_t base, int hwt, int irq, int nmi)
+{
+       uint64_t ipi;
+       int     node, ncpu;
+
+       node = hwt / 32;
+       ncpu = hwt & 0x1f;
+       ipi = ((uint64_t)nmi << 31) | (irq << 20) | (node << 17) |
+               (1 << (ncpu & 0xf));
+       if (ncpu > 15)
+               ipi |= 0x10000; /* Setting bit 16 to select cpus 16-31 */
+
+       nlm_write_pic_reg(base, PIC_IPI_CTL, ipi);
+}
+
+static inline void
+nlm_pic_ack(uint64_t base, int irt_num)
+{
+       nlm_write_pic_reg(base, PIC_INT_ACK, irt_num);
+
+       /* Ack the Status register for Watchdog & System timers */
+       if (irt_num < 12)
+               nlm_write_pic_reg(base, PIC_STATUS, (1 << irt_num));
+}
+
+static inline void
+nlm_pic_init_irt(uint64_t base, int irt, int irq, int hwt)
+{
+       nlm_pic_write_irt_direct(base, irt, 0, 0, 0, irq, 0);
+}
+
+extern uint64_t nlm_pic_base;
+int nlm_irq_to_irt(int irq);
+int nlm_irt_to_irq(int irt);
+
+#endif /* __ASSEMBLY__ */
+#endif /* _NLM_HAL_PIC_H */
diff --git a/arch/mips/include/asm/netlogic/xlp-hal/sys.h b/arch/mips/include/asm/netlogic/xlp-hal/sys.h
new file mode 100644 (file)
index 0000000..21432f7
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
+ * reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the NetLogic
+ * license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __NLM_HAL_SYS_H__
+#define __NLM_HAL_SYS_H__
+
+/**
+* @file_name sys.h
+* @author Netlogic Microsystems
+* @brief HAL for System configuration registers
+*/
+#define        SYS_CHIP_RESET                          0x00
+#define        SYS_POWER_ON_RESET_CFG                  0x01
+#define        SYS_EFUSE_DEVICE_CFG_STATUS0            0x02
+#define        SYS_EFUSE_DEVICE_CFG_STATUS1            0x03
+#define        SYS_EFUSE_DEVICE_CFG_STATUS2            0x04
+#define        SYS_EFUSE_DEVICE_CFG3                   0x05
+#define        SYS_EFUSE_DEVICE_CFG4                   0x06
+#define        SYS_EFUSE_DEVICE_CFG5                   0x07
+#define        SYS_EFUSE_DEVICE_CFG6                   0x08
+#define        SYS_EFUSE_DEVICE_CFG7                   0x09
+#define        SYS_PLL_CTRL                            0x0a
+#define        SYS_CPU_RESET                           0x0b
+#define        SYS_CPU_NONCOHERENT_MODE                0x0d
+#define        SYS_CORE_DFS_DIS_CTRL                   0x0e
+#define        SYS_CORE_DFS_RST_CTRL                   0x0f
+#define        SYS_CORE_DFS_BYP_CTRL                   0x10
+#define        SYS_CORE_DFS_PHA_CTRL                   0x11
+#define        SYS_CORE_DFS_DIV_INC_CTRL               0x12
+#define        SYS_CORE_DFS_DIV_DEC_CTRL               0x13
+#define        SYS_CORE_DFS_DIV_VALUE                  0x14
+#define        SYS_RESET                               0x15
+#define        SYS_DFS_DIS_CTRL                        0x16
+#define        SYS_DFS_RST_CTRL                        0x17
+#define        SYS_DFS_BYP_CTRL                        0x18
+#define        SYS_DFS_DIV_INC_CTRL                    0x19
+#define        SYS_DFS_DIV_DEC_CTRL                    0x1a
+#define        SYS_DFS_DIV_VALUE0                      0x1b
+#define        SYS_DFS_DIV_VALUE1                      0x1c
+#define        SYS_SENSE_AMP_DLY                       0x1d
+#define        SYS_SOC_SENSE_AMP_DLY                   0x1e
+#define        SYS_CTRL0                               0x1f
+#define        SYS_CTRL1                               0x20
+#define        SYS_TIMEOUT_BS1                         0x21
+#define        SYS_BYTE_SWAP                           0x22
+#define        SYS_VRM_VID                             0x23
+#define        SYS_PWR_RAM_CMD                         0x24
+#define        SYS_PWR_RAM_ADDR                        0x25
+#define        SYS_PWR_RAM_DATA0                       0x26
+#define        SYS_PWR_RAM_DATA1                       0x27
+#define        SYS_PWR_RAM_DATA2                       0x28
+#define        SYS_PWR_UCODE                           0x29
+#define        SYS_CPU0_PWR_STATUS                     0x2a
+#define        SYS_CPU1_PWR_STATUS                     0x2b
+#define        SYS_CPU2_PWR_STATUS                     0x2c
+#define        SYS_CPU3_PWR_STATUS                     0x2d
+#define        SYS_CPU4_PWR_STATUS                     0x2e
+#define        SYS_CPU5_PWR_STATUS                     0x2f
+#define        SYS_CPU6_PWR_STATUS                     0x30
+#define        SYS_CPU7_PWR_STATUS                     0x31
+#define        SYS_STATUS                              0x32
+#define        SYS_INT_POL                             0x33
+#define        SYS_INT_TYPE                            0x34
+#define        SYS_INT_STATUS                          0x35
+#define        SYS_INT_MASK0                           0x36
+#define        SYS_INT_MASK1                           0x37
+#define        SYS_UCO_S_ECC                           0x38
+#define        SYS_UCO_M_ECC                           0x39
+#define        SYS_UCO_ADDR                            0x3a
+#define        SYS_UCO_INSTR                           0x3b
+#define        SYS_MEM_BIST0                           0x3c
+#define        SYS_MEM_BIST1                           0x3d
+#define        SYS_MEM_BIST2                           0x3e
+#define        SYS_MEM_BIST3                           0x3f
+#define        SYS_MEM_BIST4                           0x40
+#define        SYS_MEM_BIST5                           0x41
+#define        SYS_MEM_BIST6                           0x42
+#define        SYS_MEM_BIST7                           0x43
+#define        SYS_MEM_BIST8                           0x44
+#define        SYS_MEM_BIST9                           0x45
+#define        SYS_MEM_BIST10                          0x46
+#define        SYS_MEM_BIST11                          0x47
+#define        SYS_MEM_BIST12                          0x48
+#define        SYS_SCRTCH0                             0x49
+#define        SYS_SCRTCH1                             0x4a
+#define        SYS_SCRTCH2                             0x4b
+#define        SYS_SCRTCH3                             0x4c
+
+#ifndef __ASSEMBLY__
+
+#define        nlm_read_sys_reg(b, r)          nlm_read_reg(b, r)
+#define        nlm_write_sys_reg(b, r, v)      nlm_write_reg(b, r, v)
+#define        nlm_get_sys_pcibase(node) nlm_pcicfg_base(XLP_IO_SYS_OFFSET(node))
+#define        nlm_get_sys_regbase(node) (nlm_get_sys_pcibase(node) + XLP_IO_PCI_HDRSZ)
+
+extern uint64_t nlm_sys_base;
+#endif
+#endif
diff --git a/arch/mips/include/asm/netlogic/xlp-hal/uart.h b/arch/mips/include/asm/netlogic/xlp-hal/uart.h
new file mode 100644 (file)
index 0000000..6a7046c
--- /dev/null
@@ -0,0 +1,191 @@
+/*
+ * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
+ * reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the NetLogic
+ * license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __XLP_HAL_UART_H__
+#define __XLP_HAL_UART_H__
+
+/* UART Specific registers */
+#define UART_RX_DATA           0x00
+#define UART_TX_DATA           0x00
+
+#define UART_INT_EN            0x01
+#define UART_INT_ID            0x02
+#define UART_FIFO_CTL          0x02
+#define UART_LINE_CTL          0x03
+#define UART_MODEM_CTL         0x04
+#define UART_LINE_STS          0x05
+#define UART_MODEM_STS         0x06
+
+#define UART_DIVISOR0          0x00
+#define UART_DIVISOR1          0x01
+
+#define BASE_BAUD              (XLP_IO_CLK/16)
+#define BAUD_DIVISOR(baud)     (BASE_BAUD / baud)
+
+/* LCR mask values */
+#define LCR_5BITS              0x00
+#define LCR_6BITS              0x01
+#define LCR_7BITS              0x02
+#define LCR_8BITS              0x03
+#define LCR_STOPB              0x04
+#define LCR_PENAB              0x08
+#define LCR_PODD               0x00
+#define LCR_PEVEN              0x10
+#define LCR_PONE               0x20
+#define LCR_PZERO              0x30
+#define LCR_SBREAK             0x40
+#define LCR_EFR_ENABLE         0xbf
+#define LCR_DLAB               0x80
+
+/* MCR mask values */
+#define MCR_DTR                        0x01
+#define MCR_RTS                        0x02
+#define MCR_DRS                        0x04
+#define MCR_IE                 0x08
+#define MCR_LOOPBACK           0x10
+
+/* FCR mask values */
+#define FCR_RCV_RST            0x02
+#define FCR_XMT_RST            0x04
+#define FCR_RX_LOW             0x00
+#define FCR_RX_MEDL            0x40
+#define FCR_RX_MEDH            0x80
+#define FCR_RX_HIGH            0xc0
+
+/* IER mask values */
+#define IER_ERXRDY             0x1
+#define IER_ETXRDY             0x2
+#define IER_ERLS               0x4
+#define IER_EMSC               0x8
+
+#if !defined(LOCORE) && !defined(__ASSEMBLY__)
+
+#define        nlm_read_uart_reg(b, r)         nlm_read_reg(b, r)
+#define        nlm_write_uart_reg(b, r, v)     nlm_write_reg(b, r, v)
+#define nlm_get_uart_pcibase(node, inst)       \
+               nlm_pcicfg_base(XLP_IO_UART_OFFSET(node, inst))
+#define nlm_get_uart_regbase(node, inst)       \
+                       (nlm_get_uart_pcibase(node, inst) + XLP_IO_PCI_HDRSZ)
+
+static inline void
+nlm_uart_set_baudrate(uint64_t base, int baud)
+{
+       uint32_t lcr;
+
+       lcr = nlm_read_uart_reg(base, UART_LINE_CTL);
+
+       /* enable divisor register, and write baud values */
+       nlm_write_uart_reg(base, UART_LINE_CTL, lcr | (1 << 7));
+       nlm_write_uart_reg(base, UART_DIVISOR0,
+                       (BAUD_DIVISOR(baud) & 0xff));
+       nlm_write_uart_reg(base, UART_DIVISOR1,
+                       ((BAUD_DIVISOR(baud) >> 8) & 0xff));
+
+       /* restore default lcr */
+       nlm_write_uart_reg(base, UART_LINE_CTL, lcr);
+}
+
+static inline void
+nlm_uart_outbyte(uint64_t base, char c)
+{
+       uint32_t lsr;
+
+       for (;;) {
+               lsr = nlm_read_uart_reg(base, UART_LINE_STS);
+               if (lsr & 0x20)
+                       break;
+       }
+
+       nlm_write_uart_reg(base, UART_TX_DATA, (int)c);
+}
+
+static inline char
+nlm_uart_inbyte(uint64_t base)
+{
+       int data, lsr;
+
+       for (;;) {
+               lsr = nlm_read_uart_reg(base, UART_LINE_STS);
+               if (lsr & 0x80) { /* parity/frame/break-error - push a zero */
+                       data = 0;
+                       break;
+               }
+               if (lsr & 0x01) {       /* Rx data */
+                       data = nlm_read_uart_reg(base, UART_RX_DATA);
+                       break;
+               }
+       }
+
+       return (char)data;
+}
+
+static inline int
+nlm_uart_init(uint64_t base, int baud, int databits, int stopbits,
+       int parity, int int_en, int loopback)
+{
+       uint32_t lcr;
+
+       lcr = 0;
+       if (databits >= 8)
+               lcr |= LCR_8BITS;
+       else if (databits == 7)
+               lcr |= LCR_7BITS;
+       else if (databits == 6)
+               lcr |= LCR_6BITS;
+       else
+               lcr |= LCR_5BITS;
+
+       if (stopbits > 1)
+               lcr |= LCR_STOPB;
+
+       lcr |= parity << 3;
+
+       /* setup default lcr */
+       nlm_write_uart_reg(base, UART_LINE_CTL, lcr);
+
+       /* Reset the FIFOs */
+       nlm_write_uart_reg(base, UART_LINE_CTL, FCR_RCV_RST | FCR_XMT_RST);
+
+       nlm_uart_set_baudrate(base, baud);
+
+       if (loopback)
+               nlm_write_uart_reg(base, UART_MODEM_CTL, 0x1f);
+
+       if (int_en)
+               nlm_write_uart_reg(base, UART_INT_EN, IER_ERXRDY | IER_ETXRDY);
+
+       return 0;
+}
+#endif /* !LOCORE && !__ASSEMBLY__ */
+#endif /* __XLP_HAL_UART_H__ */
diff --git a/arch/mips/include/asm/netlogic/xlp-hal/xlp.h b/arch/mips/include/asm/netlogic/xlp-hal/xlp.h
new file mode 100644 (file)
index 0000000..1540588
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
+ * reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the NetLogic
+ * license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _NLM_HAL_XLP_H
+#define _NLM_HAL_XLP_H
+
+#define PIC_UART_0_IRQ           17
+#define PIC_UART_1_IRQ           18
+
+#ifndef __ASSEMBLY__
+
+/* SMP support functions */
+void xlp_boot_core0_siblings(void);
+void xlp_wakeup_secondary_cpus(void);
+
+void xlp_mmu_init(void);
+void nlm_hal_init(void);
+
+#endif /* !__ASSEMBLY__ */
+#endif /* _ASM_NLM_XLP_H */
index 2e3a4dd53045e4c2056ec0a1ade4617437bc77ae..2e768f032e83198eba1652a57f2287a988f1d607 100644 (file)
 #define DEFAULT_HT_TYPE0_CFG_BASE       0x16000000
 #define DEFAULT_HT_TYPE1_CFG_BASE       0x17000000
 
-#ifndef __ASSEMBLY__
-#include <linux/types.h>
-#include <asm/byteorder.h>
-
-typedef volatile __u32 nlm_reg_t;
-extern unsigned long netlogic_io_base;
-
-/* FIXME read once in write_reg */
-#ifdef CONFIG_CPU_LITTLE_ENDIAN
-#define netlogic_read_reg(base, offset)                ((base)[(offset)])
-#define netlogic_write_reg(base, offset, value)        ((base)[(offset)] = (value))
-#else
-#define netlogic_read_reg(base, offset)                (be32_to_cpu((base)[(offset)]))
-#define netlogic_write_reg(base, offset, value) \
-                               ((base)[(offset)] = cpu_to_be32((value)))
-#endif
-
-#define netlogic_read_reg_le32(base, offset) (le32_to_cpu((base)[(offset)]))
-#define netlogic_write_reg_le32(base, offset, value) \
-                               ((base)[(offset)] = cpu_to_le32((value)))
-#define netlogic_io_mmio(offset) ((nlm_reg_t *)(netlogic_io_base+(offset)))
-#endif /* __ASSEMBLY__ */
 #endif
diff --git a/arch/mips/include/asm/netlogic/xlr/msidef.h b/arch/mips/include/asm/netlogic/xlr/msidef.h
new file mode 100644 (file)
index 0000000..7e39d40
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
+ * reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the NetLogic
+ * license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef ASM_RMI_MSIDEF_H
+#define ASM_RMI_MSIDEF_H
+
+/*
+ * Constants for Intel APIC based MSI messages.
+ * Adapted for the RMI XLR using identical defines
+ */
+
+/*
+ * Shifts for MSI data
+ */
+
+#define MSI_DATA_VECTOR_SHIFT          0
+#define  MSI_DATA_VECTOR_MASK          0x000000ff
+#define         MSI_DATA_VECTOR(v)             (((v) << MSI_DATA_VECTOR_SHIFT) & \
+                                               MSI_DATA_VECTOR_MASK)
+
+#define MSI_DATA_DELIVERY_MODE_SHIFT   8
+#define  MSI_DATA_DELIVERY_FIXED       (0 << MSI_DATA_DELIVERY_MODE_SHIFT)
+#define  MSI_DATA_DELIVERY_LOWPRI      (1 << MSI_DATA_DELIVERY_MODE_SHIFT)
+
+#define MSI_DATA_LEVEL_SHIFT           14
+#define         MSI_DATA_LEVEL_DEASSERT        (0 << MSI_DATA_LEVEL_SHIFT)
+#define         MSI_DATA_LEVEL_ASSERT          (1 << MSI_DATA_LEVEL_SHIFT)
+
+#define MSI_DATA_TRIGGER_SHIFT         15
+#define  MSI_DATA_TRIGGER_EDGE         (0 << MSI_DATA_TRIGGER_SHIFT)
+#define  MSI_DATA_TRIGGER_LEVEL                (1 << MSI_DATA_TRIGGER_SHIFT)
+
+/*
+ * Shift/mask fields for msi address
+ */
+
+#define MSI_ADDR_BASE_HI               0
+#define MSI_ADDR_BASE_LO               0xfee00000
+
+#define MSI_ADDR_DEST_MODE_SHIFT       2
+#define  MSI_ADDR_DEST_MODE_PHYSICAL   (0 << MSI_ADDR_DEST_MODE_SHIFT)
+#define         MSI_ADDR_DEST_MODE_LOGICAL     (1 << MSI_ADDR_DEST_MODE_SHIFT)
+
+#define MSI_ADDR_REDIRECTION_SHIFT     3
+#define  MSI_ADDR_REDIRECTION_CPU      (0 << MSI_ADDR_REDIRECTION_SHIFT)
+#define  MSI_ADDR_REDIRECTION_LOWPRI   (1 << MSI_ADDR_REDIRECTION_SHIFT)
+
+#define MSI_ADDR_DEST_ID_SHIFT         12
+#define         MSI_ADDR_DEST_ID_MASK          0x00ffff0
+#define  MSI_ADDR_DEST_ID(dest)                (((dest) << MSI_ADDR_DEST_ID_SHIFT) & \
+                                                MSI_ADDR_DEST_ID_MASK)
+
+#endif /* ASM_RMI_MSIDEF_H */
index 5cceb746f080ce988e3f52d4d0c926f6cfa5bcf0..868013e62f3225711ed0033401cc9690a9c200c0 100644 (file)
 /* end XLS */
 
 #ifndef __ASSEMBLY__
-static inline void pic_send_ipi(u32 ipi)
+
+#define PIC_IRQ_IS_EDGE_TRIGGERED(irq) (((irq) >= PIC_TIMER_0_IRQ) && \
+                                       ((irq) <= PIC_TIMER_7_IRQ))
+#define PIC_IRQ_IS_IRT(irq)            (((irq) >= PIC_IRT_FIRST_IRQ) && \
+                                       ((irq) <= PIC_IRT_LAST_IRQ))
+
+static inline int
+nlm_irq_to_irt(int irq)
 {
-       nlm_reg_t *mmio = netlogic_io_mmio(NETLOGIC_IO_PIC_OFFSET);
+       if (PIC_IRQ_IS_IRT(irq) == 0)
+               return -1;
 
-       netlogic_write_reg(mmio, PIC_IPI, ipi);
+       return PIC_IRQ_TO_INTR(irq);
 }
 
-static inline u32 pic_read_control(void)
+static inline int
+nlm_irt_to_irq(int irt)
 {
-       nlm_reg_t *mmio = netlogic_io_mmio(NETLOGIC_IO_PIC_OFFSET);
 
-       return netlogic_read_reg(mmio, PIC_CTRL);
+       return PIC_INTR_TO_IRQ(irt);
 }
 
-static inline void pic_write_control(u32 control)
+static inline void
+nlm_pic_enable_irt(uint64_t base, int irt)
 {
-       nlm_reg_t *mmio = netlogic_io_mmio(NETLOGIC_IO_PIC_OFFSET);
+       uint32_t reg;
 
-       netlogic_write_reg(mmio, PIC_CTRL, control);
+       reg = nlm_read_reg(base, PIC_IRT_1(irt));
+       nlm_write_reg(base, PIC_IRT_1(irt), reg | (1u << 31));
 }
 
-static inline void pic_update_control(u32 control)
+static inline void
+nlm_pic_disable_irt(uint64_t base, int irt)
 {
-       nlm_reg_t *mmio = netlogic_io_mmio(NETLOGIC_IO_PIC_OFFSET);
+       uint32_t reg;
 
-       netlogic_write_reg(mmio, PIC_CTRL,
-               (control | netlogic_read_reg(mmio, PIC_CTRL)));
+       reg = nlm_read_reg(base, PIC_IRT_1(irt));
+       nlm_write_reg(base, PIC_IRT_1(irt), reg & ~(1u << 31));
 }
 
-#define PIC_IRQ_IS_EDGE_TRIGGERED(irq) (((irq) >= PIC_TIMER_0_IRQ) && \
-                                       ((irq) <= PIC_TIMER_7_IRQ))
-#define PIC_IRQ_IS_IRT(irq)            (((irq) >= PIC_IRT_FIRST_IRQ) && \
-                                       ((irq) <= PIC_IRT_LAST_IRQ))
-#endif
+static inline void
+nlm_pic_send_ipi(uint64_t base, int hwt, int irq, int nmi)
+{
+       unsigned int tid, pid;
+
+       tid = hwt & 0x3;
+       pid = (hwt >> 2) & 0x07;
+       nlm_write_reg(base, PIC_IPI,
+               (pid << 20) | (tid << 16) | (nmi << 8) | irq);
+}
+
+static inline void
+nlm_pic_ack(uint64_t base, int irt)
+{
+       nlm_write_reg(base, PIC_INT_ACK, 1u << irt);
+}
 
+static inline void
+nlm_pic_init_irt(uint64_t base, int irt, int irq, int hwt)
+{
+       nlm_write_reg(base, PIC_IRT_0(irt), (1u << hwt));
+       /* local scheduling, invalid, level by default */
+       nlm_write_reg(base, PIC_IRT_1(irt),
+               (1 << 30) | (1 << 6) | irq);
+}
+
+extern uint64_t nlm_pic_base;
+#endif
 #endif /* _ASM_NLM_XLR_PIC_H */
index 3e6372692a04fe7f0cdf1fd133cd54cdfe3ea830..ff4a17b0bf78df40462a8b4f71279ebe1cfd3910 100644 (file)
@@ -40,17 +40,8 @@ struct uart_port;
 unsigned int nlm_xlr_uart_in(struct uart_port *, int);
 void nlm_xlr_uart_out(struct uart_port *, int, int);
 
-/* SMP support functions */
-struct irq_desc;
-void nlm_smp_function_ipi_handler(unsigned int irq, struct irq_desc *desc);
-void nlm_smp_resched_ipi_handler(unsigned int irq, struct irq_desc *desc);
-int nlm_wakeup_secondary_cpus(u32 wakeup_mask);
-void nlm_smp_irq_init(void);
-void nlm_boot_smp_nmi(void);
-void prom_pre_boot_secondary_cpus(void);
-
-extern struct plat_smp_ops nlm_smp_ops;
-extern unsigned long nlm_common_ebase;
+/* SMP helpers */
+void xlr_wakeup_secondary_cpus(void);
 
 /* XLS B silicon "Rook" */
 static inline unsigned int nlm_chip_is_xls_b(void)
diff --git a/arch/mips/include/asm/octeon/cvmx-address.h b/arch/mips/include/asm/octeon/cvmx-address.h
new file mode 100644 (file)
index 0000000..3c74d82
--- /dev/null
@@ -0,0 +1,274 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2009 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/**
+ * Typedefs and defines for working with Octeon physical addresses.
+ *
+ */
+#ifndef __CVMX_ADDRESS_H__
+#define __CVMX_ADDRESS_H__
+
+#if 0
+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;
+#endif
+
+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,
+       /* see cvmx_add_win_dma_dec_t for further decode */
+       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 {
+       /*
+        * Add store data to the write buffer entry, allocating it if
+        * necessary.
+        */
+       CVMX_ADD_WIN_DMA_ADD = 0L,
+       /* send out the write buffer entry to DRAM */
+       CVMX_ADD_WIN_DMA_SENDMEM = 1L,
+       /* store data must be normal DRAM memory space address in this case */
+       /* send out the write buffer entry as an IOBDMA command */
+       CVMX_ADD_WIN_DMA_SENDDMA = 2L,
+       /* see CVMX_ADD_WIN_DMA_SEND_DEC for data contents */
+       /* send out the write buffer entry as an IO write */
+       CVMX_ADD_WIN_DMA_SENDIO = 3L,
+       /* store data must be normal IO space address in this case */
+       /* send out a single-tick command on the NCB bus */
+       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 {
+
+       uint64_t u64;
+       /* mapped or unmapped virtual address */
+       struct {
+               uint64_t R:2;
+               uint64_t offset:62;
+       } sva;
+
+       /* mapped USEG virtual addresses (typically) */
+       struct {
+               uint64_t zeroes:33;
+               uint64_t offset:31;
+       } suseg;
+
+       /* mapped or unmapped virtual address */
+       struct {
+               uint64_t ones:33;
+               uint64_t sp:2;
+               uint64_t offset:29;
+       } sxkseg;
+
+       /*
+        * physical address accessed through xkphys unmapped virtual
+        * address.
+        */
+       struct {
+               uint64_t R:2;   /* CVMX_MIPS_SPACE_XKPHYS in this case */
+               uint64_t cca:3; /* ignored by octeon */
+               uint64_t mbz:10;
+               uint64_t pa:49; /* physical address */
+       } sxkphys;
+
+       /* physical address */
+       struct {
+               uint64_t mbz:15;
+               /* if set, the address is uncached and resides on MCB bus */
+               uint64_t is_io:1;
+               /*
+                * the hardware ignores this field when is_io==0, else
+                * device ID.
+                */
+               uint64_t did:8;
+               /* the hardware ignores <39:36> in Octeon I */
+               uint64_t unaddr:4;
+               uint64_t offset:36;
+       } sphys;
+
+       /* physical mem address */
+       struct {
+               /* techically, <47:40> are dont-cares */
+               uint64_t zeroes:24;
+               /* the hardware ignores <39:36> in Octeon I */
+               uint64_t unaddr:4;
+               uint64_t offset:36;
+       } smem;
+
+       /* physical IO address */
+       struct {
+               uint64_t mem_region:2;
+               uint64_t mbz:13;
+               /* 1 in this case */
+               uint64_t is_io:1;
+               /*
+                * The hardware ignores this field when is_io==0, else
+                * device ID.
+                */
+               uint64_t did:8;
+               /* the hardware ignores <39:36> in Octeon I */
+               uint64_t unaddr:4;
+               uint64_t offset:36;
+       } sio;
+
+       /*
+        * Scratchpad virtual address - accessed through a window at
+        * the end of kseg3
+        */
+       struct {
+               uint64_t ones:49;
+               /* CVMX_ADD_WIN_SCR (0) in this case */
+               cvmx_add_win_dec_t csrdec:2;
+               uint64_t addr:13;
+       } sscr;
+
+       /* there should only be stores to IOBDMA space, no loads */
+       /*
+        * IOBDMA virtual address - accessed through a window at the
+        * end of kseg3
+        */
+       struct {
+               uint64_t ones:49;
+               uint64_t csrdec:2;      /* CVMX_ADD_WIN_DMA (1) in this case */
+               uint64_t unused2:3;
+               uint64_t type:3;
+               uint64_t addr:7;
+       } sdma;
+
+       struct {
+               uint64_t didspace:24;
+               uint64_t 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) \
+       (((int32_t)segment << 31) | (int32_t)(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) ((((uint64_t)segment) << 62) | (add))
+#ifndef CVMX_ADD_IO_SEG
+#define CVMX_ADD_IO_SEG(add) CVMX_ADD_SEG(CVMX_IO_SEG, (add))
+#endif
+#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_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)
+
+#endif /* __CVMX_ADDRESS_H__ */
diff --git a/arch/mips/include/asm/octeon/cvmx-asxx-defs.h b/arch/mips/include/asm/octeon/cvmx-asxx-defs.h
new file mode 100644 (file)
index 0000000..91415a8
--- /dev/null
@@ -0,0 +1,475 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+#ifndef __CVMX_ASXX_DEFS_H__
+#define __CVMX_ASXX_DEFS_H__
+
+#define CVMX_ASXX_GMII_RX_CLK_SET(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000180ull + (((block_id) & 0) * 0x8000000ull))
+#define CVMX_ASXX_GMII_RX_DAT_SET(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000188ull + (((block_id) & 0) * 0x8000000ull))
+#define CVMX_ASXX_INT_EN(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000018ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_INT_REG(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000010ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_MII_RX_DAT_SET(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000190ull + (((block_id) & 0) * 0x8000000ull))
+#define CVMX_ASXX_PRT_LOOP(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000040ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_RLD_BYPASS(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000248ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_RLD_BYPASS_SETTING(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000250ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_RLD_COMP(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000220ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_RLD_DATA_DRV(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000218ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_RLD_FCRAM_MODE(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000210ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_RLD_NCTL_STRONG(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000230ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_RLD_NCTL_WEAK(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000240ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_RLD_PCTL_STRONG(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000228ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_RLD_PCTL_WEAK(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000238ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_RLD_SETTING(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000258ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_RX_CLK_SETX(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000020ull + (((offset) & 3) * 8) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_RX_PRT_EN(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000000ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_RX_WOL(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000100ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_RX_WOL_MSK(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000108ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_RX_WOL_POWOK(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000118ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_RX_WOL_SIG(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000110ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_TX_CLK_SETX(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000048ull + (((offset) & 3) * 8) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_TX_COMP_BYP(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000068ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_TX_HI_WATERX(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000080ull + (((offset) & 3) * 8) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_ASXX_TX_PRT_EN(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000008ull + (((block_id) & 1) * 0x8000000ull))
+
+union cvmx_asxx_gmii_rx_clk_set {
+       uint64_t u64;
+       struct cvmx_asxx_gmii_rx_clk_set_s {
+               uint64_t reserved_5_63:59;
+               uint64_t 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;
+};
+
+union cvmx_asxx_gmii_rx_dat_set {
+       uint64_t u64;
+       struct cvmx_asxx_gmii_rx_dat_set_s {
+               uint64_t reserved_5_63:59;
+               uint64_t 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;
+};
+
+union cvmx_asxx_int_en {
+       uint64_t u64;
+       struct cvmx_asxx_int_en_s {
+               uint64_t reserved_12_63:52;
+               uint64_t txpsh:4;
+               uint64_t txpop:4;
+               uint64_t ovrflw:4;
+       } s;
+       struct cvmx_asxx_int_en_cn30xx {
+               uint64_t reserved_11_63:53;
+               uint64_t txpsh:3;
+               uint64_t reserved_7_7:1;
+               uint64_t txpop:3;
+               uint64_t reserved_3_3:1;
+               uint64_t 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;
+};
+
+union cvmx_asxx_int_reg {
+       uint64_t u64;
+       struct cvmx_asxx_int_reg_s {
+               uint64_t reserved_12_63:52;
+               uint64_t txpsh:4;
+               uint64_t txpop:4;
+               uint64_t ovrflw:4;
+       } s;
+       struct cvmx_asxx_int_reg_cn30xx {
+               uint64_t reserved_11_63:53;
+               uint64_t txpsh:3;
+               uint64_t reserved_7_7:1;
+               uint64_t txpop:3;
+               uint64_t reserved_3_3:1;
+               uint64_t 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;
+};
+
+union cvmx_asxx_mii_rx_dat_set {
+       uint64_t u64;
+       struct cvmx_asxx_mii_rx_dat_set_s {
+               uint64_t reserved_5_63:59;
+               uint64_t setting:5;
+       } s;
+       struct cvmx_asxx_mii_rx_dat_set_s cn30xx;
+       struct cvmx_asxx_mii_rx_dat_set_s cn50xx;
+};
+
+union cvmx_asxx_prt_loop {
+       uint64_t u64;
+       struct cvmx_asxx_prt_loop_s {
+               uint64_t reserved_8_63:56;
+               uint64_t ext_loop:4;
+               uint64_t int_loop:4;
+       } s;
+       struct cvmx_asxx_prt_loop_cn30xx {
+               uint64_t reserved_7_63:57;
+               uint64_t ext_loop:3;
+               uint64_t reserved_3_3:1;
+               uint64_t 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;
+};
+
+union cvmx_asxx_rld_bypass {
+       uint64_t u64;
+       struct cvmx_asxx_rld_bypass_s {
+               uint64_t reserved_1_63:63;
+               uint64_t 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;
+};
+
+union cvmx_asxx_rld_bypass_setting {
+       uint64_t u64;
+       struct cvmx_asxx_rld_bypass_setting_s {
+               uint64_t reserved_5_63:59;
+               uint64_t 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;
+};
+
+union cvmx_asxx_rld_comp {
+       uint64_t u64;
+       struct cvmx_asxx_rld_comp_s {
+               uint64_t reserved_9_63:55;
+               uint64_t pctl:5;
+               uint64_t nctl:4;
+       } s;
+       struct cvmx_asxx_rld_comp_cn38xx {
+               uint64_t reserved_8_63:56;
+               uint64_t pctl:4;
+               uint64_t nctl:4;
+       } cn38xx;
+       struct cvmx_asxx_rld_comp_cn38xx cn38xxp2;
+       struct cvmx_asxx_rld_comp_s cn58xx;
+       struct cvmx_asxx_rld_comp_s cn58xxp1;
+};
+
+union cvmx_asxx_rld_data_drv {
+       uint64_t u64;
+       struct cvmx_asxx_rld_data_drv_s {
+               uint64_t reserved_8_63:56;
+               uint64_t pctl:4;
+               uint64_t 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;
+};
+
+union cvmx_asxx_rld_fcram_mode {
+       uint64_t u64;
+       struct cvmx_asxx_rld_fcram_mode_s {
+               uint64_t reserved_1_63:63;
+               uint64_t mode:1;
+       } s;
+       struct cvmx_asxx_rld_fcram_mode_s cn38xx;
+       struct cvmx_asxx_rld_fcram_mode_s cn38xxp2;
+};
+
+union cvmx_asxx_rld_nctl_strong {
+       uint64_t u64;
+       struct cvmx_asxx_rld_nctl_strong_s {
+               uint64_t reserved_5_63:59;
+               uint64_t 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;
+};
+
+union cvmx_asxx_rld_nctl_weak {
+       uint64_t u64;
+       struct cvmx_asxx_rld_nctl_weak_s {
+               uint64_t reserved_5_63:59;
+               uint64_t 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;
+};
+
+union cvmx_asxx_rld_pctl_strong {
+       uint64_t u64;
+       struct cvmx_asxx_rld_pctl_strong_s {
+               uint64_t reserved_5_63:59;
+               uint64_t 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;
+};
+
+union cvmx_asxx_rld_pctl_weak {
+       uint64_t u64;
+       struct cvmx_asxx_rld_pctl_weak_s {
+               uint64_t reserved_5_63:59;
+               uint64_t 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;
+};
+
+union cvmx_asxx_rld_setting {
+       uint64_t u64;
+       struct cvmx_asxx_rld_setting_s {
+               uint64_t reserved_13_63:51;
+               uint64_t dfaset:5;
+               uint64_t dfalag:1;
+               uint64_t dfalead:1;
+               uint64_t dfalock:1;
+               uint64_t setting:5;
+       } s;
+       struct cvmx_asxx_rld_setting_cn38xx {
+               uint64_t reserved_5_63:59;
+               uint64_t setting:5;
+       } cn38xx;
+       struct cvmx_asxx_rld_setting_cn38xx cn38xxp2;
+       struct cvmx_asxx_rld_setting_s cn58xx;
+       struct cvmx_asxx_rld_setting_s cn58xxp1;
+};
+
+union cvmx_asxx_rx_clk_setx {
+       uint64_t u64;
+       struct cvmx_asxx_rx_clk_setx_s {
+               uint64_t reserved_5_63:59;
+               uint64_t 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;
+};
+
+union cvmx_asxx_rx_prt_en {
+       uint64_t u64;
+       struct cvmx_asxx_rx_prt_en_s {
+               uint64_t reserved_4_63:60;
+               uint64_t prt_en:4;
+       } s;
+       struct cvmx_asxx_rx_prt_en_cn30xx {
+               uint64_t reserved_3_63:61;
+               uint64_t 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;
+};
+
+union cvmx_asxx_rx_wol {
+       uint64_t u64;
+       struct cvmx_asxx_rx_wol_s {
+               uint64_t reserved_2_63:62;
+               uint64_t status:1;
+               uint64_t enable:1;
+       } s;
+       struct cvmx_asxx_rx_wol_s cn38xx;
+       struct cvmx_asxx_rx_wol_s cn38xxp2;
+};
+
+union cvmx_asxx_rx_wol_msk {
+       uint64_t u64;
+       struct cvmx_asxx_rx_wol_msk_s {
+               uint64_t msk:64;
+       } s;
+       struct cvmx_asxx_rx_wol_msk_s cn38xx;
+       struct cvmx_asxx_rx_wol_msk_s cn38xxp2;
+};
+
+union cvmx_asxx_rx_wol_powok {
+       uint64_t u64;
+       struct cvmx_asxx_rx_wol_powok_s {
+               uint64_t reserved_1_63:63;
+               uint64_t powerok:1;
+       } s;
+       struct cvmx_asxx_rx_wol_powok_s cn38xx;
+       struct cvmx_asxx_rx_wol_powok_s cn38xxp2;
+};
+
+union cvmx_asxx_rx_wol_sig {
+       uint64_t u64;
+       struct cvmx_asxx_rx_wol_sig_s {
+               uint64_t reserved_32_63:32;
+               uint64_t sig:32;
+       } s;
+       struct cvmx_asxx_rx_wol_sig_s cn38xx;
+       struct cvmx_asxx_rx_wol_sig_s cn38xxp2;
+};
+
+union cvmx_asxx_tx_clk_setx {
+       uint64_t u64;
+       struct cvmx_asxx_tx_clk_setx_s {
+               uint64_t reserved_5_63:59;
+               uint64_t 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;
+};
+
+union cvmx_asxx_tx_comp_byp {
+       uint64_t u64;
+       struct cvmx_asxx_tx_comp_byp_s {
+               uint64_t reserved_0_63:64;
+       } s;
+       struct cvmx_asxx_tx_comp_byp_cn30xx {
+               uint64_t reserved_9_63:55;
+               uint64_t bypass:1;
+               uint64_t pctl:4;
+               uint64_t nctl:4;
+       } cn30xx;
+       struct cvmx_asxx_tx_comp_byp_cn30xx cn31xx;
+       struct cvmx_asxx_tx_comp_byp_cn38xx {
+               uint64_t reserved_8_63:56;
+               uint64_t pctl:4;
+               uint64_t nctl:4;
+       } cn38xx;
+       struct cvmx_asxx_tx_comp_byp_cn38xx cn38xxp2;
+       struct cvmx_asxx_tx_comp_byp_cn50xx {
+               uint64_t reserved_17_63:47;
+               uint64_t bypass:1;
+               uint64_t reserved_13_15:3;
+               uint64_t pctl:5;
+               uint64_t reserved_5_7:3;
+               uint64_t nctl:5;
+       } cn50xx;
+       struct cvmx_asxx_tx_comp_byp_cn58xx {
+               uint64_t reserved_13_63:51;
+               uint64_t pctl:5;
+               uint64_t reserved_5_7:3;
+               uint64_t nctl:5;
+       } cn58xx;
+       struct cvmx_asxx_tx_comp_byp_cn58xx cn58xxp1;
+};
+
+union cvmx_asxx_tx_hi_waterx {
+       uint64_t u64;
+       struct cvmx_asxx_tx_hi_waterx_s {
+               uint64_t reserved_4_63:60;
+               uint64_t mark:4;
+       } s;
+       struct cvmx_asxx_tx_hi_waterx_cn30xx {
+               uint64_t reserved_3_63:61;
+               uint64_t 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;
+};
+
+union cvmx_asxx_tx_prt_en {
+       uint64_t u64;
+       struct cvmx_asxx_tx_prt_en_s {
+               uint64_t reserved_4_63:60;
+               uint64_t prt_en:4;
+       } s;
+       struct cvmx_asxx_tx_prt_en_cn30xx {
+               uint64_t reserved_3_63:61;
+               uint64_t 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;
+};
+
+#endif
index 4e4c3a8282d624575d39a335348bd920c29fb86d..1db1dc2724cb2c5ed74a83ae9fe8da05490e4c23 100644 (file)
@@ -39,7 +39,7 @@
  * versions.
  */
 #define CVMX_BOOTINFO_MAJ_VER 1
-#define CVMX_BOOTINFO_MIN_VER 2
+#define CVMX_BOOTINFO_MIN_VER 3
 
 #if (CVMX_BOOTINFO_MAJ_VER == 1)
 #define CVMX_BOOTINFO_OCTEON_SERIAL_LEN 20
@@ -116,7 +116,13 @@ struct cvmx_bootinfo {
         */
        uint32_t config_flags;
 #endif
-
+#if (CVMX_BOOTINFO_MIN_VER >= 3)
+       /*
+        * Address of the OF Flattened Device Tree structure
+        * describing the board.
+        */
+       uint64_t fdt_addr;
+#endif
 };
 
 #define CVMX_BOOTINFO_CFG_FLAG_PCI_HOST                        (1ull << 0)
@@ -164,6 +170,22 @@ enum cvmx_board_types_enum {
        /* Special 'generic' board type, supports many boards */
        CVMX_BOARD_TYPE_GENERIC = 28,
        CVMX_BOARD_TYPE_EBH5610 = 29,
+       CVMX_BOARD_TYPE_LANAI2_A = 30,
+       CVMX_BOARD_TYPE_LANAI2_U = 31,
+       CVMX_BOARD_TYPE_EBB5600 = 32,
+       CVMX_BOARD_TYPE_EBB6300 = 33,
+       CVMX_BOARD_TYPE_NIC_XLE_10G = 34,
+       CVMX_BOARD_TYPE_LANAI2_G = 35,
+       CVMX_BOARD_TYPE_EBT5810 = 36,
+       CVMX_BOARD_TYPE_NIC10E = 37,
+       CVMX_BOARD_TYPE_EP6300C = 38,
+       CVMX_BOARD_TYPE_EBB6800 = 39,
+       CVMX_BOARD_TYPE_NIC4E = 40,
+       CVMX_BOARD_TYPE_NIC2E = 41,
+       CVMX_BOARD_TYPE_EBB6600 = 42,
+       CVMX_BOARD_TYPE_REDWING = 43,
+       CVMX_BOARD_TYPE_NIC68_4 = 44,
+       CVMX_BOARD_TYPE_NIC10E_66 = 45,
        CVMX_BOARD_TYPE_MAX,
 
        /*
@@ -181,6 +203,23 @@ enum cvmx_board_types_enum {
        CVMX_BOARD_TYPE_CUST_NS0216 = 10002,
        CVMX_BOARD_TYPE_CUST_NB5 = 10003,
        CVMX_BOARD_TYPE_CUST_WMR500 = 10004,
+       CVMX_BOARD_TYPE_CUST_ITB101 = 10005,
+       CVMX_BOARD_TYPE_CUST_NTE102 = 10006,
+       CVMX_BOARD_TYPE_CUST_AGS103 = 10007,
+       CVMX_BOARD_TYPE_CUST_GST104 = 10008,
+       CVMX_BOARD_TYPE_CUST_GCT105 = 10009,
+       CVMX_BOARD_TYPE_CUST_AGS106 = 10010,
+       CVMX_BOARD_TYPE_CUST_SGM107 = 10011,
+       CVMX_BOARD_TYPE_CUST_GCT108 = 10012,
+       CVMX_BOARD_TYPE_CUST_AGS109 = 10013,
+       CVMX_BOARD_TYPE_CUST_GCT110 = 10014,
+       CVMX_BOARD_TYPE_CUST_L2_AIR_SENDER = 10015,
+       CVMX_BOARD_TYPE_CUST_L2_AIR_RECEIVER = 10016,
+       CVMX_BOARD_TYPE_CUST_L2_ACCTON2_TX = 10017,
+       CVMX_BOARD_TYPE_CUST_L2_ACCTON2_RX = 10018,
+       CVMX_BOARD_TYPE_CUST_L2_WSTRNSNIC_TX = 10019,
+       CVMX_BOARD_TYPE_CUST_L2_WSTRNSNIC_RX = 10020,
+       CVMX_BOARD_TYPE_CUST_L2_ZINWELL = 10021,
        CVMX_BOARD_TYPE_CUST_DEFINED_MAX = 20000,
 
        /*
@@ -241,6 +280,22 @@ static inline const char *cvmx_board_type_to_string(enum
                ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CB5200)
                ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_GENERIC)
                ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_EBH5610)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_LANAI2_A)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_LANAI2_U)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_EBB5600)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_EBB6300)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_NIC_XLE_10G)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_LANAI2_G)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_EBT5810)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_NIC10E)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_EP6300C)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_EBB6800)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_NIC4E)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_NIC2E)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_EBB6600)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_REDWING)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_NIC68_4)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_NIC10E_66)
                ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_MAX)
 
                        /* Customer boards listed here */
@@ -249,6 +304,23 @@ static inline const char *cvmx_board_type_to_string(enum
                ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_NS0216)
                ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_NB5)
                ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_WMR500)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_ITB101)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_NTE102)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_AGS103)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_GST104)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_GCT105)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_AGS106)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_SGM107)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_GCT108)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_AGS109)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_GCT110)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_L2_AIR_SENDER)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_L2_AIR_RECEIVER)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_L2_ACCTON2_TX)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_L2_ACCTON2_RX)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_L2_WSTRNSNIC_TX)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_L2_WSTRNSNIC_RX)
+               ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_L2_ZINWELL)
                ENUM_BRD_TYPE_CASE(CVMX_BOARD_TYPE_CUST_DEFINED_MAX)
 
                    /* Customer private range */
@@ -265,9 +337,9 @@ static inline const char *cvmx_chip_type_to_string(enum
 {
        switch (type) {
                ENUM_CHIP_TYPE_CASE(CVMX_CHIP_TYPE_NULL)
-                   ENUM_CHIP_TYPE_CASE(CVMX_CHIP_SIM_TYPE_DEPRECATED)
-                   ENUM_CHIP_TYPE_CASE(CVMX_CHIP_TYPE_OCTEON_SAMPLE)
-                   ENUM_CHIP_TYPE_CASE(CVMX_CHIP_TYPE_MAX)
+               ENUM_CHIP_TYPE_CASE(CVMX_CHIP_SIM_TYPE_DEPRECATED)
+               ENUM_CHIP_TYPE_CASE(CVMX_CHIP_TYPE_OCTEON_SAMPLE)
+               ENUM_CHIP_TYPE_CASE(CVMX_CHIP_TYPE_MAX)
        }
        return "Unsupported Chip";
 }
diff --git a/arch/mips/include/asm/octeon/cvmx-cmd-queue.h b/arch/mips/include/asm/octeon/cvmx-cmd-queue.h
new file mode 100644 (file)
index 0000000..614653b
--- /dev/null
@@ -0,0 +1,617 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ *
+ * 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, 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 working 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__
+
+#include <linux/prefetch.h>
+
+#include "cvmx-fpa.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,
+       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_END = 0x50000,
+} cvmx_cmd_queue_id_t;
+
+/**
+ * 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 {
+       /* You have lock when this is your ticket */
+       uint8_t now_serving;
+       uint64_t unused1:24;
+       /* Maximum outstanding command words */
+       uint32_t max_depth;
+       /* FPA pool buffers come from */
+       uint64_t fpa_pool:3;
+       /* Top of command buffer pointer shifted 7 */
+       uint64_t base_ptr_div128:29;
+       uint64_t unused2:6;
+       /* FPA buffer size in 64bit words minus 1 */
+       uint64_t pool_size_m1:13;
+       /* Number of commands already used in buffer */
+       uint64_t index:13;
+} __cvmx_cmd_queue_state_t;
+
+/**
+ * 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 differnet
+ * cahce 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 {
+       uint64_t ticket[(CVMX_CMD_QUEUE_END >> 16) * 256];
+       __cvmx_cmd_queue_state_t state[(CVMX_CMD_QUEUE_END >> 16) * 256];
+} __cvmx_cmd_queue_all_state_t;
+
+/**
+ * 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.
+ *
+ * @queue_id:  Hardware command queue to initialize.
+ * @max_depth: Maximum outstanding commands that can be queued.
+ * @fpa_pool:  FPA pool the command queues should come from.
+ * @pool_size: Size of each buffer in the FPA pool (bytes)
+ *
+ * Returns 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.
+ *
+ * @queue_id: Queue to shutdown
+ *
+ * Returns 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.
+ *
+ * @queue_id: Hardware command queue to query
+ *
+ * Returns 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 t othe low level buffer
+ * for initial hardware setup. User applications should not call this
+ * function directly.
+ *
+ * @queue_id: Command queue to query
+ *
+ * Returns Command buffer or NULL on failure
+ */
+void *cvmx_cmd_queue_buffer(cvmx_cmd_queue_id_t queue_id);
+
+/**
+ * Get the index into the state arrays for the supplied queue id.
+ *
+ * @queue_id: Queue ID to get an index for
+ *
+ * Returns Index into the state arrays
+ */
+static inline 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.
+        */
+       int unit = queue_id >> 16;
+       int q = (queue_id >> 4) & 0xf;
+       int core = queue_id & 0xf;
+       return unit * 256 + core * 16 + q;
+}
+
+/**
+ * Lock the supplied queue so nobody else is updating it at the same
+ * time as us.
+ *
+ * @queue_id: Queue ID to lock
+ * @qptr:     Pointer to the queue's global state
+ */
+static inline void __cvmx_cmd_queue_lock(cvmx_cmd_queue_id_t queue_id,
+                                        __cvmx_cmd_queue_state_t *qptr)
+{
+       extern __cvmx_cmd_queue_all_state_t
+           *__cvmx_cmd_queue_state_ptr;
+       int tmp;
+       int my_ticket;
+       prefetch(qptr);
+       asm volatile (
+               ".set push\n"
+               ".set noreorder\n"
+               "1:\n"
+               /* Atomic add one to ticket_ptr */
+               "ll     %[my_ticket], %[ticket_ptr]\n"
+               /* and store the original value */
+               "li     %[ticket], 1\n"
+               /* in my_ticket */
+               "baddu  %[ticket], %[my_ticket]\n"
+               "sc     %[ticket], %[ticket_ptr]\n"
+               "beqz   %[ticket], 1b\n"
+               " nop\n"
+               /* Load the current now_serving ticket */
+               "lbu    %[ticket], %[now_serving]\n"
+               "2:\n"
+               /* Jump out if now_serving == my_ticket */
+               "beq    %[ticket], %[my_ticket], 4f\n"
+               /* Find out how many tickets are in front of me */
+               " subu   %[ticket], %[my_ticket], %[ticket]\n"
+               /* Use tickets in front of me minus one to delay */
+               "subu  %[ticket], 1\n"
+               /* Delay will be ((tickets in front)-1)*32 loops */
+               "cins   %[ticket], %[ticket], 5, 7\n"
+               "3:\n"
+               /* Loop here until our ticket might be up */
+               "bnez   %[ticket], 3b\n"
+               " subu  %[ticket], 1\n"
+               /* Jump back up to check out ticket again */
+               "b      2b\n"
+               /* Load the current now_serving ticket */
+               " lbu   %[ticket], %[now_serving]\n"
+               "4:\n"
+               ".set pop\n" :
+               [ticket_ptr] "=m"(__cvmx_cmd_queue_state_ptr->ticket[__cvmx_cmd_queue_get_index(queue_id)]),
+               [now_serving] "=m"(qptr->now_serving), [ticket] "=r"(tmp),
+               [my_ticket] "=r"(my_ticket)
+           );
+}
+
+/**
+ * Unlock the queue, flushing all writes.
+ *
+ * @qptr:   Queue to unlock
+ */
+static inline void __cvmx_cmd_queue_unlock(__cvmx_cmd_queue_state_t *qptr)
+{
+       qptr->now_serving++;
+       CVMX_SYNCWS;
+}
+
+/**
+ * Get the queue state structure for the given queue id
+ *
+ * @queue_id: Queue id to get
+ *
+ * Returns 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)
+{
+       extern __cvmx_cmd_queue_all_state_t
+           *__cvmx_cmd_queue_state_ptr;
+       return &__cvmx_cmd_queue_state_ptr->
+           state[__cvmx_cmd_queue_get_index(queue_id)];
+}
+
+/**
+ * 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.
+ *
+ * @queue_id:  Hardware command queue to write to
+ * @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.
+ * @cmd_count: Number of command words to write
+ * @cmds:      Array of commands to write
+ *
+ * Returns 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,
+                                                          int use_locking,
+                                                          int cmd_count,
+                                                          uint64_t *cmds)
+{
+       __cvmx_cmd_queue_state_t *qptr = __cvmx_cmd_queue_get_state(queue_id);
+
+       /* Make sure nobody else is updating the same queue */
+       if (likely(use_locking))
+               __cvmx_cmd_queue_lock(queue_id, qptr);
+
+       /*
+        * If a max queue length was specified then make sure we don't
+        * exceed it. If any part of the command would be below the
+        * limit we allow it.
+        */
+       if (CVMX_CMD_QUEUE_ENABLE_MAX_DEPTH && unlikely(qptr->max_depth)) {
+               if (unlikely
+                   (cvmx_cmd_queue_length(queue_id) > (int)qptr->max_depth)) {
+                       if (likely(use_locking))
+                               __cvmx_cmd_queue_unlock(qptr);
+                       return CVMX_CMD_QUEUE_FULL;
+               }
+       }
+
+       /*
+        * Normally there is plenty of room in the current buffer for
+        * the command.
+        */
+       if (likely(qptr->index + cmd_count < qptr->pool_size_m1)) {
+               uint64_t *ptr =
+                   (uint64_t *) cvmx_phys_to_ptr((uint64_t) qptr->
+                                                 base_ptr_div128 << 7);
+               ptr += qptr->index;
+               qptr->index += cmd_count;
+               while (cmd_count--)
+                       *ptr++ = *cmds++;
+       } else {
+               uint64_t *ptr;
+               int count;
+               /*
+                * We need a new command buffer. Fail if there isn't
+                * one available.
+                */
+               uint64_t *new_buffer =
+                   (uint64_t *) cvmx_fpa_alloc(qptr->fpa_pool);
+               if (unlikely(new_buffer == NULL)) {
+                       if (likely(use_locking))
+                               __cvmx_cmd_queue_unlock(qptr);
+                       return CVMX_CMD_QUEUE_NO_MEMORY;
+               }
+               ptr =
+                   (uint64_t *) cvmx_phys_to_ptr((uint64_t) qptr->
+                                                 base_ptr_div128 << 7);
+               /*
+                * Figure out how many command words will fit in this
+                * buffer. One location will be needed for the next
+                * buffer pointer.
+                */
+               count = qptr->pool_size_m1 - qptr->index;
+               ptr += qptr->index;
+               cmd_count -= count;
+               while (count--)
+                       *ptr++ = *cmds++;
+               *ptr = cvmx_ptr_to_phys(new_buffer);
+               /*
+                * The current buffer is full and has a link to the
+                * next buffer. Time to write the rest of the commands
+                * into the new buffer.
+                */
+               qptr->base_ptr_div128 = *ptr >> 7;
+               qptr->index = cmd_count;
+               ptr = new_buffer;
+               while (cmd_count--)
+                       *ptr++ = *cmds++;
+       }
+
+       /* All updates are complete. Release the lock and return */
+       if (likely(use_locking))
+               __cvmx_cmd_queue_unlock(qptr);
+       return CVMX_CMD_QUEUE_SUCCESS;
+}
+
+/**
+ * Simple function to write two command words to a command
+ * queue.
+ *
+ * @queue_id: Hardware command queue to write to
+ * @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.
+ * @cmd1:     Command
+ * @cmd2:     Command
+ *
+ * Returns 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,
+                                                           int use_locking,
+                                                           uint64_t cmd1,
+                                                           uint64_t cmd2)
+{
+       __cvmx_cmd_queue_state_t *qptr = __cvmx_cmd_queue_get_state(queue_id);
+
+       /* Make sure nobody else is updating the same queue */
+       if (likely(use_locking))
+               __cvmx_cmd_queue_lock(queue_id, qptr);
+
+       /*
+        * If a max queue length was specified then make sure we don't
+        * exceed it. If any part of the command would be below the
+        * limit we allow it.
+        */
+       if (CVMX_CMD_QUEUE_ENABLE_MAX_DEPTH && unlikely(qptr->max_depth)) {
+               if (unlikely
+                   (cvmx_cmd_queue_length(queue_id) > (int)qptr->max_depth)) {
+                       if (likely(use_locking))
+                               __cvmx_cmd_queue_unlock(qptr);
+                       return CVMX_CMD_QUEUE_FULL;
+               }
+       }
+
+       /*
+        * Normally there is plenty of room in the current buffer for
+        * the command.
+        */
+       if (likely(qptr->index + 2 < qptr->pool_size_m1)) {
+               uint64_t *ptr =
+                   (uint64_t *) cvmx_phys_to_ptr((uint64_t) qptr->
+                                                 base_ptr_div128 << 7);
+               ptr += qptr->index;
+               qptr->index += 2;
+               ptr[0] = cmd1;
+               ptr[1] = cmd2;
+       } else {
+               uint64_t *ptr;
+               /*
+                * Figure out how many command words will fit in this
+                * buffer. One location will be needed for the next
+                * buffer pointer.
+                */
+               int count = qptr->pool_size_m1 - qptr->index;
+               /*
+                * We need a new command buffer. Fail if there isn't
+                * one available.
+                */
+               uint64_t *new_buffer =
+                   (uint64_t *) cvmx_fpa_alloc(qptr->fpa_pool);
+               if (unlikely(new_buffer == NULL)) {
+                       if (likely(use_locking))
+                               __cvmx_cmd_queue_unlock(qptr);
+                       return CVMX_CMD_QUEUE_NO_MEMORY;
+               }
+               count--;
+               ptr =
+                   (uint64_t *) cvmx_phys_to_ptr((uint64_t) qptr->
+                                                 base_ptr_div128 << 7);
+               ptr += qptr->index;
+               *ptr++ = cmd1;
+               if (likely(count))
+                       *ptr++ = cmd2;
+               *ptr = cvmx_ptr_to_phys(new_buffer);
+               /*
+                * The current buffer is full and has a link to the
+                * next buffer. Time to write the rest of the commands
+                * into the new buffer.
+                */
+               qptr->base_ptr_div128 = *ptr >> 7;
+               qptr->index = 0;
+               if (unlikely(count == 0)) {
+                       qptr->index = 1;
+                       new_buffer[0] = cmd2;
+               }
+       }
+
+       /* All updates are complete. Release the lock and return */
+       if (likely(use_locking))
+               __cvmx_cmd_queue_unlock(qptr);
+       return CVMX_CMD_QUEUE_SUCCESS;
+}
+
+/**
+ * Simple function to write three command words to a command
+ * queue.
+ *
+ * @queue_id: Hardware command queue to write to
+ * @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.
+ * @cmd1:     Command
+ * @cmd2:     Command
+ * @cmd3:     Command
+ *
+ * Returns 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,
+                                                           int use_locking,
+                                                           uint64_t cmd1,
+                                                           uint64_t cmd2,
+                                                           uint64_t cmd3)
+{
+       __cvmx_cmd_queue_state_t *qptr = __cvmx_cmd_queue_get_state(queue_id);
+
+       /* Make sure nobody else is updating the same queue */
+       if (likely(use_locking))
+               __cvmx_cmd_queue_lock(queue_id, qptr);
+
+       /*
+        * If a max queue length was specified then make sure we don't
+        * exceed it. If any part of the command would be below the
+        * limit we allow it.
+        */
+       if (CVMX_CMD_QUEUE_ENABLE_MAX_DEPTH && unlikely(qptr->max_depth)) {
+               if (unlikely
+                   (cvmx_cmd_queue_length(queue_id) > (int)qptr->max_depth)) {
+                       if (likely(use_locking))
+                               __cvmx_cmd_queue_unlock(qptr);
+                       return CVMX_CMD_QUEUE_FULL;
+               }
+       }
+
+       /*
+        * Normally there is plenty of room in the current buffer for
+        * the command.
+        */
+       if (likely(qptr->index + 3 < qptr->pool_size_m1)) {
+               uint64_t *ptr =
+                   (uint64_t *) cvmx_phys_to_ptr((uint64_t) qptr->
+                                                 base_ptr_div128 << 7);
+               ptr += qptr->index;
+               qptr->index += 3;
+               ptr[0] = cmd1;
+               ptr[1] = cmd2;
+               ptr[2] = cmd3;
+       } else {
+               uint64_t *ptr;
+               /*
+                * Figure out how many command words will fit in this
+                * buffer. One location will be needed for the next
+                * buffer pointer
+                */
+               int count = qptr->pool_size_m1 - qptr->index;
+               /*
+                * We need a new command buffer. Fail if there isn't
+                * one available
+                */
+               uint64_t *new_buffer =
+                   (uint64_t *) cvmx_fpa_alloc(qptr->fpa_pool);
+               if (unlikely(new_buffer == NULL)) {
+                       if (likely(use_locking))
+                               __cvmx_cmd_queue_unlock(qptr);
+                       return CVMX_CMD_QUEUE_NO_MEMORY;
+               }
+               count--;
+               ptr =
+                   (uint64_t *) cvmx_phys_to_ptr((uint64_t) qptr->
+                                                 base_ptr_div128 << 7);
+               ptr += qptr->index;
+               *ptr++ = cmd1;
+               if (count) {
+                       *ptr++ = cmd2;
+                       if (count > 1)
+                               *ptr++ = cmd3;
+               }
+               *ptr = cvmx_ptr_to_phys(new_buffer);
+               /*
+                * The current buffer is full and has a link to the
+                * next buffer. Time to write the rest of the commands
+                * into the new buffer.
+                */
+               qptr->base_ptr_div128 = *ptr >> 7;
+               qptr->index = 0;
+               ptr = new_buffer;
+               if (count == 0) {
+                       *ptr++ = cmd2;
+                       qptr->index++;
+               }
+               if (count < 2) {
+                       *ptr++ = cmd3;
+                       qptr->index++;
+               }
+       }
+
+       /* All updates are complete. Release the lock and return */
+       if (likely(use_locking))
+               __cvmx_cmd_queue_unlock(qptr);
+       return CVMX_CMD_QUEUE_SUCCESS;
+}
+
+#endif /* __CVMX_CMD_QUEUE_H__ */
diff --git a/arch/mips/include/asm/octeon/cvmx-config.h b/arch/mips/include/asm/octeon/cvmx-config.h
new file mode 100644 (file)
index 0000000..26835d1
--- /dev/null
@@ -0,0 +1,168 @@
+#ifndef __CVMX_CONFIG_H__
+#define __CVMX_CONFIG_H__
+
+/************************* Config Specific Defines ************************/
+#define CVMX_LLM_NUM_PORTS 1
+#define CVMX_NULL_POINTER_PROTECT 1
+#define CVMX_ENABLE_DEBUG_PRINTS 1
+/* PKO queues per port for interface 0 (ports 0-15) */
+#define CVMX_PKO_QUEUES_PER_PORT_INTERFACE0 1
+/* PKO queues per port for interface 1 (ports 16-31) */
+#define CVMX_PKO_QUEUES_PER_PORT_INTERFACE1 1
+/* Limit on the number of PKO ports enabled for interface 0 */
+#define CVMX_PKO_MAX_PORTS_INTERFACE0 CVMX_HELPER_PKO_MAX_PORTS_INTERFACE0
+/* Limit on the number of PKO ports enabled for interface 1 */
+#define CVMX_PKO_MAX_PORTS_INTERFACE1 CVMX_HELPER_PKO_MAX_PORTS_INTERFACE1
+/* PKO queues per port for PCI (ports 32-35) */
+#define CVMX_PKO_QUEUES_PER_PORT_PCI 1
+/* PKO queues per port for Loop devices (ports 36-39) */
+#define CVMX_PKO_QUEUES_PER_PORT_LOOP 1
+
+/************************* FPA allocation *********************************/
+/* Pool sizes in bytes, must be multiple of a cache line */
+#define CVMX_FPA_POOL_0_SIZE (16 * CVMX_CACHE_LINE_SIZE)
+#define CVMX_FPA_POOL_1_SIZE (1 * CVMX_CACHE_LINE_SIZE)
+#define CVMX_FPA_POOL_2_SIZE (8 * CVMX_CACHE_LINE_SIZE)
+#define CVMX_FPA_POOL_3_SIZE (0 * CVMX_CACHE_LINE_SIZE)
+#define CVMX_FPA_POOL_4_SIZE (0 * CVMX_CACHE_LINE_SIZE)
+#define CVMX_FPA_POOL_5_SIZE (0 * CVMX_CACHE_LINE_SIZE)
+#define CVMX_FPA_POOL_6_SIZE (0 * CVMX_CACHE_LINE_SIZE)
+#define CVMX_FPA_POOL_7_SIZE (0 * CVMX_CACHE_LINE_SIZE)
+
+/* Pools in use */
+/* Packet buffers */
+#define CVMX_FPA_PACKET_POOL                (0)
+#define CVMX_FPA_PACKET_POOL_SIZE           CVMX_FPA_POOL_0_SIZE
+/* Work queue entrys */
+#define CVMX_FPA_WQE_POOL                   (1)
+#define CVMX_FPA_WQE_POOL_SIZE              CVMX_FPA_POOL_1_SIZE
+/* PKO queue command buffers */
+#define CVMX_FPA_OUTPUT_BUFFER_POOL         (2)
+#define CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE    CVMX_FPA_POOL_2_SIZE
+
+/*************************  FAU allocation ********************************/
+/* The fetch and add registers are allocated here.  They are arranged
+ * in order of descending size so that all alignment constraints are
+ * automatically met.  The enums are linked so that the following enum
+ * continues allocating where the previous one left off, so the
+ * numbering within each enum always starts with zero.  The macros
+ * take care of the address increment size, so the values entered
+ * always increase by 1.  FAU registers are accessed with byte
+ * addresses.
+ */
+
+#define CVMX_FAU_REG_64_ADDR(x) ((x << 3) + CVMX_FAU_REG_64_START)
+typedef enum {
+       CVMX_FAU_REG_64_START   = 0,
+       CVMX_FAU_REG_64_END     = CVMX_FAU_REG_64_ADDR(0),
+} cvmx_fau_reg_64_t;
+
+#define CVMX_FAU_REG_32_ADDR(x) ((x << 2) + CVMX_FAU_REG_32_START)
+typedef enum {
+       CVMX_FAU_REG_32_START   = CVMX_FAU_REG_64_END,
+       CVMX_FAU_REG_32_END     = CVMX_FAU_REG_32_ADDR(0),
+} cvmx_fau_reg_32_t;
+
+#define CVMX_FAU_REG_16_ADDR(x) ((x << 1) + CVMX_FAU_REG_16_START)
+typedef enum {
+       CVMX_FAU_REG_16_START   = CVMX_FAU_REG_32_END,
+       CVMX_FAU_REG_16_END     = CVMX_FAU_REG_16_ADDR(0),
+} cvmx_fau_reg_16_t;
+
+#define CVMX_FAU_REG_8_ADDR(x) ((x) + CVMX_FAU_REG_8_START)
+typedef enum {
+       CVMX_FAU_REG_8_START    = CVMX_FAU_REG_16_END,
+       CVMX_FAU_REG_8_END      = CVMX_FAU_REG_8_ADDR(0),
+} cvmx_fau_reg_8_t;
+
+/*
+ * The name CVMX_FAU_REG_AVAIL_BASE is provided to indicate the first
+ * available FAU address that is not allocated in cvmx-config.h. This
+ * is 64 bit aligned.
+ */
+#define CVMX_FAU_REG_AVAIL_BASE ((CVMX_FAU_REG_8_END + 0x7) & (~0x7ULL))
+#define CVMX_FAU_REG_END (2048)
+
+/********************** scratch memory allocation *************************/
+/* Scratchpad memory allocation.  Note that these are byte memory
+ * addresses.  Some uses of scratchpad (IOBDMA for example) require
+ * the use of 8-byte aligned addresses, so proper alignment needs to
+ * be taken into account.
+ */
+/* Generic scratch iobdma area */
+#define CVMX_SCR_SCRATCH               (0)
+/* First location available after cvmx-config.h allocated region. */
+#define CVMX_SCR_REG_AVAIL_BASE        (8)
+
+/*
+ * CVMX_HELPER_FIRST_MBUFF_SKIP is the number of bytes to reserve
+ * before the beginning of the packet. If necessary, override the
+ * default here.  See the IPD section of the hardware manual for MBUFF
+ * SKIP details.
+ */
+#define CVMX_HELPER_FIRST_MBUFF_SKIP 184
+
+/*
+ * CVMX_HELPER_NOT_FIRST_MBUFF_SKIP is the number of bytes to reserve
+ * in each chained packet element. If necessary, override the default
+ * here.
+ */
+#define CVMX_HELPER_NOT_FIRST_MBUFF_SKIP 0
+
+/*
+ * CVMX_HELPER_ENABLE_BACK_PRESSURE controls whether back pressure is
+ * enabled for all input ports. This controls if IPD sends
+ * backpressure to all ports if Octeon's FPA pools don't have enough
+ * packet or work queue entries. Even when this is off, it is still
+ * possible to get backpressure from individual hardware ports. When
+ * configuring backpressure, also check
+ * CVMX_HELPER_DISABLE_*_BACKPRESSURE below. If necessary, override
+ * the default here.
+ */
+#define CVMX_HELPER_ENABLE_BACK_PRESSURE 1
+
+/*
+ * CVMX_HELPER_ENABLE_IPD controls if the IPD is enabled in the helper
+ * function. Once it is enabled the hardware starts accepting
+ * packets. You might want to skip the IPD enable if configuration
+ * changes are need from the default helper setup. If necessary,
+ * override the default here.
+ */
+#define CVMX_HELPER_ENABLE_IPD 0
+
+/*
+ * CVMX_HELPER_INPUT_TAG_TYPE selects the type of tag that the IPD assigns
+ * to incoming packets.
+ */
+#define CVMX_HELPER_INPUT_TAG_TYPE CVMX_POW_TAG_TYPE_ORDERED
+
+#define CVMX_ENABLE_PARAMETER_CHECKING 0
+
+/*
+ * The following select which fields are used by the PIP to generate
+ * the tag on INPUT
+ * 0: don't include
+ * 1: include
+ */
+#define CVMX_HELPER_INPUT_TAG_IPV6_SRC_IP      0
+#define CVMX_HELPER_INPUT_TAG_IPV6_DST_IP      0
+#define CVMX_HELPER_INPUT_TAG_IPV6_SRC_PORT    0
+#define CVMX_HELPER_INPUT_TAG_IPV6_DST_PORT    0
+#define CVMX_HELPER_INPUT_TAG_IPV6_NEXT_HEADER         0
+#define CVMX_HELPER_INPUT_TAG_IPV4_SRC_IP      0
+#define CVMX_HELPER_INPUT_TAG_IPV4_DST_IP      0
+#define CVMX_HELPER_INPUT_TAG_IPV4_SRC_PORT    0
+#define CVMX_HELPER_INPUT_TAG_IPV4_DST_PORT    0
+#define CVMX_HELPER_INPUT_TAG_IPV4_PROTOCOL    0
+#define CVMX_HELPER_INPUT_TAG_INPUT_PORT       1
+
+/* Select skip mode for input ports */
+#define CVMX_HELPER_INPUT_PORT_SKIP_MODE       CVMX_PIP_PORT_CFG_MODE_SKIPL2
+
+/*
+ * Force backpressure to be disabled.  This overrides all other
+ * backpressure configuration.
+ */
+#define CVMX_HELPER_DISABLE_RGMII_BACKPRESSURE 0
+
+#endif /* __CVMX_CONFIG_H__ */
diff --git a/arch/mips/include/asm/octeon/cvmx-dbg-defs.h b/arch/mips/include/asm/octeon/cvmx-dbg-defs.h
new file mode 100644 (file)
index 0000000..abbf42d
--- /dev/null
@@ -0,0 +1,72 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+#ifndef __CVMX_DBG_DEFS_H__
+#define __CVMX_DBG_DEFS_H__
+
+#define CVMX_DBG_DATA \
+        CVMX_ADD_IO_SEG(0x00011F00000001E8ull)
+
+union cvmx_dbg_data {
+       uint64_t u64;
+       struct cvmx_dbg_data_s {
+               uint64_t reserved_23_63:41;
+               uint64_t c_mul:5;
+               uint64_t dsel_ext:1;
+               uint64_t data:17;
+       } s;
+       struct cvmx_dbg_data_cn30xx {
+               uint64_t reserved_31_63:33;
+               uint64_t pll_mul:3;
+               uint64_t reserved_23_27:5;
+               uint64_t c_mul:5;
+               uint64_t dsel_ext:1;
+               uint64_t data:17;
+       } cn30xx;
+       struct cvmx_dbg_data_cn30xx cn31xx;
+       struct cvmx_dbg_data_cn38xx {
+               uint64_t reserved_29_63:35;
+               uint64_t d_mul:4;
+               uint64_t dclk_mul2:1;
+               uint64_t cclk_div2:1;
+               uint64_t c_mul:5;
+               uint64_t dsel_ext:1;
+               uint64_t data:17;
+       } cn38xx;
+       struct cvmx_dbg_data_cn38xx cn38xxp2;
+       struct cvmx_dbg_data_cn30xx cn50xx;
+       struct cvmx_dbg_data_cn58xx {
+               uint64_t reserved_29_63:35;
+               uint64_t rem:6;
+               uint64_t c_mul:5;
+               uint64_t dsel_ext:1;
+               uint64_t data:17;
+       } cn58xx;
+       struct cvmx_dbg_data_cn58xx cn58xxp1;
+};
+
+#endif
diff --git a/arch/mips/include/asm/octeon/cvmx-dpi-defs.h b/arch/mips/include/asm/octeon/cvmx-dpi-defs.h
new file mode 100644 (file)
index 0000000..c34ad04
--- /dev/null
@@ -0,0 +1,643 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2011 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+#ifndef __CVMX_DPI_DEFS_H__
+#define __CVMX_DPI_DEFS_H__
+
+#define CVMX_DPI_BIST_STATUS (CVMX_ADD_IO_SEG(0x0001DF0000000000ull))
+#define CVMX_DPI_CTL (CVMX_ADD_IO_SEG(0x0001DF0000000040ull))
+#define CVMX_DPI_DMAX_COUNTS(offset) (CVMX_ADD_IO_SEG(0x0001DF0000000300ull) + ((offset) & 7) * 8)
+#define CVMX_DPI_DMAX_DBELL(offset) (CVMX_ADD_IO_SEG(0x0001DF0000000200ull) + ((offset) & 7) * 8)
+#define CVMX_DPI_DMAX_ERR_RSP_STATUS(offset) (CVMX_ADD_IO_SEG(0x0001DF0000000A80ull) + ((offset) & 7) * 8)
+#define CVMX_DPI_DMAX_IBUFF_SADDR(offset) (CVMX_ADD_IO_SEG(0x0001DF0000000280ull) + ((offset) & 7) * 8)
+#define CVMX_DPI_DMAX_IFLIGHT(offset) (CVMX_ADD_IO_SEG(0x0001DF0000000A00ull) + ((offset) & 7) * 8)
+#define CVMX_DPI_DMAX_NADDR(offset) (CVMX_ADD_IO_SEG(0x0001DF0000000380ull) + ((offset) & 7) * 8)
+#define CVMX_DPI_DMAX_REQBNK0(offset) (CVMX_ADD_IO_SEG(0x0001DF0000000400ull) + ((offset) & 7) * 8)
+#define CVMX_DPI_DMAX_REQBNK1(offset) (CVMX_ADD_IO_SEG(0x0001DF0000000480ull) + ((offset) & 7) * 8)
+#define CVMX_DPI_DMA_CONTROL (CVMX_ADD_IO_SEG(0x0001DF0000000048ull))
+#define CVMX_DPI_DMA_ENGX_EN(offset) (CVMX_ADD_IO_SEG(0x0001DF0000000080ull) + ((offset) & 7) * 8)
+#define CVMX_DPI_DMA_PPX_CNT(offset) (CVMX_ADD_IO_SEG(0x0001DF0000000B00ull) + ((offset) & 31) * 8)
+#define CVMX_DPI_ENGX_BUF(offset) (CVMX_ADD_IO_SEG(0x0001DF0000000880ull) + ((offset) & 7) * 8)
+#define CVMX_DPI_INFO_REG (CVMX_ADD_IO_SEG(0x0001DF0000000980ull))
+#define CVMX_DPI_INT_EN (CVMX_ADD_IO_SEG(0x0001DF0000000010ull))
+#define CVMX_DPI_INT_REG (CVMX_ADD_IO_SEG(0x0001DF0000000008ull))
+#define CVMX_DPI_NCBX_CFG(block_id) (CVMX_ADD_IO_SEG(0x0001DF0000000800ull))
+#define CVMX_DPI_PINT_INFO (CVMX_ADD_IO_SEG(0x0001DF0000000830ull))
+#define CVMX_DPI_PKT_ERR_RSP (CVMX_ADD_IO_SEG(0x0001DF0000000078ull))
+#define CVMX_DPI_REQ_ERR_RSP (CVMX_ADD_IO_SEG(0x0001DF0000000058ull))
+#define CVMX_DPI_REQ_ERR_RSP_EN (CVMX_ADD_IO_SEG(0x0001DF0000000068ull))
+#define CVMX_DPI_REQ_ERR_RST (CVMX_ADD_IO_SEG(0x0001DF0000000060ull))
+#define CVMX_DPI_REQ_ERR_RST_EN (CVMX_ADD_IO_SEG(0x0001DF0000000070ull))
+#define CVMX_DPI_REQ_ERR_SKIP_COMP (CVMX_ADD_IO_SEG(0x0001DF0000000838ull))
+#define CVMX_DPI_REQ_GBL_EN (CVMX_ADD_IO_SEG(0x0001DF0000000050ull))
+#define CVMX_DPI_SLI_PRTX_CFG(offset) (CVMX_ADD_IO_SEG(0x0001DF0000000900ull) + ((offset) & 3) * 8)
+#define CVMX_DPI_SLI_PRTX_ERR_INFO(offset) (CVMX_ADD_IO_SEG(0x0001DF0000000940ull) + ((offset) & 3) * 8)
+
+union cvmx_dpi_bist_status {
+       uint64_t u64;
+       struct cvmx_dpi_bist_status_s {
+               uint64_t reserved_47_63:17;
+               uint64_t bist:47;
+       } s;
+       struct cvmx_dpi_bist_status_s cn61xx;
+       struct cvmx_dpi_bist_status_cn63xx {
+               uint64_t reserved_45_63:19;
+               uint64_t bist:45;
+       } cn63xx;
+       struct cvmx_dpi_bist_status_cn63xxp1 {
+               uint64_t reserved_37_63:27;
+               uint64_t bist:37;
+       } cn63xxp1;
+       struct cvmx_dpi_bist_status_s cn66xx;
+       struct cvmx_dpi_bist_status_cn63xx cn68xx;
+       struct cvmx_dpi_bist_status_cn63xx cn68xxp1;
+};
+
+union cvmx_dpi_ctl {
+       uint64_t u64;
+       struct cvmx_dpi_ctl_s {
+               uint64_t reserved_2_63:62;
+               uint64_t clk:1;
+               uint64_t en:1;
+       } s;
+       struct cvmx_dpi_ctl_cn61xx {
+               uint64_t reserved_1_63:63;
+               uint64_t 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;
+};
+
+union cvmx_dpi_dmax_counts {
+       uint64_t u64;
+       struct cvmx_dpi_dmax_counts_s {
+               uint64_t reserved_39_63:25;
+               uint64_t fcnt:7;
+               uint64_t 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;
+};
+
+union cvmx_dpi_dmax_dbell {
+       uint64_t u64;
+       struct cvmx_dpi_dmax_dbell_s {
+               uint64_t reserved_16_63:48;
+               uint64_t 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;
+};
+
+union cvmx_dpi_dmax_err_rsp_status {
+       uint64_t u64;
+       struct cvmx_dpi_dmax_err_rsp_status_s {
+               uint64_t reserved_6_63:58;
+               uint64_t 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;
+};
+
+union cvmx_dpi_dmax_ibuff_saddr {
+       uint64_t u64;
+       struct cvmx_dpi_dmax_ibuff_saddr_s {
+               uint64_t reserved_62_63:2;
+               uint64_t csize:14;
+               uint64_t reserved_41_47:7;
+               uint64_t idle:1;
+               uint64_t saddr:33;
+               uint64_t reserved_0_6:7;
+       } s;
+       struct cvmx_dpi_dmax_ibuff_saddr_cn61xx {
+               uint64_t reserved_62_63:2;
+               uint64_t csize:14;
+               uint64_t reserved_41_47:7;
+               uint64_t idle:1;
+               uint64_t reserved_36_39:4;
+               uint64_t saddr:29;
+               uint64_t 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_s cn68xx;
+       struct cvmx_dpi_dmax_ibuff_saddr_s cn68xxp1;
+};
+
+union cvmx_dpi_dmax_iflight {
+       uint64_t u64;
+       struct cvmx_dpi_dmax_iflight_s {
+               uint64_t reserved_3_63:61;
+               uint64_t 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;
+};
+
+union cvmx_dpi_dmax_naddr {
+       uint64_t u64;
+       struct cvmx_dpi_dmax_naddr_s {
+               uint64_t reserved_40_63:24;
+               uint64_t addr:40;
+       } s;
+       struct cvmx_dpi_dmax_naddr_cn61xx {
+               uint64_t reserved_36_63:28;
+               uint64_t 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_s cn68xx;
+       struct cvmx_dpi_dmax_naddr_s cn68xxp1;
+};
+
+union cvmx_dpi_dmax_reqbnk0 {
+       uint64_t u64;
+       struct cvmx_dpi_dmax_reqbnk0_s {
+               uint64_t 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;
+};
+
+union cvmx_dpi_dmax_reqbnk1 {
+       uint64_t u64;
+       struct cvmx_dpi_dmax_reqbnk1_s {
+               uint64_t 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;
+};
+
+union cvmx_dpi_dma_control {
+       uint64_t u64;
+       struct cvmx_dpi_dma_control_s {
+               uint64_t reserved_62_63:2;
+               uint64_t dici_mode:1;
+               uint64_t pkt_en1:1;
+               uint64_t ffp_dis:1;
+               uint64_t commit_mode:1;
+               uint64_t pkt_hp:1;
+               uint64_t pkt_en:1;
+               uint64_t reserved_54_55:2;
+               uint64_t dma_enb:6;
+               uint64_t reserved_34_47:14;
+               uint64_t b0_lend:1;
+               uint64_t dwb_denb:1;
+               uint64_t dwb_ichk:9;
+               uint64_t fpa_que:3;
+               uint64_t o_add1:1;
+               uint64_t o_ro:1;
+               uint64_t o_ns:1;
+               uint64_t o_es:2;
+               uint64_t o_mode:1;
+               uint64_t reserved_0_13:14;
+       } s;
+       struct cvmx_dpi_dma_control_s cn61xx;
+       struct cvmx_dpi_dma_control_cn63xx {
+               uint64_t reserved_61_63:3;
+               uint64_t pkt_en1:1;
+               uint64_t ffp_dis:1;
+               uint64_t commit_mode:1;
+               uint64_t pkt_hp:1;
+               uint64_t pkt_en:1;
+               uint64_t reserved_54_55:2;
+               uint64_t dma_enb:6;
+               uint64_t reserved_34_47:14;
+               uint64_t b0_lend:1;
+               uint64_t dwb_denb:1;
+               uint64_t dwb_ichk:9;
+               uint64_t fpa_que:3;
+               uint64_t o_add1:1;
+               uint64_t o_ro:1;
+               uint64_t o_ns:1;
+               uint64_t o_es:2;
+               uint64_t o_mode:1;
+               uint64_t reserved_0_13:14;
+       } cn63xx;
+       struct cvmx_dpi_dma_control_cn63xxp1 {
+               uint64_t reserved_59_63:5;
+               uint64_t commit_mode:1;
+               uint64_t pkt_hp:1;
+               uint64_t pkt_en:1;
+               uint64_t reserved_54_55:2;
+               uint64_t dma_enb:6;
+               uint64_t reserved_34_47:14;
+               uint64_t b0_lend:1;
+               uint64_t dwb_denb:1;
+               uint64_t dwb_ichk:9;
+               uint64_t fpa_que:3;
+               uint64_t o_add1:1;
+               uint64_t o_ro:1;
+               uint64_t o_ns:1;
+               uint64_t o_es:2;
+               uint64_t o_mode:1;
+               uint64_t reserved_0_13:14;
+       } cn63xxp1;
+       struct cvmx_dpi_dma_control_cn63xx cn66xx;
+       struct cvmx_dpi_dma_control_s cn68xx;
+       struct cvmx_dpi_dma_control_cn63xx cn68xxp1;
+};
+
+union cvmx_dpi_dma_engx_en {
+       uint64_t u64;
+       struct cvmx_dpi_dma_engx_en_s {
+               uint64_t reserved_8_63:56;
+               uint64_t qen:8;
+       } s;
+       struct cvmx_dpi_dma_engx_en_s cn61xx;
+       struct cvmx_dpi_dma_engx_en_s cn63xx;
+       struct cvmx_dpi_dma_engx_en_s cn63xxp1;
+       struct cvmx_dpi_dma_engx_en_s cn66xx;
+       struct cvmx_dpi_dma_engx_en_s cn68xx;
+       struct cvmx_dpi_dma_engx_en_s cn68xxp1;
+};
+
+union cvmx_dpi_dma_ppx_cnt {
+       uint64_t u64;
+       struct cvmx_dpi_dma_ppx_cnt_s {
+               uint64_t reserved_16_63:48;
+               uint64_t cnt:16;
+       } s;
+       struct cvmx_dpi_dma_ppx_cnt_s cn61xx;
+       struct cvmx_dpi_dma_ppx_cnt_s cn68xx;
+};
+
+union cvmx_dpi_engx_buf {
+       uint64_t u64;
+       struct cvmx_dpi_engx_buf_s {
+               uint64_t reserved_37_63:27;
+               uint64_t compblks:5;
+               uint64_t reserved_9_31:23;
+               uint64_t base:5;
+               uint64_t blks:4;
+       } s;
+       struct cvmx_dpi_engx_buf_s cn61xx;
+       struct cvmx_dpi_engx_buf_cn63xx {
+               uint64_t reserved_8_63:56;
+               uint64_t base:4;
+               uint64_t blks:4;
+       } cn63xx;
+       struct cvmx_dpi_engx_buf_cn63xx cn63xxp1;
+       struct cvmx_dpi_engx_buf_s cn66xx;
+       struct cvmx_dpi_engx_buf_s cn68xx;
+       struct cvmx_dpi_engx_buf_s cn68xxp1;
+};
+
+union cvmx_dpi_info_reg {
+       uint64_t u64;
+       struct cvmx_dpi_info_reg_s {
+               uint64_t reserved_8_63:56;
+               uint64_t ffp:4;
+               uint64_t reserved_2_3:2;
+               uint64_t ncb:1;
+               uint64_t rsl:1;
+       } s;
+       struct cvmx_dpi_info_reg_s cn61xx;
+       struct cvmx_dpi_info_reg_s cn63xx;
+       struct cvmx_dpi_info_reg_cn63xxp1 {
+               uint64_t reserved_2_63:62;
+               uint64_t ncb:1;
+               uint64_t rsl:1;
+       } cn63xxp1;
+       struct cvmx_dpi_info_reg_s cn66xx;
+       struct cvmx_dpi_info_reg_s cn68xx;
+       struct cvmx_dpi_info_reg_s cn68xxp1;
+};
+
+union cvmx_dpi_int_en {
+       uint64_t u64;
+       struct cvmx_dpi_int_en_s {
+               uint64_t reserved_28_63:36;
+               uint64_t sprt3_rst:1;
+               uint64_t sprt2_rst:1;
+               uint64_t sprt1_rst:1;
+               uint64_t sprt0_rst:1;
+               uint64_t reserved_23_23:1;
+               uint64_t req_badfil:1;
+               uint64_t req_inull:1;
+               uint64_t req_anull:1;
+               uint64_t req_undflw:1;
+               uint64_t req_ovrflw:1;
+               uint64_t req_badlen:1;
+               uint64_t req_badadr:1;
+               uint64_t dmadbo:8;
+               uint64_t reserved_2_7:6;
+               uint64_t nfovr:1;
+               uint64_t nderr:1;
+       } s;
+       struct cvmx_dpi_int_en_s cn61xx;
+       struct cvmx_dpi_int_en_cn63xx {
+               uint64_t reserved_26_63:38;
+               uint64_t sprt1_rst:1;
+               uint64_t sprt0_rst:1;
+               uint64_t reserved_23_23:1;
+               uint64_t req_badfil:1;
+               uint64_t req_inull:1;
+               uint64_t req_anull:1;
+               uint64_t req_undflw:1;
+               uint64_t req_ovrflw:1;
+               uint64_t req_badlen:1;
+               uint64_t req_badadr:1;
+               uint64_t dmadbo:8;
+               uint64_t reserved_2_7:6;
+               uint64_t nfovr:1;
+               uint64_t 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;
+};
+
+union cvmx_dpi_int_reg {
+       uint64_t u64;
+       struct cvmx_dpi_int_reg_s {
+               uint64_t reserved_28_63:36;
+               uint64_t sprt3_rst:1;
+               uint64_t sprt2_rst:1;
+               uint64_t sprt1_rst:1;
+               uint64_t sprt0_rst:1;
+               uint64_t reserved_23_23:1;
+               uint64_t req_badfil:1;
+               uint64_t req_inull:1;
+               uint64_t req_anull:1;
+               uint64_t req_undflw:1;
+               uint64_t req_ovrflw:1;
+               uint64_t req_badlen:1;
+               uint64_t req_badadr:1;
+               uint64_t dmadbo:8;
+               uint64_t reserved_2_7:6;
+               uint64_t nfovr:1;
+               uint64_t nderr:1;
+       } s;
+       struct cvmx_dpi_int_reg_s cn61xx;
+       struct cvmx_dpi_int_reg_cn63xx {
+               uint64_t reserved_26_63:38;
+               uint64_t sprt1_rst:1;
+               uint64_t sprt0_rst:1;
+               uint64_t reserved_23_23:1;
+               uint64_t req_badfil:1;
+               uint64_t req_inull:1;
+               uint64_t req_anull:1;
+               uint64_t req_undflw:1;
+               uint64_t req_ovrflw:1;
+               uint64_t req_badlen:1;
+               uint64_t req_badadr:1;
+               uint64_t dmadbo:8;
+               uint64_t reserved_2_7:6;
+               uint64_t nfovr:1;
+               uint64_t 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;
+};
+
+union cvmx_dpi_ncbx_cfg {
+       uint64_t u64;
+       struct cvmx_dpi_ncbx_cfg_s {
+               uint64_t reserved_6_63:58;
+               uint64_t molr:6;
+       } s;
+       struct cvmx_dpi_ncbx_cfg_s cn61xx;
+       struct cvmx_dpi_ncbx_cfg_s cn66xx;
+       struct cvmx_dpi_ncbx_cfg_s cn68xx;
+};
+
+union cvmx_dpi_pint_info {
+       uint64_t u64;
+       struct cvmx_dpi_pint_info_s {
+               uint64_t reserved_14_63:50;
+               uint64_t iinfo:6;
+               uint64_t reserved_6_7:2;
+               uint64_t 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;
+};
+
+union cvmx_dpi_pkt_err_rsp {
+       uint64_t u64;
+       struct cvmx_dpi_pkt_err_rsp_s {
+               uint64_t reserved_1_63:63;
+               uint64_t 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;
+};
+
+union cvmx_dpi_req_err_rsp {
+       uint64_t u64;
+       struct cvmx_dpi_req_err_rsp_s {
+               uint64_t reserved_8_63:56;
+               uint64_t 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;
+};
+
+union cvmx_dpi_req_err_rsp_en {
+       uint64_t u64;
+       struct cvmx_dpi_req_err_rsp_en_s {
+               uint64_t reserved_8_63:56;
+               uint64_t 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;
+};
+
+union cvmx_dpi_req_err_rst {
+       uint64_t u64;
+       struct cvmx_dpi_req_err_rst_s {
+               uint64_t reserved_8_63:56;
+               uint64_t 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;
+};
+
+union cvmx_dpi_req_err_rst_en {
+       uint64_t u64;
+       struct cvmx_dpi_req_err_rst_en_s {
+               uint64_t reserved_8_63:56;
+               uint64_t 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;
+};
+
+union cvmx_dpi_req_err_skip_comp {
+       uint64_t u64;
+       struct cvmx_dpi_req_err_skip_comp_s {
+               uint64_t reserved_24_63:40;
+               uint64_t en_rst:8;
+               uint64_t reserved_8_15:8;
+               uint64_t 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;
+};
+
+union cvmx_dpi_req_gbl_en {
+       uint64_t u64;
+       struct cvmx_dpi_req_gbl_en_s {
+               uint64_t reserved_8_63:56;
+               uint64_t 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;
+};
+
+union cvmx_dpi_sli_prtx_cfg {
+       uint64_t u64;
+       struct cvmx_dpi_sli_prtx_cfg_s {
+               uint64_t reserved_25_63:39;
+               uint64_t halt:1;
+               uint64_t qlm_cfg:4;
+               uint64_t reserved_17_19:3;
+               uint64_t rd_mode:1;
+               uint64_t reserved_14_15:2;
+               uint64_t molr:6;
+               uint64_t mps_lim:1;
+               uint64_t reserved_5_6:2;
+               uint64_t mps:1;
+               uint64_t mrrs_lim:1;
+               uint64_t reserved_2_2:1;
+               uint64_t mrrs:2;
+       } s;
+       struct cvmx_dpi_sli_prtx_cfg_s cn61xx;
+       struct cvmx_dpi_sli_prtx_cfg_cn63xx {
+               uint64_t reserved_25_63:39;
+               uint64_t halt:1;
+               uint64_t reserved_21_23:3;
+               uint64_t qlm_cfg:1;
+               uint64_t reserved_17_19:3;
+               uint64_t rd_mode:1;
+               uint64_t reserved_14_15:2;
+               uint64_t molr:6;
+               uint64_t mps_lim:1;
+               uint64_t reserved_5_6:2;
+               uint64_t mps:1;
+               uint64_t mrrs_lim:1;
+               uint64_t reserved_2_2:1;
+               uint64_t mrrs:2;
+       } cn63xx;
+       struct cvmx_dpi_sli_prtx_cfg_cn63xx cn63xxp1;
+       struct cvmx_dpi_sli_prtx_cfg_s cn66xx;
+       struct cvmx_dpi_sli_prtx_cfg_cn63xx cn68xx;
+       struct cvmx_dpi_sli_prtx_cfg_cn63xx cn68xxp1;
+};
+
+union cvmx_dpi_sli_prtx_err {
+       uint64_t u64;
+       struct cvmx_dpi_sli_prtx_err_s {
+               uint64_t addr:61;
+               uint64_t 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;
+};
+
+union cvmx_dpi_sli_prtx_err_info {
+       uint64_t u64;
+       struct cvmx_dpi_sli_prtx_err_info_s {
+               uint64_t reserved_9_63:55;
+               uint64_t lock:1;
+               uint64_t reserved_5_7:3;
+               uint64_t type:1;
+               uint64_t reserved_3_3:1;
+               uint64_t 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;
+};
+
+#endif
diff --git a/arch/mips/include/asm/octeon/cvmx-fau.h b/arch/mips/include/asm/octeon/cvmx-fau.h
new file mode 100644 (file)
index 0000000..a6939fc
--- /dev/null
@@ -0,0 +1,597 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ * Interface to the hardware Fetch and Add Unit.
+ */
+
+#ifndef __CVMX_FAU_H__
+#define __CVMX_FAU_H__
+
+/*
+ * 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
+
+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 {
+       uint64_t error:1;
+       int64_t 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 {
+       uint64_t error:1;
+       int32_t 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 {
+       uint64_t error:1;
+       int16_t 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 {
+       uint64_t 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 {
+       uint64_t u64;
+       struct {
+               uint64_t invalid:1;
+               uint64_t data:63;       /* unpredictable if invalid is set */
+       } s;
+} cvmx_fau_async_tagwait_result_t;
+
+/**
+ * Builds a store I/O address for writing to the FAU
+ *
+ * @noadd:  0 = Store value is atomically added to the current value
+ *               1 = Store value is atomically written over the current value
+ * @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.
+ * Returns Address to store for atomic update
+ */
+static inline uint64_t __cvmx_fau_store_address(uint64_t noadd, uint64_t 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);
+}
+
+/**
+ * Builds a I/O address for accessing the FAU
+ *
+ * @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
+ * @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.
+ * @value:   Signed value to add.
+ *                Note: When performing 32 and 64 bit access, only the low
+ *                22 bits are available.
+ * Returns Address to read from for atomic update
+ */
+static inline uint64_t __cvmx_fau_atomic_address(uint64_t tagwait, uint64_t reg,
+                                                int64_t 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
+ *
+ * @reg:     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 8 for 64 bit access.
+ * @value:   Signed value to add.
+ *                Note: Only the low 22 bits are available.
+ * Returns Value of the register before the update
+ */
+static inline int64_t cvmx_fau_fetch_and_add64(cvmx_fau_reg_64_t reg,
+                                              int64_t value)
+{
+       return cvmx_read64_int64(__cvmx_fau_atomic_address(0, reg, value));
+}
+
+/**
+ * Perform an atomic 32 bit add
+ *
+ * @reg:     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 4 for 32 bit access.
+ * @value:   Signed value to add.
+ *                Note: Only the low 22 bits are available.
+ * Returns Value of the register before the update
+ */
+static inline int32_t cvmx_fau_fetch_and_add32(cvmx_fau_reg_32_t reg,
+                                              int32_t value)
+{
+       return cvmx_read64_int32(__cvmx_fau_atomic_address(0, reg, value));
+}
+
+/**
+ * Perform an atomic 16 bit add
+ *
+ * @reg:     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 2 for 16 bit access.
+ * @value:   Signed value to add.
+ * Returns Value of the register before the update
+ */
+static inline int16_t cvmx_fau_fetch_and_add16(cvmx_fau_reg_16_t reg,
+                                              int16_t value)
+{
+       return cvmx_read64_int16(__cvmx_fau_atomic_address(0, reg, value));
+}
+
+/**
+ * Perform an atomic 8 bit add
+ *
+ * @reg:     FAU atomic register to access. 0 <= reg < 2048.
+ * @value:   Signed value to add.
+ * Returns Value of the register before the update
+ */
+static inline int8_t cvmx_fau_fetch_and_add8(cvmx_fau_reg_8_t reg, int8_t value)
+{
+       return cvmx_read64_int8(__cvmx_fau_atomic_address(0, reg, value));
+}
+
+/**
+ * Perform an atomic 64 bit add after the current tag switch
+ * completes
+ *
+ * @reg:    FAU atomic register to access. 0 <= reg < 2048.
+ *               - Step by 8 for 64 bit access.
+ * @value:  Signed value to add.
+ *               Note: Only the low 22 bits are available.
+ * Returns 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_fau_tagwait_fetch_and_add64(cvmx_fau_reg_64_t reg, int64_t value)
+{
+       union {
+               uint64_t i64;
+               cvmx_fau_tagwait64_t t;
+       } result;
+       result.i64 =
+           cvmx_read64_int64(__cvmx_fau_atomic_address(1, reg, value));
+       return result.t;
+}
+
+/**
+ * Perform an atomic 32 bit add after the current tag switch
+ * completes
+ *
+ * @reg:    FAU atomic register to access. 0 <= reg < 2048.
+ *               - Step by 4 for 32 bit access.
+ * @value:  Signed value to add.
+ *               Note: Only the low 22 bits are available.
+ * Returns 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_fau_tagwait_fetch_and_add32(cvmx_fau_reg_32_t reg, int32_t value)
+{
+       union {
+               uint64_t i32;
+               cvmx_fau_tagwait32_t t;
+       } result;
+       result.i32 =
+           cvmx_read64_int32(__cvmx_fau_atomic_address(1, reg, value));
+       return result.t;
+}
+
+/**
+ * Perform an atomic 16 bit add after the current tag switch
+ * completes
+ *
+ * @reg:    FAU atomic register to access. 0 <= reg < 2048.
+ *               - Step by 2 for 16 bit access.
+ * @value:  Signed value to add.
+ * Returns 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_fau_tagwait_fetch_and_add16(cvmx_fau_reg_16_t reg, int16_t value)
+{
+       union {
+               uint64_t i16;
+               cvmx_fau_tagwait16_t t;
+       } result;
+       result.i16 =
+           cvmx_read64_int16(__cvmx_fau_atomic_address(1, reg, value));
+       return result.t;
+}
+
+/**
+ * Perform an atomic 8 bit add after the current tag switch
+ * completes
+ *
+ * @reg:    FAU atomic register to access. 0 <= reg < 2048.
+ * @value:  Signed value to add.
+ * Returns 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_fau_tagwait_fetch_and_add8(cvmx_fau_reg_8_t reg, int8_t value)
+{
+       union {
+               uint64_t i8;
+               cvmx_fau_tagwait8_t t;
+       } result;
+       result.i8 = cvmx_read64_int8(__cvmx_fau_atomic_address(1, reg, value));
+       return result.t;
+}
+
+/**
+ * Builds I/O data for async operations
+ *
+ * @scraddr: Scratch pad byte address to write to.  Must be 8 byte aligned
+ * @value:   Signed value to add.
+ *                Note: When performing 32 and 64 bit access, only the low
+ *                22 bits are available.
+ * @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
+ * @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
+ * @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.
+ * Returns Data to write using cvmx_send_single
+ */
+static inline uint64_t __cvmx_fau_iobdma_data(uint64_t scraddr, int64_t value,
+                                             uint64_t tagwait,
+                                             cvmx_fau_op_size_t size,
+                                             uint64_t 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.
+ *
+ * @scraddr: Scratch memory byte address to put response in.
+ *                Must be 8 byte aligned.
+ * @reg:     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 8 for 64 bit access.
+ * @value:   Signed value to add.
+ *                Note: Only the low 22 bits are available.
+ * Returns Placed in the scratch pad register
+ */
+static inline void cvmx_fau_async_fetch_and_add64(uint64_t scraddr,
+                                                 cvmx_fau_reg_64_t reg,
+                                                 int64_t 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.
+ *
+ * @scraddr: Scratch memory byte address to put response in.
+ *                Must be 8 byte aligned.
+ * @reg:     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 4 for 32 bit access.
+ * @value:   Signed value to add.
+ *                Note: Only the low 22 bits are available.
+ * Returns Placed in the scratch pad register
+ */
+static inline void cvmx_fau_async_fetch_and_add32(uint64_t scraddr,
+                                                 cvmx_fau_reg_32_t reg,
+                                                 int32_t 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.
+ *
+ * @scraddr: Scratch memory byte address to put response in.
+ *                Must be 8 byte aligned.
+ * @reg:     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 2 for 16 bit access.
+ * @value:   Signed value to add.
+ * Returns Placed in the scratch pad register
+ */
+static inline void cvmx_fau_async_fetch_and_add16(uint64_t scraddr,
+                                                 cvmx_fau_reg_16_t reg,
+                                                 int16_t 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.
+ *
+ * @scraddr: Scratch memory byte address to put response in.
+ *                Must be 8 byte aligned.
+ * @reg:     FAU atomic register to access. 0 <= reg < 2048.
+ * @value:   Signed value to add.
+ * Returns Placed in the scratch pad register
+ */
+static inline void cvmx_fau_async_fetch_and_add8(uint64_t scraddr,
+                                                cvmx_fau_reg_8_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.
+ *
+ * @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
+ *
+ * @reg:     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 8 for 64 bit access.
+ * @value:   Signed value to add.
+ *                Note: Only the low 22 bits are available.
+ * Returns Placed in the scratch pad register
+ */
+static inline void cvmx_fau_async_tagwait_fetch_and_add64(uint64_t scraddr,
+                                                         cvmx_fau_reg_64_t reg,
+                                                         int64_t 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.
+ *
+ * @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
+ *
+ * @reg:     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 4 for 32 bit access.
+ * @value:   Signed value to add.
+ *                Note: Only the low 22 bits are available.
+ * Returns Placed in the scratch pad register
+ */
+static inline void cvmx_fau_async_tagwait_fetch_and_add32(uint64_t scraddr,
+                                                         cvmx_fau_reg_32_t reg,
+                                                         int32_t 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.
+ *
+ * @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
+ *
+ * @reg:     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 2 for 16 bit access.
+ * @value:   Signed value to add.
+ *
+ * Returns Placed in the scratch pad register
+ */
+static inline void cvmx_fau_async_tagwait_fetch_and_add16(uint64_t scraddr,
+                                                         cvmx_fau_reg_16_t reg,
+                                                         int16_t 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.
+ *
+ * @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
+ *
+ * @reg:     FAU atomic register to access. 0 <= reg < 2048.
+ * @value:   Signed value to add.
+ *
+ * Returns Placed in the scratch pad register
+ */
+static inline void cvmx_fau_async_tagwait_fetch_and_add8(uint64_t scraddr,
+                                                        cvmx_fau_reg_8_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
+ *
+ * @reg:     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 8 for 64 bit access.
+ * @value:   Signed value to add.
+ */
+static inline void cvmx_fau_atomic_add64(cvmx_fau_reg_64_t reg, int64_t value)
+{
+       cvmx_write64_int64(__cvmx_fau_store_address(0, reg), value);
+}
+
+/**
+ * Perform an atomic 32 bit add
+ *
+ * @reg:     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 4 for 32 bit access.
+ * @value:   Signed value to add.
+ */
+static inline void cvmx_fau_atomic_add32(cvmx_fau_reg_32_t reg, int32_t value)
+{
+       cvmx_write64_int32(__cvmx_fau_store_address(0, reg), value);
+}
+
+/**
+ * Perform an atomic 16 bit add
+ *
+ * @reg:     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 2 for 16 bit access.
+ * @value:   Signed value to add.
+ */
+static inline void cvmx_fau_atomic_add16(cvmx_fau_reg_16_t reg, int16_t value)
+{
+       cvmx_write64_int16(__cvmx_fau_store_address(0, reg), value);
+}
+
+/**
+ * Perform an atomic 8 bit add
+ *
+ * @reg:     FAU atomic register to access. 0 <= reg < 2048.
+ * @value:   Signed value to add.
+ */
+static inline void cvmx_fau_atomic_add8(cvmx_fau_reg_8_t reg, int8_t value)
+{
+       cvmx_write64_int8(__cvmx_fau_store_address(0, reg), value);
+}
+
+/**
+ * Perform an atomic 64 bit write
+ *
+ * @reg:     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 8 for 64 bit access.
+ * @value:   Signed value to write.
+ */
+static inline void cvmx_fau_atomic_write64(cvmx_fau_reg_64_t reg, int64_t value)
+{
+       cvmx_write64_int64(__cvmx_fau_store_address(1, reg), value);
+}
+
+/**
+ * Perform an atomic 32 bit write
+ *
+ * @reg:     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 4 for 32 bit access.
+ * @value:   Signed value to write.
+ */
+static inline void cvmx_fau_atomic_write32(cvmx_fau_reg_32_t reg, int32_t value)
+{
+       cvmx_write64_int32(__cvmx_fau_store_address(1, reg), value);
+}
+
+/**
+ * Perform an atomic 16 bit write
+ *
+ * @reg:     FAU atomic register to access. 0 <= reg < 2048.
+ *                - Step by 2 for 16 bit access.
+ * @value:   Signed value to write.
+ */
+static inline void cvmx_fau_atomic_write16(cvmx_fau_reg_16_t reg, int16_t value)
+{
+       cvmx_write64_int16(__cvmx_fau_store_address(1, reg), value);
+}
+
+/**
+ * Perform an atomic 8 bit write
+ *
+ * @reg:     FAU atomic register to access. 0 <= reg < 2048.
+ * @value:   Signed value to write.
+ */
+static inline void cvmx_fau_atomic_write8(cvmx_fau_reg_8_t reg, int8_t value)
+{
+       cvmx_write64_int8(__cvmx_fau_store_address(1, reg), value);
+}
+
+#endif /* __CVMX_FAU_H__ */
diff --git a/arch/mips/include/asm/octeon/cvmx-fpa-defs.h b/arch/mips/include/asm/octeon/cvmx-fpa-defs.h
new file mode 100644 (file)
index 0000000..bf5546b
--- /dev/null
@@ -0,0 +1,403 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+#ifndef __CVMX_FPA_DEFS_H__
+#define __CVMX_FPA_DEFS_H__
+
+#define CVMX_FPA_BIST_STATUS \
+        CVMX_ADD_IO_SEG(0x00011800280000E8ull)
+#define CVMX_FPA_CTL_STATUS \
+        CVMX_ADD_IO_SEG(0x0001180028000050ull)
+#define CVMX_FPA_FPF0_MARKS \
+        CVMX_ADD_IO_SEG(0x0001180028000000ull)
+#define CVMX_FPA_FPF0_SIZE \
+        CVMX_ADD_IO_SEG(0x0001180028000058ull)
+#define CVMX_FPA_FPF1_MARKS \
+        CVMX_ADD_IO_SEG(0x0001180028000008ull)
+#define CVMX_FPA_FPF2_MARKS \
+        CVMX_ADD_IO_SEG(0x0001180028000010ull)
+#define CVMX_FPA_FPF3_MARKS \
+        CVMX_ADD_IO_SEG(0x0001180028000018ull)
+#define CVMX_FPA_FPF4_MARKS \
+        CVMX_ADD_IO_SEG(0x0001180028000020ull)
+#define CVMX_FPA_FPF5_MARKS \
+        CVMX_ADD_IO_SEG(0x0001180028000028ull)
+#define CVMX_FPA_FPF6_MARKS \
+        CVMX_ADD_IO_SEG(0x0001180028000030ull)
+#define CVMX_FPA_FPF7_MARKS \
+        CVMX_ADD_IO_SEG(0x0001180028000038ull)
+#define CVMX_FPA_FPFX_MARKS(offset) \
+        CVMX_ADD_IO_SEG(0x0001180028000008ull + (((offset) & 7) * 8) - 8 * 1)
+#define CVMX_FPA_FPFX_SIZE(offset) \
+        CVMX_ADD_IO_SEG(0x0001180028000060ull + (((offset) & 7) * 8) - 8 * 1)
+#define CVMX_FPA_INT_ENB \
+        CVMX_ADD_IO_SEG(0x0001180028000048ull)
+#define CVMX_FPA_INT_SUM \
+        CVMX_ADD_IO_SEG(0x0001180028000040ull)
+#define CVMX_FPA_QUE0_PAGE_INDEX \
+        CVMX_ADD_IO_SEG(0x00011800280000F0ull)
+#define CVMX_FPA_QUE1_PAGE_INDEX \
+        CVMX_ADD_IO_SEG(0x00011800280000F8ull)
+#define CVMX_FPA_QUE2_PAGE_INDEX \
+        CVMX_ADD_IO_SEG(0x0001180028000100ull)
+#define CVMX_FPA_QUE3_PAGE_INDEX \
+        CVMX_ADD_IO_SEG(0x0001180028000108ull)
+#define CVMX_FPA_QUE4_PAGE_INDEX \
+        CVMX_ADD_IO_SEG(0x0001180028000110ull)
+#define CVMX_FPA_QUE5_PAGE_INDEX \
+        CVMX_ADD_IO_SEG(0x0001180028000118ull)
+#define CVMX_FPA_QUE6_PAGE_INDEX \
+        CVMX_ADD_IO_SEG(0x0001180028000120ull)
+#define CVMX_FPA_QUE7_PAGE_INDEX \
+        CVMX_ADD_IO_SEG(0x0001180028000128ull)
+#define CVMX_FPA_QUEX_AVAILABLE(offset) \
+        CVMX_ADD_IO_SEG(0x0001180028000098ull + (((offset) & 7) * 8))
+#define CVMX_FPA_QUEX_PAGE_INDEX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800280000F0ull + (((offset) & 7) * 8))
+#define CVMX_FPA_QUE_ACT \
+        CVMX_ADD_IO_SEG(0x0001180028000138ull)
+#define CVMX_FPA_QUE_EXP \
+        CVMX_ADD_IO_SEG(0x0001180028000130ull)
+#define CVMX_FPA_WART_CTL \
+        CVMX_ADD_IO_SEG(0x00011800280000D8ull)
+#define CVMX_FPA_WART_STATUS \
+        CVMX_ADD_IO_SEG(0x00011800280000E0ull)
+
+union cvmx_fpa_bist_status {
+       uint64_t u64;
+       struct cvmx_fpa_bist_status_s {
+               uint64_t reserved_5_63:59;
+               uint64_t frd:1;
+               uint64_t fpf0:1;
+               uint64_t fpf1:1;
+               uint64_t ffr:1;
+               uint64_t fdr:1;
+       } s;
+       struct cvmx_fpa_bist_status_s cn30xx;
+       struct cvmx_fpa_bist_status_s cn31xx;
+       struct cvmx_fpa_bist_status_s cn38xx;
+       struct cvmx_fpa_bist_status_s cn38xxp2;
+       struct cvmx_fpa_bist_status_s cn50xx;
+       struct cvmx_fpa_bist_status_s cn52xx;
+       struct cvmx_fpa_bist_status_s cn52xxp1;
+       struct cvmx_fpa_bist_status_s cn56xx;
+       struct cvmx_fpa_bist_status_s cn56xxp1;
+       struct cvmx_fpa_bist_status_s cn58xx;
+       struct cvmx_fpa_bist_status_s cn58xxp1;
+};
+
+union cvmx_fpa_ctl_status {
+       uint64_t u64;
+       struct cvmx_fpa_ctl_status_s {
+               uint64_t reserved_18_63:46;
+               uint64_t reset:1;
+               uint64_t use_ldt:1;
+               uint64_t use_stt:1;
+               uint64_t enb:1;
+               uint64_t mem1_err:7;
+               uint64_t mem0_err:7;
+       } s;
+       struct cvmx_fpa_ctl_status_s cn30xx;
+       struct cvmx_fpa_ctl_status_s cn31xx;
+       struct cvmx_fpa_ctl_status_s cn38xx;
+       struct cvmx_fpa_ctl_status_s cn38xxp2;
+       struct cvmx_fpa_ctl_status_s cn50xx;
+       struct cvmx_fpa_ctl_status_s cn52xx;
+       struct cvmx_fpa_ctl_status_s cn52xxp1;
+       struct cvmx_fpa_ctl_status_s cn56xx;
+       struct cvmx_fpa_ctl_status_s cn56xxp1;
+       struct cvmx_fpa_ctl_status_s cn58xx;
+       struct cvmx_fpa_ctl_status_s cn58xxp1;
+};
+
+union cvmx_fpa_fpfx_marks {
+       uint64_t u64;
+       struct cvmx_fpa_fpfx_marks_s {
+               uint64_t reserved_22_63:42;
+               uint64_t fpf_wr:11;
+               uint64_t 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;
+};
+
+union cvmx_fpa_fpfx_size {
+       uint64_t u64;
+       struct cvmx_fpa_fpfx_size_s {
+               uint64_t reserved_11_63:53;
+               uint64_t 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;
+};
+
+union cvmx_fpa_fpf0_marks {
+       uint64_t u64;
+       struct cvmx_fpa_fpf0_marks_s {
+               uint64_t reserved_24_63:40;
+               uint64_t fpf_wr:12;
+               uint64_t 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;
+};
+
+union cvmx_fpa_fpf0_size {
+       uint64_t u64;
+       struct cvmx_fpa_fpf0_size_s {
+               uint64_t reserved_12_63:52;
+               uint64_t 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;
+};
+
+union cvmx_fpa_int_enb {
+       uint64_t u64;
+       struct cvmx_fpa_int_enb_s {
+               uint64_t reserved_28_63:36;
+               uint64_t q7_perr:1;
+               uint64_t q7_coff:1;
+               uint64_t q7_und:1;
+               uint64_t q6_perr:1;
+               uint64_t q6_coff:1;
+               uint64_t q6_und:1;
+               uint64_t q5_perr:1;
+               uint64_t q5_coff:1;
+               uint64_t q5_und:1;
+               uint64_t q4_perr:1;
+               uint64_t q4_coff:1;
+               uint64_t q4_und:1;
+               uint64_t q3_perr:1;
+               uint64_t q3_coff:1;
+               uint64_t q3_und:1;
+               uint64_t q2_perr:1;
+               uint64_t q2_coff:1;
+               uint64_t q2_und:1;
+               uint64_t q1_perr:1;
+               uint64_t q1_coff:1;
+               uint64_t q1_und:1;
+               uint64_t q0_perr:1;
+               uint64_t q0_coff:1;
+               uint64_t q0_und:1;
+               uint64_t fed1_dbe:1;
+               uint64_t fed1_sbe:1;
+               uint64_t fed0_dbe:1;
+               uint64_t fed0_sbe:1;
+       } s;
+       struct cvmx_fpa_int_enb_s cn30xx;
+       struct cvmx_fpa_int_enb_s cn31xx;
+       struct cvmx_fpa_int_enb_s cn38xx;
+       struct cvmx_fpa_int_enb_s cn38xxp2;
+       struct cvmx_fpa_int_enb_s cn50xx;
+       struct cvmx_fpa_int_enb_s cn52xx;
+       struct cvmx_fpa_int_enb_s cn52xxp1;
+       struct cvmx_fpa_int_enb_s cn56xx;
+       struct cvmx_fpa_int_enb_s cn56xxp1;
+       struct cvmx_fpa_int_enb_s cn58xx;
+       struct cvmx_fpa_int_enb_s cn58xxp1;
+};
+
+union cvmx_fpa_int_sum {
+       uint64_t u64;
+       struct cvmx_fpa_int_sum_s {
+               uint64_t reserved_28_63:36;
+               uint64_t q7_perr:1;
+               uint64_t q7_coff:1;
+               uint64_t q7_und:1;
+               uint64_t q6_perr:1;
+               uint64_t q6_coff:1;
+               uint64_t q6_und:1;
+               uint64_t q5_perr:1;
+               uint64_t q5_coff:1;
+               uint64_t q5_und:1;
+               uint64_t q4_perr:1;
+               uint64_t q4_coff:1;
+               uint64_t q4_und:1;
+               uint64_t q3_perr:1;
+               uint64_t q3_coff:1;
+               uint64_t q3_und:1;
+               uint64_t q2_perr:1;
+               uint64_t q2_coff:1;
+               uint64_t q2_und:1;
+               uint64_t q1_perr:1;
+               uint64_t q1_coff:1;
+               uint64_t q1_und:1;
+               uint64_t q0_perr:1;
+               uint64_t q0_coff:1;
+               uint64_t q0_und:1;
+               uint64_t fed1_dbe:1;
+               uint64_t fed1_sbe:1;
+               uint64_t fed0_dbe:1;
+               uint64_t fed0_sbe:1;
+       } s;
+       struct cvmx_fpa_int_sum_s cn30xx;
+       struct cvmx_fpa_int_sum_s cn31xx;
+       struct cvmx_fpa_int_sum_s cn38xx;
+       struct cvmx_fpa_int_sum_s cn38xxp2;
+       struct cvmx_fpa_int_sum_s cn50xx;
+       struct cvmx_fpa_int_sum_s cn52xx;
+       struct cvmx_fpa_int_sum_s cn52xxp1;
+       struct cvmx_fpa_int_sum_s cn56xx;
+       struct cvmx_fpa_int_sum_s cn56xxp1;
+       struct cvmx_fpa_int_sum_s cn58xx;
+       struct cvmx_fpa_int_sum_s cn58xxp1;
+};
+
+union cvmx_fpa_quex_available {
+       uint64_t u64;
+       struct cvmx_fpa_quex_available_s {
+               uint64_t reserved_29_63:35;
+               uint64_t que_siz:29;
+       } s;
+       struct cvmx_fpa_quex_available_s cn30xx;
+       struct cvmx_fpa_quex_available_s cn31xx;
+       struct cvmx_fpa_quex_available_s cn38xx;
+       struct cvmx_fpa_quex_available_s cn38xxp2;
+       struct cvmx_fpa_quex_available_s cn50xx;
+       struct cvmx_fpa_quex_available_s cn52xx;
+       struct cvmx_fpa_quex_available_s cn52xxp1;
+       struct cvmx_fpa_quex_available_s cn56xx;
+       struct cvmx_fpa_quex_available_s cn56xxp1;
+       struct cvmx_fpa_quex_available_s cn58xx;
+       struct cvmx_fpa_quex_available_s cn58xxp1;
+};
+
+union cvmx_fpa_quex_page_index {
+       uint64_t u64;
+       struct cvmx_fpa_quex_page_index_s {
+               uint64_t reserved_25_63:39;
+               uint64_t 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;
+};
+
+union cvmx_fpa_que_act {
+       uint64_t u64;
+       struct cvmx_fpa_que_act_s {
+               uint64_t reserved_29_63:35;
+               uint64_t act_que:3;
+               uint64_t 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;
+};
+
+union cvmx_fpa_que_exp {
+       uint64_t u64;
+       struct cvmx_fpa_que_exp_s {
+               uint64_t reserved_29_63:35;
+               uint64_t exp_que:3;
+               uint64_t 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;
+};
+
+union cvmx_fpa_wart_ctl {
+       uint64_t u64;
+       struct cvmx_fpa_wart_ctl_s {
+               uint64_t reserved_16_63:48;
+               uint64_t 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;
+};
+
+union cvmx_fpa_wart_status {
+       uint64_t u64;
+       struct cvmx_fpa_wart_status_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+#endif
diff --git a/arch/mips/include/asm/octeon/cvmx-fpa.h b/arch/mips/include/asm/octeon/cvmx-fpa.h
new file mode 100644 (file)
index 0000000..1f04f96
--- /dev/null
@@ -0,0 +1,299 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/**
+ * @file
+ *
+ * Interface to the hardware Free Pool Allocator.
+ *
+ *
+ */
+
+#ifndef __CVMX_FPA_H__
+#define __CVMX_FPA_H__
+
+#include "cvmx-address.h"
+#include "cvmx-fpa-defs.h"
+
+#define CVMX_FPA_NUM_POOLS      8
+#define CVMX_FPA_MIN_BLOCK_SIZE 128
+#define CVMX_FPA_ALIGNMENT      128
+
+/**
+ * Structure describing the data format used for stores to the FPA.
+ */
+typedef union {
+       uint64_t u64;
+       struct {
+               /*
+                * the (64-bit word) location in scratchpad to write
+                * to (if len != 0)
+                */
+               uint64_t scraddr:8;
+               /* the number of words in the response (0 => no response) */
+               uint64_t len:8;
+               /* the ID of the device on the non-coherent bus */
+               uint64_t did:8;
+               /*
+                * the address that will appear in the first tick on
+                * the NCB bus.
+                */
+               uint64_t addr:40;
+       } s;
+} cvmx_fpa_iobdma_data_t;
+
+/**
+ * Structure describing the current state of a FPA pool.
+ */
+typedef struct {
+       /* Name it was created under */
+       const char *name;
+       /* Size of each block */
+       uint64_t size;
+       /* The base memory address of whole block */
+       void *base;
+       /* The number of elements in the pool at creation */
+       uint64_t starting_element_count;
+} cvmx_fpa_pool_info_t;
+
+/**
+ * Current state of all the pools. Use access functions
+ * instead of using it directly.
+ */
+extern cvmx_fpa_pool_info_t cvmx_fpa_pool_info[CVMX_FPA_NUM_POOLS];
+
+/* CSR typedefs have been moved to cvmx-csr-*.h */
+
+/**
+ * Return the name of the pool
+ *
+ * @pool:   Pool to get the name of
+ * Returns The name
+ */
+static inline const char *cvmx_fpa_get_name(uint64_t pool)
+{
+       return cvmx_fpa_pool_info[pool].name;
+}
+
+/**
+ * Return the base of the pool
+ *
+ * @pool:   Pool to get the base of
+ * Returns The base
+ */
+static inline void *cvmx_fpa_get_base(uint64_t pool)
+{
+       return cvmx_fpa_pool_info[pool].base;
+}
+
+/**
+ * Check if a pointer belongs to an FPA pool. Return non-zero
+ * if the supplied pointer is inside the memory controlled by
+ * an FPA pool.
+ *
+ * @pool:   Pool to check
+ * @ptr:    Pointer to check
+ * Returns Non-zero if pointer is in the pool. Zero if not
+ */
+static inline int cvmx_fpa_is_member(uint64_t pool, void *ptr)
+{
+       return ((ptr >= cvmx_fpa_pool_info[pool].base) &&
+               ((char *)ptr <
+                ((char *)(cvmx_fpa_pool_info[pool].base)) +
+                cvmx_fpa_pool_info[pool].size *
+                cvmx_fpa_pool_info[pool].starting_element_count));
+}
+
+/**
+ * Enable the FPA for use. Must be performed after any CSR
+ * configuration but before any other FPA functions.
+ */
+static inline void cvmx_fpa_enable(void)
+{
+       union cvmx_fpa_ctl_status status;
+
+       status.u64 = cvmx_read_csr(CVMX_FPA_CTL_STATUS);
+       if (status.s.enb) {
+               cvmx_dprintf
+                   ("Warning: Enabling FPA when FPA already enabled.\n");
+       }
+
+       /*
+        * Do runtime check as we allow pass1 compiled code to run on
+        * pass2 chips.
+        */
+       if (cvmx_octeon_is_pass1()) {
+               union cvmx_fpa_fpfx_marks marks;
+               int i;
+               for (i = 1; i < 8; i++) {
+                       marks.u64 =
+                           cvmx_read_csr(CVMX_FPA_FPF1_MARKS + (i - 1) * 8ull);
+                       marks.s.fpf_wr = 0xe0;
+                       cvmx_write_csr(CVMX_FPA_FPF1_MARKS + (i - 1) * 8ull,
+                                      marks.u64);
+               }
+
+               /* Enforce a 10 cycle delay between config and enable */
+               cvmx_wait(10);
+       }
+
+       /* FIXME: CVMX_FPA_CTL_STATUS read is unmodelled */
+       status.u64 = 0;
+       status.s.enb = 1;
+       cvmx_write_csr(CVMX_FPA_CTL_STATUS, status.u64);
+}
+
+/**
+ * Get a new block from the FPA
+ *
+ * @pool:   Pool to get the block from
+ * Returns Pointer to the block or NULL on failure
+ */
+static inline void *cvmx_fpa_alloc(uint64_t pool)
+{
+       uint64_t address =
+           cvmx_read_csr(CVMX_ADDR_DID(CVMX_FULL_DID(CVMX_OCT_DID_FPA, pool)));
+       if (address)
+               return cvmx_phys_to_ptr(address);
+       else
+               return NULL;
+}
+
+/**
+ * Asynchronously get a new block from the FPA
+ *
+ * @scr_addr: Local scratch address to put response in.  This is a byte address,
+ *                  but must be 8 byte aligned.
+ * @pool:      Pool to get the block from
+ */
+static inline void cvmx_fpa_async_alloc(uint64_t scr_addr, uint64_t pool)
+{
+       cvmx_fpa_iobdma_data_t data;
+
+       /*
+        * Hardware only uses 64 bit aligned locations, so convert
+        * from byte address to 64-bit index
+        */
+       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_send_single(data.u64);
+}
+
+/**
+ * Free a block allocated with a FPA pool.  Does NOT provide memory
+ * ordering in cases where the memory block was modified by the core.
+ *
+ * @ptr:    Block to free
+ * @pool:   Pool to put it in
+ * @num_cache_lines:
+ *               Cache lines to invalidate
+ */
+static inline void cvmx_fpa_free_nosync(void *ptr, uint64_t pool,
+                                       uint64_t 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 */
+       barrier();
+       /* value written is number of cache lines not written back */
+       cvmx_write_io(newptr.u64, num_cache_lines);
+}
+
+/**
+ * Free a block allocated with a FPA pool.  Provides required memory
+ * ordering in cases where memory block was modified by core.
+ *
+ * @ptr:    Block to free
+ * @pool:   Pool to put it in
+ * @num_cache_lines:
+ *               Cache lines to invalidate
+ */
+static inline void cvmx_fpa_free(void *ptr, uint64_t pool,
+                                uint64_t 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);
+}
+
+/**
+ * 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.
+ *
+ * @pool:       Pool to initialize
+ *                   0 <= pool < 8
+ * @name:       Constant character string to name this pool.
+ *                   String is not copied.
+ * @buffer:     Pointer to the block of memory to use. This must be
+ *                   accessible by all processors and external hardware.
+ * @block_size: Size for each block controlled by the FPA
+ * @num_blocks: Number of blocks
+ *
+ * Returns 0 on Success,
+ *         -1 on failure
+ */
+extern int cvmx_fpa_setup_pool(uint64_t pool, const char *name, void *buffer,
+                              uint64_t block_size, uint64_t num_blocks);
+
+/**
+ * Shutdown a Memory pool and validate that it had all of
+ * the buffers originally placed in it. This should only be
+ * called by one processor after all hardware has finished
+ * using the pool.
+ *
+ * @pool:   Pool to shutdown
+ * Returns Zero on success
+ *         - Positive is count of missing buffers
+ *         - Negative is too many buffers or corrupted pointers
+ */
+extern uint64_t cvmx_fpa_shutdown_pool(uint64_t pool);
+
+/**
+ * Get the size of blocks controlled by the pool
+ * This is resolved to a constant at compile time.
+ *
+ * @pool:   Pool to access
+ * Returns Size of the block in bytes
+ */
+uint64_t cvmx_fpa_get_block_size(uint64_t pool);
+
+#endif /*  __CVM_FPA_H__ */
diff --git a/arch/mips/include/asm/octeon/cvmx-gmxx-defs.h b/arch/mips/include/asm/octeon/cvmx-gmxx-defs.h
new file mode 100644 (file)
index 0000000..946a43a
--- /dev/null
@@ -0,0 +1,2529 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+#ifndef __CVMX_GMXX_DEFS_H__
+#define __CVMX_GMXX_DEFS_H__
+
+#define CVMX_GMXX_BAD_REG(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000518ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_BIST(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000400ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_CLK_EN(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080007F0ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_HG2_CONTROL(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000550ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_INF_MODE(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080007F8ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_NXA_ADR(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000510ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_PRTX_CBFC_CTL(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000580ull + (((offset) & 0) * 8) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_PRTX_CFG(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000010ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_ADR_CAM0(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000180ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_ADR_CAM1(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000188ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_ADR_CAM2(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000190ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_ADR_CAM3(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000198ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_ADR_CAM4(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080001A0ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_ADR_CAM5(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080001A8ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_ADR_CAM_EN(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000108ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_ADR_CTL(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000100ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_DECISION(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000040ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_FRM_CHK(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000020ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_FRM_CTL(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000018ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_FRM_MAX(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000030ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_FRM_MIN(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000028ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_IFG(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000058ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_INT_EN(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000008ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_INT_REG(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000000ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_JABBER(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000038ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_PAUSE_DROP_TIME(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000068ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_RX_INBND(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000060ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_STATS_CTL(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000050ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_STATS_OCTS(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000088ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_STATS_OCTS_CTL(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000098ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_STATS_OCTS_DMAC(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080000A8ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_STATS_OCTS_DRP(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080000B8ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_STATS_PKTS(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000080ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_STATS_PKTS_BAD(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080000C0ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_STATS_PKTS_CTL(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000090ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_STATS_PKTS_DMAC(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080000A0ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_STATS_PKTS_DRP(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080000B0ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RXX_UDD_SKP(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000048ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RX_BP_DROPX(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000420ull + (((offset) & 3) * 8) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RX_BP_OFFX(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000460ull + (((offset) & 3) * 8) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RX_BP_ONX(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000440ull + (((offset) & 3) * 8) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RX_HG2_STATUS(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000548ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RX_PASS_EN(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080005F8ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RX_PASS_MAPX(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000600ull + (((offset) & 15) * 8) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RX_PRTS(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000410ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RX_PRT_INFO(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080004E8ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RX_TX_STATUS(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080007E8ull + (((block_id) & 0) * 0x8000000ull))
+#define CVMX_GMXX_RX_XAUI_BAD_COL(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000538ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_RX_XAUI_CTL(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000530ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_SMACX(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000230ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_STAT_BP(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000520ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_APPEND(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000218ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_BURST(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000228ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_CBFC_XOFF(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080005A0ull + (((offset) & 0) * 8) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_CBFC_XON(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080005C0ull + (((offset) & 0) * 8) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_CLK(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000208ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_CTL(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000270ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_MIN_PKT(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000240ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_PAUSE_PKT_INTERVAL(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000248ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_PAUSE_PKT_TIME(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000238ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_PAUSE_TOGO(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000258ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_PAUSE_ZERO(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000260ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_SGMII_CTL(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000300ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_SLOT(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000220ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_SOFT_PAUSE(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000250ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_STAT0(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000280ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_STAT1(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000288ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_STAT2(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000290ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_STAT3(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000298ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_STAT4(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080002A0ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_STAT5(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080002A8ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_STAT6(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080002B0ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_STAT7(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080002B8ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_STAT8(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080002C0ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_STAT9(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080002C8ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_STATS_CTL(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000268ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TXX_THRESH(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000210ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TX_BP(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080004D0ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TX_CLK_MSKX(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000780ull + (((offset) & 1) * 8) + (((block_id) & 0) * 0x0ull))
+#define CVMX_GMXX_TX_COL_ATTEMPT(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000498ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TX_CORRUPT(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080004D8ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TX_HG2_REG1(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000558ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TX_HG2_REG2(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000560ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TX_IFG(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000488ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TX_INT_EN(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000508ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TX_INT_REG(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000500ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TX_JAM(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000490ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TX_LFSR(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080004F8ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TX_OVR_BP(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080004C8ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TX_PAUSE_PKT_DMAC(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080004A0ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TX_PAUSE_PKT_TYPE(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080004A8ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TX_PRTS(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000480ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TX_SPI_CTL(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080004C0ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TX_SPI_DRAIN(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080004E0ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TX_SPI_MAX(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080004B0ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TX_SPI_ROUNDX(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000680ull + (((offset) & 31) * 8) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TX_SPI_THRESH(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800080004B8ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_TX_XAUI_CTL(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000528ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_GMXX_XAUI_EXT_LOOPBACK(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180008000540ull + (((block_id) & 1) * 0x8000000ull))
+
+union cvmx_gmxx_bad_reg {
+       uint64_t u64;
+       struct cvmx_gmxx_bad_reg_s {
+               uint64_t reserved_31_63:33;
+               uint64_t inb_nxa:4;
+               uint64_t statovr:1;
+               uint64_t loststat:4;
+               uint64_t reserved_18_21:4;
+               uint64_t out_ovr:16;
+               uint64_t ncb_ovr:1;
+               uint64_t out_col:1;
+       } s;
+       struct cvmx_gmxx_bad_reg_cn30xx {
+               uint64_t reserved_31_63:33;
+               uint64_t inb_nxa:4;
+               uint64_t statovr:1;
+               uint64_t reserved_25_25:1;
+               uint64_t loststat:3;
+               uint64_t reserved_5_21:17;
+               uint64_t out_ovr:3;
+               uint64_t 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 {
+               uint64_t reserved_31_63:33;
+               uint64_t inb_nxa:4;
+               uint64_t statovr:1;
+               uint64_t loststat:4;
+               uint64_t reserved_6_21:16;
+               uint64_t out_ovr:4;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_bist {
+       uint64_t u64;
+       struct cvmx_gmxx_bist_s {
+               uint64_t reserved_17_63:47;
+               uint64_t status:17;
+       } s;
+       struct cvmx_gmxx_bist_cn30xx {
+               uint64_t reserved_10_63:54;
+               uint64_t 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 {
+               uint64_t reserved_12_63:52;
+               uint64_t status:12;
+       } cn50xx;
+       struct cvmx_gmxx_bist_cn52xx {
+               uint64_t reserved_16_63:48;
+               uint64_t 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_s cn58xx;
+       struct cvmx_gmxx_bist_s cn58xxp1;
+};
+
+union cvmx_gmxx_clk_en {
+       uint64_t u64;
+       struct cvmx_gmxx_clk_en_s {
+               uint64_t reserved_1_63:63;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_hg2_control {
+       uint64_t u64;
+       struct cvmx_gmxx_hg2_control_s {
+               uint64_t reserved_19_63:45;
+               uint64_t hg2tx_en:1;
+               uint64_t hg2rx_en:1;
+               uint64_t phys_en:1;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_inf_mode {
+       uint64_t u64;
+       struct cvmx_gmxx_inf_mode_s {
+               uint64_t reserved_10_63:54;
+               uint64_t speed:2;
+               uint64_t reserved_6_7:2;
+               uint64_t mode:2;
+               uint64_t reserved_3_3:1;
+               uint64_t p0mii:1;
+               uint64_t en:1;
+               uint64_t type:1;
+       } s;
+       struct cvmx_gmxx_inf_mode_cn30xx {
+               uint64_t reserved_3_63:61;
+               uint64_t p0mii:1;
+               uint64_t en:1;
+               uint64_t type:1;
+       } cn30xx;
+       struct cvmx_gmxx_inf_mode_cn31xx {
+               uint64_t reserved_2_63:62;
+               uint64_t en:1;
+               uint64_t 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 {
+               uint64_t reserved_10_63:54;
+               uint64_t speed:2;
+               uint64_t reserved_6_7:2;
+               uint64_t mode:2;
+               uint64_t reserved_2_3:2;
+               uint64_t en:1;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_nxa_adr {
+       uint64_t u64;
+       struct cvmx_gmxx_nxa_adr_s {
+               uint64_t reserved_6_63:58;
+               uint64_t prt:6;
+       } s;
+       struct cvmx_gmxx_nxa_adr_s cn30xx;
+       struct cvmx_gmxx_nxa_adr_s cn31xx;
+       struct cvmx_gmxx_nxa_adr_s cn38xx;
+       struct cvmx_gmxx_nxa_adr_s cn38xxp2;
+       struct cvmx_gmxx_nxa_adr_s cn50xx;
+       struct cvmx_gmxx_nxa_adr_s cn52xx;
+       struct cvmx_gmxx_nxa_adr_s cn52xxp1;
+       struct cvmx_gmxx_nxa_adr_s cn56xx;
+       struct cvmx_gmxx_nxa_adr_s cn56xxp1;
+       struct cvmx_gmxx_nxa_adr_s cn58xx;
+       struct cvmx_gmxx_nxa_adr_s cn58xxp1;
+};
+
+union cvmx_gmxx_prtx_cbfc_ctl {
+       uint64_t u64;
+       struct cvmx_gmxx_prtx_cbfc_ctl_s {
+               uint64_t phys_en:16;
+               uint64_t logl_en:16;
+               uint64_t phys_bp:16;
+               uint64_t reserved_4_15:12;
+               uint64_t bck_en:1;
+               uint64_t drp_en:1;
+               uint64_t tx_en:1;
+               uint64_t rx_en:1;
+       } s;
+       struct cvmx_gmxx_prtx_cbfc_ctl_s cn52xx;
+       struct cvmx_gmxx_prtx_cbfc_ctl_s cn56xx;
+};
+
+union cvmx_gmxx_prtx_cfg {
+       uint64_t u64;
+       struct cvmx_gmxx_prtx_cfg_s {
+               uint64_t reserved_14_63:50;
+               uint64_t tx_idle:1;
+               uint64_t rx_idle:1;
+               uint64_t reserved_9_11:3;
+               uint64_t speed_msb:1;
+               uint64_t reserved_4_7:4;
+               uint64_t slottime:1;
+               uint64_t duplex:1;
+               uint64_t speed:1;
+               uint64_t en:1;
+       } s;
+       struct cvmx_gmxx_prtx_cfg_cn30xx {
+               uint64_t reserved_4_63:60;
+               uint64_t slottime:1;
+               uint64_t duplex:1;
+               uint64_t speed:1;
+               uint64_t 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_s cn52xx;
+       struct cvmx_gmxx_prtx_cfg_s cn52xxp1;
+       struct cvmx_gmxx_prtx_cfg_s cn56xx;
+       struct cvmx_gmxx_prtx_cfg_s cn56xxp1;
+       struct cvmx_gmxx_prtx_cfg_cn30xx cn58xx;
+       struct cvmx_gmxx_prtx_cfg_cn30xx cn58xxp1;
+};
+
+union cvmx_gmxx_rxx_adr_cam0 {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_adr_cam0_s {
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_adr_cam1 {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_adr_cam1_s {
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_adr_cam2 {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_adr_cam2_s {
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_adr_cam3 {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_adr_cam3_s {
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_adr_cam4 {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_adr_cam4_s {
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_adr_cam5 {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_adr_cam5_s {
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_adr_cam_en {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_adr_cam_en_s {
+               uint64_t reserved_8_63:56;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_adr_ctl {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_adr_ctl_s {
+               uint64_t reserved_4_63:60;
+               uint64_t cam_mode:1;
+               uint64_t mcst:2;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_decision {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_decision_s {
+               uint64_t reserved_5_63:59;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_frm_chk {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_frm_chk_s {
+               uint64_t reserved_10_63:54;
+               uint64_t niberr:1;
+               uint64_t skperr:1;
+               uint64_t rcverr:1;
+               uint64_t lenerr:1;
+               uint64_t alnerr:1;
+               uint64_t fcserr:1;
+               uint64_t jabber:1;
+               uint64_t maxerr:1;
+               uint64_t carext:1;
+               uint64_t 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 {
+               uint64_t reserved_10_63:54;
+               uint64_t niberr:1;
+               uint64_t skperr:1;
+               uint64_t rcverr:1;
+               uint64_t reserved_6_6:1;
+               uint64_t alnerr:1;
+               uint64_t fcserr:1;
+               uint64_t jabber:1;
+               uint64_t reserved_2_2:1;
+               uint64_t carext:1;
+               uint64_t reserved_0_0:1;
+       } cn50xx;
+       struct cvmx_gmxx_rxx_frm_chk_cn52xx {
+               uint64_t reserved_9_63:55;
+               uint64_t skperr:1;
+               uint64_t rcverr:1;
+               uint64_t reserved_5_6:2;
+               uint64_t fcserr:1;
+               uint64_t jabber:1;
+               uint64_t reserved_2_2:1;
+               uint64_t carext:1;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_frm_ctl {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_frm_ctl_s {
+               uint64_t reserved_11_63:53;
+               uint64_t null_dis:1;
+               uint64_t pre_align:1;
+               uint64_t pad_len:1;
+               uint64_t vlan_len:1;
+               uint64_t pre_free:1;
+               uint64_t ctl_smac:1;
+               uint64_t ctl_mcst:1;
+               uint64_t ctl_bck:1;
+               uint64_t ctl_drp:1;
+               uint64_t pre_strp:1;
+               uint64_t pre_chk:1;
+       } s;
+       struct cvmx_gmxx_rxx_frm_ctl_cn30xx {
+               uint64_t reserved_9_63:55;
+               uint64_t pad_len:1;
+               uint64_t vlan_len:1;
+               uint64_t pre_free:1;
+               uint64_t ctl_smac:1;
+               uint64_t ctl_mcst:1;
+               uint64_t ctl_bck:1;
+               uint64_t ctl_drp:1;
+               uint64_t pre_strp:1;
+               uint64_t pre_chk:1;
+       } cn30xx;
+       struct cvmx_gmxx_rxx_frm_ctl_cn31xx {
+               uint64_t reserved_8_63:56;
+               uint64_t vlan_len:1;
+               uint64_t pre_free:1;
+               uint64_t ctl_smac:1;
+               uint64_t ctl_mcst:1;
+               uint64_t ctl_bck:1;
+               uint64_t ctl_drp:1;
+               uint64_t pre_strp:1;
+               uint64_t 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 {
+               uint64_t reserved_11_63:53;
+               uint64_t null_dis:1;
+               uint64_t pre_align:1;
+               uint64_t reserved_7_8:2;
+               uint64_t pre_free:1;
+               uint64_t ctl_smac:1;
+               uint64_t ctl_mcst:1;
+               uint64_t ctl_bck:1;
+               uint64_t ctl_drp:1;
+               uint64_t pre_strp:1;
+               uint64_t 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 {
+               uint64_t reserved_10_63:54;
+               uint64_t pre_align:1;
+               uint64_t reserved_7_8:2;
+               uint64_t pre_free:1;
+               uint64_t ctl_smac:1;
+               uint64_t ctl_mcst:1;
+               uint64_t ctl_bck:1;
+               uint64_t ctl_drp:1;
+               uint64_t pre_strp:1;
+               uint64_t pre_chk:1;
+       } cn56xxp1;
+       struct cvmx_gmxx_rxx_frm_ctl_s cn58xx;
+       struct cvmx_gmxx_rxx_frm_ctl_cn30xx cn58xxp1;
+};
+
+union cvmx_gmxx_rxx_frm_max {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_frm_max_s {
+               uint64_t reserved_16_63:48;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_frm_min {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_frm_min_s {
+               uint64_t reserved_16_63:48;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_ifg {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_ifg_s {
+               uint64_t reserved_4_63:60;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_int_en {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_int_en_s {
+               uint64_t reserved_29_63:35;
+               uint64_t hg2cc:1;
+               uint64_t hg2fld:1;
+               uint64_t undat:1;
+               uint64_t uneop:1;
+               uint64_t unsop:1;
+               uint64_t bad_term:1;
+               uint64_t bad_seq:1;
+               uint64_t rem_fault:1;
+               uint64_t loc_fault:1;
+               uint64_t pause_drp:1;
+               uint64_t phy_dupx:1;
+               uint64_t phy_spd:1;
+               uint64_t phy_link:1;
+               uint64_t ifgerr:1;
+               uint64_t coldet:1;
+               uint64_t falerr:1;
+               uint64_t rsverr:1;
+               uint64_t pcterr:1;
+               uint64_t ovrerr:1;
+               uint64_t niberr:1;
+               uint64_t skperr:1;
+               uint64_t rcverr:1;
+               uint64_t lenerr:1;
+               uint64_t alnerr:1;
+               uint64_t fcserr:1;
+               uint64_t jabber:1;
+               uint64_t maxerr:1;
+               uint64_t carext:1;
+               uint64_t minerr:1;
+       } s;
+       struct cvmx_gmxx_rxx_int_en_cn30xx {
+               uint64_t reserved_19_63:45;
+               uint64_t phy_dupx:1;
+               uint64_t phy_spd:1;
+               uint64_t phy_link:1;
+               uint64_t ifgerr:1;
+               uint64_t coldet:1;
+               uint64_t falerr:1;
+               uint64_t rsverr:1;
+               uint64_t pcterr:1;
+               uint64_t ovrerr:1;
+               uint64_t niberr:1;
+               uint64_t skperr:1;
+               uint64_t rcverr:1;
+               uint64_t lenerr:1;
+               uint64_t alnerr:1;
+               uint64_t fcserr:1;
+               uint64_t jabber:1;
+               uint64_t maxerr:1;
+               uint64_t carext:1;
+               uint64_t 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 {
+               uint64_t reserved_20_63:44;
+               uint64_t pause_drp:1;
+               uint64_t phy_dupx:1;
+               uint64_t phy_spd:1;
+               uint64_t phy_link:1;
+               uint64_t ifgerr:1;
+               uint64_t coldet:1;
+               uint64_t falerr:1;
+               uint64_t rsverr:1;
+               uint64_t pcterr:1;
+               uint64_t ovrerr:1;
+               uint64_t niberr:1;
+               uint64_t skperr:1;
+               uint64_t rcverr:1;
+               uint64_t reserved_6_6:1;
+               uint64_t alnerr:1;
+               uint64_t fcserr:1;
+               uint64_t jabber:1;
+               uint64_t reserved_2_2:1;
+               uint64_t carext:1;
+               uint64_t reserved_0_0:1;
+       } cn50xx;
+       struct cvmx_gmxx_rxx_int_en_cn52xx {
+               uint64_t reserved_29_63:35;
+               uint64_t hg2cc:1;
+               uint64_t hg2fld:1;
+               uint64_t undat:1;
+               uint64_t uneop:1;
+               uint64_t unsop:1;
+               uint64_t bad_term:1;
+               uint64_t bad_seq:1;
+               uint64_t rem_fault:1;
+               uint64_t loc_fault:1;
+               uint64_t pause_drp:1;
+               uint64_t reserved_16_18:3;
+               uint64_t ifgerr:1;
+               uint64_t coldet:1;
+               uint64_t falerr:1;
+               uint64_t rsverr:1;
+               uint64_t pcterr:1;
+               uint64_t ovrerr:1;
+               uint64_t reserved_9_9:1;
+               uint64_t skperr:1;
+               uint64_t rcverr:1;
+               uint64_t reserved_5_6:2;
+               uint64_t fcserr:1;
+               uint64_t jabber:1;
+               uint64_t reserved_2_2:1;
+               uint64_t carext:1;
+               uint64_t 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 {
+               uint64_t reserved_27_63:37;
+               uint64_t undat:1;
+               uint64_t uneop:1;
+               uint64_t unsop:1;
+               uint64_t bad_term:1;
+               uint64_t bad_seq:1;
+               uint64_t rem_fault:1;
+               uint64_t loc_fault:1;
+               uint64_t pause_drp:1;
+               uint64_t reserved_16_18:3;
+               uint64_t ifgerr:1;
+               uint64_t coldet:1;
+               uint64_t falerr:1;
+               uint64_t rsverr:1;
+               uint64_t pcterr:1;
+               uint64_t ovrerr:1;
+               uint64_t reserved_9_9:1;
+               uint64_t skperr:1;
+               uint64_t rcverr:1;
+               uint64_t reserved_5_6:2;
+               uint64_t fcserr:1;
+               uint64_t jabber:1;
+               uint64_t reserved_2_2:1;
+               uint64_t carext:1;
+               uint64_t reserved_0_0:1;
+       } cn56xxp1;
+       struct cvmx_gmxx_rxx_int_en_cn58xx {
+               uint64_t reserved_20_63:44;
+               uint64_t pause_drp:1;
+               uint64_t phy_dupx:1;
+               uint64_t phy_spd:1;
+               uint64_t phy_link:1;
+               uint64_t ifgerr:1;
+               uint64_t coldet:1;
+               uint64_t falerr:1;
+               uint64_t rsverr:1;
+               uint64_t pcterr:1;
+               uint64_t ovrerr:1;
+               uint64_t niberr:1;
+               uint64_t skperr:1;
+               uint64_t rcverr:1;
+               uint64_t lenerr:1;
+               uint64_t alnerr:1;
+               uint64_t fcserr:1;
+               uint64_t jabber:1;
+               uint64_t maxerr:1;
+               uint64_t carext:1;
+               uint64_t minerr:1;
+       } cn58xx;
+       struct cvmx_gmxx_rxx_int_en_cn58xx cn58xxp1;
+};
+
+union cvmx_gmxx_rxx_int_reg {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_int_reg_s {
+               uint64_t reserved_29_63:35;
+               uint64_t hg2cc:1;
+               uint64_t hg2fld:1;
+               uint64_t undat:1;
+               uint64_t uneop:1;
+               uint64_t unsop:1;
+               uint64_t bad_term:1;
+               uint64_t bad_seq:1;
+               uint64_t rem_fault:1;
+               uint64_t loc_fault:1;
+               uint64_t pause_drp:1;
+               uint64_t phy_dupx:1;
+               uint64_t phy_spd:1;
+               uint64_t phy_link:1;
+               uint64_t ifgerr:1;
+               uint64_t coldet:1;
+               uint64_t falerr:1;
+               uint64_t rsverr:1;
+               uint64_t pcterr:1;
+               uint64_t ovrerr:1;
+               uint64_t niberr:1;
+               uint64_t skperr:1;
+               uint64_t rcverr:1;
+               uint64_t lenerr:1;
+               uint64_t alnerr:1;
+               uint64_t fcserr:1;
+               uint64_t jabber:1;
+               uint64_t maxerr:1;
+               uint64_t carext:1;
+               uint64_t minerr:1;
+       } s;
+       struct cvmx_gmxx_rxx_int_reg_cn30xx {
+               uint64_t reserved_19_63:45;
+               uint64_t phy_dupx:1;
+               uint64_t phy_spd:1;
+               uint64_t phy_link:1;
+               uint64_t ifgerr:1;
+               uint64_t coldet:1;
+               uint64_t falerr:1;
+               uint64_t rsverr:1;
+               uint64_t pcterr:1;
+               uint64_t ovrerr:1;
+               uint64_t niberr:1;
+               uint64_t skperr:1;
+               uint64_t rcverr:1;
+               uint64_t lenerr:1;
+               uint64_t alnerr:1;
+               uint64_t fcserr:1;
+               uint64_t jabber:1;
+               uint64_t maxerr:1;
+               uint64_t carext:1;
+               uint64_t 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 {
+               uint64_t reserved_20_63:44;
+               uint64_t pause_drp:1;
+               uint64_t phy_dupx:1;
+               uint64_t phy_spd:1;
+               uint64_t phy_link:1;
+               uint64_t ifgerr:1;
+               uint64_t coldet:1;
+               uint64_t falerr:1;
+               uint64_t rsverr:1;
+               uint64_t pcterr:1;
+               uint64_t ovrerr:1;
+               uint64_t niberr:1;
+               uint64_t skperr:1;
+               uint64_t rcverr:1;
+               uint64_t reserved_6_6:1;
+               uint64_t alnerr:1;
+               uint64_t fcserr:1;
+               uint64_t jabber:1;
+               uint64_t reserved_2_2:1;
+               uint64_t carext:1;
+               uint64_t reserved_0_0:1;
+       } cn50xx;
+       struct cvmx_gmxx_rxx_int_reg_cn52xx {
+               uint64_t reserved_29_63:35;
+               uint64_t hg2cc:1;
+               uint64_t hg2fld:1;
+               uint64_t undat:1;
+               uint64_t uneop:1;
+               uint64_t unsop:1;
+               uint64_t bad_term:1;
+               uint64_t bad_seq:1;
+               uint64_t rem_fault:1;
+               uint64_t loc_fault:1;
+               uint64_t pause_drp:1;
+               uint64_t reserved_16_18:3;
+               uint64_t ifgerr:1;
+               uint64_t coldet:1;
+               uint64_t falerr:1;
+               uint64_t rsverr:1;
+               uint64_t pcterr:1;
+               uint64_t ovrerr:1;
+               uint64_t reserved_9_9:1;
+               uint64_t skperr:1;
+               uint64_t rcverr:1;
+               uint64_t reserved_5_6:2;
+               uint64_t fcserr:1;
+               uint64_t jabber:1;
+               uint64_t reserved_2_2:1;
+               uint64_t carext:1;
+               uint64_t 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 {
+               uint64_t reserved_27_63:37;
+               uint64_t undat:1;
+               uint64_t uneop:1;
+               uint64_t unsop:1;
+               uint64_t bad_term:1;
+               uint64_t bad_seq:1;
+               uint64_t rem_fault:1;
+               uint64_t loc_fault:1;
+               uint64_t pause_drp:1;
+               uint64_t reserved_16_18:3;
+               uint64_t ifgerr:1;
+               uint64_t coldet:1;
+               uint64_t falerr:1;
+               uint64_t rsverr:1;
+               uint64_t pcterr:1;
+               uint64_t ovrerr:1;
+               uint64_t reserved_9_9:1;
+               uint64_t skperr:1;
+               uint64_t rcverr:1;
+               uint64_t reserved_5_6:2;
+               uint64_t fcserr:1;
+               uint64_t jabber:1;
+               uint64_t reserved_2_2:1;
+               uint64_t carext:1;
+               uint64_t reserved_0_0:1;
+       } cn56xxp1;
+       struct cvmx_gmxx_rxx_int_reg_cn58xx {
+               uint64_t reserved_20_63:44;
+               uint64_t pause_drp:1;
+               uint64_t phy_dupx:1;
+               uint64_t phy_spd:1;
+               uint64_t phy_link:1;
+               uint64_t ifgerr:1;
+               uint64_t coldet:1;
+               uint64_t falerr:1;
+               uint64_t rsverr:1;
+               uint64_t pcterr:1;
+               uint64_t ovrerr:1;
+               uint64_t niberr:1;
+               uint64_t skperr:1;
+               uint64_t rcverr:1;
+               uint64_t lenerr:1;
+               uint64_t alnerr:1;
+               uint64_t fcserr:1;
+               uint64_t jabber:1;
+               uint64_t maxerr:1;
+               uint64_t carext:1;
+               uint64_t minerr:1;
+       } cn58xx;
+       struct cvmx_gmxx_rxx_int_reg_cn58xx cn58xxp1;
+};
+
+union cvmx_gmxx_rxx_jabber {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_jabber_s {
+               uint64_t reserved_16_63:48;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_pause_drop_time {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_pause_drop_time_s {
+               uint64_t reserved_16_63:48;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_rx_inbnd {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_rx_inbnd_s {
+               uint64_t reserved_4_63:60;
+               uint64_t duplex:1;
+               uint64_t speed:2;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_stats_ctl {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_stats_ctl_s {
+               uint64_t reserved_1_63:63;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_stats_octs {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_stats_octs_s {
+               uint64_t reserved_48_63:16;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_stats_octs_ctl {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_stats_octs_ctl_s {
+               uint64_t reserved_48_63:16;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_stats_octs_dmac {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_stats_octs_dmac_s {
+               uint64_t reserved_48_63:16;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_stats_octs_drp {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_stats_octs_drp_s {
+               uint64_t reserved_48_63:16;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_stats_pkts {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_stats_pkts_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_stats_pkts_bad {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_stats_pkts_bad_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_stats_pkts_ctl {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_stats_pkts_ctl_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_stats_pkts_dmac {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_stats_pkts_dmac_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_stats_pkts_drp {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_stats_pkts_drp_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rxx_udd_skp {
+       uint64_t u64;
+       struct cvmx_gmxx_rxx_udd_skp_s {
+               uint64_t reserved_9_63:55;
+               uint64_t fcssel:1;
+               uint64_t reserved_7_7:1;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rx_bp_dropx {
+       uint64_t u64;
+       struct cvmx_gmxx_rx_bp_dropx_s {
+               uint64_t reserved_6_63:58;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rx_bp_offx {
+       uint64_t u64;
+       struct cvmx_gmxx_rx_bp_offx_s {
+               uint64_t reserved_6_63:58;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rx_bp_onx {
+       uint64_t u64;
+       struct cvmx_gmxx_rx_bp_onx_s {
+               uint64_t reserved_9_63:55;
+               uint64_t mark:9;
+       } s;
+       struct cvmx_gmxx_rx_bp_onx_s cn30xx;
+       struct cvmx_gmxx_rx_bp_onx_s cn31xx;
+       struct cvmx_gmxx_rx_bp_onx_s cn38xx;
+       struct cvmx_gmxx_rx_bp_onx_s cn38xxp2;
+       struct cvmx_gmxx_rx_bp_onx_s cn50xx;
+       struct cvmx_gmxx_rx_bp_onx_s cn52xx;
+       struct cvmx_gmxx_rx_bp_onx_s cn52xxp1;
+       struct cvmx_gmxx_rx_bp_onx_s cn56xx;
+       struct cvmx_gmxx_rx_bp_onx_s cn56xxp1;
+       struct cvmx_gmxx_rx_bp_onx_s cn58xx;
+       struct cvmx_gmxx_rx_bp_onx_s cn58xxp1;
+};
+
+union cvmx_gmxx_rx_hg2_status {
+       uint64_t u64;
+       struct cvmx_gmxx_rx_hg2_status_s {
+               uint64_t reserved_48_63:16;
+               uint64_t phtim2go:16;
+               uint64_t xof:16;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rx_pass_en {
+       uint64_t u64;
+       struct cvmx_gmxx_rx_pass_en_s {
+               uint64_t reserved_16_63:48;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rx_pass_mapx {
+       uint64_t u64;
+       struct cvmx_gmxx_rx_pass_mapx_s {
+               uint64_t reserved_4_63:60;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rx_prt_info {
+       uint64_t u64;
+       struct cvmx_gmxx_rx_prt_info_s {
+               uint64_t reserved_32_63:32;
+               uint64_t drop:16;
+               uint64_t commit:16;
+       } s;
+       struct cvmx_gmxx_rx_prt_info_cn30xx {
+               uint64_t reserved_19_63:45;
+               uint64_t drop:3;
+               uint64_t reserved_3_15:13;
+               uint64_t 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 {
+               uint64_t reserved_20_63:44;
+               uint64_t drop:4;
+               uint64_t reserved_4_15:12;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rx_prts {
+       uint64_t u64;
+       struct cvmx_gmxx_rx_prts_s {
+               uint64_t reserved_3_63:61;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rx_tx_status {
+       uint64_t u64;
+       struct cvmx_gmxx_rx_tx_status_s {
+               uint64_t reserved_7_63:57;
+               uint64_t tx:3;
+               uint64_t reserved_3_3:1;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rx_xaui_bad_col {
+       uint64_t u64;
+       struct cvmx_gmxx_rx_xaui_bad_col_s {
+               uint64_t reserved_40_63:24;
+               uint64_t val:1;
+               uint64_t state:3;
+               uint64_t lane_rxc:4;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_rx_xaui_ctl {
+       uint64_t u64;
+       struct cvmx_gmxx_rx_xaui_ctl_s {
+               uint64_t reserved_2_63:62;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_smacx {
+       uint64_t u64;
+       struct cvmx_gmxx_smacx_s {
+               uint64_t reserved_48_63:16;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_stat_bp {
+       uint64_t u64;
+       struct cvmx_gmxx_stat_bp_s {
+               uint64_t reserved_17_63:47;
+               uint64_t bp:1;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_append {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_append_s {
+               uint64_t reserved_4_63:60;
+               uint64_t force_fcs:1;
+               uint64_t fcs:1;
+               uint64_t pad:1;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_burst {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_burst_s {
+               uint64_t reserved_16_63:48;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_cbfc_xoff {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_cbfc_xoff_s {
+               uint64_t reserved_16_63:48;
+               uint64_t xoff:16;
+       } s;
+       struct cvmx_gmxx_txx_cbfc_xoff_s cn52xx;
+       struct cvmx_gmxx_txx_cbfc_xoff_s cn56xx;
+};
+
+union cvmx_gmxx_txx_cbfc_xon {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_cbfc_xon_s {
+               uint64_t reserved_16_63:48;
+               uint64_t xon:16;
+       } s;
+       struct cvmx_gmxx_txx_cbfc_xon_s cn52xx;
+       struct cvmx_gmxx_txx_cbfc_xon_s cn56xx;
+};
+
+union cvmx_gmxx_txx_clk {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_clk_s {
+               uint64_t reserved_6_63:58;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_ctl {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_ctl_s {
+               uint64_t reserved_2_63:62;
+               uint64_t xsdef_en:1;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_min_pkt {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_min_pkt_s {
+               uint64_t reserved_8_63:56;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_pause_pkt_interval {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_pause_pkt_interval_s {
+               uint64_t reserved_16_63:48;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_pause_pkt_time {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_pause_pkt_time_s {
+               uint64_t reserved_16_63:48;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_pause_togo {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_pause_togo_s {
+               uint64_t reserved_32_63:32;
+               uint64_t msg_time:16;
+               uint64_t time:16;
+       } s;
+       struct cvmx_gmxx_txx_pause_togo_cn30xx {
+               uint64_t reserved_16_63:48;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_pause_zero {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_pause_zero_s {
+               uint64_t reserved_1_63:63;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_sgmii_ctl {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_sgmii_ctl_s {
+               uint64_t reserved_1_63:63;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_slot {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_slot_s {
+               uint64_t reserved_10_63:54;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_soft_pause {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_soft_pause_s {
+               uint64_t reserved_16_63:48;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_stat0 {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_stat0_s {
+               uint64_t xsdef:32;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_stat1 {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_stat1_s {
+               uint64_t scol:32;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_stat2 {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_stat2_s {
+               uint64_t reserved_48_63:16;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_stat3 {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_stat3_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_stat4 {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_stat4_s {
+               uint64_t hist1:32;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_stat5 {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_stat5_s {
+               uint64_t hist3:32;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_stat6 {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_stat6_s {
+               uint64_t hist5:32;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_stat7 {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_stat7_s {
+               uint64_t hist7:32;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_stat8 {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_stat8_s {
+               uint64_t mcst:32;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_stat9 {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_stat9_s {
+               uint64_t undflw:32;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_stats_ctl {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_stats_ctl_s {
+               uint64_t reserved_1_63:63;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_txx_thresh {
+       uint64_t u64;
+       struct cvmx_gmxx_txx_thresh_s {
+               uint64_t reserved_9_63:55;
+               uint64_t cnt:9;
+       } s;
+       struct cvmx_gmxx_txx_thresh_cn30xx {
+               uint64_t reserved_7_63:57;
+               uint64_t cnt:7;
+       } cn30xx;
+       struct cvmx_gmxx_txx_thresh_cn30xx cn31xx;
+       struct cvmx_gmxx_txx_thresh_s cn38xx;
+       struct cvmx_gmxx_txx_thresh_s cn38xxp2;
+       struct cvmx_gmxx_txx_thresh_cn30xx cn50xx;
+       struct cvmx_gmxx_txx_thresh_s cn52xx;
+       struct cvmx_gmxx_txx_thresh_s cn52xxp1;
+       struct cvmx_gmxx_txx_thresh_s cn56xx;
+       struct cvmx_gmxx_txx_thresh_s cn56xxp1;
+       struct cvmx_gmxx_txx_thresh_s cn58xx;
+       struct cvmx_gmxx_txx_thresh_s cn58xxp1;
+};
+
+union cvmx_gmxx_tx_bp {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_bp_s {
+               uint64_t reserved_4_63:60;
+               uint64_t bp:4;
+       } s;
+       struct cvmx_gmxx_tx_bp_cn30xx {
+               uint64_t reserved_3_63:61;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_tx_clk_mskx {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_clk_mskx_s {
+               uint64_t reserved_1_63:63;
+               uint64_t msk:1;
+       } s;
+       struct cvmx_gmxx_tx_clk_mskx_s cn30xx;
+       struct cvmx_gmxx_tx_clk_mskx_s cn50xx;
+};
+
+union cvmx_gmxx_tx_col_attempt {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_col_attempt_s {
+               uint64_t reserved_5_63:59;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_tx_corrupt {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_corrupt_s {
+               uint64_t reserved_4_63:60;
+               uint64_t corrupt:4;
+       } s;
+       struct cvmx_gmxx_tx_corrupt_cn30xx {
+               uint64_t reserved_3_63:61;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_tx_hg2_reg1 {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_hg2_reg1_s {
+               uint64_t reserved_16_63:48;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_tx_hg2_reg2 {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_hg2_reg2_s {
+               uint64_t reserved_16_63:48;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_tx_ifg {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_ifg_s {
+               uint64_t reserved_8_63:56;
+               uint64_t ifg2:4;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_tx_int_en {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_int_en_s {
+               uint64_t reserved_20_63:44;
+               uint64_t late_col:4;
+               uint64_t xsdef:4;
+               uint64_t xscol:4;
+               uint64_t reserved_6_7:2;
+               uint64_t undflw:4;
+               uint64_t ncb_nxa:1;
+               uint64_t pko_nxa:1;
+       } s;
+       struct cvmx_gmxx_tx_int_en_cn30xx {
+               uint64_t reserved_19_63:45;
+               uint64_t late_col:3;
+               uint64_t reserved_15_15:1;
+               uint64_t xsdef:3;
+               uint64_t reserved_11_11:1;
+               uint64_t xscol:3;
+               uint64_t reserved_5_7:3;
+               uint64_t undflw:3;
+               uint64_t reserved_1_1:1;
+               uint64_t pko_nxa:1;
+       } cn30xx;
+       struct cvmx_gmxx_tx_int_en_cn31xx {
+               uint64_t reserved_15_63:49;
+               uint64_t xsdef:3;
+               uint64_t reserved_11_11:1;
+               uint64_t xscol:3;
+               uint64_t reserved_5_7:3;
+               uint64_t undflw:3;
+               uint64_t reserved_1_1:1;
+               uint64_t pko_nxa:1;
+       } cn31xx;
+       struct cvmx_gmxx_tx_int_en_s cn38xx;
+       struct cvmx_gmxx_tx_int_en_cn38xxp2 {
+               uint64_t reserved_16_63:48;
+               uint64_t xsdef:4;
+               uint64_t xscol:4;
+               uint64_t reserved_6_7:2;
+               uint64_t undflw:4;
+               uint64_t ncb_nxa:1;
+               uint64_t pko_nxa:1;
+       } cn38xxp2;
+       struct cvmx_gmxx_tx_int_en_cn30xx cn50xx;
+       struct cvmx_gmxx_tx_int_en_cn52xx {
+               uint64_t reserved_20_63:44;
+               uint64_t late_col:4;
+               uint64_t xsdef:4;
+               uint64_t xscol:4;
+               uint64_t reserved_6_7:2;
+               uint64_t undflw:4;
+               uint64_t reserved_1_1:1;
+               uint64_t 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_s cn58xx;
+       struct cvmx_gmxx_tx_int_en_s cn58xxp1;
+};
+
+union cvmx_gmxx_tx_int_reg {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_int_reg_s {
+               uint64_t reserved_20_63:44;
+               uint64_t late_col:4;
+               uint64_t xsdef:4;
+               uint64_t xscol:4;
+               uint64_t reserved_6_7:2;
+               uint64_t undflw:4;
+               uint64_t ncb_nxa:1;
+               uint64_t pko_nxa:1;
+       } s;
+       struct cvmx_gmxx_tx_int_reg_cn30xx {
+               uint64_t reserved_19_63:45;
+               uint64_t late_col:3;
+               uint64_t reserved_15_15:1;
+               uint64_t xsdef:3;
+               uint64_t reserved_11_11:1;
+               uint64_t xscol:3;
+               uint64_t reserved_5_7:3;
+               uint64_t undflw:3;
+               uint64_t reserved_1_1:1;
+               uint64_t pko_nxa:1;
+       } cn30xx;
+       struct cvmx_gmxx_tx_int_reg_cn31xx {
+               uint64_t reserved_15_63:49;
+               uint64_t xsdef:3;
+               uint64_t reserved_11_11:1;
+               uint64_t xscol:3;
+               uint64_t reserved_5_7:3;
+               uint64_t undflw:3;
+               uint64_t reserved_1_1:1;
+               uint64_t pko_nxa:1;
+       } cn31xx;
+       struct cvmx_gmxx_tx_int_reg_s cn38xx;
+       struct cvmx_gmxx_tx_int_reg_cn38xxp2 {
+               uint64_t reserved_16_63:48;
+               uint64_t xsdef:4;
+               uint64_t xscol:4;
+               uint64_t reserved_6_7:2;
+               uint64_t undflw:4;
+               uint64_t ncb_nxa:1;
+               uint64_t pko_nxa:1;
+       } cn38xxp2;
+       struct cvmx_gmxx_tx_int_reg_cn30xx cn50xx;
+       struct cvmx_gmxx_tx_int_reg_cn52xx {
+               uint64_t reserved_20_63:44;
+               uint64_t late_col:4;
+               uint64_t xsdef:4;
+               uint64_t xscol:4;
+               uint64_t reserved_6_7:2;
+               uint64_t undflw:4;
+               uint64_t reserved_1_1:1;
+               uint64_t 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_s cn58xx;
+       struct cvmx_gmxx_tx_int_reg_s cn58xxp1;
+};
+
+union cvmx_gmxx_tx_jam {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_jam_s {
+               uint64_t reserved_8_63:56;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_tx_lfsr {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_lfsr_s {
+               uint64_t reserved_16_63:48;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_tx_ovr_bp {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_ovr_bp_s {
+               uint64_t reserved_48_63:16;
+               uint64_t tx_prt_bp:16;
+               uint64_t reserved_12_31:20;
+               uint64_t en:4;
+               uint64_t bp:4;
+               uint64_t ign_full:4;
+       } s;
+       struct cvmx_gmxx_tx_ovr_bp_cn30xx {
+               uint64_t reserved_11_63:53;
+               uint64_t en:3;
+               uint64_t reserved_7_7:1;
+               uint64_t bp:3;
+               uint64_t reserved_3_3:1;
+               uint64_t ign_full:3;
+       } cn30xx;
+       struct cvmx_gmxx_tx_ovr_bp_cn30xx cn31xx;
+       struct cvmx_gmxx_tx_ovr_bp_cn38xx {
+               uint64_t reserved_12_63:52;
+               uint64_t en:4;
+               uint64_t bp:4;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_tx_pause_pkt_dmac {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_pause_pkt_dmac_s {
+               uint64_t reserved_48_63:16;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_tx_pause_pkt_type {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_pause_pkt_type_s {
+               uint64_t reserved_16_63:48;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_tx_prts {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_prts_s {
+               uint64_t reserved_5_63:59;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_tx_spi_ctl {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_spi_ctl_s {
+               uint64_t reserved_2_63:62;
+               uint64_t tpa_clr:1;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_tx_spi_drain {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_spi_drain_s {
+               uint64_t reserved_16_63:48;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_tx_spi_max {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_spi_max_s {
+               uint64_t reserved_23_63:41;
+               uint64_t slice:7;
+               uint64_t max2:8;
+               uint64_t max1:8;
+       } s;
+       struct cvmx_gmxx_tx_spi_max_cn38xx {
+               uint64_t reserved_16_63:48;
+               uint64_t max2:8;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_tx_spi_roundx {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_spi_roundx_s {
+               uint64_t reserved_16_63:48;
+               uint64_t round:16;
+       } s;
+       struct cvmx_gmxx_tx_spi_roundx_s cn58xx;
+       struct cvmx_gmxx_tx_spi_roundx_s cn58xxp1;
+};
+
+union cvmx_gmxx_tx_spi_thresh {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_spi_thresh_s {
+               uint64_t reserved_6_63:58;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_tx_xaui_ctl {
+       uint64_t u64;
+       struct cvmx_gmxx_tx_xaui_ctl_s {
+               uint64_t reserved_11_63:53;
+               uint64_t hg_pause_hgi:2;
+               uint64_t hg_en:1;
+               uint64_t reserved_7_7:1;
+               uint64_t ls_byp:1;
+               uint64_t ls:2;
+               uint64_t reserved_2_3:2;
+               uint64_t uni_en:1;
+               uint64_t 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;
+};
+
+union cvmx_gmxx_xaui_ext_loopback {
+       uint64_t u64;
+       struct cvmx_gmxx_xaui_ext_loopback_s {
+               uint64_t reserved_5_63:59;
+               uint64_t en:1;
+               uint64_t 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;
+};
+
+#endif
diff --git a/arch/mips/include/asm/octeon/cvmx-helper-board.h b/arch/mips/include/asm/octeon/cvmx-helper-board.h
new file mode 100644 (file)
index 0000000..88527fa
--- /dev/null
@@ -0,0 +1,157 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/**
+ *
+ * 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__
+
+#include "cvmx-helper.h"
+
+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,        /* Mask for 2 bit wide flow control field */
+} cvmx_helper_board_set_phy_link_flags_types_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
+
+/**
+ * cvmx_override_board_link_get(int ipd_port) is a function
+ * pointer. It is meant to allow customization of the process of
+ * talking to a PHY to determine link speed. It is called every
+ * time a PHY must be polled for link status. Users should set
+ * this pointer to a function before calling any cvmx-helper
+ * operations.
+ */
+extern cvmx_helper_link_info_t(*cvmx_override_board_link_get) (int ipd_port);
+
+/**
+ * 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 modifed for every new Octeon board.
+ * Internally it uses switch statements based on the cvmx_sysinfo
+ * data to determine board types and revisions. It relys on the
+ * fact that every Octeon board receives a unique board type
+ * enumeration from the bootloader.
+ *
+ * @ipd_port: Octeon IPD port to get the MII address for.
+ *
+ * Returns MII PHY address and bus number or -1.
+ */
+extern 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.
+ *
+ * @phy_addr:  The address of the PHY to program
+ * @link_flags:
+ *                  Flags to control autonegotiation.  Bit 0 is autonegotiation
+ *                  enable/disable to maintain backware compatibility.
+ * @link_info: Link speed to program. If the speed is zero and autonegotiation
+ *                  is enabled, all possible negotiation speeds are advertised.
+ *
+ * Returns 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);
+
+/**
+ * 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 modifed for every new Octeon board.
+ * Internally it uses switch statements based on the cvmx_sysinfo
+ * data to determine board types and revisions. It relys on the
+ * fact that every Octeon board receives a unique board type
+ * enumeration from the bootloader.
+ *
+ * @ipd_port: IPD input port associated with the port we want to get link
+ *                 status for.
+ *
+ * Returns The ports link status. If the link isn't fully resolved, this must
+ *         return zero.
+ */
+extern cvmx_helper_link_info_t __cvmx_helper_board_link_get(int ipd_port);
+
+/**
+ * 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 modifed for every new Octeon board.
+ * Internally it uses switch statements based on the cvmx_sysinfo
+ * data to determine board types and revisions. It relys on the
+ * fact that every Octeon board receives a unique board type
+ * enumeration from the bootloader.
+ *
+ * @interface: Interface to probe
+ * @supported_ports:
+ *                  Number of ports Octeon supports.
+ *
+ * Returns Number of ports the actual board supports. Many times this will
+ *         simple be "support_ports".
+ */
+extern int __cvmx_helper_board_interface_probe(int interface,
+                                              int supported_ports);
+
+/**
+ * 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.
+ *
+ * @interface: Interface to enable
+ *
+ * Returns Zero on success, negative on failure
+ */
+extern int __cvmx_helper_board_hardware_enable(int interface);
+
+#endif /* __CVMX_HELPER_BOARD_H__ */
diff --git a/arch/mips/include/asm/octeon/cvmx-helper-fpa.h b/arch/mips/include/asm/octeon/cvmx-helper-fpa.h
new file mode 100644 (file)
index 0000000..5ff8c93
--- /dev/null
@@ -0,0 +1,64 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/**
+ * @file
+ *
+ * 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.
+ *
+ * @packet_buffers:
+ *               Number of packet buffers to allocate
+ * @work_queue_entries:
+ *               Number of work queue entries
+ * @pko_buffers:
+ *               PKO Command buffers. You should at minimum have two per
+ *               each PKO queue.
+ * @tim_buffers:
+ *               TIM ring buffer command queues. At least two per timer bucket
+ *               is recommened.
+ * @dfa_buffers:
+ *               DFA command buffer. A relatively small (32 for example)
+ *               number should work.
+ * Returns Zero on success, non-zero if out of memory
+ */
+extern int cvmx_helper_initialize_fpa(int packet_buffers,
+                                     int work_queue_entries, int pko_buffers,
+                                     int tim_buffers, int dfa_buffers);
+
+#endif /* __CVMX_HELPER_H__ */
diff --git a/arch/mips/include/asm/octeon/cvmx-helper-loop.h b/arch/mips/include/asm/octeon/cvmx-helper-loop.h
new file mode 100644 (file)
index 0000000..077f0e9
--- /dev/null
@@ -0,0 +1,60 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as published by
+ * the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/**
+ * @file
+ *
+ * Functions for LOOP initialization, configuration,
+ * and monitoring.
+ *
+ */
+#ifndef __CVMX_HELPER_LOOP_H__
+#define __CVMX_HELPER_LOOP_H__
+
+/**
+ * Probe a LOOP interface and determine the number of ports
+ * connected to it. The LOOP interface should still be down after
+ * this call.
+ *
+ * @interface: Interface to probe
+ *
+ * Returns Number of ports on the interface. Zero to disable.
+ */
+extern int __cvmx_helper_loop_probe(int interface);
+static inline int __cvmx_helper_loop_enumerate(int interface) {return 4; }
+
+/**
+ * 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.
+ *
+ * @interface: Interface to bring up
+ *
+ * Returns Zero on success, negative on failure
+ */
+extern int __cvmx_helper_loop_enable(int interface);
+
+#endif
diff --git a/arch/mips/include/asm/octeon/cvmx-helper-npi.h b/arch/mips/include/asm/octeon/cvmx-helper-npi.h
new file mode 100644 (file)
index 0000000..8df4c7f
--- /dev/null
@@ -0,0 +1,61 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/**
+ * @file
+ *
+ * Functions for NPI initialization, configuration,
+ * and monitoring.
+ *
+ */
+#ifndef __CVMX_HELPER_NPI_H__
+#define __CVMX_HELPER_NPI_H__
+
+/**
+ * Probe a NPI interface and determine the number of ports
+ * connected to it. The NPI interface should still be down after
+ * this call.
+ *
+ * @interface: Interface to probe
+ *
+ * Returns Number of ports on the interface. Zero to disable.
+ */
+extern int __cvmx_helper_npi_probe(int interface);
+#define __cvmx_helper_npi_enumerate __cvmx_helper_npi_probe
+
+/**
+ * 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.
+ *
+ * @interface: Interface to bring up
+ *
+ * Returns Zero on success, negative on failure
+ */
+extern int __cvmx_helper_npi_enable(int interface);
+
+#endif
diff --git a/arch/mips/include/asm/octeon/cvmx-helper-rgmii.h b/arch/mips/include/asm/octeon/cvmx-helper-rgmii.h
new file mode 100644 (file)
index 0000000..78295ba
--- /dev/null
@@ -0,0 +1,111 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/**
+ * @file
+ *
+ * Functions for RGMII/GMII/MII initialization, configuration,
+ * and monitoring.
+ *
+ */
+#ifndef __CVMX_HELPER_RGMII_H__
+#define __CVMX_HELPER_RGMII_H__
+
+/**
+ * Probe RGMII ports and determine the number present
+ *
+ * @interface: Interface to probe
+ *
+ * Returns Number of RGMII/GMII/MII ports (0-4).
+ */
+extern int __cvmx_helper_rgmii_probe(int interface);
+#define __cvmx_helper_rgmii_enumerate __cvmx_helper_rgmii_probe
+
+/**
+ * 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.
+ *
+ * @port:   IPD port number to loop.
+ */
+extern void cvmx_helper_rgmii_internal_loopback(int port);
+
+/**
+ * Configure all of the ASX, GMX, and PKO regsiters required
+ * to get RGMII to function on the supplied interface.
+ *
+ * @interface: PKO Interface to configure (0 or 1)
+ *
+ * Returns Zero on success
+ */
+extern int __cvmx_helper_rgmii_enable(int interface);
+
+/**
+ * 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().
+ *
+ * @ipd_port: IPD/PKO port to query
+ *
+ * Returns Link state
+ */
+extern cvmx_helper_link_info_t __cvmx_helper_rgmii_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.
+ *
+ * @ipd_port:  IPD/PKO port to configure
+ * @link_info: The new link state
+ *
+ * Returns Zero on success, negative on failure
+ */
+extern int __cvmx_helper_rgmii_link_set(int ipd_port,
+                                       cvmx_helper_link_info_t link_info);
+
+/**
+ * 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.
+ *
+ * @ipd_port: IPD/PKO port to loopback.
+ * @enable_internal:
+ *                 Non zero if you want internal loopback
+ * @enable_external:
+ *                 Non zero if you want external loopback
+ *
+ * Returns Zero on success, negative on failure.
+ */
+extern int __cvmx_helper_rgmii_configure_loopback(int ipd_port,
+                                                 int enable_internal,
+                                                 int enable_external);
+
+#endif
diff --git a/arch/mips/include/asm/octeon/cvmx-helper-sgmii.h b/arch/mips/include/asm/octeon/cvmx-helper-sgmii.h
new file mode 100644 (file)
index 0000000..9a9b6c1
--- /dev/null
@@ -0,0 +1,105 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/**
+ * @file
+ *
+ * Functions for SGMII initialization, configuration,
+ * and monitoring.
+ *
+ */
+#ifndef __CVMX_HELPER_SGMII_H__
+#define __CVMX_HELPER_SGMII_H__
+
+/**
+ * Probe a SGMII interface and determine the number of ports
+ * connected to it. The SGMII interface should still be down after
+ * this call.
+ *
+ * @interface: Interface to probe
+ *
+ * Returns Number of ports on the interface. Zero to disable.
+ */
+extern int __cvmx_helper_sgmii_probe(int interface);
+extern int __cvmx_helper_sgmii_enumerate(int interface);
+
+/**
+ * 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.
+ *
+ * @interface: Interface to bring up
+ *
+ * Returns Zero on success, negative on failure
+ */
+extern int __cvmx_helper_sgmii_enable(int interface);
+
+/**
+ * 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().
+ *
+ * @ipd_port: IPD/PKO port to query
+ *
+ * Returns Link state
+ */
+extern cvmx_helper_link_info_t __cvmx_helper_sgmii_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.
+ *
+ * @ipd_port:  IPD/PKO port to configure
+ * @link_info: The new link state
+ *
+ * Returns Zero on success, negative on failure
+ */
+extern int __cvmx_helper_sgmii_link_set(int ipd_port,
+                                       cvmx_helper_link_info_t link_info);
+
+/**
+ * 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.
+ *
+ * @ipd_port: IPD/PKO port to loopback.
+ * @enable_internal:
+ *                 Non zero if you want internal loopback
+ * @enable_external:
+ *                 Non zero if you want external loopback
+ *
+ * Returns Zero on success, negative on failure.
+ */
+extern int __cvmx_helper_sgmii_configure_loopback(int ipd_port,
+                                                 int enable_internal,
+                                                 int enable_external);
+
+#endif
diff --git a/arch/mips/include/asm/octeon/cvmx-helper-spi.h b/arch/mips/include/asm/octeon/cvmx-helper-spi.h
new file mode 100644 (file)
index 0000000..9f1c6b9
--- /dev/null
@@ -0,0 +1,85 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ * Functions for SPI initialization, configuration,
+ * and monitoring.
+ */
+#ifndef __CVMX_HELPER_SPI_H__
+#define __CVMX_HELPER_SPI_H__
+
+/**
+ * Probe a SPI interface and determine the number of ports
+ * connected to it. The SPI interface should still be down after
+ * this call.
+ *
+ * @interface: Interface to probe
+ *
+ * Returns Number of ports on the interface. Zero to disable.
+ */
+extern int __cvmx_helper_spi_probe(int interface);
+extern int __cvmx_helper_spi_enumerate(int interface);
+
+/**
+ * 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.
+ *
+ * @interface: Interface to bring up
+ *
+ * Returns Zero on success, negative on failure
+ */
+extern int __cvmx_helper_spi_enable(int interface);
+
+/**
+ * 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().
+ *
+ * @ipd_port: IPD/PKO port to query
+ *
+ * Returns Link state
+ */
+extern cvmx_helper_link_info_t __cvmx_helper_spi_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.
+ *
+ * @ipd_port:  IPD/PKO port to configure
+ * @link_info: The new link state
+ *
+ * Returns Zero on success, negative on failure
+ */
+extern int __cvmx_helper_spi_link_set(int ipd_port,
+                                     cvmx_helper_link_info_t link_info);
+
+#endif
diff --git a/arch/mips/include/asm/octeon/cvmx-helper-util.h b/arch/mips/include/asm/octeon/cvmx-helper-util.h
new file mode 100644 (file)
index 0000000..6a6e52f
--- /dev/null
@@ -0,0 +1,215 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ *
+ * Small helper utilities.
+ *
+ */
+
+#ifndef __CVMX_HELPER_UTIL_H__
+#define __CVMX_HELPER_UTIL_H__
+
+/**
+ * Convert a interface mode into a human readable string
+ *
+ * @mode:   Mode to convert
+ *
+ * Returns String
+ */
+extern const char
+    *cvmx_helper_interface_mode_to_string(cvmx_helper_interface_mode_t mode);
+
+/**
+ * Debug routine to dump the packet structure to the console
+ *
+ * @work:   Work queue entry containing the packet to dump
+ * Returns
+ */
+extern int cvmx_helper_dump_packet(cvmx_wqe_t *work);
+
+/**
+ * Setup Random Early Drop on a specific input queue
+ *
+ * @queue:  Input queue to setup RED on (0-7)
+ * @pass_thresh:
+ *               Packets will begin slowly dropping when there are less than
+ *               this many packet buffers free in FPA 0.
+ * @drop_thresh:
+ *               All incomming packets will be dropped when there are less
+ *               than this many free packet buffers in FPA 0.
+ * Returns Zero on success. Negative on failure
+ */
+extern int cvmx_helper_setup_red_queue(int queue, int pass_thresh,
+                                      int drop_thresh);
+
+/**
+ * Setup Random Early Drop to automatically begin dropping packets.
+ *
+ * @pass_thresh:
+ *               Packets will begin slowly dropping when there are less than
+ *               this many packet buffers free in FPA 0.
+ * @drop_thresh:
+ *               All incomming packets will be dropped when there are less
+ *               than this many free packet buffers in FPA 0.
+ * Returns Zero on success. Negative on failure
+ */
+extern int cvmx_helper_setup_red(int pass_thresh, int drop_thresh);
+
+/**
+ * Get the version of the CVMX libraries.
+ *
+ * Returns Version string. Note this buffer is allocated statically
+ *         and will be shared by all callers.
+ */
+extern const char *cvmx_helper_get_version(void);
+
+/**
+ * Setup the common GMX settings that determine the number of
+ * ports. These setting apply to almost all configurations of all
+ * chips.
+ *
+ * @interface: Interface to configure
+ * @num_ports: Number of ports on the interface
+ *
+ * Returns Zero on success, negative on failure
+ */
+extern int __cvmx_helper_setup_gmx(int interface, int num_ports);
+
+/**
+ * Returns the IPD/PKO port number for a port on the given
+ * interface.
+ *
+ * @interface: Interface to use
+ * @port:      Port on the interface
+ *
+ * Returns IPD/PKO port number
+ */
+extern int cvmx_helper_get_ipd_port(int interface, int port);
+
+/**
+ * Returns the IPD/PKO port number for the first port on the given
+ * interface.
+ *
+ * @interface: Interface to use
+ *
+ * Returns IPD/PKO port number
+ */
+static inline int cvmx_helper_get_first_ipd_port(int interface)
+{
+       return cvmx_helper_get_ipd_port(interface, 0);
+}
+
+/**
+ * Returns the IPD/PKO port number for the last port on the given
+ * interface.
+ *
+ * @interface: Interface to use
+ *
+ * Returns IPD/PKO port number
+ */
+static inline int cvmx_helper_get_last_ipd_port(int interface)
+{
+       extern int cvmx_helper_ports_on_interface(int interface);
+
+       return cvmx_helper_get_first_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.
+ *
+ * @work:   Work queue entry with packet to free
+ */
+static inline void cvmx_helper_free_packet_data(cvmx_wqe_t *work)
+{
+       uint64_t number_buffers;
+       union cvmx_buf_ptr buffer_ptr;
+       union cvmx_buf_ptr next_buffer_ptr;
+       uint64_t 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 =
+                   *(union cvmx_buf_ptr *) 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 =
+                   *(union cvmx_buf_ptr *) 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;
+       }
+}
+
+/**
+ * Returns the interface number for an IPD/PKO port number.
+ *
+ * @ipd_port: IPD/PKO port number
+ *
+ * Returns Interface number
+ */
+extern int cvmx_helper_get_interface_num(int ipd_port);
+
+/**
+ * Returns the interface index number for an IPD/PKO port
+ * number.
+ *
+ * @ipd_port: IPD/PKO port number
+ *
+ * Returns Interface index number
+ */
+extern int cvmx_helper_get_interface_index_num(int ipd_port);
+
+#endif /* __CVMX_HELPER_H__ */
diff --git a/arch/mips/include/asm/octeon/cvmx-helper-xaui.h b/arch/mips/include/asm/octeon/cvmx-helper-xaui.h
new file mode 100644 (file)
index 0000000..f6fbc4f
--- /dev/null
@@ -0,0 +1,104 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/**
+ * @file
+ *
+ * Functions for XAUI initialization, configuration,
+ * and monitoring.
+ *
+ */
+#ifndef __CVMX_HELPER_XAUI_H__
+#define __CVMX_HELPER_XAUI_H__
+
+/**
+ * Probe a XAUI interface and determine the number of ports
+ * connected to it. The XAUI interface should still be down
+ * after this call.
+ *
+ * @interface: Interface to probe
+ *
+ * Returns Number of ports on the interface. Zero to disable.
+ */
+extern int __cvmx_helper_xaui_probe(int interface);
+extern int __cvmx_helper_xaui_enumerate(int interface);
+
+/**
+ * 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.
+ *
+ * @interface: Interface to bring up
+ *
+ * Returns Zero on success, negative on failure
+ */
+extern int __cvmx_helper_xaui_enable(int interface);
+
+/**
+ * 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().
+ *
+ * @ipd_port: IPD/PKO port to query
+ *
+ * Returns Link state
+ */
+extern cvmx_helper_link_info_t __cvmx_helper_xaui_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.
+ *
+ * @ipd_port:  IPD/PKO port to configure
+ * @link_info: The new link state
+ *
+ * Returns Zero on success, negative on failure
+ */
+extern int __cvmx_helper_xaui_link_set(int ipd_port,
+                                      cvmx_helper_link_info_t link_info);
+
+/**
+ * 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.
+ *
+ * @ipd_port: IPD/PKO port to loopback.
+ * @enable_internal:
+ *                 Non zero if you want internal loopback
+ * @enable_external:
+ *                 Non zero if you want external loopback
+ *
+ * Returns Zero on success, negative on failure.
+ */
+extern int __cvmx_helper_xaui_configure_loopback(int ipd_port,
+                                                int enable_internal,
+                                                int enable_external);
+#endif
diff --git a/arch/mips/include/asm/octeon/cvmx-helper.h b/arch/mips/include/asm/octeon/cvmx-helper.h
new file mode 100644 (file)
index 0000000..3169cd7
--- /dev/null
@@ -0,0 +1,228 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ *
+ * Helper functions for common, but complicated tasks.
+ *
+ */
+
+#ifndef __CVMX_HELPER_H__
+#define __CVMX_HELPER_H__
+
+#include "cvmx-config.h"
+#include "cvmx-fpa.h"
+#include "cvmx-wqe.h"
+
+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_t;
+
+typedef union {
+       uint64_t u64;
+       struct {
+               uint64_t reserved_20_63:44;
+               uint64_t link_up:1;         /**< Is the physical link up? */
+               uint64_t full_duplex:1;     /**< 1 if the link is full duplex */
+               uint64_t speed:18;          /**< Speed of the link in Mbps */
+       } s;
+} cvmx_helper_link_info_t;
+
+#include "cvmx-helper-fpa.h"
+
+#include <asm/octeon/cvmx-helper-errata.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-util.h"
+#include "cvmx-helper-xaui.h"
+
+/**
+ * cvmx_override_pko_queue_priority(int ipd_port, uint64_t
+ * 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.
+ */
+extern void (*cvmx_override_pko_queue_priority) (int pko_port,
+                                                uint64_t priorities[16]);
+
+/**
+ * cvmx_override_ipd_port_setup(int ipd_port) is a function
+ * pointer. It is meant to allow customization of the IPD port
+ * 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.
+ */
+extern void (*cvmx_override_ipd_port_setup) (int ipd_port);
+
+/**
+ * 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.
+ *
+ * Returns 0 on success
+ *         -1 on failure
+ */
+extern int cvmx_helper_ipd_and_packet_input_enable(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.
+ *
+ * Returns Zero on success, non-zero on failure
+ */
+extern int cvmx_helper_initialize_packet_io_global(void);
+
+/**
+ * Does core local initialization for packet io
+ *
+ * Returns Zero on success, non-zero on failure
+ */
+extern int cvmx_helper_initialize_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.
+ *
+ * @interface: Which interface to return port count for.
+ *
+ * Returns Port count for interface
+ *         -1 for uninitialized interface
+ */
+extern 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.
+ *
+ * Returns Number of interfaces on chip
+ */
+extern 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.
+ *
+ * @interface: Interface to probe
+ *
+ * Returns Mode of the interface. Unknown or unsupported interfaces return
+ *         DISABLED.
+ */
+extern cvmx_helper_interface_mode_t cvmx_helper_interface_get_mode(int
+                                                                  interface);
+
+/**
+ * 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));
+ *
+ * @ipd_port: IPD/PKO port to auto configure
+ *
+ * Returns Link state after configure
+ */
+extern 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().
+ *
+ * @ipd_port: IPD/PKO port to query
+ *
+ * Returns Link state
+ */
+extern 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.
+ *
+ * @ipd_port:  IPD/PKO port to configure
+ * @link_info: The new link state
+ *
+ * Returns Zero on success, negative on failure
+ */
+extern 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 doesn't setup the
+ * ports or enable them. The main goal here is to set the global
+ * interface_port_count[interface] correctly. Hardware setup of the
+ * ports will be performed later.
+ *
+ * @interface: Interface to probe
+ *
+ * Returns Zero on success, negative on failure
+ */
+extern int cvmx_helper_interface_probe(int interface);
+extern int cvmx_helper_interface_enumerate(int interface);
+
+/**
+ * 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.
+ *
+ * @ipd_port: IPD/PKO port to loopback.
+ * @enable_internal:
+ *                 Non zero if you want internal loopback
+ * @enable_external:
+ *                 Non zero if you want external loopback
+ *
+ * Returns Zero on success, negative on failure.
+ */
+extern int cvmx_helper_configure_loopback(int ipd_port, int enable_internal,
+                                         int enable_external);
+
+#endif /* __CVMX_HELPER_H__ */
diff --git a/arch/mips/include/asm/octeon/cvmx-ipd.h b/arch/mips/include/asm/octeon/cvmx-ipd.h
new file mode 100644 (file)
index 0000000..115a552
--- /dev/null
@@ -0,0 +1,338 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/**
+ *
+ * Interface to the hardware Input Packet Data unit.
+ */
+
+#ifndef __CVMX_IPD_H__
+#define __CVMX_IPD_H__
+
+#include <asm/octeon/octeon-feature.h>
+
+#include <asm/octeon/cvmx-ipd-defs.h>
+
+enum cvmx_ipd_mode {
+   CVMX_IPD_OPC_MODE_STT = 0LL,   /* All blocks DRAM, not cached in L2 */
+   CVMX_IPD_OPC_MODE_STF = 1LL,   /* All bloccks into  L2 */
+   CVMX_IPD_OPC_MODE_STF1_STT = 2LL,   /* 1st block L2, rest DRAM */
+   CVMX_IPD_OPC_MODE_STF2_STT = 3LL    /* 1st, 2nd blocks L2, rest DRAM */
+};
+
+#ifndef CVMX_ENABLE_LEN_M8_FIX
+#define CVMX_ENABLE_LEN_M8_FIX 0
+#endif
+
+/* CSR typedefs have been moved to cvmx-csr-*.h */
+typedef union cvmx_ipd_1st_mbuff_skip cvmx_ipd_mbuff_first_skip_t;
+typedef union cvmx_ipd_1st_next_ptr_back cvmx_ipd_first_next_ptr_back_t;
+
+typedef cvmx_ipd_mbuff_first_skip_t cvmx_ipd_mbuff_not_first_skip_t;
+typedef cvmx_ipd_first_next_ptr_back_t cvmx_ipd_second_next_ptr_back_t;
+
+/**
+ * Configure IPD
+ *
+ * @mbuff_size: Packets buffer size in 8 byte words
+ * @first_mbuff_skip:
+ *                   Number of 8 byte words to skip in the first buffer
+ * @not_first_mbuff_skip:
+ *                   Number of 8 byte words to skip in each following buffer
+ * @first_back: Must be same as first_mbuff_skip / 128
+ * @second_back:
+ *                   Must be same as not_first_mbuff_skip / 128
+ * @wqe_fpa_pool:
+ *                   FPA pool to get work entries from
+ * @cache_mode:
+ * @back_pres_enable_flag:
+ *                   Enable or disable port back pressure
+ */
+static inline void cvmx_ipd_config(uint64_t mbuff_size,
+                                  uint64_t first_mbuff_skip,
+                                  uint64_t not_first_mbuff_skip,
+                                  uint64_t first_back,
+                                  uint64_t second_back,
+                                  uint64_t wqe_fpa_pool,
+                                  enum cvmx_ipd_mode cache_mode,
+                                  uint64_t back_pres_enable_flag)
+{
+       cvmx_ipd_mbuff_first_skip_t first_skip;
+       cvmx_ipd_mbuff_not_first_skip_t not_first_skip;
+       union cvmx_ipd_packet_mbuff_size size;
+       cvmx_ipd_first_next_ptr_back_t first_back_struct;
+       cvmx_ipd_second_next_ptr_back_t second_back_struct;
+       union cvmx_ipd_wqe_fpa_queue wqe_pool;
+       union cvmx_ipd_ctl_status ipd_ctl_reg;
+
+       first_skip.u64 = 0;
+       first_skip.s.skip_sz = first_mbuff_skip;
+       cvmx_write_csr(CVMX_IPD_1ST_MBUFF_SKIP, first_skip.u64);
+
+       not_first_skip.u64 = 0;
+       not_first_skip.s.skip_sz = not_first_mbuff_skip;
+       cvmx_write_csr(CVMX_IPD_NOT_1ST_MBUFF_SKIP, not_first_skip.u64);
+
+       size.u64 = 0;
+       size.s.mb_size = mbuff_size;
+       cvmx_write_csr(CVMX_IPD_PACKET_MBUFF_SIZE, size.u64);
+
+       first_back_struct.u64 = 0;
+       first_back_struct.s.back = first_back;
+       cvmx_write_csr(CVMX_IPD_1st_NEXT_PTR_BACK, first_back_struct.u64);
+
+       second_back_struct.u64 = 0;
+       second_back_struct.s.back = second_back;
+       cvmx_write_csr(CVMX_IPD_2nd_NEXT_PTR_BACK, second_back_struct.u64);
+
+       wqe_pool.u64 = 0;
+       wqe_pool.s.wqe_pool = wqe_fpa_pool;
+       cvmx_write_csr(CVMX_IPD_WQE_FPA_QUEUE, wqe_pool.u64);
+
+       ipd_ctl_reg.u64 = cvmx_read_csr(CVMX_IPD_CTL_STATUS);
+       ipd_ctl_reg.s.opc_mode = cache_mode;
+       ipd_ctl_reg.s.pbp_en = back_pres_enable_flag;
+       cvmx_write_csr(CVMX_IPD_CTL_STATUS, ipd_ctl_reg.u64);
+
+       /* Note: the example RED code that used to be here has been moved to
+          cvmx_helper_setup_red */
+}
+
+/**
+ * Enable IPD
+ */
+static inline void cvmx_ipd_enable(void)
+{
+       union cvmx_ipd_ctl_status ipd_reg;
+       ipd_reg.u64 = cvmx_read_csr(CVMX_IPD_CTL_STATUS);
+       if (ipd_reg.s.ipd_en) {
+               cvmx_dprintf
+                   ("Warning: Enabling IPD when IPD already enabled.\n");
+       }
+       ipd_reg.s.ipd_en = 1;
+#if  CVMX_ENABLE_LEN_M8_FIX
+       if (!OCTEON_IS_MODEL(OCTEON_CN38XX_PASS2))
+               ipd_reg.s.len_m8 = TRUE;
+#endif
+       cvmx_write_csr(CVMX_IPD_CTL_STATUS, ipd_reg.u64);
+}
+
+/**
+ * Disable IPD
+ */
+static inline void cvmx_ipd_disable(void)
+{
+       union cvmx_ipd_ctl_status ipd_reg;
+       ipd_reg.u64 = cvmx_read_csr(CVMX_IPD_CTL_STATUS);
+       ipd_reg.s.ipd_en = 0;
+       cvmx_write_csr(CVMX_IPD_CTL_STATUS, ipd_reg.u64);
+}
+
+/**
+ * Supportive function for cvmx_fpa_shutdown_pool.
+ */
+static inline void cvmx_ipd_free_ptr(void)
+{
+       /* Only CN38XXp{1,2} cannot read pointer out of the IPD */
+       if (!OCTEON_IS_MODEL(OCTEON_CN38XX_PASS1)
+           && !OCTEON_IS_MODEL(OCTEON_CN38XX_PASS2)) {
+               int no_wptr = 0;
+               union cvmx_ipd_ptr_count ipd_ptr_count;
+               ipd_ptr_count.u64 = cvmx_read_csr(CVMX_IPD_PTR_COUNT);
+
+               /* Handle Work Queue Entry in cn56xx and cn52xx */
+               if (octeon_has_feature(OCTEON_FEATURE_NO_WPTR)) {
+                       union cvmx_ipd_ctl_status ipd_ctl_status;
+                       ipd_ctl_status.u64 = cvmx_read_csr(CVMX_IPD_CTL_STATUS);
+                       if (ipd_ctl_status.s.no_wptr)
+                               no_wptr = 1;
+               }
+
+               /* Free the prefetched WQE */
+               if (ipd_ptr_count.s.wqev_cnt) {
+                       union cvmx_ipd_wqe_ptr_valid ipd_wqe_ptr_valid;
+                       ipd_wqe_ptr_valid.u64 =
+                           cvmx_read_csr(CVMX_IPD_WQE_PTR_VALID);
+                       if (no_wptr)
+                               cvmx_fpa_free(cvmx_phys_to_ptr
+                                             ((uint64_t) ipd_wqe_ptr_valid.s.
+                                              ptr << 7), CVMX_FPA_PACKET_POOL,
+                                             0);
+                       else
+                               cvmx_fpa_free(cvmx_phys_to_ptr
+                                             ((uint64_t) ipd_wqe_ptr_valid.s.
+                                              ptr << 7), CVMX_FPA_WQE_POOL, 0);
+               }
+
+               /* Free all WQE in the fifo */
+               if (ipd_ptr_count.s.wqe_pcnt) {
+                       int i;
+                       union cvmx_ipd_pwp_ptr_fifo_ctl ipd_pwp_ptr_fifo_ctl;
+                       ipd_pwp_ptr_fifo_ctl.u64 =
+                           cvmx_read_csr(CVMX_IPD_PWP_PTR_FIFO_CTL);
+                       for (i = 0; i < ipd_ptr_count.s.wqe_pcnt; i++) {
+                               ipd_pwp_ptr_fifo_ctl.s.cena = 0;
+                               ipd_pwp_ptr_fifo_ctl.s.raddr =
+                                   ipd_pwp_ptr_fifo_ctl.s.max_cnts +
+                                   (ipd_pwp_ptr_fifo_ctl.s.wraddr +
+                                    i) % ipd_pwp_ptr_fifo_ctl.s.max_cnts;
+                               cvmx_write_csr(CVMX_IPD_PWP_PTR_FIFO_CTL,
+                                              ipd_pwp_ptr_fifo_ctl.u64);
+                               ipd_pwp_ptr_fifo_ctl.u64 =
+                                   cvmx_read_csr(CVMX_IPD_PWP_PTR_FIFO_CTL);
+                               if (no_wptr)
+                                       cvmx_fpa_free(cvmx_phys_to_ptr
+                                                     ((uint64_t)
+                                                      ipd_pwp_ptr_fifo_ctl.s.
+                                                      ptr << 7),
+                                                     CVMX_FPA_PACKET_POOL, 0);
+                               else
+                                       cvmx_fpa_free(cvmx_phys_to_ptr
+                                                     ((uint64_t)
+                                                      ipd_pwp_ptr_fifo_ctl.s.
+                                                      ptr << 7),
+                                                     CVMX_FPA_WQE_POOL, 0);
+                       }
+                       ipd_pwp_ptr_fifo_ctl.s.cena = 1;
+                       cvmx_write_csr(CVMX_IPD_PWP_PTR_FIFO_CTL,
+                                      ipd_pwp_ptr_fifo_ctl.u64);
+               }
+
+               /* Free the prefetched packet */
+               if (ipd_ptr_count.s.pktv_cnt) {
+                       union cvmx_ipd_pkt_ptr_valid ipd_pkt_ptr_valid;
+                       ipd_pkt_ptr_valid.u64 =
+                           cvmx_read_csr(CVMX_IPD_PKT_PTR_VALID);
+                       cvmx_fpa_free(cvmx_phys_to_ptr
+                                     (ipd_pkt_ptr_valid.s.ptr << 7),
+                                     CVMX_FPA_PACKET_POOL, 0);
+               }
+
+               /* Free the per port prefetched packets */
+               if (1) {
+                       int i;
+                       union cvmx_ipd_prc_port_ptr_fifo_ctl
+                           ipd_prc_port_ptr_fifo_ctl;
+                       ipd_prc_port_ptr_fifo_ctl.u64 =
+                           cvmx_read_csr(CVMX_IPD_PRC_PORT_PTR_FIFO_CTL);
+
+                       for (i = 0; i < ipd_prc_port_ptr_fifo_ctl.s.max_pkt;
+                            i++) {
+                               ipd_prc_port_ptr_fifo_ctl.s.cena = 0;
+                               ipd_prc_port_ptr_fifo_ctl.s.raddr =
+                                   i % ipd_prc_port_ptr_fifo_ctl.s.max_pkt;
+                               cvmx_write_csr(CVMX_IPD_PRC_PORT_PTR_FIFO_CTL,
+                                              ipd_prc_port_ptr_fifo_ctl.u64);
+                               ipd_prc_port_ptr_fifo_ctl.u64 =
+                                   cvmx_read_csr
+                                   (CVMX_IPD_PRC_PORT_PTR_FIFO_CTL);
+                               cvmx_fpa_free(cvmx_phys_to_ptr
+                                             ((uint64_t)
+                                              ipd_prc_port_ptr_fifo_ctl.s.
+                                              ptr << 7), CVMX_FPA_PACKET_POOL,
+                                             0);
+                       }
+                       ipd_prc_port_ptr_fifo_ctl.s.cena = 1;
+                       cvmx_write_csr(CVMX_IPD_PRC_PORT_PTR_FIFO_CTL,
+                                      ipd_prc_port_ptr_fifo_ctl.u64);
+               }
+
+               /* Free all packets in the holding fifo */
+               if (ipd_ptr_count.s.pfif_cnt) {
+                       int i;
+                       union cvmx_ipd_prc_hold_ptr_fifo_ctl
+                           ipd_prc_hold_ptr_fifo_ctl;
+
+                       ipd_prc_hold_ptr_fifo_ctl.u64 =
+                           cvmx_read_csr(CVMX_IPD_PRC_HOLD_PTR_FIFO_CTL);
+
+                       for (i = 0; i < ipd_ptr_count.s.pfif_cnt; i++) {
+                               ipd_prc_hold_ptr_fifo_ctl.s.cena = 0;
+                               ipd_prc_hold_ptr_fifo_ctl.s.raddr =
+                                   (ipd_prc_hold_ptr_fifo_ctl.s.praddr +
+                                    i) % ipd_prc_hold_ptr_fifo_ctl.s.max_pkt;
+                               cvmx_write_csr(CVMX_IPD_PRC_HOLD_PTR_FIFO_CTL,
+                                              ipd_prc_hold_ptr_fifo_ctl.u64);
+                               ipd_prc_hold_ptr_fifo_ctl.u64 =
+                                   cvmx_read_csr
+                                   (CVMX_IPD_PRC_HOLD_PTR_FIFO_CTL);
+                               cvmx_fpa_free(cvmx_phys_to_ptr
+                                             ((uint64_t)
+                                              ipd_prc_hold_ptr_fifo_ctl.s.
+                                              ptr << 7), CVMX_FPA_PACKET_POOL,
+                                             0);
+                       }
+                       ipd_prc_hold_ptr_fifo_ctl.s.cena = 1;
+                       cvmx_write_csr(CVMX_IPD_PRC_HOLD_PTR_FIFO_CTL,
+                                      ipd_prc_hold_ptr_fifo_ctl.u64);
+               }
+
+               /* Free all packets in the fifo */
+               if (ipd_ptr_count.s.pkt_pcnt) {
+                       int i;
+                       union cvmx_ipd_pwp_ptr_fifo_ctl ipd_pwp_ptr_fifo_ctl;
+                       ipd_pwp_ptr_fifo_ctl.u64 =
+                           cvmx_read_csr(CVMX_IPD_PWP_PTR_FIFO_CTL);
+
+                       for (i = 0; i < ipd_ptr_count.s.pkt_pcnt; i++) {
+                               ipd_pwp_ptr_fifo_ctl.s.cena = 0;
+                               ipd_pwp_ptr_fifo_ctl.s.raddr =
+                                   (ipd_pwp_ptr_fifo_ctl.s.praddr +
+                                    i) % ipd_pwp_ptr_fifo_ctl.s.max_cnts;
+                               cvmx_write_csr(CVMX_IPD_PWP_PTR_FIFO_CTL,
+                                              ipd_pwp_ptr_fifo_ctl.u64);
+                               ipd_pwp_ptr_fifo_ctl.u64 =
+                                   cvmx_read_csr(CVMX_IPD_PWP_PTR_FIFO_CTL);
+                               cvmx_fpa_free(cvmx_phys_to_ptr
+                                             ((uint64_t) ipd_pwp_ptr_fifo_ctl.
+                                              s.ptr << 7),
+                                             CVMX_FPA_PACKET_POOL, 0);
+                       }
+                       ipd_pwp_ptr_fifo_ctl.s.cena = 1;
+                       cvmx_write_csr(CVMX_IPD_PWP_PTR_FIFO_CTL,
+                                      ipd_pwp_ptr_fifo_ctl.u64);
+               }
+
+               /* Reset the IPD to get all buffers out of it */
+               {
+                       union cvmx_ipd_ctl_status ipd_ctl_status;
+                       ipd_ctl_status.u64 = cvmx_read_csr(CVMX_IPD_CTL_STATUS);
+                       ipd_ctl_status.s.reset = 1;
+                       cvmx_write_csr(CVMX_IPD_CTL_STATUS, ipd_ctl_status.u64);
+               }
+
+               /* Reset the PIP */
+               {
+                       union cvmx_pip_sft_rst pip_sft_rst;
+                       pip_sft_rst.u64 = cvmx_read_csr(CVMX_PIP_SFT_RST);
+                       pip_sft_rst.s.rst = 1;
+                       cvmx_write_csr(CVMX_PIP_SFT_RST, pip_sft_rst.u64);
+               }
+       }
+}
+
+#endif /*  __CVMX_IPD_H__ */
diff --git a/arch/mips/include/asm/octeon/cvmx-mdio.h b/arch/mips/include/asm/octeon/cvmx-mdio.h
new file mode 100644 (file)
index 0000000..d88ab8d
--- /dev/null
@@ -0,0 +1,506 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ *
+ * Interface to the SMI/MDIO hardware, including support for both IEEE 802.3
+ * clause 22 and clause 45 operations.
+ *
+ */
+
+#ifndef __CVMX_MIO_H__
+#define __CVMX_MIO_H__
+
+#include "cvmx-smix-defs.h"
+
+/**
+ * PHY register 0 from the 802.3 spec
+ */
+#define CVMX_MDIO_PHY_REG_CONTROL 0
+typedef union {
+       uint16_t u16;
+       struct {
+               uint16_t reset:1;
+               uint16_t loopback:1;
+               uint16_t speed_lsb:1;
+               uint16_t autoneg_enable:1;
+               uint16_t power_down:1;
+               uint16_t isolate:1;
+               uint16_t restart_autoneg:1;
+               uint16_t duplex:1;
+               uint16_t collision_test:1;
+               uint16_t speed_msb:1;
+               uint16_t unidirectional_enable:1;
+               uint16_t reserved_0_4:5;
+       } s;
+} cvmx_mdio_phy_reg_control_t;
+
+/**
+ * PHY register 1 from the 802.3 spec
+ */
+#define CVMX_MDIO_PHY_REG_STATUS 1
+typedef union {
+       uint16_t u16;
+       struct {
+               uint16_t capable_100base_t4:1;
+               uint16_t capable_100base_x_full:1;
+               uint16_t capable_100base_x_half:1;
+               uint16_t capable_10_full:1;
+               uint16_t capable_10_half:1;
+               uint16_t capable_100base_t2_full:1;
+               uint16_t capable_100base_t2_half:1;
+               uint16_t capable_extended_status:1;
+               uint16_t capable_unidirectional:1;
+               uint16_t capable_mf_preamble_suppression:1;
+               uint16_t autoneg_complete:1;
+               uint16_t remote_fault:1;
+               uint16_t capable_autoneg:1;
+               uint16_t link_status:1;
+               uint16_t jabber_detect:1;
+               uint16_t capable_extended_registers:1;
+
+       } s;
+} cvmx_mdio_phy_reg_status_t;
+
+/**
+ * PHY register 2 from the 802.3 spec
+ */
+#define CVMX_MDIO_PHY_REG_ID1 2
+typedef union {
+       uint16_t u16;
+       struct {
+               uint16_t oui_bits_3_18;
+       } s;
+} cvmx_mdio_phy_reg_id1_t;
+
+/**
+ * PHY register 3 from the 802.3 spec
+ */
+#define CVMX_MDIO_PHY_REG_ID2 3
+typedef union {
+       uint16_t u16;
+       struct {
+               uint16_t oui_bits_19_24:6;
+               uint16_t model:6;
+               uint16_t revision:4;
+       } s;
+} cvmx_mdio_phy_reg_id2_t;
+
+/**
+ * PHY register 4 from the 802.3 spec
+ */
+#define CVMX_MDIO_PHY_REG_AUTONEG_ADVER 4
+typedef union {
+       uint16_t u16;
+       struct {
+               uint16_t next_page:1;
+               uint16_t reserved_14:1;
+               uint16_t remote_fault:1;
+               uint16_t reserved_12:1;
+               uint16_t asymmetric_pause:1;
+               uint16_t pause:1;
+               uint16_t advert_100base_t4:1;
+               uint16_t advert_100base_tx_full:1;
+               uint16_t advert_100base_tx_half:1;
+               uint16_t advert_10base_tx_full:1;
+               uint16_t advert_10base_tx_half:1;
+               uint16_t selector:5;
+       } s;
+} cvmx_mdio_phy_reg_autoneg_adver_t;
+
+/**
+ * PHY register 5 from the 802.3 spec
+ */
+#define CVMX_MDIO_PHY_REG_LINK_PARTNER_ABILITY 5
+typedef union {
+       uint16_t u16;
+       struct {
+               uint16_t next_page:1;
+               uint16_t ack:1;
+               uint16_t remote_fault:1;
+               uint16_t reserved_12:1;
+               uint16_t asymmetric_pause:1;
+               uint16_t pause:1;
+               uint16_t advert_100base_t4:1;
+               uint16_t advert_100base_tx_full:1;
+               uint16_t advert_100base_tx_half:1;
+               uint16_t advert_10base_tx_full:1;
+               uint16_t advert_10base_tx_half:1;
+               uint16_t selector:5;
+       } s;
+} cvmx_mdio_phy_reg_link_partner_ability_t;
+
+/**
+ * PHY register 6 from the 802.3 spec
+ */
+#define CVMX_MDIO_PHY_REG_AUTONEG_EXPANSION 6
+typedef union {
+       uint16_t u16;
+       struct {
+               uint16_t reserved_5_15:11;
+               uint16_t parallel_detection_fault:1;
+               uint16_t link_partner_next_page_capable:1;
+               uint16_t local_next_page_capable:1;
+               uint16_t page_received:1;
+               uint16_t link_partner_autoneg_capable:1;
+
+       } s;
+} cvmx_mdio_phy_reg_autoneg_expansion_t;
+
+/**
+ * PHY register 9 from the 802.3 spec
+ */
+#define CVMX_MDIO_PHY_REG_CONTROL_1000 9
+typedef union {
+       uint16_t u16;
+       struct {
+               uint16_t test_mode:3;
+               uint16_t manual_master_slave:1;
+               uint16_t master:1;
+               uint16_t port_type:1;
+               uint16_t advert_1000base_t_full:1;
+               uint16_t advert_1000base_t_half:1;
+               uint16_t reserved_0_7:8;
+       } s;
+} cvmx_mdio_phy_reg_control_1000_t;
+
+/**
+ * PHY register 10 from the 802.3 spec
+ */
+#define CVMX_MDIO_PHY_REG_STATUS_1000 10
+typedef union {
+       uint16_t u16;
+       struct {
+               uint16_t master_slave_fault:1;
+               uint16_t is_master:1;
+               uint16_t local_receiver_ok:1;
+               uint16_t remote_receiver_ok:1;
+               uint16_t remote_capable_1000base_t_full:1;
+               uint16_t remote_capable_1000base_t_half:1;
+               uint16_t reserved_8_9:2;
+               uint16_t idle_error_count:8;
+       } s;
+} cvmx_mdio_phy_reg_status_1000_t;
+
+/**
+ * PHY register 15 from the 802.3 spec
+ */
+#define CVMX_MDIO_PHY_REG_EXTENDED_STATUS 15
+typedef union {
+       uint16_t u16;
+       struct {
+               uint16_t capable_1000base_x_full:1;
+               uint16_t capable_1000base_x_half:1;
+               uint16_t capable_1000base_t_full:1;
+               uint16_t capable_1000base_t_half:1;
+               uint16_t reserved_0_11:12;
+       } s;
+} cvmx_mdio_phy_reg_extended_status_t;
+
+/**
+ * PHY register 13 from the 802.3 spec
+ */
+#define CVMX_MDIO_PHY_REG_MMD_CONTROL 13
+typedef union {
+       uint16_t u16;
+       struct {
+               uint16_t function:2;
+               uint16_t reserved_5_13:9;
+               uint16_t devad:5;
+       } s;
+} cvmx_mdio_phy_reg_mmd_control_t;
+
+/**
+ * PHY register 14 from the 802.3 spec
+ */
+#define CVMX_MDIO_PHY_REG_MMD_ADDRESS_DATA 14
+typedef union {
+       uint16_t u16;
+       struct {
+               uint16_t address_data:16;
+       } s;
+} cvmx_mdio_phy_reg_mmd_address_data_t;
+
+/* Operating request encodings. */
+#define MDIO_CLAUSE_22_WRITE    0
+#define MDIO_CLAUSE_22_READ     1
+
+#define MDIO_CLAUSE_45_ADDRESS  0
+#define MDIO_CLAUSE_45_WRITE    1
+#define MDIO_CLAUSE_45_READ_INC 2
+#define MDIO_CLAUSE_45_READ     3
+
+/* MMD identifiers, mostly for accessing devices within XENPAK modules. */
+#define CVMX_MMD_DEVICE_PMA_PMD      1
+#define CVMX_MMD_DEVICE_WIS          2
+#define CVMX_MMD_DEVICE_PCS          3
+#define CVMX_MMD_DEVICE_PHY_XS       4
+#define CVMX_MMD_DEVICE_DTS_XS       5
+#define CVMX_MMD_DEVICE_TC           6
+#define CVMX_MMD_DEVICE_CL22_EXT     29
+#define CVMX_MMD_DEVICE_VENDOR_1     30
+#define CVMX_MMD_DEVICE_VENDOR_2     31
+
+/* Helper function to put MDIO interface into clause 45 mode */
+static inline void __cvmx_mdio_set_clause45_mode(int bus_id)
+{
+       union cvmx_smix_clk smi_clk;
+       /* Put bus into clause 45 mode */
+       smi_clk.u64 = cvmx_read_csr(CVMX_SMIX_CLK(bus_id));
+       smi_clk.s.mode = 1;
+       smi_clk.s.preamble = 1;
+       cvmx_write_csr(CVMX_SMIX_CLK(bus_id), smi_clk.u64);
+}
+
+/* Helper function to put MDIO interface into clause 22 mode */
+static inline void __cvmx_mdio_set_clause22_mode(int bus_id)
+{
+       union cvmx_smix_clk smi_clk;
+       /* Put bus into clause 22 mode */
+       smi_clk.u64 = cvmx_read_csr(CVMX_SMIX_CLK(bus_id));
+       smi_clk.s.mode = 0;
+       cvmx_write_csr(CVMX_SMIX_CLK(bus_id), smi_clk.u64);
+}
+
+/**
+ * Perform an MII read. This function is used to read PHY
+ * registers controlling auto negotiation.
+ *
+ * @bus_id:   MDIO bus number. Zero on most chips, but some chips (ex CN56XX)
+ *                 support multiple busses.
+ * @phy_id:   The MII phy id
+ * @location: Register location to read
+ *
+ * Returns Result from the read or -1 on failure
+ */
+static inline int cvmx_mdio_read(int bus_id, int phy_id, int location)
+{
+       union cvmx_smix_cmd smi_cmd;
+       union cvmx_smix_rd_dat smi_rd;
+       int timeout = 1000;
+
+       if (octeon_has_feature(OCTEON_FEATURE_MDIO_CLAUSE_45))
+               __cvmx_mdio_set_clause22_mode(bus_id);
+
+       smi_cmd.u64 = 0;
+       smi_cmd.s.phy_op = MDIO_CLAUSE_22_READ;
+       smi_cmd.s.phy_adr = phy_id;
+       smi_cmd.s.reg_adr = location;
+       cvmx_write_csr(CVMX_SMIX_CMD(bus_id), smi_cmd.u64);
+
+       do {
+               cvmx_wait(1000);
+               smi_rd.u64 = cvmx_read_csr(CVMX_SMIX_RD_DAT(bus_id));
+       } while (smi_rd.s.pending && timeout--);
+
+       if (smi_rd.s.val)
+               return smi_rd.s.dat;
+       else
+               return -1;
+}
+
+/**
+ * Perform an MII write. This function is used to write PHY
+ * registers controlling auto negotiation.
+ *
+ * @bus_id:   MDIO bus number. Zero on most chips, but some chips (ex CN56XX)
+ *                 support multiple busses.
+ * @phy_id:   The MII phy id
+ * @location: Register location to write
+ * @val:      Value to write
+ *
+ * Returns -1 on error
+ *         0 on success
+ */
+static inline int cvmx_mdio_write(int bus_id, int phy_id, int location, int val)
+{
+       union cvmx_smix_cmd smi_cmd;
+       union cvmx_smix_wr_dat smi_wr;
+       int timeout = 1000;
+
+       if (octeon_has_feature(OCTEON_FEATURE_MDIO_CLAUSE_45))
+               __cvmx_mdio_set_clause22_mode(bus_id);
+
+       smi_wr.u64 = 0;
+       smi_wr.s.dat = val;
+       cvmx_write_csr(CVMX_SMIX_WR_DAT(bus_id), smi_wr.u64);
+
+       smi_cmd.u64 = 0;
+       smi_cmd.s.phy_op = MDIO_CLAUSE_22_WRITE;
+       smi_cmd.s.phy_adr = phy_id;
+       smi_cmd.s.reg_adr = location;
+       cvmx_write_csr(CVMX_SMIX_CMD(bus_id), smi_cmd.u64);
+
+       do {
+               cvmx_wait(1000);
+               smi_wr.u64 = cvmx_read_csr(CVMX_SMIX_WR_DAT(bus_id));
+       } while (smi_wr.s.pending && --timeout);
+       if (timeout <= 0)
+               return -1;
+
+       return 0;
+}
+
+/**
+ * Perform an IEEE 802.3 clause 45 MII read. This function is used to
+ * read PHY registers controlling auto negotiation.
+ *
+ * @bus_id:   MDIO bus number. Zero on most chips, but some chips (ex CN56XX)
+ *                 support multiple busses.
+ * @phy_id:   The MII phy id
+ * @device:   MDIO Managable Device (MMD) id
+ * @location: Register location to read
+ *
+ * Returns Result from the read or -1 on failure
+ */
+
+static inline int cvmx_mdio_45_read(int bus_id, int phy_id, int device,
+                                   int location)
+{
+       union cvmx_smix_cmd smi_cmd;
+       union cvmx_smix_rd_dat smi_rd;
+       union cvmx_smix_wr_dat smi_wr;
+       int timeout = 1000;
+
+       if (!octeon_has_feature(OCTEON_FEATURE_MDIO_CLAUSE_45))
+               return -1;
+
+       __cvmx_mdio_set_clause45_mode(bus_id);
+
+       smi_wr.u64 = 0;
+       smi_wr.s.dat = location;
+       cvmx_write_csr(CVMX_SMIX_WR_DAT(bus_id), smi_wr.u64);
+
+       smi_cmd.u64 = 0;
+       smi_cmd.s.phy_op = MDIO_CLAUSE_45_ADDRESS;
+       smi_cmd.s.phy_adr = phy_id;
+       smi_cmd.s.reg_adr = device;
+       cvmx_write_csr(CVMX_SMIX_CMD(bus_id), smi_cmd.u64);
+
+       do {
+               cvmx_wait(1000);
+               smi_wr.u64 = cvmx_read_csr(CVMX_SMIX_WR_DAT(bus_id));
+       } while (smi_wr.s.pending && --timeout);
+       if (timeout <= 0) {
+               cvmx_dprintf("cvmx_mdio_45_read: bus_id %d phy_id %2d "
+                            "device %2d register %2d   TIME OUT(address)\n",
+                    bus_id, phy_id, device, location);
+               return -1;
+       }
+
+       smi_cmd.u64 = 0;
+       smi_cmd.s.phy_op = MDIO_CLAUSE_45_READ;
+       smi_cmd.s.phy_adr = phy_id;
+       smi_cmd.s.reg_adr = device;
+       cvmx_write_csr(CVMX_SMIX_CMD(bus_id), smi_cmd.u64);
+
+       do {
+               cvmx_wait(1000);
+               smi_rd.u64 = cvmx_read_csr(CVMX_SMIX_RD_DAT(bus_id));
+       } while (smi_rd.s.pending && --timeout);
+
+       if (timeout <= 0) {
+               cvmx_dprintf("cvmx_mdio_45_read: bus_id %d phy_id %2d "
+                            "device %2d register %2d   TIME OUT(data)\n",
+                    bus_id, phy_id, device, location);
+               return -1;
+       }
+
+       if (smi_rd.s.val)
+               return smi_rd.s.dat;
+       else {
+               cvmx_dprintf("cvmx_mdio_45_read: bus_id %d phy_id %2d "
+                            "device %2d register %2d   INVALID READ\n",
+                    bus_id, phy_id, device, location);
+               return -1;
+       }
+}
+
+/**
+ * Perform an IEEE 802.3 clause 45 MII write. This function is used to
+ * write PHY registers controlling auto negotiation.
+ *
+ * @bus_id:   MDIO bus number. Zero on most chips, but some chips (ex CN56XX)
+ *                 support multiple busses.
+ * @phy_id:   The MII phy id
+ * @device:   MDIO Managable Device (MMD) id
+ * @location: Register location to write
+ * @val:      Value to write
+ *
+ * Returns -1 on error
+ *         0 on success
+ */
+static inline int cvmx_mdio_45_write(int bus_id, int phy_id, int device,
+                                    int location, int val)
+{
+       union cvmx_smix_cmd smi_cmd;
+       union cvmx_smix_wr_dat smi_wr;
+       int timeout = 1000;
+
+       if (!octeon_has_feature(OCTEON_FEATURE_MDIO_CLAUSE_45))
+               return -1;
+
+       __cvmx_mdio_set_clause45_mode(bus_id);
+
+       smi_wr.u64 = 0;
+       smi_wr.s.dat = location;
+       cvmx_write_csr(CVMX_SMIX_WR_DAT(bus_id), smi_wr.u64);
+
+       smi_cmd.u64 = 0;
+       smi_cmd.s.phy_op = MDIO_CLAUSE_45_ADDRESS;
+       smi_cmd.s.phy_adr = phy_id;
+       smi_cmd.s.reg_adr = device;
+       cvmx_write_csr(CVMX_SMIX_CMD(bus_id), smi_cmd.u64);
+
+       do {
+               cvmx_wait(1000);
+               smi_wr.u64 = cvmx_read_csr(CVMX_SMIX_WR_DAT(bus_id));
+       } while (smi_wr.s.pending && --timeout);
+       if (timeout <= 0)
+               return -1;
+
+       smi_wr.u64 = 0;
+       smi_wr.s.dat = val;
+       cvmx_write_csr(CVMX_SMIX_WR_DAT(bus_id), smi_wr.u64);
+
+       smi_cmd.u64 = 0;
+       smi_cmd.s.phy_op = MDIO_CLAUSE_45_WRITE;
+       smi_cmd.s.phy_adr = phy_id;
+       smi_cmd.s.reg_adr = device;
+       cvmx_write_csr(CVMX_SMIX_CMD(bus_id), smi_cmd.u64);
+
+       do {
+               cvmx_wait(1000);
+               smi_wr.u64 = cvmx_read_csr(CVMX_SMIX_WR_DAT(bus_id));
+       } while (smi_wr.s.pending && --timeout);
+       if (timeout <= 0)
+               return -1;
+
+       return 0;
+}
+
+#endif
index 52b14a333ad44ada1b25b3bfc0e0475743fa4e23..b1774126736d93dc3f3755cac20004448f04a3d2 100644 (file)
 #define CVMX_MIO_BOOT_REG_CFGX(offset) (CVMX_ADD_IO_SEG(0x0001180000000000ull) + ((offset) & 7) * 8)
 #define CVMX_MIO_BOOT_REG_TIMX(offset) (CVMX_ADD_IO_SEG(0x0001180000000040ull) + ((offset) & 7) * 8)
 #define CVMX_MIO_BOOT_THR (CVMX_ADD_IO_SEG(0x00011800000000B0ull))
+#define CVMX_MIO_EMM_BUF_DAT (CVMX_ADD_IO_SEG(0x00011800000020E8ull))
+#define CVMX_MIO_EMM_BUF_IDX (CVMX_ADD_IO_SEG(0x00011800000020E0ull))
+#define CVMX_MIO_EMM_CFG (CVMX_ADD_IO_SEG(0x0001180000002000ull))
+#define CVMX_MIO_EMM_CMD (CVMX_ADD_IO_SEG(0x0001180000002058ull))
+#define CVMX_MIO_EMM_DMA (CVMX_ADD_IO_SEG(0x0001180000002050ull))
+#define CVMX_MIO_EMM_INT (CVMX_ADD_IO_SEG(0x0001180000002078ull))
+#define CVMX_MIO_EMM_INT_EN (CVMX_ADD_IO_SEG(0x0001180000002080ull))
+#define CVMX_MIO_EMM_MODEX(offset) (CVMX_ADD_IO_SEG(0x0001180000002008ull) + ((offset) & 3) * 8)
+#define CVMX_MIO_EMM_RCA (CVMX_ADD_IO_SEG(0x00011800000020A0ull))
+#define CVMX_MIO_EMM_RSP_HI (CVMX_ADD_IO_SEG(0x0001180000002070ull))
+#define CVMX_MIO_EMM_RSP_LO (CVMX_ADD_IO_SEG(0x0001180000002068ull))
+#define CVMX_MIO_EMM_RSP_STS (CVMX_ADD_IO_SEG(0x0001180000002060ull))
+#define CVMX_MIO_EMM_SAMPLE (CVMX_ADD_IO_SEG(0x0001180000002090ull))
+#define CVMX_MIO_EMM_STS_MASK (CVMX_ADD_IO_SEG(0x0001180000002098ull))
+#define CVMX_MIO_EMM_SWITCH (CVMX_ADD_IO_SEG(0x0001180000002048ull))
+#define CVMX_MIO_EMM_WDOG (CVMX_ADD_IO_SEG(0x0001180000002088ull))
 #define CVMX_MIO_FUS_BNK_DATX(offset) (CVMX_ADD_IO_SEG(0x0001180000001520ull) + ((offset) & 3) * 8)
 #define CVMX_MIO_FUS_DAT0 (CVMX_ADD_IO_SEG(0x0001180000001400ull))
 #define CVMX_MIO_FUS_DAT1 (CVMX_ADD_IO_SEG(0x0001180000001408ull))
@@ -60,6 +76,7 @@
 #define CVMX_MIO_FUS_REPAIR_RES2 (CVMX_ADD_IO_SEG(0x0001180000001568ull))
 #define CVMX_MIO_FUS_SPR_REPAIR_RES (CVMX_ADD_IO_SEG(0x0001180000001548ull))
 #define CVMX_MIO_FUS_SPR_REPAIR_SUM (CVMX_ADD_IO_SEG(0x0001180000001540ull))
+#define CVMX_MIO_FUS_TGG (CVMX_ADD_IO_SEG(0x0001180000001428ull))
 #define CVMX_MIO_FUS_UNLOCK (CVMX_ADD_IO_SEG(0x0001180000001578ull))
 #define CVMX_MIO_FUS_WADR (CVMX_ADD_IO_SEG(0x0001180000001508ull))
 #define CVMX_MIO_GPIO_COMP (CVMX_ADD_IO_SEG(0x00011800000000C8ull))
 #define CVMX_MIO_NDF_DMA_INT_EN (CVMX_ADD_IO_SEG(0x0001180000000178ull))
 #define CVMX_MIO_PLL_CTL (CVMX_ADD_IO_SEG(0x0001180000001448ull))
 #define CVMX_MIO_PLL_SETTING (CVMX_ADD_IO_SEG(0x0001180000001440ull))
+#define CVMX_MIO_PTP_CKOUT_HI_INCR (CVMX_ADD_IO_SEG(0x0001070000000F40ull))
+#define CVMX_MIO_PTP_CKOUT_LO_INCR (CVMX_ADD_IO_SEG(0x0001070000000F48ull))
+#define CVMX_MIO_PTP_CKOUT_THRESH_HI (CVMX_ADD_IO_SEG(0x0001070000000F38ull))
+#define CVMX_MIO_PTP_CKOUT_THRESH_LO (CVMX_ADD_IO_SEG(0x0001070000000F30ull))
 #define CVMX_MIO_PTP_CLOCK_CFG (CVMX_ADD_IO_SEG(0x0001070000000F00ull))
 #define CVMX_MIO_PTP_CLOCK_COMP (CVMX_ADD_IO_SEG(0x0001070000000F18ull))
 #define CVMX_MIO_PTP_CLOCK_HI (CVMX_ADD_IO_SEG(0x0001070000000F10ull))
 #define CVMX_MIO_PTP_CLOCK_LO (CVMX_ADD_IO_SEG(0x0001070000000F08ull))
 #define CVMX_MIO_PTP_EVT_CNT (CVMX_ADD_IO_SEG(0x0001070000000F28ull))
+#define CVMX_MIO_PTP_PPS_HI_INCR (CVMX_ADD_IO_SEG(0x0001070000000F60ull))
+#define CVMX_MIO_PTP_PPS_LO_INCR (CVMX_ADD_IO_SEG(0x0001070000000F68ull))
+#define CVMX_MIO_PTP_PPS_THRESH_HI (CVMX_ADD_IO_SEG(0x0001070000000F58ull))
+#define CVMX_MIO_PTP_PPS_THRESH_LO (CVMX_ADD_IO_SEG(0x0001070000000F50ull))
 #define CVMX_MIO_PTP_TIMESTAMP (CVMX_ADD_IO_SEG(0x0001070000000F20ull))
+#define CVMX_MIO_QLMX_CFG(offset) (CVMX_ADD_IO_SEG(0x0001180000001590ull) + ((offset) & 7) * 8)
 #define CVMX_MIO_RST_BOOT (CVMX_ADD_IO_SEG(0x0001180000001600ull))
 #define CVMX_MIO_RST_CFG (CVMX_ADD_IO_SEG(0x0001180000001610ull))
+#define CVMX_MIO_RST_CKILL (CVMX_ADD_IO_SEG(0x0001180000001638ull))
+#define CVMX_MIO_RST_CNTLX(offset) (CVMX_ADD_IO_SEG(0x0001180000001648ull) + ((offset) & 3) * 8)
 #define CVMX_MIO_RST_CTLX(offset) (CVMX_ADD_IO_SEG(0x0001180000001618ull) + ((offset) & 1) * 8)
 #define CVMX_MIO_RST_DELAY (CVMX_ADD_IO_SEG(0x0001180000001608ull))
 #define CVMX_MIO_RST_INT (CVMX_ADD_IO_SEG(0x0001180000001628ull))
@@ -183,11 +211,21 @@ union cvmx_mio_boot_bist_stat {
        struct cvmx_mio_boot_bist_stat_cn52xxp1 cn56xxp1;
        struct cvmx_mio_boot_bist_stat_cn38xx cn58xx;
        struct cvmx_mio_boot_bist_stat_cn38xx cn58xxp1;
+       struct cvmx_mio_boot_bist_stat_cn61xx {
+               uint64_t reserved_12_63:52;
+               uint64_t stat:12;
+       } cn61xx;
        struct cvmx_mio_boot_bist_stat_cn63xx {
                uint64_t reserved_9_63:55;
                uint64_t stat:9;
        } cn63xx;
        struct cvmx_mio_boot_bist_stat_cn63xx cn63xxp1;
+       struct cvmx_mio_boot_bist_stat_cn66xx {
+               uint64_t reserved_10_63:54;
+               uint64_t stat:10;
+       } cn66xx;
+       struct cvmx_mio_boot_bist_stat_cn66xx cn68xx;
+       struct cvmx_mio_boot_bist_stat_cn66xx cn68xxp1;
 };
 
 union cvmx_mio_boot_comp {
@@ -204,12 +242,16 @@ union cvmx_mio_boot_comp {
        struct cvmx_mio_boot_comp_cn50xx cn52xxp1;
        struct cvmx_mio_boot_comp_cn50xx cn56xx;
        struct cvmx_mio_boot_comp_cn50xx cn56xxp1;
-       struct cvmx_mio_boot_comp_cn63xx {
+       struct cvmx_mio_boot_comp_cn61xx {
                uint64_t reserved_12_63:52;
                uint64_t pctl:6;
                uint64_t nctl:6;
-       } cn63xx;
-       struct cvmx_mio_boot_comp_cn63xx cn63xxp1;
+       } cn61xx;
+       struct cvmx_mio_boot_comp_cn61xx cn63xx;
+       struct cvmx_mio_boot_comp_cn61xx cn63xxp1;
+       struct cvmx_mio_boot_comp_cn61xx cn66xx;
+       struct cvmx_mio_boot_comp_cn61xx cn68xx;
+       struct cvmx_mio_boot_comp_cn61xx cn68xxp1;
 };
 
 union cvmx_mio_boot_dma_cfgx {
@@ -230,8 +272,12 @@ union cvmx_mio_boot_dma_cfgx {
        struct cvmx_mio_boot_dma_cfgx_s cn52xxp1;
        struct cvmx_mio_boot_dma_cfgx_s cn56xx;
        struct cvmx_mio_boot_dma_cfgx_s cn56xxp1;
+       struct cvmx_mio_boot_dma_cfgx_s cn61xx;
        struct cvmx_mio_boot_dma_cfgx_s cn63xx;
        struct cvmx_mio_boot_dma_cfgx_s cn63xxp1;
+       struct cvmx_mio_boot_dma_cfgx_s cn66xx;
+       struct cvmx_mio_boot_dma_cfgx_s cn68xx;
+       struct cvmx_mio_boot_dma_cfgx_s cn68xxp1;
 };
 
 union cvmx_mio_boot_dma_intx {
@@ -245,8 +291,12 @@ union cvmx_mio_boot_dma_intx {
        struct cvmx_mio_boot_dma_intx_s cn52xxp1;
        struct cvmx_mio_boot_dma_intx_s cn56xx;
        struct cvmx_mio_boot_dma_intx_s cn56xxp1;
+       struct cvmx_mio_boot_dma_intx_s cn61xx;
        struct cvmx_mio_boot_dma_intx_s cn63xx;
        struct cvmx_mio_boot_dma_intx_s cn63xxp1;
+       struct cvmx_mio_boot_dma_intx_s cn66xx;
+       struct cvmx_mio_boot_dma_intx_s cn68xx;
+       struct cvmx_mio_boot_dma_intx_s cn68xxp1;
 };
 
 union cvmx_mio_boot_dma_int_enx {
@@ -260,8 +310,12 @@ union cvmx_mio_boot_dma_int_enx {
        struct cvmx_mio_boot_dma_int_enx_s cn52xxp1;
        struct cvmx_mio_boot_dma_int_enx_s cn56xx;
        struct cvmx_mio_boot_dma_int_enx_s cn56xxp1;
+       struct cvmx_mio_boot_dma_int_enx_s cn61xx;
        struct cvmx_mio_boot_dma_int_enx_s cn63xx;
        struct cvmx_mio_boot_dma_int_enx_s cn63xxp1;
+       struct cvmx_mio_boot_dma_int_enx_s cn66xx;
+       struct cvmx_mio_boot_dma_int_enx_s cn68xx;
+       struct cvmx_mio_boot_dma_int_enx_s cn68xxp1;
 };
 
 union cvmx_mio_boot_dma_timx {
@@ -287,8 +341,12 @@ union cvmx_mio_boot_dma_timx {
        struct cvmx_mio_boot_dma_timx_s cn52xxp1;
        struct cvmx_mio_boot_dma_timx_s cn56xx;
        struct cvmx_mio_boot_dma_timx_s cn56xxp1;
+       struct cvmx_mio_boot_dma_timx_s cn61xx;
        struct cvmx_mio_boot_dma_timx_s cn63xx;
        struct cvmx_mio_boot_dma_timx_s cn63xxp1;
+       struct cvmx_mio_boot_dma_timx_s cn66xx;
+       struct cvmx_mio_boot_dma_timx_s cn68xx;
+       struct cvmx_mio_boot_dma_timx_s cn68xxp1;
 };
 
 union cvmx_mio_boot_err {
@@ -309,8 +367,12 @@ union cvmx_mio_boot_err {
        struct cvmx_mio_boot_err_s cn56xxp1;
        struct cvmx_mio_boot_err_s cn58xx;
        struct cvmx_mio_boot_err_s cn58xxp1;
+       struct cvmx_mio_boot_err_s cn61xx;
        struct cvmx_mio_boot_err_s cn63xx;
        struct cvmx_mio_boot_err_s cn63xxp1;
+       struct cvmx_mio_boot_err_s cn66xx;
+       struct cvmx_mio_boot_err_s cn68xx;
+       struct cvmx_mio_boot_err_s cn68xxp1;
 };
 
 union cvmx_mio_boot_int {
@@ -331,8 +393,12 @@ union cvmx_mio_boot_int {
        struct cvmx_mio_boot_int_s cn56xxp1;
        struct cvmx_mio_boot_int_s cn58xx;
        struct cvmx_mio_boot_int_s cn58xxp1;
+       struct cvmx_mio_boot_int_s cn61xx;
        struct cvmx_mio_boot_int_s cn63xx;
        struct cvmx_mio_boot_int_s cn63xxp1;
+       struct cvmx_mio_boot_int_s cn66xx;
+       struct cvmx_mio_boot_int_s cn68xx;
+       struct cvmx_mio_boot_int_s cn68xxp1;
 };
 
 union cvmx_mio_boot_loc_adr {
@@ -353,8 +419,12 @@ union cvmx_mio_boot_loc_adr {
        struct cvmx_mio_boot_loc_adr_s cn56xxp1;
        struct cvmx_mio_boot_loc_adr_s cn58xx;
        struct cvmx_mio_boot_loc_adr_s cn58xxp1;
+       struct cvmx_mio_boot_loc_adr_s cn61xx;
        struct cvmx_mio_boot_loc_adr_s cn63xx;
        struct cvmx_mio_boot_loc_adr_s cn63xxp1;
+       struct cvmx_mio_boot_loc_adr_s cn66xx;
+       struct cvmx_mio_boot_loc_adr_s cn68xx;
+       struct cvmx_mio_boot_loc_adr_s cn68xxp1;
 };
 
 union cvmx_mio_boot_loc_cfgx {
@@ -377,8 +447,12 @@ union cvmx_mio_boot_loc_cfgx {
        struct cvmx_mio_boot_loc_cfgx_s cn56xxp1;
        struct cvmx_mio_boot_loc_cfgx_s cn58xx;
        struct cvmx_mio_boot_loc_cfgx_s cn58xxp1;
+       struct cvmx_mio_boot_loc_cfgx_s cn61xx;
        struct cvmx_mio_boot_loc_cfgx_s cn63xx;
        struct cvmx_mio_boot_loc_cfgx_s cn63xxp1;
+       struct cvmx_mio_boot_loc_cfgx_s cn66xx;
+       struct cvmx_mio_boot_loc_cfgx_s cn68xx;
+       struct cvmx_mio_boot_loc_cfgx_s cn68xxp1;
 };
 
 union cvmx_mio_boot_loc_dat {
@@ -397,14 +471,19 @@ union cvmx_mio_boot_loc_dat {
        struct cvmx_mio_boot_loc_dat_s cn56xxp1;
        struct cvmx_mio_boot_loc_dat_s cn58xx;
        struct cvmx_mio_boot_loc_dat_s cn58xxp1;
+       struct cvmx_mio_boot_loc_dat_s cn61xx;
        struct cvmx_mio_boot_loc_dat_s cn63xx;
        struct cvmx_mio_boot_loc_dat_s cn63xxp1;
+       struct cvmx_mio_boot_loc_dat_s cn66xx;
+       struct cvmx_mio_boot_loc_dat_s cn68xx;
+       struct cvmx_mio_boot_loc_dat_s cn68xxp1;
 };
 
 union cvmx_mio_boot_pin_defs {
        uint64_t u64;
        struct cvmx_mio_boot_pin_defs_s {
-               uint64_t reserved_16_63:48;
+               uint64_t reserved_32_63:32;
+               uint64_t user1:16;
                uint64_t ale:1;
                uint64_t width:1;
                uint64_t dmack_p2:1;
@@ -412,7 +491,7 @@ union cvmx_mio_boot_pin_defs {
                uint64_t dmack_p0:1;
                uint64_t term:2;
                uint64_t nand:1;
-               uint64_t reserved_0_7:8;
+               uint64_t user0:8;
        } s;
        struct cvmx_mio_boot_pin_defs_cn52xx {
                uint64_t reserved_16_63:48;
@@ -435,8 +514,23 @@ union cvmx_mio_boot_pin_defs {
                uint64_t term:2;
                uint64_t reserved_0_8:9;
        } cn56xx;
+       struct cvmx_mio_boot_pin_defs_cn61xx {
+               uint64_t reserved_32_63:32;
+               uint64_t user1:16;
+               uint64_t ale:1;
+               uint64_t width:1;
+               uint64_t reserved_13_13:1;
+               uint64_t dmack_p1:1;
+               uint64_t dmack_p0:1;
+               uint64_t term:2;
+               uint64_t nand:1;
+               uint64_t user0:8;
+       } cn61xx;
        struct cvmx_mio_boot_pin_defs_cn52xx cn63xx;
        struct cvmx_mio_boot_pin_defs_cn52xx cn63xxp1;
+       struct cvmx_mio_boot_pin_defs_cn52xx cn66xx;
+       struct cvmx_mio_boot_pin_defs_cn52xx cn68xx;
+       struct cvmx_mio_boot_pin_defs_cn52xx cn68xxp1;
 };
 
 union cvmx_mio_boot_reg_cfgx {
@@ -498,8 +592,12 @@ union cvmx_mio_boot_reg_cfgx {
        struct cvmx_mio_boot_reg_cfgx_s cn56xxp1;
        struct cvmx_mio_boot_reg_cfgx_cn30xx cn58xx;
        struct cvmx_mio_boot_reg_cfgx_cn30xx cn58xxp1;
+       struct cvmx_mio_boot_reg_cfgx_s cn61xx;
        struct cvmx_mio_boot_reg_cfgx_s cn63xx;
        struct cvmx_mio_boot_reg_cfgx_s cn63xxp1;
+       struct cvmx_mio_boot_reg_cfgx_s cn66xx;
+       struct cvmx_mio_boot_reg_cfgx_s cn68xx;
+       struct cvmx_mio_boot_reg_cfgx_s cn68xxp1;
 };
 
 union cvmx_mio_boot_reg_timx {
@@ -544,8 +642,12 @@ union cvmx_mio_boot_reg_timx {
        struct cvmx_mio_boot_reg_timx_s cn56xxp1;
        struct cvmx_mio_boot_reg_timx_s cn58xx;
        struct cvmx_mio_boot_reg_timx_s cn58xxp1;
+       struct cvmx_mio_boot_reg_timx_s cn61xx;
        struct cvmx_mio_boot_reg_timx_s cn63xx;
        struct cvmx_mio_boot_reg_timx_s cn63xxp1;
+       struct cvmx_mio_boot_reg_timx_s cn66xx;
+       struct cvmx_mio_boot_reg_timx_s cn68xx;
+       struct cvmx_mio_boot_reg_timx_s cn68xxp1;
 };
 
 union cvmx_mio_boot_thr {
@@ -574,8 +676,231 @@ union cvmx_mio_boot_thr {
        struct cvmx_mio_boot_thr_s cn56xxp1;
        struct cvmx_mio_boot_thr_cn30xx cn58xx;
        struct cvmx_mio_boot_thr_cn30xx cn58xxp1;
+       struct cvmx_mio_boot_thr_s cn61xx;
        struct cvmx_mio_boot_thr_s cn63xx;
        struct cvmx_mio_boot_thr_s cn63xxp1;
+       struct cvmx_mio_boot_thr_s cn66xx;
+       struct cvmx_mio_boot_thr_s cn68xx;
+       struct cvmx_mio_boot_thr_s cn68xxp1;
+};
+
+union cvmx_mio_emm_buf_dat {
+       uint64_t u64;
+       struct cvmx_mio_emm_buf_dat_s {
+               uint64_t dat:64;
+       } s;
+       struct cvmx_mio_emm_buf_dat_s cn61xx;
+};
+
+union cvmx_mio_emm_buf_idx {
+       uint64_t u64;
+       struct cvmx_mio_emm_buf_idx_s {
+               uint64_t reserved_17_63:47;
+               uint64_t inc:1;
+               uint64_t reserved_7_15:9;
+               uint64_t buf_num:1;
+               uint64_t offset:6;
+       } s;
+       struct cvmx_mio_emm_buf_idx_s cn61xx;
+};
+
+union cvmx_mio_emm_cfg {
+       uint64_t u64;
+       struct cvmx_mio_emm_cfg_s {
+               uint64_t reserved_17_63:47;
+               uint64_t boot_fail:1;
+               uint64_t reserved_4_15:12;
+               uint64_t bus_ena:4;
+       } s;
+       struct cvmx_mio_emm_cfg_s cn61xx;
+};
+
+union cvmx_mio_emm_cmd {
+       uint64_t u64;
+       struct cvmx_mio_emm_cmd_s {
+               uint64_t reserved_62_63:2;
+               uint64_t bus_id:2;
+               uint64_t cmd_val:1;
+               uint64_t reserved_56_58:3;
+               uint64_t dbuf:1;
+               uint64_t offset:6;
+               uint64_t reserved_43_48:6;
+               uint64_t ctype_xor:2;
+               uint64_t rtype_xor:3;
+               uint64_t cmd_idx:6;
+               uint64_t arg:32;
+       } s;
+       struct cvmx_mio_emm_cmd_s cn61xx;
+};
+
+union cvmx_mio_emm_dma {
+       uint64_t u64;
+       struct cvmx_mio_emm_dma_s {
+               uint64_t reserved_62_63:2;
+               uint64_t bus_id:2;
+               uint64_t dma_val:1;
+               uint64_t sector:1;
+               uint64_t dat_null:1;
+               uint64_t thres:6;
+               uint64_t rel_wr:1;
+               uint64_t rw:1;
+               uint64_t multi:1;
+               uint64_t block_cnt:16;
+               uint64_t card_addr:32;
+       } s;
+       struct cvmx_mio_emm_dma_s cn61xx;
+};
+
+union cvmx_mio_emm_int {
+       uint64_t u64;
+       struct cvmx_mio_emm_int_s {
+               uint64_t reserved_7_63:57;
+               uint64_t switch_err:1;
+               uint64_t switch_done:1;
+               uint64_t dma_err:1;
+               uint64_t cmd_err:1;
+               uint64_t dma_done:1;
+               uint64_t cmd_done:1;
+               uint64_t buf_done:1;
+       } s;
+       struct cvmx_mio_emm_int_s cn61xx;
+};
+
+union cvmx_mio_emm_int_en {
+       uint64_t u64;
+       struct cvmx_mio_emm_int_en_s {
+               uint64_t reserved_7_63:57;
+               uint64_t switch_err:1;
+               uint64_t switch_done:1;
+               uint64_t dma_err:1;
+               uint64_t cmd_err:1;
+               uint64_t dma_done:1;
+               uint64_t cmd_done:1;
+               uint64_t buf_done:1;
+       } s;
+       struct cvmx_mio_emm_int_en_s cn61xx;
+};
+
+union cvmx_mio_emm_modex {
+       uint64_t u64;
+       struct cvmx_mio_emm_modex_s {
+               uint64_t reserved_49_63:15;
+               uint64_t hs_timing:1;
+               uint64_t reserved_43_47:5;
+               uint64_t bus_width:3;
+               uint64_t reserved_36_39:4;
+               uint64_t power_class:4;
+               uint64_t clk_hi:16;
+               uint64_t clk_lo:16;
+       } s;
+       struct cvmx_mio_emm_modex_s cn61xx;
+};
+
+union cvmx_mio_emm_rca {
+       uint64_t u64;
+       struct cvmx_mio_emm_rca_s {
+               uint64_t reserved_16_63:48;
+               uint64_t card_rca:16;
+       } s;
+       struct cvmx_mio_emm_rca_s cn61xx;
+};
+
+union cvmx_mio_emm_rsp_hi {
+       uint64_t u64;
+       struct cvmx_mio_emm_rsp_hi_s {
+               uint64_t dat:64;
+       } s;
+       struct cvmx_mio_emm_rsp_hi_s cn61xx;
+};
+
+union cvmx_mio_emm_rsp_lo {
+       uint64_t u64;
+       struct cvmx_mio_emm_rsp_lo_s {
+               uint64_t dat:64;
+       } s;
+       struct cvmx_mio_emm_rsp_lo_s cn61xx;
+};
+
+union cvmx_mio_emm_rsp_sts {
+       uint64_t u64;
+       struct cvmx_mio_emm_rsp_sts_s {
+               uint64_t reserved_62_63:2;
+               uint64_t bus_id:2;
+               uint64_t cmd_val:1;
+               uint64_t switch_val:1;
+               uint64_t dma_val:1;
+               uint64_t dma_pend:1;
+               uint64_t reserved_29_55:27;
+               uint64_t dbuf_err:1;
+               uint64_t reserved_24_27:4;
+               uint64_t dbuf:1;
+               uint64_t blk_timeout:1;
+               uint64_t blk_crc_err:1;
+               uint64_t rsp_busybit:1;
+               uint64_t stp_timeout:1;
+               uint64_t stp_crc_err:1;
+               uint64_t stp_bad_sts:1;
+               uint64_t stp_val:1;
+               uint64_t rsp_timeout:1;
+               uint64_t rsp_crc_err:1;
+               uint64_t rsp_bad_sts:1;
+               uint64_t rsp_val:1;
+               uint64_t rsp_type:3;
+               uint64_t cmd_type:2;
+               uint64_t cmd_idx:6;
+               uint64_t cmd_done:1;
+       } s;
+       struct cvmx_mio_emm_rsp_sts_s cn61xx;
+};
+
+union cvmx_mio_emm_sample {
+       uint64_t u64;
+       struct cvmx_mio_emm_sample_s {
+               uint64_t reserved_26_63:38;
+               uint64_t cmd_cnt:10;
+               uint64_t reserved_10_15:6;
+               uint64_t dat_cnt:10;
+       } s;
+       struct cvmx_mio_emm_sample_s cn61xx;
+};
+
+union cvmx_mio_emm_sts_mask {
+       uint64_t u64;
+       struct cvmx_mio_emm_sts_mask_s {
+               uint64_t reserved_32_63:32;
+               uint64_t sts_msk:32;
+       } s;
+       struct cvmx_mio_emm_sts_mask_s cn61xx;
+};
+
+union cvmx_mio_emm_switch {
+       uint64_t u64;
+       struct cvmx_mio_emm_switch_s {
+               uint64_t reserved_62_63:2;
+               uint64_t bus_id:2;
+               uint64_t switch_exe:1;
+               uint64_t switch_err0:1;
+               uint64_t switch_err1:1;
+               uint64_t switch_err2:1;
+               uint64_t reserved_49_55:7;
+               uint64_t hs_timing:1;
+               uint64_t reserved_43_47:5;
+               uint64_t bus_width:3;
+               uint64_t reserved_36_39:4;
+               uint64_t power_class:4;
+               uint64_t clk_hi:16;
+               uint64_t clk_lo:16;
+       } s;
+       struct cvmx_mio_emm_switch_s cn61xx;
+};
+
+union cvmx_mio_emm_wdog {
+       uint64_t u64;
+       struct cvmx_mio_emm_wdog_s {
+               uint64_t reserved_26_63:38;
+               uint64_t clk_cnt:26;
+       } s;
+       struct cvmx_mio_emm_wdog_s cn61xx;
 };
 
 union cvmx_mio_fus_bnk_datx {
@@ -590,8 +915,12 @@ union cvmx_mio_fus_bnk_datx {
        struct cvmx_mio_fus_bnk_datx_s cn56xxp1;
        struct cvmx_mio_fus_bnk_datx_s cn58xx;
        struct cvmx_mio_fus_bnk_datx_s cn58xxp1;
+       struct cvmx_mio_fus_bnk_datx_s cn61xx;
        struct cvmx_mio_fus_bnk_datx_s cn63xx;
        struct cvmx_mio_fus_bnk_datx_s cn63xxp1;
+       struct cvmx_mio_fus_bnk_datx_s cn66xx;
+       struct cvmx_mio_fus_bnk_datx_s cn68xx;
+       struct cvmx_mio_fus_bnk_datx_s cn68xxp1;
 };
 
 union cvmx_mio_fus_dat0 {
@@ -611,8 +940,12 @@ union cvmx_mio_fus_dat0 {
        struct cvmx_mio_fus_dat0_s cn56xxp1;
        struct cvmx_mio_fus_dat0_s cn58xx;
        struct cvmx_mio_fus_dat0_s cn58xxp1;
+       struct cvmx_mio_fus_dat0_s cn61xx;
        struct cvmx_mio_fus_dat0_s cn63xx;
        struct cvmx_mio_fus_dat0_s cn63xxp1;
+       struct cvmx_mio_fus_dat0_s cn66xx;
+       struct cvmx_mio_fus_dat0_s cn68xx;
+       struct cvmx_mio_fus_dat0_s cn68xxp1;
 };
 
 union cvmx_mio_fus_dat1 {
@@ -632,14 +965,21 @@ union cvmx_mio_fus_dat1 {
        struct cvmx_mio_fus_dat1_s cn56xxp1;
        struct cvmx_mio_fus_dat1_s cn58xx;
        struct cvmx_mio_fus_dat1_s cn58xxp1;
+       struct cvmx_mio_fus_dat1_s cn61xx;
        struct cvmx_mio_fus_dat1_s cn63xx;
        struct cvmx_mio_fus_dat1_s cn63xxp1;
+       struct cvmx_mio_fus_dat1_s cn66xx;
+       struct cvmx_mio_fus_dat1_s cn68xx;
+       struct cvmx_mio_fus_dat1_s cn68xxp1;
 };
 
 union cvmx_mio_fus_dat2 {
        uint64_t u64;
        struct cvmx_mio_fus_dat2_s {
-               uint64_t reserved_35_63:29;
+               uint64_t reserved_48_63:16;
+               uint64_t fus118:1;
+               uint64_t rom_info:10;
+               uint64_t power_limit:2;
                uint64_t dorm_crypto:1;
                uint64_t fus318:1;
                uint64_t raid_en:1;
@@ -747,6 +1087,23 @@ union cvmx_mio_fus_dat2 {
                uint64_t pp_dis:16;
        } cn58xx;
        struct cvmx_mio_fus_dat2_cn58xx cn58xxp1;
+       struct cvmx_mio_fus_dat2_cn61xx {
+               uint64_t reserved_48_63:16;
+               uint64_t fus118:1;
+               uint64_t rom_info:10;
+               uint64_t power_limit:2;
+               uint64_t dorm_crypto:1;
+               uint64_t fus318:1;
+               uint64_t raid_en:1;
+               uint64_t reserved_29_31:3;
+               uint64_t nodfa_cp2:1;
+               uint64_t nomul:1;
+               uint64_t nocrypto:1;
+               uint64_t reserved_24_25:2;
+               uint64_t chip_id:8;
+               uint64_t reserved_4_15:12;
+               uint64_t pp_dis:4;
+       } cn61xx;
        struct cvmx_mio_fus_dat2_cn63xx {
                uint64_t reserved_35_63:29;
                uint64_t dorm_crypto:1;
@@ -762,6 +1119,38 @@ union cvmx_mio_fus_dat2 {
                uint64_t pp_dis:6;
        } cn63xx;
        struct cvmx_mio_fus_dat2_cn63xx cn63xxp1;
+       struct cvmx_mio_fus_dat2_cn66xx {
+               uint64_t reserved_48_63:16;
+               uint64_t fus118:1;
+               uint64_t rom_info:10;
+               uint64_t power_limit:2;
+               uint64_t dorm_crypto:1;
+               uint64_t fus318:1;
+               uint64_t raid_en:1;
+               uint64_t reserved_29_31:3;
+               uint64_t nodfa_cp2:1;
+               uint64_t nomul:1;
+               uint64_t nocrypto:1;
+               uint64_t reserved_24_25:2;
+               uint64_t chip_id:8;
+               uint64_t reserved_10_15:6;
+               uint64_t pp_dis:10;
+       } cn66xx;
+       struct cvmx_mio_fus_dat2_cn68xx {
+               uint64_t reserved_37_63:27;
+               uint64_t power_limit:2;
+               uint64_t dorm_crypto:1;
+               uint64_t fus318:1;
+               uint64_t raid_en:1;
+               uint64_t reserved_29_31:3;
+               uint64_t nodfa_cp2:1;
+               uint64_t nomul:1;
+               uint64_t nocrypto:1;
+               uint64_t reserved_24_25:2;
+               uint64_t chip_id:8;
+               uint64_t reserved_0_15:16;
+       } cn68xx;
+       struct cvmx_mio_fus_dat2_cn68xx cn68xxp1;
 };
 
 union cvmx_mio_fus_dat3 {
@@ -834,7 +1223,7 @@ union cvmx_mio_fus_dat3 {
        struct cvmx_mio_fus_dat3_cn38xx cn56xxp1;
        struct cvmx_mio_fus_dat3_cn38xx cn58xx;
        struct cvmx_mio_fus_dat3_cn38xx cn58xxp1;
-       struct cvmx_mio_fus_dat3_cn63xx {
+       struct cvmx_mio_fus_dat3_cn61xx {
                uint64_t reserved_58_63:6;
                uint64_t pll_ctl:10;
                uint64_t dfa_info_dte:3;
@@ -853,8 +1242,12 @@ union cvmx_mio_fus_dat3 {
                uint64_t nozip:1;
                uint64_t nodfa_dte:1;
                uint64_t reserved_0_23:24;
-       } cn63xx;
-       struct cvmx_mio_fus_dat3_cn63xx cn63xxp1;
+       } cn61xx;
+       struct cvmx_mio_fus_dat3_cn61xx cn63xx;
+       struct cvmx_mio_fus_dat3_cn61xx cn63xxp1;
+       struct cvmx_mio_fus_dat3_cn61xx cn66xx;
+       struct cvmx_mio_fus_dat3_cn61xx cn68xx;
+       struct cvmx_mio_fus_dat3_cn61xx cn68xxp1;
 };
 
 union cvmx_mio_fus_ema {
@@ -875,8 +1268,12 @@ union cvmx_mio_fus_ema {
                uint64_t ema:2;
        } cn58xx;
        struct cvmx_mio_fus_ema_cn58xx cn58xxp1;
+       struct cvmx_mio_fus_ema_s cn61xx;
        struct cvmx_mio_fus_ema_s cn63xx;
        struct cvmx_mio_fus_ema_s cn63xxp1;
+       struct cvmx_mio_fus_ema_s cn66xx;
+       struct cvmx_mio_fus_ema_s cn68xx;
+       struct cvmx_mio_fus_ema_s cn68xxp1;
 };
 
 union cvmx_mio_fus_pdf {
@@ -890,14 +1287,21 @@ union cvmx_mio_fus_pdf {
        struct cvmx_mio_fus_pdf_s cn56xx;
        struct cvmx_mio_fus_pdf_s cn56xxp1;
        struct cvmx_mio_fus_pdf_s cn58xx;
+       struct cvmx_mio_fus_pdf_s cn61xx;
        struct cvmx_mio_fus_pdf_s cn63xx;
        struct cvmx_mio_fus_pdf_s cn63xxp1;
+       struct cvmx_mio_fus_pdf_s cn66xx;
+       struct cvmx_mio_fus_pdf_s cn68xx;
+       struct cvmx_mio_fus_pdf_s cn68xxp1;
 };
 
 union cvmx_mio_fus_pll {
        uint64_t u64;
        struct cvmx_mio_fus_pll_s {
-               uint64_t reserved_8_63:56;
+               uint64_t reserved_48_63:16;
+               uint64_t rclk_align_r:8;
+               uint64_t rclk_align_l:8;
+               uint64_t reserved_8_31:24;
                uint64_t c_cout_rst:1;
                uint64_t c_cout_sel:2;
                uint64_t pnr_cout_rst:1;
@@ -916,8 +1320,20 @@ union cvmx_mio_fus_pll {
        struct cvmx_mio_fus_pll_cn50xx cn56xxp1;
        struct cvmx_mio_fus_pll_cn50xx cn58xx;
        struct cvmx_mio_fus_pll_cn50xx cn58xxp1;
-       struct cvmx_mio_fus_pll_s cn63xx;
-       struct cvmx_mio_fus_pll_s cn63xxp1;
+       struct cvmx_mio_fus_pll_cn61xx {
+               uint64_t reserved_8_63:56;
+               uint64_t c_cout_rst:1;
+               uint64_t c_cout_sel:2;
+               uint64_t pnr_cout_rst:1;
+               uint64_t pnr_cout_sel:2;
+               uint64_t rfslip:1;
+               uint64_t fbslip:1;
+       } cn61xx;
+       struct cvmx_mio_fus_pll_cn61xx cn63xx;
+       struct cvmx_mio_fus_pll_cn61xx cn63xxp1;
+       struct cvmx_mio_fus_pll_cn61xx cn66xx;
+       struct cvmx_mio_fus_pll_s cn68xx;
+       struct cvmx_mio_fus_pll_s cn68xxp1;
 };
 
 union cvmx_mio_fus_prog {
@@ -941,8 +1357,12 @@ union cvmx_mio_fus_prog {
        struct cvmx_mio_fus_prog_cn30xx cn56xxp1;
        struct cvmx_mio_fus_prog_cn30xx cn58xx;
        struct cvmx_mio_fus_prog_cn30xx cn58xxp1;
+       struct cvmx_mio_fus_prog_s cn61xx;
        struct cvmx_mio_fus_prog_s cn63xx;
        struct cvmx_mio_fus_prog_s cn63xxp1;
+       struct cvmx_mio_fus_prog_s cn66xx;
+       struct cvmx_mio_fus_prog_s cn68xx;
+       struct cvmx_mio_fus_prog_s cn68xxp1;
 };
 
 union cvmx_mio_fus_prog_times {
@@ -969,7 +1389,7 @@ union cvmx_mio_fus_prog_times {
        struct cvmx_mio_fus_prog_times_cn50xx cn56xxp1;
        struct cvmx_mio_fus_prog_times_cn50xx cn58xx;
        struct cvmx_mio_fus_prog_times_cn50xx cn58xxp1;
-       struct cvmx_mio_fus_prog_times_cn63xx {
+       struct cvmx_mio_fus_prog_times_cn61xx {
                uint64_t reserved_35_63:29;
                uint64_t vgate_pin:1;
                uint64_t fsrc_pin:1;
@@ -978,8 +1398,12 @@ union cvmx_mio_fus_prog_times {
                uint64_t sclk_lo:4;
                uint64_t sclk_hi:15;
                uint64_t setup:6;
-       } cn63xx;
-       struct cvmx_mio_fus_prog_times_cn63xx cn63xxp1;
+       } cn61xx;
+       struct cvmx_mio_fus_prog_times_cn61xx cn63xx;
+       struct cvmx_mio_fus_prog_times_cn61xx cn63xxp1;
+       struct cvmx_mio_fus_prog_times_cn61xx cn66xx;
+       struct cvmx_mio_fus_prog_times_cn61xx cn68xx;
+       struct cvmx_mio_fus_prog_times_cn61xx cn68xxp1;
 };
 
 union cvmx_mio_fus_rcmd {
@@ -1013,8 +1437,12 @@ union cvmx_mio_fus_rcmd {
        struct cvmx_mio_fus_rcmd_s cn56xxp1;
        struct cvmx_mio_fus_rcmd_cn30xx cn58xx;
        struct cvmx_mio_fus_rcmd_cn30xx cn58xxp1;
+       struct cvmx_mio_fus_rcmd_s cn61xx;
        struct cvmx_mio_fus_rcmd_s cn63xx;
        struct cvmx_mio_fus_rcmd_s cn63xxp1;
+       struct cvmx_mio_fus_rcmd_s cn66xx;
+       struct cvmx_mio_fus_rcmd_s cn68xx;
+       struct cvmx_mio_fus_rcmd_s cn68xxp1;
 };
 
 union cvmx_mio_fus_read_times {
@@ -1027,8 +1455,12 @@ union cvmx_mio_fus_read_times {
                uint64_t sdh:4;
                uint64_t setup:10;
        } s;
+       struct cvmx_mio_fus_read_times_s cn61xx;
        struct cvmx_mio_fus_read_times_s cn63xx;
        struct cvmx_mio_fus_read_times_s cn63xxp1;
+       struct cvmx_mio_fus_read_times_s cn66xx;
+       struct cvmx_mio_fus_read_times_s cn68xx;
+       struct cvmx_mio_fus_read_times_s cn68xxp1;
 };
 
 union cvmx_mio_fus_repair_res0 {
@@ -1040,8 +1472,12 @@ union cvmx_mio_fus_repair_res0 {
                uint64_t repair1:18;
                uint64_t repair0:18;
        } s;
+       struct cvmx_mio_fus_repair_res0_s cn61xx;
        struct cvmx_mio_fus_repair_res0_s cn63xx;
        struct cvmx_mio_fus_repair_res0_s cn63xxp1;
+       struct cvmx_mio_fus_repair_res0_s cn66xx;
+       struct cvmx_mio_fus_repair_res0_s cn68xx;
+       struct cvmx_mio_fus_repair_res0_s cn68xxp1;
 };
 
 union cvmx_mio_fus_repair_res1 {
@@ -1052,8 +1488,12 @@ union cvmx_mio_fus_repair_res1 {
                uint64_t repair4:18;
                uint64_t repair3:18;
        } s;
+       struct cvmx_mio_fus_repair_res1_s cn61xx;
        struct cvmx_mio_fus_repair_res1_s cn63xx;
        struct cvmx_mio_fus_repair_res1_s cn63xxp1;
+       struct cvmx_mio_fus_repair_res1_s cn66xx;
+       struct cvmx_mio_fus_repair_res1_s cn68xx;
+       struct cvmx_mio_fus_repair_res1_s cn68xxp1;
 };
 
 union cvmx_mio_fus_repair_res2 {
@@ -1062,8 +1502,12 @@ union cvmx_mio_fus_repair_res2 {
                uint64_t reserved_18_63:46;
                uint64_t repair6:18;
        } s;
+       struct cvmx_mio_fus_repair_res2_s cn61xx;
        struct cvmx_mio_fus_repair_res2_s cn63xx;
        struct cvmx_mio_fus_repair_res2_s cn63xxp1;
+       struct cvmx_mio_fus_repair_res2_s cn66xx;
+       struct cvmx_mio_fus_repair_res2_s cn68xx;
+       struct cvmx_mio_fus_repair_res2_s cn68xxp1;
 };
 
 union cvmx_mio_fus_spr_repair_res {
@@ -1084,8 +1528,12 @@ union cvmx_mio_fus_spr_repair_res {
        struct cvmx_mio_fus_spr_repair_res_s cn56xxp1;
        struct cvmx_mio_fus_spr_repair_res_s cn58xx;
        struct cvmx_mio_fus_spr_repair_res_s cn58xxp1;
+       struct cvmx_mio_fus_spr_repair_res_s cn61xx;
        struct cvmx_mio_fus_spr_repair_res_s cn63xx;
        struct cvmx_mio_fus_spr_repair_res_s cn63xxp1;
+       struct cvmx_mio_fus_spr_repair_res_s cn66xx;
+       struct cvmx_mio_fus_spr_repair_res_s cn68xx;
+       struct cvmx_mio_fus_spr_repair_res_s cn68xxp1;
 };
 
 union cvmx_mio_fus_spr_repair_sum {
@@ -1104,8 +1552,22 @@ union cvmx_mio_fus_spr_repair_sum {
        struct cvmx_mio_fus_spr_repair_sum_s cn56xxp1;
        struct cvmx_mio_fus_spr_repair_sum_s cn58xx;
        struct cvmx_mio_fus_spr_repair_sum_s cn58xxp1;
+       struct cvmx_mio_fus_spr_repair_sum_s cn61xx;
        struct cvmx_mio_fus_spr_repair_sum_s cn63xx;
        struct cvmx_mio_fus_spr_repair_sum_s cn63xxp1;
+       struct cvmx_mio_fus_spr_repair_sum_s cn66xx;
+       struct cvmx_mio_fus_spr_repair_sum_s cn68xx;
+       struct cvmx_mio_fus_spr_repair_sum_s cn68xxp1;
+};
+
+union cvmx_mio_fus_tgg {
+       uint64_t u64;
+       struct cvmx_mio_fus_tgg_s {
+               uint64_t val:1;
+               uint64_t dat:63;
+       } s;
+       struct cvmx_mio_fus_tgg_s cn61xx;
+       struct cvmx_mio_fus_tgg_s cn66xx;
 };
 
 union cvmx_mio_fus_unlock {
@@ -1141,11 +1603,15 @@ union cvmx_mio_fus_wadr {
        struct cvmx_mio_fus_wadr_cn52xx cn56xxp1;
        struct cvmx_mio_fus_wadr_cn50xx cn58xx;
        struct cvmx_mio_fus_wadr_cn50xx cn58xxp1;
-       struct cvmx_mio_fus_wadr_cn63xx {
+       struct cvmx_mio_fus_wadr_cn61xx {
                uint64_t reserved_4_63:60;
                uint64_t addr:4;
-       } cn63xx;
-       struct cvmx_mio_fus_wadr_cn63xx cn63xxp1;
+       } cn61xx;
+       struct cvmx_mio_fus_wadr_cn61xx cn63xx;
+       struct cvmx_mio_fus_wadr_cn61xx cn63xxp1;
+       struct cvmx_mio_fus_wadr_cn61xx cn66xx;
+       struct cvmx_mio_fus_wadr_cn61xx cn68xx;
+       struct cvmx_mio_fus_wadr_cn61xx cn68xxp1;
 };
 
 union cvmx_mio_gpio_comp {
@@ -1155,8 +1621,12 @@ union cvmx_mio_gpio_comp {
                uint64_t pctl:6;
                uint64_t nctl:6;
        } s;
+       struct cvmx_mio_gpio_comp_s cn61xx;
        struct cvmx_mio_gpio_comp_s cn63xx;
        struct cvmx_mio_gpio_comp_s cn63xxp1;
+       struct cvmx_mio_gpio_comp_s cn66xx;
+       struct cvmx_mio_gpio_comp_s cn68xx;
+       struct cvmx_mio_gpio_comp_s cn68xxp1;
 };
 
 union cvmx_mio_ndf_dma_cfg {
@@ -1174,8 +1644,12 @@ union cvmx_mio_ndf_dma_cfg {
                uint64_t adr:36;
        } s;
        struct cvmx_mio_ndf_dma_cfg_s cn52xx;
+       struct cvmx_mio_ndf_dma_cfg_s cn61xx;
        struct cvmx_mio_ndf_dma_cfg_s cn63xx;
        struct cvmx_mio_ndf_dma_cfg_s cn63xxp1;
+       struct cvmx_mio_ndf_dma_cfg_s cn66xx;
+       struct cvmx_mio_ndf_dma_cfg_s cn68xx;
+       struct cvmx_mio_ndf_dma_cfg_s cn68xxp1;
 };
 
 union cvmx_mio_ndf_dma_int {
@@ -1185,8 +1659,12 @@ union cvmx_mio_ndf_dma_int {
                uint64_t done:1;
        } s;
        struct cvmx_mio_ndf_dma_int_s cn52xx;
+       struct cvmx_mio_ndf_dma_int_s cn61xx;
        struct cvmx_mio_ndf_dma_int_s cn63xx;
        struct cvmx_mio_ndf_dma_int_s cn63xxp1;
+       struct cvmx_mio_ndf_dma_int_s cn66xx;
+       struct cvmx_mio_ndf_dma_int_s cn68xx;
+       struct cvmx_mio_ndf_dma_int_s cn68xxp1;
 };
 
 union cvmx_mio_ndf_dma_int_en {
@@ -1196,8 +1674,12 @@ union cvmx_mio_ndf_dma_int_en {
                uint64_t done:1;
        } s;
        struct cvmx_mio_ndf_dma_int_en_s cn52xx;
+       struct cvmx_mio_ndf_dma_int_en_s cn61xx;
        struct cvmx_mio_ndf_dma_int_en_s cn63xx;
        struct cvmx_mio_ndf_dma_int_en_s cn63xxp1;
+       struct cvmx_mio_ndf_dma_int_en_s cn66xx;
+       struct cvmx_mio_ndf_dma_int_en_s cn68xx;
+       struct cvmx_mio_ndf_dma_int_en_s cn68xxp1;
 };
 
 union cvmx_mio_pll_ctl {
@@ -1220,10 +1702,63 @@ union cvmx_mio_pll_setting {
        struct cvmx_mio_pll_setting_s cn31xx;
 };
 
+union cvmx_mio_ptp_ckout_hi_incr {
+       uint64_t u64;
+       struct cvmx_mio_ptp_ckout_hi_incr_s {
+               uint64_t nanosec:32;
+               uint64_t frnanosec:32;
+       } s;
+       struct cvmx_mio_ptp_ckout_hi_incr_s cn61xx;
+       struct cvmx_mio_ptp_ckout_hi_incr_s cn66xx;
+       struct cvmx_mio_ptp_ckout_hi_incr_s cn68xx;
+};
+
+union cvmx_mio_ptp_ckout_lo_incr {
+       uint64_t u64;
+       struct cvmx_mio_ptp_ckout_lo_incr_s {
+               uint64_t nanosec:32;
+               uint64_t frnanosec:32;
+       } s;
+       struct cvmx_mio_ptp_ckout_lo_incr_s cn61xx;
+       struct cvmx_mio_ptp_ckout_lo_incr_s cn66xx;
+       struct cvmx_mio_ptp_ckout_lo_incr_s cn68xx;
+};
+
+union cvmx_mio_ptp_ckout_thresh_hi {
+       uint64_t u64;
+       struct cvmx_mio_ptp_ckout_thresh_hi_s {
+               uint64_t nanosec:64;
+       } s;
+       struct cvmx_mio_ptp_ckout_thresh_hi_s cn61xx;
+       struct cvmx_mio_ptp_ckout_thresh_hi_s cn66xx;
+       struct cvmx_mio_ptp_ckout_thresh_hi_s cn68xx;
+};
+
+union cvmx_mio_ptp_ckout_thresh_lo {
+       uint64_t u64;
+       struct cvmx_mio_ptp_ckout_thresh_lo_s {
+               uint64_t reserved_32_63:32;
+               uint64_t frnanosec:32;
+       } s;
+       struct cvmx_mio_ptp_ckout_thresh_lo_s cn61xx;
+       struct cvmx_mio_ptp_ckout_thresh_lo_s cn66xx;
+       struct cvmx_mio_ptp_ckout_thresh_lo_s cn68xx;
+};
+
 union cvmx_mio_ptp_clock_cfg {
        uint64_t u64;
        struct cvmx_mio_ptp_clock_cfg_s {
-               uint64_t reserved_24_63:40;
+               uint64_t reserved_42_63:22;
+               uint64_t pps:1;
+               uint64_t ckout:1;
+               uint64_t ext_clk_edge:2;
+               uint64_t ckout_out4:1;
+               uint64_t pps_out:5;
+               uint64_t pps_inv:1;
+               uint64_t pps_en:1;
+               uint64_t ckout_out:4;
+               uint64_t ckout_inv:1;
+               uint64_t ckout_en:1;
                uint64_t evcnt_in:6;
                uint64_t evcnt_edge:1;
                uint64_t evcnt_en:1;
@@ -1234,8 +1769,42 @@ union cvmx_mio_ptp_clock_cfg {
                uint64_t ext_clk_en:1;
                uint64_t ptp_en:1;
        } s;
-       struct cvmx_mio_ptp_clock_cfg_s cn63xx;
-       struct cvmx_mio_ptp_clock_cfg_s cn63xxp1;
+       struct cvmx_mio_ptp_clock_cfg_s cn61xx;
+       struct cvmx_mio_ptp_clock_cfg_cn63xx {
+               uint64_t reserved_24_63:40;
+               uint64_t evcnt_in:6;
+               uint64_t evcnt_edge:1;
+               uint64_t evcnt_en:1;
+               uint64_t tstmp_in:6;
+               uint64_t tstmp_edge:1;
+               uint64_t tstmp_en:1;
+               uint64_t ext_clk_in:6;
+               uint64_t ext_clk_en:1;
+               uint64_t ptp_en:1;
+       } cn63xx;
+       struct cvmx_mio_ptp_clock_cfg_cn63xx cn63xxp1;
+       struct cvmx_mio_ptp_clock_cfg_cn66xx {
+               uint64_t reserved_40_63:24;
+               uint64_t ext_clk_edge:2;
+               uint64_t ckout_out4:1;
+               uint64_t pps_out:5;
+               uint64_t pps_inv:1;
+               uint64_t pps_en:1;
+               uint64_t ckout_out:4;
+               uint64_t ckout_inv:1;
+               uint64_t ckout_en:1;
+               uint64_t evcnt_in:6;
+               uint64_t evcnt_edge:1;
+               uint64_t evcnt_en:1;
+               uint64_t tstmp_in:6;
+               uint64_t tstmp_edge:1;
+               uint64_t tstmp_en:1;
+               uint64_t ext_clk_in:6;
+               uint64_t ext_clk_en:1;
+               uint64_t ptp_en:1;
+       } cn66xx;
+       struct cvmx_mio_ptp_clock_cfg_s cn68xx;
+       struct cvmx_mio_ptp_clock_cfg_cn63xx cn68xxp1;
 };
 
 union cvmx_mio_ptp_clock_comp {
@@ -1244,8 +1813,12 @@ union cvmx_mio_ptp_clock_comp {
                uint64_t nanosec:32;
                uint64_t frnanosec:32;
        } s;
+       struct cvmx_mio_ptp_clock_comp_s cn61xx;
        struct cvmx_mio_ptp_clock_comp_s cn63xx;
        struct cvmx_mio_ptp_clock_comp_s cn63xxp1;
+       struct cvmx_mio_ptp_clock_comp_s cn66xx;
+       struct cvmx_mio_ptp_clock_comp_s cn68xx;
+       struct cvmx_mio_ptp_clock_comp_s cn68xxp1;
 };
 
 union cvmx_mio_ptp_clock_hi {
@@ -1253,8 +1826,12 @@ union cvmx_mio_ptp_clock_hi {
        struct cvmx_mio_ptp_clock_hi_s {
                uint64_t nanosec:64;
        } s;
+       struct cvmx_mio_ptp_clock_hi_s cn61xx;
        struct cvmx_mio_ptp_clock_hi_s cn63xx;
        struct cvmx_mio_ptp_clock_hi_s cn63xxp1;
+       struct cvmx_mio_ptp_clock_hi_s cn66xx;
+       struct cvmx_mio_ptp_clock_hi_s cn68xx;
+       struct cvmx_mio_ptp_clock_hi_s cn68xxp1;
 };
 
 union cvmx_mio_ptp_clock_lo {
@@ -1263,8 +1840,12 @@ union cvmx_mio_ptp_clock_lo {
                uint64_t reserved_32_63:32;
                uint64_t frnanosec:32;
        } s;
+       struct cvmx_mio_ptp_clock_lo_s cn61xx;
        struct cvmx_mio_ptp_clock_lo_s cn63xx;
        struct cvmx_mio_ptp_clock_lo_s cn63xxp1;
+       struct cvmx_mio_ptp_clock_lo_s cn66xx;
+       struct cvmx_mio_ptp_clock_lo_s cn68xx;
+       struct cvmx_mio_ptp_clock_lo_s cn68xxp1;
 };
 
 union cvmx_mio_ptp_evt_cnt {
@@ -1272,8 +1853,55 @@ union cvmx_mio_ptp_evt_cnt {
        struct cvmx_mio_ptp_evt_cnt_s {
                uint64_t 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;
+};
+
+union cvmx_mio_ptp_pps_hi_incr {
+       uint64_t u64;
+       struct cvmx_mio_ptp_pps_hi_incr_s {
+               uint64_t nanosec:32;
+               uint64_t frnanosec:32;
+       } s;
+       struct cvmx_mio_ptp_pps_hi_incr_s cn61xx;
+       struct cvmx_mio_ptp_pps_hi_incr_s cn66xx;
+       struct cvmx_mio_ptp_pps_hi_incr_s cn68xx;
+};
+
+union cvmx_mio_ptp_pps_lo_incr {
+       uint64_t u64;
+       struct cvmx_mio_ptp_pps_lo_incr_s {
+               uint64_t nanosec:32;
+               uint64_t frnanosec:32;
+       } s;
+       struct cvmx_mio_ptp_pps_lo_incr_s cn61xx;
+       struct cvmx_mio_ptp_pps_lo_incr_s cn66xx;
+       struct cvmx_mio_ptp_pps_lo_incr_s cn68xx;
+};
+
+union cvmx_mio_ptp_pps_thresh_hi {
+       uint64_t u64;
+       struct cvmx_mio_ptp_pps_thresh_hi_s {
+               uint64_t nanosec:64;
+       } s;
+       struct cvmx_mio_ptp_pps_thresh_hi_s cn61xx;
+       struct cvmx_mio_ptp_pps_thresh_hi_s cn66xx;
+       struct cvmx_mio_ptp_pps_thresh_hi_s cn68xx;
+};
+
+union cvmx_mio_ptp_pps_thresh_lo {
+       uint64_t u64;
+       struct cvmx_mio_ptp_pps_thresh_lo_s {
+               uint64_t reserved_32_63:32;
+               uint64_t frnanosec:32;
+       } s;
+       struct cvmx_mio_ptp_pps_thresh_lo_s cn61xx;
+       struct cvmx_mio_ptp_pps_thresh_lo_s cn66xx;
+       struct cvmx_mio_ptp_pps_thresh_lo_s cn68xx;
 };
 
 union cvmx_mio_ptp_timestamp {
@@ -1281,14 +1909,52 @@ union cvmx_mio_ptp_timestamp {
        struct cvmx_mio_ptp_timestamp_s {
                uint64_t nanosec:64;
        } s;
+       struct cvmx_mio_ptp_timestamp_s cn61xx;
        struct cvmx_mio_ptp_timestamp_s cn63xx;
        struct cvmx_mio_ptp_timestamp_s cn63xxp1;
+       struct cvmx_mio_ptp_timestamp_s cn66xx;
+       struct cvmx_mio_ptp_timestamp_s cn68xx;
+       struct cvmx_mio_ptp_timestamp_s cn68xxp1;
+};
+
+union cvmx_mio_qlmx_cfg {
+       uint64_t u64;
+       struct cvmx_mio_qlmx_cfg_s {
+               uint64_t reserved_12_63:52;
+               uint64_t qlm_spd:4;
+               uint64_t reserved_4_7:4;
+               uint64_t qlm_cfg:4;
+       } s;
+       struct cvmx_mio_qlmx_cfg_cn61xx {
+               uint64_t reserved_12_63:52;
+               uint64_t qlm_spd:4;
+               uint64_t reserved_2_7:6;
+               uint64_t qlm_cfg:2;
+       } cn61xx;
+       struct cvmx_mio_qlmx_cfg_s cn66xx;
+       struct cvmx_mio_qlmx_cfg_cn68xx {
+               uint64_t reserved_12_63:52;
+               uint64_t qlm_spd:4;
+               uint64_t reserved_3_7:5;
+               uint64_t qlm_cfg:3;
+       } cn68xx;
+       struct cvmx_mio_qlmx_cfg_cn68xx cn68xxp1;
 };
 
 union cvmx_mio_rst_boot {
        uint64_t u64;
        struct cvmx_mio_rst_boot_s {
-               uint64_t reserved_36_63:28;
+               uint64_t chipkill:1;
+               uint64_t jtcsrdis:1;
+               uint64_t ejtagdis:1;
+               uint64_t romen:1;
+               uint64_t ckill_ppdis:1;
+               uint64_t jt_tstmode:1;
+               uint64_t reserved_50_57:8;
+               uint64_t lboot_ext:2;
+               uint64_t reserved_44_47:4;
+               uint64_t qlm4_spd:4;
+               uint64_t qlm3_spd:4;
                uint64_t c_mul:6;
                uint64_t pnr_mul:6;
                uint64_t qlm2_spd:4;
@@ -1298,32 +1964,168 @@ union cvmx_mio_rst_boot {
                uint64_t rboot:1;
                uint64_t rboot_pin:1;
        } s;
-       struct cvmx_mio_rst_boot_s cn63xx;
-       struct cvmx_mio_rst_boot_s cn63xxp1;
+       struct cvmx_mio_rst_boot_cn61xx {
+               uint64_t chipkill:1;
+               uint64_t jtcsrdis:1;
+               uint64_t ejtagdis:1;
+               uint64_t romen:1;
+               uint64_t ckill_ppdis:1;
+               uint64_t jt_tstmode:1;
+               uint64_t reserved_50_57:8;
+               uint64_t lboot_ext:2;
+               uint64_t reserved_36_47:12;
+               uint64_t c_mul:6;
+               uint64_t pnr_mul:6;
+               uint64_t qlm2_spd:4;
+               uint64_t qlm1_spd:4;
+               uint64_t qlm0_spd:4;
+               uint64_t lboot:10;
+               uint64_t rboot:1;
+               uint64_t rboot_pin:1;
+       } cn61xx;
+       struct cvmx_mio_rst_boot_cn63xx {
+               uint64_t reserved_36_63:28;
+               uint64_t c_mul:6;
+               uint64_t pnr_mul:6;
+               uint64_t qlm2_spd:4;
+               uint64_t qlm1_spd:4;
+               uint64_t qlm0_spd:4;
+               uint64_t lboot:10;
+               uint64_t rboot:1;
+               uint64_t rboot_pin:1;
+       } cn63xx;
+       struct cvmx_mio_rst_boot_cn63xx cn63xxp1;
+       struct cvmx_mio_rst_boot_cn66xx {
+               uint64_t chipkill:1;
+               uint64_t jtcsrdis:1;
+               uint64_t ejtagdis:1;
+               uint64_t romen:1;
+               uint64_t ckill_ppdis:1;
+               uint64_t reserved_50_58:9;
+               uint64_t lboot_ext:2;
+               uint64_t reserved_36_47:12;
+               uint64_t c_mul:6;
+               uint64_t pnr_mul:6;
+               uint64_t qlm2_spd:4;
+               uint64_t qlm1_spd:4;
+               uint64_t qlm0_spd:4;
+               uint64_t lboot:10;
+               uint64_t rboot:1;
+               uint64_t rboot_pin:1;
+       } cn66xx;
+       struct cvmx_mio_rst_boot_cn68xx {
+               uint64_t reserved_59_63:5;
+               uint64_t jt_tstmode:1;
+               uint64_t reserved_44_57:14;
+               uint64_t qlm4_spd:4;
+               uint64_t qlm3_spd:4;
+               uint64_t c_mul:6;
+               uint64_t pnr_mul:6;
+               uint64_t qlm2_spd:4;
+               uint64_t qlm1_spd:4;
+               uint64_t qlm0_spd:4;
+               uint64_t lboot:10;
+               uint64_t rboot:1;
+               uint64_t rboot_pin:1;
+       } cn68xx;
+       struct cvmx_mio_rst_boot_cn68xxp1 {
+               uint64_t reserved_44_63:20;
+               uint64_t qlm4_spd:4;
+               uint64_t qlm3_spd:4;
+               uint64_t c_mul:6;
+               uint64_t pnr_mul:6;
+               uint64_t qlm2_spd:4;
+               uint64_t qlm1_spd:4;
+               uint64_t qlm0_spd:4;
+               uint64_t lboot:10;
+               uint64_t rboot:1;
+               uint64_t rboot_pin:1;
+       } cn68xxp1;
 };
 
 union cvmx_mio_rst_cfg {
        uint64_t u64;
        struct cvmx_mio_rst_cfg_s {
+               uint64_t reserved_3_63:61;
+               uint64_t cntl_clr_bist:1;
+               uint64_t warm_clr_bist:1;
+               uint64_t soft_clr_bist:1;
+       } s;
+       struct cvmx_mio_rst_cfg_cn61xx {
                uint64_t bist_delay:58;
                uint64_t reserved_3_5:3;
                uint64_t cntl_clr_bist:1;
                uint64_t warm_clr_bist:1;
                uint64_t soft_clr_bist:1;
-       } s;
-       struct cvmx_mio_rst_cfg_s cn63xx;
+       } cn61xx;
+       struct cvmx_mio_rst_cfg_cn61xx cn63xx;
        struct cvmx_mio_rst_cfg_cn63xxp1 {
                uint64_t bist_delay:58;
                uint64_t reserved_2_5:4;
                uint64_t warm_clr_bist:1;
                uint64_t soft_clr_bist:1;
        } cn63xxp1;
+       struct cvmx_mio_rst_cfg_cn61xx cn66xx;
+       struct cvmx_mio_rst_cfg_cn68xx {
+               uint64_t bist_delay:56;
+               uint64_t reserved_3_7:5;
+               uint64_t cntl_clr_bist:1;
+               uint64_t warm_clr_bist:1;
+               uint64_t soft_clr_bist:1;
+       } cn68xx;
+       struct cvmx_mio_rst_cfg_cn68xx cn68xxp1;
+};
+
+union cvmx_mio_rst_ckill {
+       uint64_t u64;
+       struct cvmx_mio_rst_ckill_s {
+               uint64_t reserved_47_63:17;
+               uint64_t timer:47;
+       } s;
+       struct cvmx_mio_rst_ckill_s cn61xx;
+       struct cvmx_mio_rst_ckill_s cn66xx;
+};
+
+union cvmx_mio_rst_cntlx {
+       uint64_t u64;
+       struct cvmx_mio_rst_cntlx_s {
+               uint64_t reserved_13_63:51;
+               uint64_t in_rev_ln:1;
+               uint64_t rev_lanes:1;
+               uint64_t gen1_only:1;
+               uint64_t prst_link:1;
+               uint64_t rst_done:1;
+               uint64_t rst_link:1;
+               uint64_t host_mode:1;
+               uint64_t prtmode:2;
+               uint64_t rst_drv:1;
+               uint64_t rst_rcv:1;
+               uint64_t rst_chip:1;
+               uint64_t rst_val:1;
+       } s;
+       struct cvmx_mio_rst_cntlx_s cn61xx;
+       struct cvmx_mio_rst_cntlx_cn66xx {
+               uint64_t reserved_10_63:54;
+               uint64_t prst_link:1;
+               uint64_t rst_done:1;
+               uint64_t rst_link:1;
+               uint64_t host_mode:1;
+               uint64_t prtmode:2;
+               uint64_t rst_drv:1;
+               uint64_t rst_rcv:1;
+               uint64_t rst_chip:1;
+               uint64_t rst_val:1;
+       } cn66xx;
+       struct cvmx_mio_rst_cntlx_cn66xx cn68xx;
 };
 
 union cvmx_mio_rst_ctlx {
        uint64_t u64;
        struct cvmx_mio_rst_ctlx_s {
-               uint64_t reserved_10_63:54;
+               uint64_t reserved_13_63:51;
+               uint64_t in_rev_ln:1;
+               uint64_t rev_lanes:1;
+               uint64_t gen1_only:1;
                uint64_t prst_link:1;
                uint64_t rst_done:1;
                uint64_t rst_link:1;
@@ -1334,7 +2136,19 @@ union cvmx_mio_rst_ctlx {
                uint64_t rst_chip:1;
                uint64_t rst_val:1;
        } s;
-       struct cvmx_mio_rst_ctlx_s cn63xx;
+       struct cvmx_mio_rst_ctlx_s cn61xx;
+       struct cvmx_mio_rst_ctlx_cn63xx {
+               uint64_t reserved_10_63:54;
+               uint64_t prst_link:1;
+               uint64_t rst_done:1;
+               uint64_t rst_link:1;
+               uint64_t host_mode:1;
+               uint64_t prtmode:2;
+               uint64_t rst_drv:1;
+               uint64_t rst_rcv:1;
+               uint64_t rst_chip:1;
+               uint64_t rst_val:1;
+       } cn63xx;
        struct cvmx_mio_rst_ctlx_cn63xxp1 {
                uint64_t reserved_9_63:55;
                uint64_t rst_done:1;
@@ -1346,17 +2160,24 @@ union cvmx_mio_rst_ctlx {
                uint64_t rst_chip:1;
                uint64_t 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;
 };
 
 union cvmx_mio_rst_delay {
        uint64_t u64;
        struct cvmx_mio_rst_delay_s {
                uint64_t reserved_32_63:32;
-               uint64_t soft_rst_dly:16;
                uint64_t warm_rst_dly:16;
+               uint64_t soft_rst_dly:16;
        } s;
+       struct cvmx_mio_rst_delay_s cn61xx;
        struct cvmx_mio_rst_delay_s cn63xx;
        struct cvmx_mio_rst_delay_s cn63xxp1;
+       struct cvmx_mio_rst_delay_s cn66xx;
+       struct cvmx_mio_rst_delay_s cn68xx;
+       struct cvmx_mio_rst_delay_s cn68xxp1;
 };
 
 union cvmx_mio_rst_int {
@@ -1365,12 +2186,25 @@ union cvmx_mio_rst_int {
                uint64_t reserved_10_63:54;
                uint64_t perst1:1;
                uint64_t perst0:1;
-               uint64_t reserved_2_7:6;
+               uint64_t reserved_4_7:4;
+               uint64_t rst_link3:1;
+               uint64_t rst_link2:1;
                uint64_t rst_link1:1;
                uint64_t rst_link0:1;
        } s;
-       struct cvmx_mio_rst_int_s cn63xx;
-       struct cvmx_mio_rst_int_s cn63xxp1;
+       struct cvmx_mio_rst_int_cn61xx {
+               uint64_t reserved_10_63:54;
+               uint64_t perst1:1;
+               uint64_t perst0:1;
+               uint64_t reserved_2_7:6;
+               uint64_t rst_link1:1;
+               uint64_t rst_link0:1;
+       } cn61xx;
+       struct cvmx_mio_rst_int_cn61xx cn63xx;
+       struct cvmx_mio_rst_int_cn61xx cn63xxp1;
+       struct cvmx_mio_rst_int_s cn66xx;
+       struct cvmx_mio_rst_int_cn61xx cn68xx;
+       struct cvmx_mio_rst_int_cn61xx cn68xxp1;
 };
 
 union cvmx_mio_rst_int_en {
@@ -1379,12 +2213,25 @@ union cvmx_mio_rst_int_en {
                uint64_t reserved_10_63:54;
                uint64_t perst1:1;
                uint64_t perst0:1;
-               uint64_t reserved_2_7:6;
+               uint64_t reserved_4_7:4;
+               uint64_t rst_link3:1;
+               uint64_t rst_link2:1;
                uint64_t rst_link1:1;
                uint64_t rst_link0:1;
        } s;
-       struct cvmx_mio_rst_int_en_s cn63xx;
-       struct cvmx_mio_rst_int_en_s cn63xxp1;
+       struct cvmx_mio_rst_int_en_cn61xx {
+               uint64_t reserved_10_63:54;
+               uint64_t perst1:1;
+               uint64_t perst0:1;
+               uint64_t reserved_2_7:6;
+               uint64_t rst_link1:1;
+               uint64_t rst_link0:1;
+       } cn61xx;
+       struct cvmx_mio_rst_int_en_cn61xx cn63xx;
+       struct cvmx_mio_rst_int_en_cn61xx cn63xxp1;
+       struct cvmx_mio_rst_int_en_s cn66xx;
+       struct cvmx_mio_rst_int_en_cn61xx cn68xx;
+       struct cvmx_mio_rst_int_en_cn61xx cn68xxp1;
 };
 
 union cvmx_mio_twsx_int {
@@ -1424,8 +2271,12 @@ union cvmx_mio_twsx_int {
        struct cvmx_mio_twsx_int_s cn56xxp1;
        struct cvmx_mio_twsx_int_s cn58xx;
        struct cvmx_mio_twsx_int_s cn58xxp1;
+       struct cvmx_mio_twsx_int_s cn61xx;
        struct cvmx_mio_twsx_int_s cn63xx;
        struct cvmx_mio_twsx_int_s cn63xxp1;
+       struct cvmx_mio_twsx_int_s cn66xx;
+       struct cvmx_mio_twsx_int_s cn68xx;
+       struct cvmx_mio_twsx_int_s cn68xxp1;
 };
 
 union cvmx_mio_twsx_sw_twsi {
@@ -1455,8 +2306,12 @@ union cvmx_mio_twsx_sw_twsi {
        struct cvmx_mio_twsx_sw_twsi_s cn56xxp1;
        struct cvmx_mio_twsx_sw_twsi_s cn58xx;
        struct cvmx_mio_twsx_sw_twsi_s cn58xxp1;
+       struct cvmx_mio_twsx_sw_twsi_s cn61xx;
        struct cvmx_mio_twsx_sw_twsi_s cn63xx;
        struct cvmx_mio_twsx_sw_twsi_s cn63xxp1;
+       struct cvmx_mio_twsx_sw_twsi_s cn66xx;
+       struct cvmx_mio_twsx_sw_twsi_s cn68xx;
+       struct cvmx_mio_twsx_sw_twsi_s cn68xxp1;
 };
 
 union cvmx_mio_twsx_sw_twsi_ext {
@@ -1477,8 +2332,12 @@ union cvmx_mio_twsx_sw_twsi_ext {
        struct cvmx_mio_twsx_sw_twsi_ext_s cn56xxp1;
        struct cvmx_mio_twsx_sw_twsi_ext_s cn58xx;
        struct cvmx_mio_twsx_sw_twsi_ext_s cn58xxp1;
+       struct cvmx_mio_twsx_sw_twsi_ext_s cn61xx;
        struct cvmx_mio_twsx_sw_twsi_ext_s cn63xx;
        struct cvmx_mio_twsx_sw_twsi_ext_s cn63xxp1;
+       struct cvmx_mio_twsx_sw_twsi_ext_s cn66xx;
+       struct cvmx_mio_twsx_sw_twsi_ext_s cn68xx;
+       struct cvmx_mio_twsx_sw_twsi_ext_s cn68xxp1;
 };
 
 union cvmx_mio_twsx_twsi_sw {
@@ -1499,8 +2358,12 @@ union cvmx_mio_twsx_twsi_sw {
        struct cvmx_mio_twsx_twsi_sw_s cn56xxp1;
        struct cvmx_mio_twsx_twsi_sw_s cn58xx;
        struct cvmx_mio_twsx_twsi_sw_s cn58xxp1;
+       struct cvmx_mio_twsx_twsi_sw_s cn61xx;
        struct cvmx_mio_twsx_twsi_sw_s cn63xx;
        struct cvmx_mio_twsx_twsi_sw_s cn63xxp1;
+       struct cvmx_mio_twsx_twsi_sw_s cn66xx;
+       struct cvmx_mio_twsx_twsi_sw_s cn68xx;
+       struct cvmx_mio_twsx_twsi_sw_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_dlh {
@@ -1520,8 +2383,12 @@ union cvmx_mio_uartx_dlh {
        struct cvmx_mio_uartx_dlh_s cn56xxp1;
        struct cvmx_mio_uartx_dlh_s cn58xx;
        struct cvmx_mio_uartx_dlh_s cn58xxp1;
+       struct cvmx_mio_uartx_dlh_s cn61xx;
        struct cvmx_mio_uartx_dlh_s cn63xx;
        struct cvmx_mio_uartx_dlh_s cn63xxp1;
+       struct cvmx_mio_uartx_dlh_s cn66xx;
+       struct cvmx_mio_uartx_dlh_s cn68xx;
+       struct cvmx_mio_uartx_dlh_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_dll {
@@ -1541,8 +2408,12 @@ union cvmx_mio_uartx_dll {
        struct cvmx_mio_uartx_dll_s cn56xxp1;
        struct cvmx_mio_uartx_dll_s cn58xx;
        struct cvmx_mio_uartx_dll_s cn58xxp1;
+       struct cvmx_mio_uartx_dll_s cn61xx;
        struct cvmx_mio_uartx_dll_s cn63xx;
        struct cvmx_mio_uartx_dll_s cn63xxp1;
+       struct cvmx_mio_uartx_dll_s cn66xx;
+       struct cvmx_mio_uartx_dll_s cn68xx;
+       struct cvmx_mio_uartx_dll_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_far {
@@ -1562,8 +2433,12 @@ union cvmx_mio_uartx_far {
        struct cvmx_mio_uartx_far_s cn56xxp1;
        struct cvmx_mio_uartx_far_s cn58xx;
        struct cvmx_mio_uartx_far_s cn58xxp1;
+       struct cvmx_mio_uartx_far_s cn61xx;
        struct cvmx_mio_uartx_far_s cn63xx;
        struct cvmx_mio_uartx_far_s cn63xxp1;
+       struct cvmx_mio_uartx_far_s cn66xx;
+       struct cvmx_mio_uartx_far_s cn68xx;
+       struct cvmx_mio_uartx_far_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_fcr {
@@ -1588,8 +2463,12 @@ union cvmx_mio_uartx_fcr {
        struct cvmx_mio_uartx_fcr_s cn56xxp1;
        struct cvmx_mio_uartx_fcr_s cn58xx;
        struct cvmx_mio_uartx_fcr_s cn58xxp1;
+       struct cvmx_mio_uartx_fcr_s cn61xx;
        struct cvmx_mio_uartx_fcr_s cn63xx;
        struct cvmx_mio_uartx_fcr_s cn63xxp1;
+       struct cvmx_mio_uartx_fcr_s cn66xx;
+       struct cvmx_mio_uartx_fcr_s cn68xx;
+       struct cvmx_mio_uartx_fcr_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_htx {
@@ -1609,8 +2488,12 @@ union cvmx_mio_uartx_htx {
        struct cvmx_mio_uartx_htx_s cn56xxp1;
        struct cvmx_mio_uartx_htx_s cn58xx;
        struct cvmx_mio_uartx_htx_s cn58xxp1;
+       struct cvmx_mio_uartx_htx_s cn61xx;
        struct cvmx_mio_uartx_htx_s cn63xx;
        struct cvmx_mio_uartx_htx_s cn63xxp1;
+       struct cvmx_mio_uartx_htx_s cn66xx;
+       struct cvmx_mio_uartx_htx_s cn68xx;
+       struct cvmx_mio_uartx_htx_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_ier {
@@ -1635,8 +2518,12 @@ union cvmx_mio_uartx_ier {
        struct cvmx_mio_uartx_ier_s cn56xxp1;
        struct cvmx_mio_uartx_ier_s cn58xx;
        struct cvmx_mio_uartx_ier_s cn58xxp1;
+       struct cvmx_mio_uartx_ier_s cn61xx;
        struct cvmx_mio_uartx_ier_s cn63xx;
        struct cvmx_mio_uartx_ier_s cn63xxp1;
+       struct cvmx_mio_uartx_ier_s cn66xx;
+       struct cvmx_mio_uartx_ier_s cn68xx;
+       struct cvmx_mio_uartx_ier_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_iir {
@@ -1658,8 +2545,12 @@ union cvmx_mio_uartx_iir {
        struct cvmx_mio_uartx_iir_s cn56xxp1;
        struct cvmx_mio_uartx_iir_s cn58xx;
        struct cvmx_mio_uartx_iir_s cn58xxp1;
+       struct cvmx_mio_uartx_iir_s cn61xx;
        struct cvmx_mio_uartx_iir_s cn63xx;
        struct cvmx_mio_uartx_iir_s cn63xxp1;
+       struct cvmx_mio_uartx_iir_s cn66xx;
+       struct cvmx_mio_uartx_iir_s cn68xx;
+       struct cvmx_mio_uartx_iir_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_lcr {
@@ -1685,8 +2576,12 @@ union cvmx_mio_uartx_lcr {
        struct cvmx_mio_uartx_lcr_s cn56xxp1;
        struct cvmx_mio_uartx_lcr_s cn58xx;
        struct cvmx_mio_uartx_lcr_s cn58xxp1;
+       struct cvmx_mio_uartx_lcr_s cn61xx;
        struct cvmx_mio_uartx_lcr_s cn63xx;
        struct cvmx_mio_uartx_lcr_s cn63xxp1;
+       struct cvmx_mio_uartx_lcr_s cn66xx;
+       struct cvmx_mio_uartx_lcr_s cn68xx;
+       struct cvmx_mio_uartx_lcr_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_lsr {
@@ -1713,8 +2608,12 @@ union cvmx_mio_uartx_lsr {
        struct cvmx_mio_uartx_lsr_s cn56xxp1;
        struct cvmx_mio_uartx_lsr_s cn58xx;
        struct cvmx_mio_uartx_lsr_s cn58xxp1;
+       struct cvmx_mio_uartx_lsr_s cn61xx;
        struct cvmx_mio_uartx_lsr_s cn63xx;
        struct cvmx_mio_uartx_lsr_s cn63xxp1;
+       struct cvmx_mio_uartx_lsr_s cn66xx;
+       struct cvmx_mio_uartx_lsr_s cn68xx;
+       struct cvmx_mio_uartx_lsr_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_mcr {
@@ -1739,8 +2638,12 @@ union cvmx_mio_uartx_mcr {
        struct cvmx_mio_uartx_mcr_s cn56xxp1;
        struct cvmx_mio_uartx_mcr_s cn58xx;
        struct cvmx_mio_uartx_mcr_s cn58xxp1;
+       struct cvmx_mio_uartx_mcr_s cn61xx;
        struct cvmx_mio_uartx_mcr_s cn63xx;
        struct cvmx_mio_uartx_mcr_s cn63xxp1;
+       struct cvmx_mio_uartx_mcr_s cn66xx;
+       struct cvmx_mio_uartx_mcr_s cn68xx;
+       struct cvmx_mio_uartx_mcr_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_msr {
@@ -1767,8 +2670,12 @@ union cvmx_mio_uartx_msr {
        struct cvmx_mio_uartx_msr_s cn56xxp1;
        struct cvmx_mio_uartx_msr_s cn58xx;
        struct cvmx_mio_uartx_msr_s cn58xxp1;
+       struct cvmx_mio_uartx_msr_s cn61xx;
        struct cvmx_mio_uartx_msr_s cn63xx;
        struct cvmx_mio_uartx_msr_s cn63xxp1;
+       struct cvmx_mio_uartx_msr_s cn66xx;
+       struct cvmx_mio_uartx_msr_s cn68xx;
+       struct cvmx_mio_uartx_msr_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_rbr {
@@ -1788,8 +2695,12 @@ union cvmx_mio_uartx_rbr {
        struct cvmx_mio_uartx_rbr_s cn56xxp1;
        struct cvmx_mio_uartx_rbr_s cn58xx;
        struct cvmx_mio_uartx_rbr_s cn58xxp1;
+       struct cvmx_mio_uartx_rbr_s cn61xx;
        struct cvmx_mio_uartx_rbr_s cn63xx;
        struct cvmx_mio_uartx_rbr_s cn63xxp1;
+       struct cvmx_mio_uartx_rbr_s cn66xx;
+       struct cvmx_mio_uartx_rbr_s cn68xx;
+       struct cvmx_mio_uartx_rbr_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_rfl {
@@ -1809,8 +2720,12 @@ union cvmx_mio_uartx_rfl {
        struct cvmx_mio_uartx_rfl_s cn56xxp1;
        struct cvmx_mio_uartx_rfl_s cn58xx;
        struct cvmx_mio_uartx_rfl_s cn58xxp1;
+       struct cvmx_mio_uartx_rfl_s cn61xx;
        struct cvmx_mio_uartx_rfl_s cn63xx;
        struct cvmx_mio_uartx_rfl_s cn63xxp1;
+       struct cvmx_mio_uartx_rfl_s cn66xx;
+       struct cvmx_mio_uartx_rfl_s cn68xx;
+       struct cvmx_mio_uartx_rfl_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_rfw {
@@ -1832,8 +2747,12 @@ union cvmx_mio_uartx_rfw {
        struct cvmx_mio_uartx_rfw_s cn56xxp1;
        struct cvmx_mio_uartx_rfw_s cn58xx;
        struct cvmx_mio_uartx_rfw_s cn58xxp1;
+       struct cvmx_mio_uartx_rfw_s cn61xx;
        struct cvmx_mio_uartx_rfw_s cn63xx;
        struct cvmx_mio_uartx_rfw_s cn63xxp1;
+       struct cvmx_mio_uartx_rfw_s cn66xx;
+       struct cvmx_mio_uartx_rfw_s cn68xx;
+       struct cvmx_mio_uartx_rfw_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_sbcr {
@@ -1853,8 +2772,12 @@ union cvmx_mio_uartx_sbcr {
        struct cvmx_mio_uartx_sbcr_s cn56xxp1;
        struct cvmx_mio_uartx_sbcr_s cn58xx;
        struct cvmx_mio_uartx_sbcr_s cn58xxp1;
+       struct cvmx_mio_uartx_sbcr_s cn61xx;
        struct cvmx_mio_uartx_sbcr_s cn63xx;
        struct cvmx_mio_uartx_sbcr_s cn63xxp1;
+       struct cvmx_mio_uartx_sbcr_s cn66xx;
+       struct cvmx_mio_uartx_sbcr_s cn68xx;
+       struct cvmx_mio_uartx_sbcr_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_scr {
@@ -1874,8 +2797,12 @@ union cvmx_mio_uartx_scr {
        struct cvmx_mio_uartx_scr_s cn56xxp1;
        struct cvmx_mio_uartx_scr_s cn58xx;
        struct cvmx_mio_uartx_scr_s cn58xxp1;
+       struct cvmx_mio_uartx_scr_s cn61xx;
        struct cvmx_mio_uartx_scr_s cn63xx;
        struct cvmx_mio_uartx_scr_s cn63xxp1;
+       struct cvmx_mio_uartx_scr_s cn66xx;
+       struct cvmx_mio_uartx_scr_s cn68xx;
+       struct cvmx_mio_uartx_scr_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_sfe {
@@ -1895,8 +2822,12 @@ union cvmx_mio_uartx_sfe {
        struct cvmx_mio_uartx_sfe_s cn56xxp1;
        struct cvmx_mio_uartx_sfe_s cn58xx;
        struct cvmx_mio_uartx_sfe_s cn58xxp1;
+       struct cvmx_mio_uartx_sfe_s cn61xx;
        struct cvmx_mio_uartx_sfe_s cn63xx;
        struct cvmx_mio_uartx_sfe_s cn63xxp1;
+       struct cvmx_mio_uartx_sfe_s cn66xx;
+       struct cvmx_mio_uartx_sfe_s cn68xx;
+       struct cvmx_mio_uartx_sfe_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_srr {
@@ -1918,8 +2849,12 @@ union cvmx_mio_uartx_srr {
        struct cvmx_mio_uartx_srr_s cn56xxp1;
        struct cvmx_mio_uartx_srr_s cn58xx;
        struct cvmx_mio_uartx_srr_s cn58xxp1;
+       struct cvmx_mio_uartx_srr_s cn61xx;
        struct cvmx_mio_uartx_srr_s cn63xx;
        struct cvmx_mio_uartx_srr_s cn63xxp1;
+       struct cvmx_mio_uartx_srr_s cn66xx;
+       struct cvmx_mio_uartx_srr_s cn68xx;
+       struct cvmx_mio_uartx_srr_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_srt {
@@ -1939,8 +2874,12 @@ union cvmx_mio_uartx_srt {
        struct cvmx_mio_uartx_srt_s cn56xxp1;
        struct cvmx_mio_uartx_srt_s cn58xx;
        struct cvmx_mio_uartx_srt_s cn58xxp1;
+       struct cvmx_mio_uartx_srt_s cn61xx;
        struct cvmx_mio_uartx_srt_s cn63xx;
        struct cvmx_mio_uartx_srt_s cn63xxp1;
+       struct cvmx_mio_uartx_srt_s cn66xx;
+       struct cvmx_mio_uartx_srt_s cn68xx;
+       struct cvmx_mio_uartx_srt_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_srts {
@@ -1960,8 +2899,12 @@ union cvmx_mio_uartx_srts {
        struct cvmx_mio_uartx_srts_s cn56xxp1;
        struct cvmx_mio_uartx_srts_s cn58xx;
        struct cvmx_mio_uartx_srts_s cn58xxp1;
+       struct cvmx_mio_uartx_srts_s cn61xx;
        struct cvmx_mio_uartx_srts_s cn63xx;
        struct cvmx_mio_uartx_srts_s cn63xxp1;
+       struct cvmx_mio_uartx_srts_s cn66xx;
+       struct cvmx_mio_uartx_srts_s cn68xx;
+       struct cvmx_mio_uartx_srts_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_stt {
@@ -1981,8 +2924,12 @@ union cvmx_mio_uartx_stt {
        struct cvmx_mio_uartx_stt_s cn56xxp1;
        struct cvmx_mio_uartx_stt_s cn58xx;
        struct cvmx_mio_uartx_stt_s cn58xxp1;
+       struct cvmx_mio_uartx_stt_s cn61xx;
        struct cvmx_mio_uartx_stt_s cn63xx;
        struct cvmx_mio_uartx_stt_s cn63xxp1;
+       struct cvmx_mio_uartx_stt_s cn66xx;
+       struct cvmx_mio_uartx_stt_s cn68xx;
+       struct cvmx_mio_uartx_stt_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_tfl {
@@ -2002,8 +2949,12 @@ union cvmx_mio_uartx_tfl {
        struct cvmx_mio_uartx_tfl_s cn56xxp1;
        struct cvmx_mio_uartx_tfl_s cn58xx;
        struct cvmx_mio_uartx_tfl_s cn58xxp1;
+       struct cvmx_mio_uartx_tfl_s cn61xx;
        struct cvmx_mio_uartx_tfl_s cn63xx;
        struct cvmx_mio_uartx_tfl_s cn63xxp1;
+       struct cvmx_mio_uartx_tfl_s cn66xx;
+       struct cvmx_mio_uartx_tfl_s cn68xx;
+       struct cvmx_mio_uartx_tfl_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_tfr {
@@ -2023,8 +2974,12 @@ union cvmx_mio_uartx_tfr {
        struct cvmx_mio_uartx_tfr_s cn56xxp1;
        struct cvmx_mio_uartx_tfr_s cn58xx;
        struct cvmx_mio_uartx_tfr_s cn58xxp1;
+       struct cvmx_mio_uartx_tfr_s cn61xx;
        struct cvmx_mio_uartx_tfr_s cn63xx;
        struct cvmx_mio_uartx_tfr_s cn63xxp1;
+       struct cvmx_mio_uartx_tfr_s cn66xx;
+       struct cvmx_mio_uartx_tfr_s cn68xx;
+       struct cvmx_mio_uartx_tfr_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_thr {
@@ -2044,8 +2999,12 @@ union cvmx_mio_uartx_thr {
        struct cvmx_mio_uartx_thr_s cn56xxp1;
        struct cvmx_mio_uartx_thr_s cn58xx;
        struct cvmx_mio_uartx_thr_s cn58xxp1;
+       struct cvmx_mio_uartx_thr_s cn61xx;
        struct cvmx_mio_uartx_thr_s cn63xx;
        struct cvmx_mio_uartx_thr_s cn63xxp1;
+       struct cvmx_mio_uartx_thr_s cn66xx;
+       struct cvmx_mio_uartx_thr_s cn68xx;
+       struct cvmx_mio_uartx_thr_s cn68xxp1;
 };
 
 union cvmx_mio_uartx_usr {
@@ -2069,8 +3028,12 @@ union cvmx_mio_uartx_usr {
        struct cvmx_mio_uartx_usr_s cn56xxp1;
        struct cvmx_mio_uartx_usr_s cn58xx;
        struct cvmx_mio_uartx_usr_s cn58xxp1;
+       struct cvmx_mio_uartx_usr_s cn61xx;
        struct cvmx_mio_uartx_usr_s cn63xx;
        struct cvmx_mio_uartx_usr_s cn63xxp1;
+       struct cvmx_mio_uartx_usr_s cn66xx;
+       struct cvmx_mio_uartx_usr_s cn68xx;
+       struct cvmx_mio_uartx_usr_s cn68xxp1;
 };
 
 union cvmx_mio_uart2_dlh {
index 9899a9d2ba721fb4ac437a00f967a7acf1d7fbbe..a3075f733ca563b60b38cb7bd75d9b36af852a65 100644 (file)
@@ -4,7 +4,7 @@
  * Contact: support@caviumnetworks.com
  * This file is part of the OCTEON SDK
  *
- * Copyright (c) 2003-2010 Cavium Networks
+ * Copyright (c) 2003-2011 Cavium Networks
  *
  * This file is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License, Version 2, as
@@ -65,7 +65,7 @@
 #define CVMX_NPEI_LAST_WIN_RDATA0 (0x0000000000000600ull)
 #define CVMX_NPEI_LAST_WIN_RDATA1 (0x0000000000000610ull)
 #define CVMX_NPEI_MEM_ACCESS_CTL (0x00000000000004F0ull)
-#define CVMX_NPEI_MEM_ACCESS_SUBIDX(offset) (0x0000000000000340ull + ((offset) & 31) * 16 - 16*12)
+#define CVMX_NPEI_MEM_ACCESS_SUBIDX(offset) (0x0000000000000280ull + ((offset) & 31) * 16 - 16*12)
 #define CVMX_NPEI_MSI_ENB0 (0x0000000000003C50ull)
 #define CVMX_NPEI_MSI_ENB1 (0x0000000000003C60ull)
 #define CVMX_NPEI_MSI_ENB2 (0x0000000000003C70ull)
index f8cb88902efbd472c613e6ac45ee26aff25cb2f3..7b1dc8b74e5b2a1271bab9673425c0da7c7f7fba 100644 (file)
@@ -4,7 +4,7 @@
  * Contact: support@caviumnetworks.com
  * This file is part of the OCTEON SDK
  *
- * Copyright (c) 2003-2010 Cavium Networks
+ * Copyright (c) 2003-2011 Cavium Networks
  *
  * This file is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License, Version 2, as
@@ -116,8 +116,12 @@ union cvmx_pciercx_cfg000 {
        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;
 };
 
 union cvmx_pciercx_cfg001 {
@@ -152,8 +156,12 @@ union cvmx_pciercx_cfg001 {
        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;
 };
 
 union cvmx_pciercx_cfg002 {
@@ -168,8 +176,12 @@ union cvmx_pciercx_cfg002 {
        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;
 };
 
 union cvmx_pciercx_cfg003 {
@@ -185,8 +197,12 @@ union cvmx_pciercx_cfg003 {
        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;
 };
 
 union cvmx_pciercx_cfg004 {
@@ -198,8 +214,12 @@ union cvmx_pciercx_cfg004 {
        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;
 };
 
 union cvmx_pciercx_cfg005 {
@@ -211,8 +231,12 @@ union cvmx_pciercx_cfg005 {
        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;
 };
 
 union cvmx_pciercx_cfg006 {
@@ -227,8 +251,12 @@ union cvmx_pciercx_cfg006 {
        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;
 };
 
 union cvmx_pciercx_cfg007 {
@@ -256,8 +284,12 @@ union cvmx_pciercx_cfg007 {
        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;
 };
 
 union cvmx_pciercx_cfg008 {
@@ -272,8 +304,12 @@ union cvmx_pciercx_cfg008 {
        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;
 };
 
 union cvmx_pciercx_cfg009 {
@@ -290,8 +326,12 @@ union cvmx_pciercx_cfg009 {
        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;
 };
 
 union cvmx_pciercx_cfg010 {
@@ -303,8 +343,12 @@ union cvmx_pciercx_cfg010 {
        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;
 };
 
 union cvmx_pciercx_cfg011 {
@@ -316,8 +360,12 @@ union cvmx_pciercx_cfg011 {
        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;
 };
 
 union cvmx_pciercx_cfg012 {
@@ -330,8 +378,12 @@ union cvmx_pciercx_cfg012 {
        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;
 };
 
 union cvmx_pciercx_cfg013 {
@@ -344,8 +396,12 @@ union cvmx_pciercx_cfg013 {
        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;
 };
 
 union cvmx_pciercx_cfg014 {
@@ -357,8 +413,12 @@ union cvmx_pciercx_cfg014 {
        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;
 };
 
 union cvmx_pciercx_cfg015 {
@@ -384,8 +444,12 @@ union cvmx_pciercx_cfg015 {
        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;
 };
 
 union cvmx_pciercx_cfg016 {
@@ -406,8 +470,12 @@ union cvmx_pciercx_cfg016 {
        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;
 };
 
 union cvmx_pciercx_cfg017 {
@@ -430,14 +498,19 @@ union cvmx_pciercx_cfg017 {
        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;
 };
 
 union cvmx_pciercx_cfg020 {
        uint32_t u32;
        struct cvmx_pciercx_cfg020_s {
-               uint32_t reserved_24_31:8;
+               uint32_t reserved_25_31:7;
+               uint32_t pvm:1;
                uint32_t m64:1;
                uint32_t mme:3;
                uint32_t mmc:3;
@@ -445,12 +518,24 @@ union cvmx_pciercx_cfg020 {
                uint32_t ncp:8;
                uint32_t 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_s cn63xx;
-       struct cvmx_pciercx_cfg020_s cn63xxp1;
+       struct cvmx_pciercx_cfg020_cn52xx {
+               uint32_t reserved_24_31:8;
+               uint32_t m64:1;
+               uint32_t mme:3;
+               uint32_t mmc:3;
+               uint32_t msien:1;
+               uint32_t ncp:8;
+               uint32_t msicid:8;
+       } cn52xx;
+       struct cvmx_pciercx_cfg020_cn52xx cn52xxp1;
+       struct cvmx_pciercx_cfg020_cn52xx cn56xx;
+       struct cvmx_pciercx_cfg020_cn52xx cn56xxp1;
+       struct cvmx_pciercx_cfg020_s cn61xx;
+       struct cvmx_pciercx_cfg020_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg020_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg020_cn52xx cn66xx;
+       struct cvmx_pciercx_cfg020_cn52xx cn68xx;
+       struct cvmx_pciercx_cfg020_cn52xx cn68xxp1;
 };
 
 union cvmx_pciercx_cfg021 {
@@ -463,8 +548,12 @@ union cvmx_pciercx_cfg021 {
        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;
 };
 
 union cvmx_pciercx_cfg022 {
@@ -476,8 +565,12 @@ union cvmx_pciercx_cfg022 {
        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;
 };
 
 union cvmx_pciercx_cfg023 {
@@ -490,8 +583,12 @@ union cvmx_pciercx_cfg023 {
        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;
 };
 
 union cvmx_pciercx_cfg028 {
@@ -509,8 +606,12 @@ union cvmx_pciercx_cfg028 {
        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;
 };
 
 union cvmx_pciercx_cfg029 {
@@ -532,8 +633,12 @@ union cvmx_pciercx_cfg029 {
        struct cvmx_pciercx_cfg029_s cn52xxp1;
        struct cvmx_pciercx_cfg029_s cn56xx;
        struct cvmx_pciercx_cfg029_s cn56xxp1;
+       struct cvmx_pciercx_cfg029_s cn61xx;
        struct cvmx_pciercx_cfg029_s cn63xx;
        struct cvmx_pciercx_cfg029_s cn63xxp1;
+       struct cvmx_pciercx_cfg029_s cn66xx;
+       struct cvmx_pciercx_cfg029_s cn68xx;
+       struct cvmx_pciercx_cfg029_s cn68xxp1;
 };
 
 union cvmx_pciercx_cfg030 {
@@ -563,15 +668,20 @@ union cvmx_pciercx_cfg030 {
        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;
 };
 
 union cvmx_pciercx_cfg031 {
        uint32_t u32;
        struct cvmx_pciercx_cfg031_s {
                uint32_t pnum:8;
-               uint32_t reserved_22_23:2;
+               uint32_t reserved_23_23:1;
+               uint32_t aspm:1;
                uint32_t lbnc:1;
                uint32_t dllarc:1;
                uint32_t sderc:1;
@@ -582,12 +692,28 @@ union cvmx_pciercx_cfg031 {
                uint32_t mlw:6;
                uint32_t mls:4;
        } s;
-       struct cvmx_pciercx_cfg031_s cn52xx;
-       struct cvmx_pciercx_cfg031_s cn52xxp1;
-       struct cvmx_pciercx_cfg031_s cn56xx;
-       struct cvmx_pciercx_cfg031_s cn56xxp1;
-       struct cvmx_pciercx_cfg031_s cn63xx;
-       struct cvmx_pciercx_cfg031_s cn63xxp1;
+       struct cvmx_pciercx_cfg031_cn52xx {
+               uint32_t pnum:8;
+               uint32_t reserved_22_23:2;
+               uint32_t lbnc:1;
+               uint32_t dllarc:1;
+               uint32_t sderc:1;
+               uint32_t cpm:1;
+               uint32_t l1el:3;
+               uint32_t l0el:3;
+               uint32_t aslpms:2;
+               uint32_t mlw:6;
+               uint32_t 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;
 };
 
 union cvmx_pciercx_cfg032 {
@@ -618,8 +744,12 @@ union cvmx_pciercx_cfg032 {
        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;
 };
 
 union cvmx_pciercx_cfg033 {
@@ -642,8 +772,12 @@ union cvmx_pciercx_cfg033 {
        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;
 };
 
 union cvmx_pciercx_cfg034 {
@@ -676,8 +810,12 @@ union cvmx_pciercx_cfg034 {
        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;
 };
 
 union cvmx_pciercx_cfg035 {
@@ -696,8 +834,12 @@ union cvmx_pciercx_cfg035 {
        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;
 };
 
 union cvmx_pciercx_cfg036 {
@@ -712,38 +854,95 @@ union cvmx_pciercx_cfg036 {
        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;
 };
 
 union cvmx_pciercx_cfg037 {
        uint32_t u32;
        struct cvmx_pciercx_cfg037_s {
-               uint32_t reserved_5_31:27;
+               uint32_t reserved_14_31:18;
+               uint32_t tph:2;
+               uint32_t reserved_11_11:1;
+               uint32_t noroprpr:1;
+               uint32_t atom128s:1;
+               uint32_t atom64s:1;
+               uint32_t atom32s:1;
+               uint32_t atom_ops:1;
+               uint32_t reserved_5_5:1;
                uint32_t ctds:1;
                uint32_t ctrs:4;
        } s;
-       struct cvmx_pciercx_cfg037_s cn52xx;
-       struct cvmx_pciercx_cfg037_s cn52xxp1;
-       struct cvmx_pciercx_cfg037_s cn56xx;
-       struct cvmx_pciercx_cfg037_s cn56xxp1;
-       struct cvmx_pciercx_cfg037_s cn63xx;
-       struct cvmx_pciercx_cfg037_s cn63xxp1;
+       struct cvmx_pciercx_cfg037_cn52xx {
+               uint32_t reserved_5_31:27;
+               uint32_t ctds:1;
+               uint32_t 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 {
+               uint32_t reserved_14_31:18;
+               uint32_t tph:2;
+               uint32_t reserved_11_11:1;
+               uint32_t noroprpr:1;
+               uint32_t atom128s:1;
+               uint32_t atom64s:1;
+               uint32_t atom32s:1;
+               uint32_t atom_ops:1;
+               uint32_t ari_fw:1;
+               uint32_t ctds:1;
+               uint32_t ctrs:4;
+       } cn61xx;
+       struct cvmx_pciercx_cfg037_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg037_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg037_cn66xx {
+               uint32_t reserved_14_31:18;
+               uint32_t tph:2;
+               uint32_t reserved_11_11:1;
+               uint32_t noroprpr:1;
+               uint32_t atom128s:1;
+               uint32_t atom64s:1;
+               uint32_t atom32s:1;
+               uint32_t atom_ops:1;
+               uint32_t ari:1;
+               uint32_t ctds:1;
+               uint32_t ctrs:4;
+       } cn66xx;
+       struct cvmx_pciercx_cfg037_cn66xx cn68xx;
+       struct cvmx_pciercx_cfg037_cn66xx cn68xxp1;
 };
 
 union cvmx_pciercx_cfg038 {
        uint32_t u32;
        struct cvmx_pciercx_cfg038_s {
-               uint32_t reserved_5_31:27;
+               uint32_t reserved_10_31:22;
+               uint32_t id0_cp:1;
+               uint32_t id0_rq:1;
+               uint32_t atom_op_eb:1;
+               uint32_t atom_op:1;
+               uint32_t ari:1;
                uint32_t ctd:1;
                uint32_t ctv:4;
        } s;
-       struct cvmx_pciercx_cfg038_s cn52xx;
-       struct cvmx_pciercx_cfg038_s cn52xxp1;
-       struct cvmx_pciercx_cfg038_s cn56xx;
-       struct cvmx_pciercx_cfg038_s cn56xxp1;
-       struct cvmx_pciercx_cfg038_s cn63xx;
-       struct cvmx_pciercx_cfg038_s cn63xxp1;
+       struct cvmx_pciercx_cfg038_cn52xx {
+               uint32_t reserved_5_31:27;
+               uint32_t ctd:1;
+               uint32_t 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_s cn61xx;
+       struct cvmx_pciercx_cfg038_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg038_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg038_s cn66xx;
+       struct cvmx_pciercx_cfg038_s cn68xx;
+       struct cvmx_pciercx_cfg038_s cn68xxp1;
 };
 
 union cvmx_pciercx_cfg039 {
@@ -760,8 +959,12 @@ union cvmx_pciercx_cfg039 {
        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;
 };
 
 union cvmx_pciercx_cfg040 {
@@ -785,8 +988,12 @@ union cvmx_pciercx_cfg040 {
        struct cvmx_pciercx_cfg040_cn52xx cn52xxp1;
        struct cvmx_pciercx_cfg040_cn52xx cn56xx;
        struct cvmx_pciercx_cfg040_cn52xx cn56xxp1;
+       struct cvmx_pciercx_cfg040_s cn61xx;
        struct cvmx_pciercx_cfg040_s cn63xx;
        struct cvmx_pciercx_cfg040_s cn63xxp1;
+       struct cvmx_pciercx_cfg040_s cn66xx;
+       struct cvmx_pciercx_cfg040_s cn68xx;
+       struct cvmx_pciercx_cfg040_s cn68xxp1;
 };
 
 union cvmx_pciercx_cfg041 {
@@ -798,8 +1005,12 @@ union cvmx_pciercx_cfg041 {
        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;
 };
 
 union cvmx_pciercx_cfg042 {
@@ -811,8 +1022,12 @@ union cvmx_pciercx_cfg042 {
        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;
 };
 
 union cvmx_pciercx_cfg064 {
@@ -826,14 +1041,20 @@ union cvmx_pciercx_cfg064 {
        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;
 };
 
 union cvmx_pciercx_cfg065 {
        uint32_t u32;
        struct cvmx_pciercx_cfg065_s {
-               uint32_t reserved_21_31:11;
+               uint32_t reserved_25_31:7;
+               uint32_t uatombs:1;
+               uint32_t reserved_21_23:3;
                uint32_t ures:1;
                uint32_t ecrces:1;
                uint32_t mtlps:1;
@@ -848,18 +1069,39 @@ union cvmx_pciercx_cfg065 {
                uint32_t dlpes:1;
                uint32_t reserved_0_3:4;
        } s;
-       struct cvmx_pciercx_cfg065_s cn52xx;
-       struct cvmx_pciercx_cfg065_s cn52xxp1;
-       struct cvmx_pciercx_cfg065_s cn56xx;
-       struct cvmx_pciercx_cfg065_s cn56xxp1;
-       struct cvmx_pciercx_cfg065_s cn63xx;
-       struct cvmx_pciercx_cfg065_s cn63xxp1;
+       struct cvmx_pciercx_cfg065_cn52xx {
+               uint32_t reserved_21_31:11;
+               uint32_t ures:1;
+               uint32_t ecrces:1;
+               uint32_t mtlps:1;
+               uint32_t ros:1;
+               uint32_t ucs:1;
+               uint32_t cas:1;
+               uint32_t cts:1;
+               uint32_t fcpes:1;
+               uint32_t ptlps:1;
+               uint32_t reserved_6_11:6;
+               uint32_t sdes:1;
+               uint32_t dlpes:1;
+               uint32_t 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_s cn61xx;
+       struct cvmx_pciercx_cfg065_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg065_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg065_s cn66xx;
+       struct cvmx_pciercx_cfg065_s cn68xx;
+       struct cvmx_pciercx_cfg065_cn52xx cn68xxp1;
 };
 
 union cvmx_pciercx_cfg066 {
        uint32_t u32;
        struct cvmx_pciercx_cfg066_s {
-               uint32_t reserved_21_31:11;
+               uint32_t reserved_25_31:7;
+               uint32_t uatombm:1;
+               uint32_t reserved_21_23:3;
                uint32_t urem:1;
                uint32_t ecrcem:1;
                uint32_t mtlpm:1;
@@ -874,18 +1116,39 @@ union cvmx_pciercx_cfg066 {
                uint32_t dlpem:1;
                uint32_t reserved_0_3:4;
        } s;
-       struct cvmx_pciercx_cfg066_s cn52xx;
-       struct cvmx_pciercx_cfg066_s cn52xxp1;
-       struct cvmx_pciercx_cfg066_s cn56xx;
-       struct cvmx_pciercx_cfg066_s cn56xxp1;
-       struct cvmx_pciercx_cfg066_s cn63xx;
-       struct cvmx_pciercx_cfg066_s cn63xxp1;
+       struct cvmx_pciercx_cfg066_cn52xx {
+               uint32_t reserved_21_31:11;
+               uint32_t urem:1;
+               uint32_t ecrcem:1;
+               uint32_t mtlpm:1;
+               uint32_t rom:1;
+               uint32_t ucm:1;
+               uint32_t cam:1;
+               uint32_t ctm:1;
+               uint32_t fcpem:1;
+               uint32_t ptlpm:1;
+               uint32_t reserved_6_11:6;
+               uint32_t sdem:1;
+               uint32_t dlpem:1;
+               uint32_t 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_s cn61xx;
+       struct cvmx_pciercx_cfg066_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg066_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg066_s cn66xx;
+       struct cvmx_pciercx_cfg066_s cn68xx;
+       struct cvmx_pciercx_cfg066_cn52xx cn68xxp1;
 };
 
 union cvmx_pciercx_cfg067 {
        uint32_t u32;
        struct cvmx_pciercx_cfg067_s {
-               uint32_t reserved_21_31:11;
+               uint32_t reserved_25_31:7;
+               uint32_t uatombs:1;
+               uint32_t reserved_21_23:3;
                uint32_t ures:1;
                uint32_t ecrces:1;
                uint32_t mtlps:1;
@@ -900,12 +1163,31 @@ union cvmx_pciercx_cfg067 {
                uint32_t dlpes:1;
                uint32_t reserved_0_3:4;
        } s;
-       struct cvmx_pciercx_cfg067_s cn52xx;
-       struct cvmx_pciercx_cfg067_s cn52xxp1;
-       struct cvmx_pciercx_cfg067_s cn56xx;
-       struct cvmx_pciercx_cfg067_s cn56xxp1;
-       struct cvmx_pciercx_cfg067_s cn63xx;
-       struct cvmx_pciercx_cfg067_s cn63xxp1;
+       struct cvmx_pciercx_cfg067_cn52xx {
+               uint32_t reserved_21_31:11;
+               uint32_t ures:1;
+               uint32_t ecrces:1;
+               uint32_t mtlps:1;
+               uint32_t ros:1;
+               uint32_t ucs:1;
+               uint32_t cas:1;
+               uint32_t cts:1;
+               uint32_t fcpes:1;
+               uint32_t ptlps:1;
+               uint32_t reserved_6_11:6;
+               uint32_t sdes:1;
+               uint32_t dlpes:1;
+               uint32_t 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_s cn61xx;
+       struct cvmx_pciercx_cfg067_cn52xx cn63xx;
+       struct cvmx_pciercx_cfg067_cn52xx cn63xxp1;
+       struct cvmx_pciercx_cfg067_s cn66xx;
+       struct cvmx_pciercx_cfg067_s cn68xx;
+       struct cvmx_pciercx_cfg067_cn52xx cn68xxp1;
 };
 
 union cvmx_pciercx_cfg068 {
@@ -925,8 +1207,12 @@ union cvmx_pciercx_cfg068 {
        struct cvmx_pciercx_cfg068_s cn52xxp1;
        struct cvmx_pciercx_cfg068_s cn56xx;
        struct cvmx_pciercx_cfg068_s cn56xxp1;
+       struct cvmx_pciercx_cfg068_s cn61xx;
        struct cvmx_pciercx_cfg068_s cn63xx;
        struct cvmx_pciercx_cfg068_s cn63xxp1;
+       struct cvmx_pciercx_cfg068_s cn66xx;
+       struct cvmx_pciercx_cfg068_s cn68xx;
+       struct cvmx_pciercx_cfg068_s cn68xxp1;
 };
 
 union cvmx_pciercx_cfg069 {
@@ -946,8 +1232,12 @@ union cvmx_pciercx_cfg069 {
        struct cvmx_pciercx_cfg069_s cn52xxp1;
        struct cvmx_pciercx_cfg069_s cn56xx;
        struct cvmx_pciercx_cfg069_s cn56xxp1;
+       struct cvmx_pciercx_cfg069_s cn61xx;
        struct cvmx_pciercx_cfg069_s cn63xx;
        struct cvmx_pciercx_cfg069_s cn63xxp1;
+       struct cvmx_pciercx_cfg069_s cn66xx;
+       struct cvmx_pciercx_cfg069_s cn68xx;
+       struct cvmx_pciercx_cfg069_s cn68xxp1;
 };
 
 union cvmx_pciercx_cfg070 {
@@ -964,8 +1254,12 @@ union cvmx_pciercx_cfg070 {
        struct cvmx_pciercx_cfg070_s cn52xxp1;
        struct cvmx_pciercx_cfg070_s cn56xx;
        struct cvmx_pciercx_cfg070_s cn56xxp1;
+       struct cvmx_pciercx_cfg070_s cn61xx;
        struct cvmx_pciercx_cfg070_s cn63xx;
        struct cvmx_pciercx_cfg070_s cn63xxp1;
+       struct cvmx_pciercx_cfg070_s cn66xx;
+       struct cvmx_pciercx_cfg070_s cn68xx;
+       struct cvmx_pciercx_cfg070_s cn68xxp1;
 };
 
 union cvmx_pciercx_cfg071 {
@@ -977,8 +1271,12 @@ union cvmx_pciercx_cfg071 {
        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;
 };
 
 union cvmx_pciercx_cfg072 {
@@ -990,8 +1288,12 @@ union cvmx_pciercx_cfg072 {
        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;
 };
 
 union cvmx_pciercx_cfg073 {
@@ -1003,8 +1305,12 @@ union cvmx_pciercx_cfg073 {
        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;
 };
 
 union cvmx_pciercx_cfg074 {
@@ -1016,8 +1322,12 @@ union cvmx_pciercx_cfg074 {
        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;
 };
 
 union cvmx_pciercx_cfg075 {
@@ -1032,8 +1342,12 @@ union cvmx_pciercx_cfg075 {
        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;
 };
 
 union cvmx_pciercx_cfg076 {
@@ -1053,8 +1367,12 @@ union cvmx_pciercx_cfg076 {
        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;
 };
 
 union cvmx_pciercx_cfg077 {
@@ -1067,8 +1385,12 @@ union cvmx_pciercx_cfg077 {
        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;
 };
 
 union cvmx_pciercx_cfg448 {
@@ -1081,8 +1403,12 @@ union cvmx_pciercx_cfg448 {
        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;
 };
 
 union cvmx_pciercx_cfg449 {
@@ -1094,8 +1420,12 @@ union cvmx_pciercx_cfg449 {
        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;
 };
 
 union cvmx_pciercx_cfg450 {
@@ -1112,26 +1442,42 @@ union cvmx_pciercx_cfg450 {
        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;
 };
 
 union cvmx_pciercx_cfg451 {
        uint32_t u32;
        struct cvmx_pciercx_cfg451_s {
-               uint32_t reserved_30_31:2;
+               uint32_t reserved_31_31:1;
+               uint32_t easpml1:1;
                uint32_t l1el:3;
                uint32_t l0el:3;
                uint32_t n_fts_cc:8;
                uint32_t n_fts:8;
                uint32_t ack_freq:8;
        } s;
-       struct cvmx_pciercx_cfg451_s cn52xx;
-       struct cvmx_pciercx_cfg451_s cn52xxp1;
-       struct cvmx_pciercx_cfg451_s cn56xx;
-       struct cvmx_pciercx_cfg451_s cn56xxp1;
-       struct cvmx_pciercx_cfg451_s cn63xx;
-       struct cvmx_pciercx_cfg451_s cn63xxp1;
+       struct cvmx_pciercx_cfg451_cn52xx {
+               uint32_t reserved_30_31:2;
+               uint32_t l1el:3;
+               uint32_t l0el:3;
+               uint32_t n_fts_cc:8;
+               uint32_t n_fts:8;
+               uint32_t 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;
 };
 
 union cvmx_pciercx_cfg452 {
@@ -1155,8 +1501,24 @@ union cvmx_pciercx_cfg452 {
        struct cvmx_pciercx_cfg452_s cn52xxp1;
        struct cvmx_pciercx_cfg452_s cn56xx;
        struct cvmx_pciercx_cfg452_s cn56xxp1;
+       struct cvmx_pciercx_cfg452_cn61xx {
+               uint32_t reserved_22_31:10;
+               uint32_t lme:6;
+               uint32_t reserved_8_15:8;
+               uint32_t flm:1;
+               uint32_t reserved_6_6:1;
+               uint32_t dllle:1;
+               uint32_t reserved_4_4:1;
+               uint32_t ra:1;
+               uint32_t le:1;
+               uint32_t sd:1;
+               uint32_t omr:1;
+       } cn61xx;
        struct cvmx_pciercx_cfg452_s cn63xx;
        struct cvmx_pciercx_cfg452_s cn63xxp1;
+       struct cvmx_pciercx_cfg452_cn61xx cn66xx;
+       struct cvmx_pciercx_cfg452_cn61xx cn68xx;
+       struct cvmx_pciercx_cfg452_cn61xx cn68xxp1;
 };
 
 union cvmx_pciercx_cfg453 {
@@ -1172,13 +1534,26 @@ union cvmx_pciercx_cfg453 {
        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;
 };
 
 union cvmx_pciercx_cfg454 {
        uint32_t u32;
        struct cvmx_pciercx_cfg454_s {
+               uint32_t cx_nfunc:3;
+               uint32_t tmfcwt:5;
+               uint32_t tmanlt:5;
+               uint32_t tmrt:5;
+               uint32_t reserved_11_13:3;
+               uint32_t nskps:3;
+               uint32_t reserved_0_7:8;
+       } s;
+       struct cvmx_pciercx_cfg454_cn52xx {
                uint32_t reserved_29_31:3;
                uint32_t tmfcwt:5;
                uint32_t tmanlt:5;
@@ -1187,13 +1562,23 @@ union cvmx_pciercx_cfg454 {
                uint32_t nskps:3;
                uint32_t reserved_4_7:4;
                uint32_t ntss:4;
-       } s;
-       struct cvmx_pciercx_cfg454_s cn52xx;
-       struct cvmx_pciercx_cfg454_s cn52xxp1;
-       struct cvmx_pciercx_cfg454_s cn56xx;
-       struct cvmx_pciercx_cfg454_s cn56xxp1;
-       struct cvmx_pciercx_cfg454_s cn63xx;
-       struct cvmx_pciercx_cfg454_s cn63xxp1;
+       } cn52xx;
+       struct cvmx_pciercx_cfg454_cn52xx cn52xxp1;
+       struct cvmx_pciercx_cfg454_cn52xx cn56xx;
+       struct cvmx_pciercx_cfg454_cn52xx cn56xxp1;
+       struct cvmx_pciercx_cfg454_cn61xx {
+               uint32_t cx_nfunc:3;
+               uint32_t tmfcwt:5;
+               uint32_t tmanlt:5;
+               uint32_t tmrt:5;
+               uint32_t reserved_8_13:6;
+               uint32_t 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;
 };
 
 union cvmx_pciercx_cfg455 {
@@ -1223,23 +1608,37 @@ union cvmx_pciercx_cfg455 {
        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;
 };
 
 union cvmx_pciercx_cfg456 {
        uint32_t u32;
        struct cvmx_pciercx_cfg456_s {
-               uint32_t reserved_2_31:30;
+               uint32_t reserved_4_31:28;
+               uint32_t m_handle_flush:1;
+               uint32_t m_dabort_4ucpl:1;
                uint32_t m_vend1_drp:1;
                uint32_t m_vend0_drp:1;
        } s;
-       struct cvmx_pciercx_cfg456_s cn52xx;
-       struct cvmx_pciercx_cfg456_s cn52xxp1;
-       struct cvmx_pciercx_cfg456_s cn56xx;
-       struct cvmx_pciercx_cfg456_s cn56xxp1;
-       struct cvmx_pciercx_cfg456_s cn63xx;
-       struct cvmx_pciercx_cfg456_s cn63xxp1;
+       struct cvmx_pciercx_cfg456_cn52xx {
+               uint32_t reserved_2_31:30;
+               uint32_t m_vend1_drp:1;
+               uint32_t 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;
 };
 
 union cvmx_pciercx_cfg458 {
@@ -1251,8 +1650,12 @@ union cvmx_pciercx_cfg458 {
        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;
 };
 
 union cvmx_pciercx_cfg459 {
@@ -1264,8 +1667,12 @@ union cvmx_pciercx_cfg459 {
        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;
 };
 
 union cvmx_pciercx_cfg460 {
@@ -1279,8 +1686,12 @@ union cvmx_pciercx_cfg460 {
        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;
 };
 
 union cvmx_pciercx_cfg461 {
@@ -1294,8 +1705,12 @@ union cvmx_pciercx_cfg461 {
        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;
 };
 
 union cvmx_pciercx_cfg462 {
@@ -1309,8 +1724,12 @@ union cvmx_pciercx_cfg462 {
        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;
 };
 
 union cvmx_pciercx_cfg463 {
@@ -1325,8 +1744,12 @@ union cvmx_pciercx_cfg463 {
        struct cvmx_pciercx_cfg463_s cn52xxp1;
        struct cvmx_pciercx_cfg463_s cn56xx;
        struct cvmx_pciercx_cfg463_s cn56xxp1;
+       struct cvmx_pciercx_cfg463_s cn61xx;
        struct cvmx_pciercx_cfg463_s cn63xx;
        struct cvmx_pciercx_cfg463_s cn63xxp1;
+       struct cvmx_pciercx_cfg463_s cn66xx;
+       struct cvmx_pciercx_cfg463_s cn68xx;
+       struct cvmx_pciercx_cfg463_s cn68xxp1;
 };
 
 union cvmx_pciercx_cfg464 {
@@ -1341,8 +1764,12 @@ union cvmx_pciercx_cfg464 {
        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;
 };
 
 union cvmx_pciercx_cfg465 {
@@ -1357,8 +1784,12 @@ union cvmx_pciercx_cfg465 {
        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;
 };
 
 union cvmx_pciercx_cfg466 {
@@ -1376,8 +1807,12 @@ union cvmx_pciercx_cfg466 {
        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;
 };
 
 union cvmx_pciercx_cfg467 {
@@ -1393,8 +1828,12 @@ union cvmx_pciercx_cfg467 {
        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;
 };
 
 union cvmx_pciercx_cfg468 {
@@ -1410,8 +1849,12 @@ union cvmx_pciercx_cfg468 {
        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;
 };
 
 union cvmx_pciercx_cfg490 {
@@ -1426,8 +1869,12 @@ union cvmx_pciercx_cfg490 {
        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;
 };
 
 union cvmx_pciercx_cfg491 {
@@ -1442,8 +1889,12 @@ union cvmx_pciercx_cfg491 {
        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;
 };
 
 union cvmx_pciercx_cfg492 {
@@ -1458,8 +1909,12 @@ union cvmx_pciercx_cfg492 {
        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;
 };
 
 union cvmx_pciercx_cfg515 {
@@ -1473,8 +1928,12 @@ union cvmx_pciercx_cfg515 {
                uint32_t le:9;
                uint32_t n_fts:8;
        } s;
+       struct cvmx_pciercx_cfg515_s cn61xx;
        struct cvmx_pciercx_cfg515_s cn63xx;
        struct cvmx_pciercx_cfg515_s cn63xxp1;
+       struct cvmx_pciercx_cfg515_s cn66xx;
+       struct cvmx_pciercx_cfg515_s cn68xx;
+       struct cvmx_pciercx_cfg515_s cn68xxp1;
 };
 
 union cvmx_pciercx_cfg516 {
@@ -1486,8 +1945,12 @@ union cvmx_pciercx_cfg516 {
        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;
 };
 
 union cvmx_pciercx_cfg517 {
@@ -1499,8 +1962,12 @@ union cvmx_pciercx_cfg517 {
        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;
 };
 
 #endif
diff --git a/arch/mips/include/asm/octeon/cvmx-pcsx-defs.h b/arch/mips/include/asm/octeon/cvmx-pcsx-defs.h
new file mode 100644 (file)
index 0000000..d45952d
--- /dev/null
@@ -0,0 +1,370 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+#ifndef __CVMX_PCSX_DEFS_H__
+#define __CVMX_PCSX_DEFS_H__
+
+#define CVMX_PCSX_ANX_ADV_REG(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0001010ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSX_ANX_EXT_ST_REG(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0001028ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSX_ANX_LP_ABIL_REG(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0001018ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSX_ANX_RESULTS_REG(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0001020ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSX_INTX_EN_REG(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0001088ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSX_INTX_REG(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0001080ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSX_LINKX_TIMER_COUNT_REG(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0001040ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSX_LOG_ANLX_REG(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0001090ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSX_MISCX_CTL_REG(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0001078ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSX_MRX_CONTROL_REG(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0001000ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSX_MRX_STATUS_REG(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0001008ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSX_RXX_STATES_REG(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0001058ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSX_RXX_SYNC_REG(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0001050ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSX_SGMX_AN_ADV_REG(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0001068ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSX_SGMX_LP_ADV_REG(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0001070ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSX_TXX_STATES_REG(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0001060ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSX_TX_RXX_POLARITY_REG(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0001048ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
+
+union cvmx_pcsx_anx_adv_reg {
+       uint64_t u64;
+       struct cvmx_pcsx_anx_adv_reg_s {
+               uint64_t reserved_16_63:48;
+               uint64_t np:1;
+               uint64_t reserved_14_14:1;
+               uint64_t rem_flt:2;
+               uint64_t reserved_9_11:3;
+               uint64_t pause:2;
+               uint64_t hfd:1;
+               uint64_t fd:1;
+               uint64_t 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;
+};
+
+union cvmx_pcsx_anx_ext_st_reg {
+       uint64_t u64;
+       struct cvmx_pcsx_anx_ext_st_reg_s {
+               uint64_t reserved_16_63:48;
+               uint64_t thou_xfd:1;
+               uint64_t thou_xhd:1;
+               uint64_t thou_tfd:1;
+               uint64_t thou_thd:1;
+               uint64_t 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;
+};
+
+union cvmx_pcsx_anx_lp_abil_reg {
+       uint64_t u64;
+       struct cvmx_pcsx_anx_lp_abil_reg_s {
+               uint64_t reserved_16_63:48;
+               uint64_t np:1;
+               uint64_t ack:1;
+               uint64_t rem_flt:2;
+               uint64_t reserved_9_11:3;
+               uint64_t pause:2;
+               uint64_t hfd:1;
+               uint64_t fd:1;
+               uint64_t 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;
+};
+
+union cvmx_pcsx_anx_results_reg {
+       uint64_t u64;
+       struct cvmx_pcsx_anx_results_reg_s {
+               uint64_t reserved_7_63:57;
+               uint64_t pause:2;
+               uint64_t spd:2;
+               uint64_t an_cpt:1;
+               uint64_t dup:1;
+               uint64_t 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;
+};
+
+union cvmx_pcsx_intx_en_reg {
+       uint64_t u64;
+       struct cvmx_pcsx_intx_en_reg_s {
+               uint64_t reserved_12_63:52;
+               uint64_t dup:1;
+               uint64_t sync_bad_en:1;
+               uint64_t an_bad_en:1;
+               uint64_t rxlock_en:1;
+               uint64_t rxbad_en:1;
+               uint64_t rxerr_en:1;
+               uint64_t txbad_en:1;
+               uint64_t txfifo_en:1;
+               uint64_t txfifu_en:1;
+               uint64_t an_err_en:1;
+               uint64_t xmit_en:1;
+               uint64_t lnkspd_en:1;
+       } s;
+       struct cvmx_pcsx_intx_en_reg_s cn52xx;
+       struct cvmx_pcsx_intx_en_reg_s cn52xxp1;
+       struct cvmx_pcsx_intx_en_reg_s cn56xx;
+       struct cvmx_pcsx_intx_en_reg_s cn56xxp1;
+};
+
+union cvmx_pcsx_intx_reg {
+       uint64_t u64;
+       struct cvmx_pcsx_intx_reg_s {
+               uint64_t reserved_12_63:52;
+               uint64_t dup:1;
+               uint64_t sync_bad:1;
+               uint64_t an_bad:1;
+               uint64_t rxlock:1;
+               uint64_t rxbad:1;
+               uint64_t rxerr:1;
+               uint64_t txbad:1;
+               uint64_t txfifo:1;
+               uint64_t txfifu:1;
+               uint64_t an_err:1;
+               uint64_t xmit:1;
+               uint64_t lnkspd:1;
+       } s;
+       struct cvmx_pcsx_intx_reg_s cn52xx;
+       struct cvmx_pcsx_intx_reg_s cn52xxp1;
+       struct cvmx_pcsx_intx_reg_s cn56xx;
+       struct cvmx_pcsx_intx_reg_s cn56xxp1;
+};
+
+union cvmx_pcsx_linkx_timer_count_reg {
+       uint64_t u64;
+       struct cvmx_pcsx_linkx_timer_count_reg_s {
+               uint64_t reserved_16_63:48;
+               uint64_t 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;
+};
+
+union cvmx_pcsx_log_anlx_reg {
+       uint64_t u64;
+       struct cvmx_pcsx_log_anlx_reg_s {
+               uint64_t reserved_4_63:60;
+               uint64_t lafifovfl:1;
+               uint64_t la_en:1;
+               uint64_t 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;
+};
+
+union cvmx_pcsx_miscx_ctl_reg {
+       uint64_t u64;
+       struct cvmx_pcsx_miscx_ctl_reg_s {
+               uint64_t reserved_13_63:51;
+               uint64_t sgmii:1;
+               uint64_t gmxeno:1;
+               uint64_t loopbck2:1;
+               uint64_t mac_phy:1;
+               uint64_t mode:1;
+               uint64_t an_ovrd:1;
+               uint64_t 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;
+};
+
+union cvmx_pcsx_mrx_control_reg {
+       uint64_t u64;
+       struct cvmx_pcsx_mrx_control_reg_s {
+               uint64_t reserved_16_63:48;
+               uint64_t reset:1;
+               uint64_t loopbck1:1;
+               uint64_t spdlsb:1;
+               uint64_t an_en:1;
+               uint64_t pwr_dn:1;
+               uint64_t reserved_10_10:1;
+               uint64_t rst_an:1;
+               uint64_t dup:1;
+               uint64_t coltst:1;
+               uint64_t spdmsb:1;
+               uint64_t uni:1;
+               uint64_t 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;
+};
+
+union cvmx_pcsx_mrx_status_reg {
+       uint64_t u64;
+       struct cvmx_pcsx_mrx_status_reg_s {
+               uint64_t reserved_16_63:48;
+               uint64_t hun_t4:1;
+               uint64_t hun_xfd:1;
+               uint64_t hun_xhd:1;
+               uint64_t ten_fd:1;
+               uint64_t ten_hd:1;
+               uint64_t hun_t2fd:1;
+               uint64_t hun_t2hd:1;
+               uint64_t ext_st:1;
+               uint64_t reserved_7_7:1;
+               uint64_t prb_sup:1;
+               uint64_t an_cpt:1;
+               uint64_t rm_flt:1;
+               uint64_t an_abil:1;
+               uint64_t lnk_st:1;
+               uint64_t reserved_1_1:1;
+               uint64_t 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;
+};
+
+union cvmx_pcsx_rxx_states_reg {
+       uint64_t u64;
+       struct cvmx_pcsx_rxx_states_reg_s {
+               uint64_t reserved_16_63:48;
+               uint64_t rx_bad:1;
+               uint64_t rx_st:5;
+               uint64_t sync_bad:1;
+               uint64_t sync:4;
+               uint64_t an_bad:1;
+               uint64_t 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;
+};
+
+union cvmx_pcsx_rxx_sync_reg {
+       uint64_t u64;
+       struct cvmx_pcsx_rxx_sync_reg_s {
+               uint64_t reserved_2_63:62;
+               uint64_t sync:1;
+               uint64_t 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;
+};
+
+union cvmx_pcsx_sgmx_an_adv_reg {
+       uint64_t u64;
+       struct cvmx_pcsx_sgmx_an_adv_reg_s {
+               uint64_t reserved_16_63:48;
+               uint64_t link:1;
+               uint64_t ack:1;
+               uint64_t reserved_13_13:1;
+               uint64_t dup:1;
+               uint64_t speed:2;
+               uint64_t reserved_1_9:9;
+               uint64_t 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;
+};
+
+union cvmx_pcsx_sgmx_lp_adv_reg {
+       uint64_t u64;
+       struct cvmx_pcsx_sgmx_lp_adv_reg_s {
+               uint64_t reserved_16_63:48;
+               uint64_t link:1;
+               uint64_t reserved_13_14:2;
+               uint64_t dup:1;
+               uint64_t speed:2;
+               uint64_t reserved_1_9:9;
+               uint64_t 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;
+};
+
+union cvmx_pcsx_txx_states_reg {
+       uint64_t u64;
+       struct cvmx_pcsx_txx_states_reg_s {
+               uint64_t reserved_7_63:57;
+               uint64_t xmit:2;
+               uint64_t tx_bad:1;
+               uint64_t 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;
+};
+
+union cvmx_pcsx_tx_rxx_polarity_reg {
+       uint64_t u64;
+       struct cvmx_pcsx_tx_rxx_polarity_reg_s {
+               uint64_t reserved_4_63:60;
+               uint64_t rxovrd:1;
+               uint64_t autorxpl:1;
+               uint64_t rxplrt:1;
+               uint64_t 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;
+};
+
+#endif
diff --git a/arch/mips/include/asm/octeon/cvmx-pcsxx-defs.h b/arch/mips/include/asm/octeon/cvmx-pcsxx-defs.h
new file mode 100644 (file)
index 0000000..55d120f
--- /dev/null
@@ -0,0 +1,316 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+#ifndef __CVMX_PCSXX_DEFS_H__
+#define __CVMX_PCSXX_DEFS_H__
+
+#define CVMX_PCSXX_10GBX_STATUS_REG(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000828ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSXX_BIST_STATUS_REG(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000870ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSXX_BIT_LOCK_STATUS_REG(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000850ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSXX_CONTROL1_REG(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000800ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSXX_CONTROL2_REG(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000818ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSXX_INT_EN_REG(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000860ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSXX_INT_REG(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000858ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSXX_LOG_ANL_REG(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000868ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSXX_MISC_CTL_REG(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000848ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSXX_RX_SYNC_STATES_REG(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000838ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSXX_SPD_ABIL_REG(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000810ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSXX_STATUS1_REG(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000808ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSXX_STATUS2_REG(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000820ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSXX_TX_RX_POLARITY_REG(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000840ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_PCSXX_TX_RX_STATES_REG(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800B0000830ull + (((block_id) & 1) * 0x8000000ull))
+
+union cvmx_pcsxx_10gbx_status_reg {
+       uint64_t u64;
+       struct cvmx_pcsxx_10gbx_status_reg_s {
+               uint64_t reserved_13_63:51;
+               uint64_t alignd:1;
+               uint64_t pattst:1;
+               uint64_t reserved_4_10:7;
+               uint64_t l3sync:1;
+               uint64_t l2sync:1;
+               uint64_t l1sync:1;
+               uint64_t l0sync:1;
+       } s;
+       struct cvmx_pcsxx_10gbx_status_reg_s cn52xx;
+       struct cvmx_pcsxx_10gbx_status_reg_s cn52xxp1;
+       struct cvmx_pcsxx_10gbx_status_reg_s cn56xx;
+       struct cvmx_pcsxx_10gbx_status_reg_s cn56xxp1;
+};
+
+union cvmx_pcsxx_bist_status_reg {
+       uint64_t u64;
+       struct cvmx_pcsxx_bist_status_reg_s {
+               uint64_t reserved_1_63:63;
+               uint64_t bist_status:1;
+       } s;
+       struct cvmx_pcsxx_bist_status_reg_s cn52xx;
+       struct cvmx_pcsxx_bist_status_reg_s cn52xxp1;
+       struct cvmx_pcsxx_bist_status_reg_s cn56xx;
+       struct cvmx_pcsxx_bist_status_reg_s cn56xxp1;
+};
+
+union cvmx_pcsxx_bit_lock_status_reg {
+       uint64_t u64;
+       struct cvmx_pcsxx_bit_lock_status_reg_s {
+               uint64_t reserved_4_63:60;
+               uint64_t bitlck3:1;
+               uint64_t bitlck2:1;
+               uint64_t bitlck1:1;
+               uint64_t bitlck0:1;
+       } s;
+       struct cvmx_pcsxx_bit_lock_status_reg_s cn52xx;
+       struct cvmx_pcsxx_bit_lock_status_reg_s cn52xxp1;
+       struct cvmx_pcsxx_bit_lock_status_reg_s cn56xx;
+       struct cvmx_pcsxx_bit_lock_status_reg_s cn56xxp1;
+};
+
+union cvmx_pcsxx_control1_reg {
+       uint64_t u64;
+       struct cvmx_pcsxx_control1_reg_s {
+               uint64_t reserved_16_63:48;
+               uint64_t reset:1;
+               uint64_t loopbck1:1;
+               uint64_t spdsel1:1;
+               uint64_t reserved_12_12:1;
+               uint64_t lo_pwr:1;
+               uint64_t reserved_7_10:4;
+               uint64_t spdsel0:1;
+               uint64_t spd:4;
+               uint64_t reserved_0_1:2;
+       } s;
+       struct cvmx_pcsxx_control1_reg_s cn52xx;
+       struct cvmx_pcsxx_control1_reg_s cn52xxp1;
+       struct cvmx_pcsxx_control1_reg_s cn56xx;
+       struct cvmx_pcsxx_control1_reg_s cn56xxp1;
+};
+
+union cvmx_pcsxx_control2_reg {
+       uint64_t u64;
+       struct cvmx_pcsxx_control2_reg_s {
+               uint64_t reserved_2_63:62;
+               uint64_t type:2;
+       } s;
+       struct cvmx_pcsxx_control2_reg_s cn52xx;
+       struct cvmx_pcsxx_control2_reg_s cn52xxp1;
+       struct cvmx_pcsxx_control2_reg_s cn56xx;
+       struct cvmx_pcsxx_control2_reg_s cn56xxp1;
+};
+
+union cvmx_pcsxx_int_en_reg {
+       uint64_t u64;
+       struct cvmx_pcsxx_int_en_reg_s {
+               uint64_t reserved_6_63:58;
+               uint64_t algnlos_en:1;
+               uint64_t synlos_en:1;
+               uint64_t bitlckls_en:1;
+               uint64_t rxsynbad_en:1;
+               uint64_t rxbad_en:1;
+               uint64_t txflt_en:1;
+       } s;
+       struct cvmx_pcsxx_int_en_reg_s cn52xx;
+       struct cvmx_pcsxx_int_en_reg_s cn52xxp1;
+       struct cvmx_pcsxx_int_en_reg_s cn56xx;
+       struct cvmx_pcsxx_int_en_reg_s cn56xxp1;
+};
+
+union cvmx_pcsxx_int_reg {
+       uint64_t u64;
+       struct cvmx_pcsxx_int_reg_s {
+               uint64_t reserved_6_63:58;
+               uint64_t algnlos:1;
+               uint64_t synlos:1;
+               uint64_t bitlckls:1;
+               uint64_t rxsynbad:1;
+               uint64_t rxbad:1;
+               uint64_t txflt:1;
+       } s;
+       struct cvmx_pcsxx_int_reg_s cn52xx;
+       struct cvmx_pcsxx_int_reg_s cn52xxp1;
+       struct cvmx_pcsxx_int_reg_s cn56xx;
+       struct cvmx_pcsxx_int_reg_s cn56xxp1;
+};
+
+union cvmx_pcsxx_log_anl_reg {
+       uint64_t u64;
+       struct cvmx_pcsxx_log_anl_reg_s {
+               uint64_t reserved_7_63:57;
+               uint64_t enc_mode:1;
+               uint64_t drop_ln:2;
+               uint64_t lafifovfl:1;
+               uint64_t la_en:1;
+               uint64_t pkt_sz:2;
+       } s;
+       struct cvmx_pcsxx_log_anl_reg_s cn52xx;
+       struct cvmx_pcsxx_log_anl_reg_s cn52xxp1;
+       struct cvmx_pcsxx_log_anl_reg_s cn56xx;
+       struct cvmx_pcsxx_log_anl_reg_s cn56xxp1;
+};
+
+union cvmx_pcsxx_misc_ctl_reg {
+       uint64_t u64;
+       struct cvmx_pcsxx_misc_ctl_reg_s {
+               uint64_t reserved_4_63:60;
+               uint64_t tx_swap:1;
+               uint64_t rx_swap:1;
+               uint64_t xaui:1;
+               uint64_t gmxeno:1;
+       } s;
+       struct cvmx_pcsxx_misc_ctl_reg_s cn52xx;
+       struct cvmx_pcsxx_misc_ctl_reg_s cn52xxp1;
+       struct cvmx_pcsxx_misc_ctl_reg_s cn56xx;
+       struct cvmx_pcsxx_misc_ctl_reg_s cn56xxp1;
+};
+
+union cvmx_pcsxx_rx_sync_states_reg {
+       uint64_t u64;
+       struct cvmx_pcsxx_rx_sync_states_reg_s {
+               uint64_t reserved_16_63:48;
+               uint64_t sync3st:4;
+               uint64_t sync2st:4;
+               uint64_t sync1st:4;
+               uint64_t sync0st:4;
+       } s;
+       struct cvmx_pcsxx_rx_sync_states_reg_s cn52xx;
+       struct cvmx_pcsxx_rx_sync_states_reg_s cn52xxp1;
+       struct cvmx_pcsxx_rx_sync_states_reg_s cn56xx;
+       struct cvmx_pcsxx_rx_sync_states_reg_s cn56xxp1;
+};
+
+union cvmx_pcsxx_spd_abil_reg {
+       uint64_t u64;
+       struct cvmx_pcsxx_spd_abil_reg_s {
+               uint64_t reserved_2_63:62;
+               uint64_t tenpasst:1;
+               uint64_t tengb:1;
+       } s;
+       struct cvmx_pcsxx_spd_abil_reg_s cn52xx;
+       struct cvmx_pcsxx_spd_abil_reg_s cn52xxp1;
+       struct cvmx_pcsxx_spd_abil_reg_s cn56xx;
+       struct cvmx_pcsxx_spd_abil_reg_s cn56xxp1;
+};
+
+union cvmx_pcsxx_status1_reg {
+       uint64_t u64;
+       struct cvmx_pcsxx_status1_reg_s {
+               uint64_t reserved_8_63:56;
+               uint64_t flt:1;
+               uint64_t reserved_3_6:4;
+               uint64_t rcv_lnk:1;
+               uint64_t lpable:1;
+               uint64_t reserved_0_0:1;
+       } s;
+       struct cvmx_pcsxx_status1_reg_s cn52xx;
+       struct cvmx_pcsxx_status1_reg_s cn52xxp1;
+       struct cvmx_pcsxx_status1_reg_s cn56xx;
+       struct cvmx_pcsxx_status1_reg_s cn56xxp1;
+};
+
+union cvmx_pcsxx_status2_reg {
+       uint64_t u64;
+       struct cvmx_pcsxx_status2_reg_s {
+               uint64_t reserved_16_63:48;
+               uint64_t dev:2;
+               uint64_t reserved_12_13:2;
+               uint64_t xmtflt:1;
+               uint64_t rcvflt:1;
+               uint64_t reserved_3_9:7;
+               uint64_t tengb_w:1;
+               uint64_t tengb_x:1;
+               uint64_t tengb_r:1;
+       } s;
+       struct cvmx_pcsxx_status2_reg_s cn52xx;
+       struct cvmx_pcsxx_status2_reg_s cn52xxp1;
+       struct cvmx_pcsxx_status2_reg_s cn56xx;
+       struct cvmx_pcsxx_status2_reg_s cn56xxp1;
+};
+
+union cvmx_pcsxx_tx_rx_polarity_reg {
+       uint64_t u64;
+       struct cvmx_pcsxx_tx_rx_polarity_reg_s {
+               uint64_t reserved_10_63:54;
+               uint64_t xor_rxplrt:4;
+               uint64_t xor_txplrt:4;
+               uint64_t rxplrt:1;
+               uint64_t txplrt:1;
+       } s;
+       struct cvmx_pcsxx_tx_rx_polarity_reg_s cn52xx;
+       struct cvmx_pcsxx_tx_rx_polarity_reg_cn52xxp1 {
+               uint64_t reserved_2_63:62;
+               uint64_t rxplrt:1;
+               uint64_t txplrt:1;
+       } cn52xxp1;
+       struct cvmx_pcsxx_tx_rx_polarity_reg_s cn56xx;
+       struct cvmx_pcsxx_tx_rx_polarity_reg_cn52xxp1 cn56xxp1;
+};
+
+union cvmx_pcsxx_tx_rx_states_reg {
+       uint64_t u64;
+       struct cvmx_pcsxx_tx_rx_states_reg_s {
+               uint64_t reserved_14_63:50;
+               uint64_t term_err:1;
+               uint64_t syn3bad:1;
+               uint64_t syn2bad:1;
+               uint64_t syn1bad:1;
+               uint64_t syn0bad:1;
+               uint64_t rxbad:1;
+               uint64_t algn_st:3;
+               uint64_t rx_st:2;
+               uint64_t tx_st:3;
+       } s;
+       struct cvmx_pcsxx_tx_rx_states_reg_s cn52xx;
+       struct cvmx_pcsxx_tx_rx_states_reg_cn52xxp1 {
+               uint64_t reserved_13_63:51;
+               uint64_t syn3bad:1;
+               uint64_t syn2bad:1;
+               uint64_t syn1bad:1;
+               uint64_t syn0bad:1;
+               uint64_t rxbad:1;
+               uint64_t algn_st:3;
+               uint64_t rx_st:2;
+               uint64_t tx_st:3;
+       } cn52xxp1;
+       struct cvmx_pcsxx_tx_rx_states_reg_s cn56xx;
+       struct cvmx_pcsxx_tx_rx_states_reg_cn52xxp1 cn56xxp1;
+};
+
+#endif
diff --git a/arch/mips/include/asm/octeon/cvmx-pemx-defs.h b/arch/mips/include/asm/octeon/cvmx-pemx-defs.h
new file mode 100644 (file)
index 0000000..be189a2
--- /dev/null
@@ -0,0 +1,509 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2011 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+#ifndef __CVMX_PEMX_DEFS_H__
+#define __CVMX_PEMX_DEFS_H__
+
+#define CVMX_PEMX_BAR1_INDEXX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C00000A8ull) + (((offset) & 15) + ((block_id) & 1) * 0x200000ull) * 8)
+#define CVMX_PEMX_BAR2_MASK(block_id) (CVMX_ADD_IO_SEG(0x00011800C0000130ull) + ((block_id) & 1) * 0x1000000ull)
+#define CVMX_PEMX_BAR_CTL(block_id) (CVMX_ADD_IO_SEG(0x00011800C0000128ull) + ((block_id) & 1) * 0x1000000ull)
+#define CVMX_PEMX_BIST_STATUS(block_id) (CVMX_ADD_IO_SEG(0x00011800C0000018ull) + ((block_id) & 1) * 0x1000000ull)
+#define CVMX_PEMX_BIST_STATUS2(block_id) (CVMX_ADD_IO_SEG(0x00011800C0000420ull) + ((block_id) & 1) * 0x1000000ull)
+#define CVMX_PEMX_CFG_RD(block_id) (CVMX_ADD_IO_SEG(0x00011800C0000030ull) + ((block_id) & 1) * 0x1000000ull)
+#define CVMX_PEMX_CFG_WR(block_id) (CVMX_ADD_IO_SEG(0x00011800C0000028ull) + ((block_id) & 1) * 0x1000000ull)
+#define CVMX_PEMX_CPL_LUT_VALID(block_id) (CVMX_ADD_IO_SEG(0x00011800C0000098ull) + ((block_id) & 1) * 0x1000000ull)
+#define CVMX_PEMX_CTL_STATUS(block_id) (CVMX_ADD_IO_SEG(0x00011800C0000000ull) + ((block_id) & 1) * 0x1000000ull)
+#define CVMX_PEMX_DBG_INFO(block_id) (CVMX_ADD_IO_SEG(0x00011800C0000008ull) + ((block_id) & 1) * 0x1000000ull)
+#define CVMX_PEMX_DBG_INFO_EN(block_id) (CVMX_ADD_IO_SEG(0x00011800C00000A0ull) + ((block_id) & 1) * 0x1000000ull)
+#define CVMX_PEMX_DIAG_STATUS(block_id) (CVMX_ADD_IO_SEG(0x00011800C0000020ull) + ((block_id) & 1) * 0x1000000ull)
+#define CVMX_PEMX_INB_READ_CREDITS(block_id) (CVMX_ADD_IO_SEG(0x00011800C0000138ull) + ((block_id) & 1) * 0x1000000ull)
+#define CVMX_PEMX_INT_ENB(block_id) (CVMX_ADD_IO_SEG(0x00011800C0000410ull) + ((block_id) & 1) * 0x1000000ull)
+#define CVMX_PEMX_INT_ENB_INT(block_id) (CVMX_ADD_IO_SEG(0x00011800C0000418ull) + ((block_id) & 1) * 0x1000000ull)
+#define CVMX_PEMX_INT_SUM(block_id) (CVMX_ADD_IO_SEG(0x00011800C0000408ull) + ((block_id) & 1) * 0x1000000ull)
+#define CVMX_PEMX_P2N_BAR0_START(block_id) (CVMX_ADD_IO_SEG(0x00011800C0000080ull) + ((block_id) & 1) * 0x1000000ull)
+#define CVMX_PEMX_P2N_BAR1_START(block_id) (CVMX_ADD_IO_SEG(0x00011800C0000088ull) + ((block_id) & 1) * 0x1000000ull)
+#define CVMX_PEMX_P2N_BAR2_START(block_id) (CVMX_ADD_IO_SEG(0x00011800C0000090ull) + ((block_id) & 1) * 0x1000000ull)
+#define CVMX_PEMX_P2P_BARX_END(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C0000048ull) + (((offset) & 3) + ((block_id) & 1) * 0x100000ull) * 16)
+#define CVMX_PEMX_P2P_BARX_START(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C0000040ull) + (((offset) & 3) + ((block_id) & 1) * 0x100000ull) * 16)
+#define CVMX_PEMX_TLP_CREDITS(block_id) (CVMX_ADD_IO_SEG(0x00011800C0000038ull) + ((block_id) & 1) * 0x1000000ull)
+
+union cvmx_pemx_bar1_indexx {
+       uint64_t u64;
+       struct cvmx_pemx_bar1_indexx_s {
+               uint64_t reserved_20_63:44;
+               uint64_t addr_idx:16;
+               uint64_t ca:1;
+               uint64_t end_swp:2;
+               uint64_t addr_v:1;
+       } s;
+       struct cvmx_pemx_bar1_indexx_s cn61xx;
+       struct cvmx_pemx_bar1_indexx_s cn63xx;
+       struct cvmx_pemx_bar1_indexx_s cn63xxp1;
+       struct cvmx_pemx_bar1_indexx_s cn66xx;
+       struct cvmx_pemx_bar1_indexx_s cn68xx;
+       struct cvmx_pemx_bar1_indexx_s cn68xxp1;
+};
+
+union cvmx_pemx_bar2_mask {
+       uint64_t u64;
+       struct cvmx_pemx_bar2_mask_s {
+               uint64_t reserved_38_63:26;
+               uint64_t mask:35;
+               uint64_t reserved_0_2:3;
+       } s;
+       struct cvmx_pemx_bar2_mask_s cn61xx;
+       struct cvmx_pemx_bar2_mask_s cn66xx;
+       struct cvmx_pemx_bar2_mask_s cn68xx;
+       struct cvmx_pemx_bar2_mask_s cn68xxp1;
+};
+
+union cvmx_pemx_bar_ctl {
+       uint64_t u64;
+       struct cvmx_pemx_bar_ctl_s {
+               uint64_t reserved_7_63:57;
+               uint64_t bar1_siz:3;
+               uint64_t bar2_enb:1;
+               uint64_t bar2_esx:2;
+               uint64_t 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;
+};
+
+union cvmx_pemx_bist_status {
+       uint64_t u64;
+       struct cvmx_pemx_bist_status_s {
+               uint64_t reserved_8_63:56;
+               uint64_t retry:1;
+               uint64_t rqdata0:1;
+               uint64_t rqdata1:1;
+               uint64_t rqdata2:1;
+               uint64_t rqdata3:1;
+               uint64_t rqhdr1:1;
+               uint64_t rqhdr0:1;
+               uint64_t sot:1;
+       } s;
+       struct cvmx_pemx_bist_status_s cn61xx;
+       struct cvmx_pemx_bist_status_s cn63xx;
+       struct cvmx_pemx_bist_status_s cn63xxp1;
+       struct cvmx_pemx_bist_status_s cn66xx;
+       struct cvmx_pemx_bist_status_s cn68xx;
+       struct cvmx_pemx_bist_status_s cn68xxp1;
+};
+
+union cvmx_pemx_bist_status2 {
+       uint64_t u64;
+       struct cvmx_pemx_bist_status2_s {
+               uint64_t reserved_10_63:54;
+               uint64_t e2p_cpl:1;
+               uint64_t e2p_n:1;
+               uint64_t e2p_p:1;
+               uint64_t peai_p2e:1;
+               uint64_t pef_tpf1:1;
+               uint64_t pef_tpf0:1;
+               uint64_t pef_tnf:1;
+               uint64_t pef_tcf1:1;
+               uint64_t pef_tc0:1;
+               uint64_t ppf:1;
+       } s;
+       struct cvmx_pemx_bist_status2_s cn61xx;
+       struct cvmx_pemx_bist_status2_s cn63xx;
+       struct cvmx_pemx_bist_status2_s cn63xxp1;
+       struct cvmx_pemx_bist_status2_s cn66xx;
+       struct cvmx_pemx_bist_status2_s cn68xx;
+       struct cvmx_pemx_bist_status2_s cn68xxp1;
+};
+
+union cvmx_pemx_cfg_rd {
+       uint64_t u64;
+       struct cvmx_pemx_cfg_rd_s {
+               uint64_t data:32;
+               uint64_t 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;
+};
+
+union cvmx_pemx_cfg_wr {
+       uint64_t u64;
+       struct cvmx_pemx_cfg_wr_s {
+               uint64_t data:32;
+               uint64_t 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;
+};
+
+union cvmx_pemx_cpl_lut_valid {
+       uint64_t u64;
+       struct cvmx_pemx_cpl_lut_valid_s {
+               uint64_t reserved_32_63:32;
+               uint64_t tag:32;
+       } s;
+       struct cvmx_pemx_cpl_lut_valid_s cn61xx;
+       struct cvmx_pemx_cpl_lut_valid_s cn63xx;
+       struct cvmx_pemx_cpl_lut_valid_s cn63xxp1;
+       struct cvmx_pemx_cpl_lut_valid_s cn66xx;
+       struct cvmx_pemx_cpl_lut_valid_s cn68xx;
+       struct cvmx_pemx_cpl_lut_valid_s cn68xxp1;
+};
+
+union cvmx_pemx_ctl_status {
+       uint64_t u64;
+       struct cvmx_pemx_ctl_status_s {
+               uint64_t reserved_48_63:16;
+               uint64_t auto_sd:1;
+               uint64_t dnum:5;
+               uint64_t pbus:8;
+               uint64_t reserved_32_33:2;
+               uint64_t cfg_rtry:16;
+               uint64_t reserved_12_15:4;
+               uint64_t pm_xtoff:1;
+               uint64_t pm_xpme:1;
+               uint64_t ob_p_cmd:1;
+               uint64_t reserved_7_8:2;
+               uint64_t nf_ecrc:1;
+               uint64_t dly_one:1;
+               uint64_t lnk_enb:1;
+               uint64_t ro_ctlp:1;
+               uint64_t fast_lm:1;
+               uint64_t inv_ecrc:1;
+               uint64_t inv_lcrc:1;
+       } s;
+       struct cvmx_pemx_ctl_status_s cn61xx;
+       struct cvmx_pemx_ctl_status_s cn63xx;
+       struct cvmx_pemx_ctl_status_s cn63xxp1;
+       struct cvmx_pemx_ctl_status_s cn66xx;
+       struct cvmx_pemx_ctl_status_s cn68xx;
+       struct cvmx_pemx_ctl_status_s cn68xxp1;
+};
+
+union cvmx_pemx_dbg_info {
+       uint64_t u64;
+       struct cvmx_pemx_dbg_info_s {
+               uint64_t reserved_31_63:33;
+               uint64_t ecrc_e:1;
+               uint64_t rawwpp:1;
+               uint64_t racpp:1;
+               uint64_t ramtlp:1;
+               uint64_t rarwdns:1;
+               uint64_t caar:1;
+               uint64_t racca:1;
+               uint64_t racur:1;
+               uint64_t rauc:1;
+               uint64_t rqo:1;
+               uint64_t fcuv:1;
+               uint64_t rpe:1;
+               uint64_t fcpvwt:1;
+               uint64_t dpeoosd:1;
+               uint64_t rtwdle:1;
+               uint64_t rdwdle:1;
+               uint64_t mre:1;
+               uint64_t rte:1;
+               uint64_t acto:1;
+               uint64_t rvdm:1;
+               uint64_t rumep:1;
+               uint64_t rptamrc:1;
+               uint64_t rpmerc:1;
+               uint64_t rfemrc:1;
+               uint64_t rnfemrc:1;
+               uint64_t rcemrc:1;
+               uint64_t rpoison:1;
+               uint64_t recrce:1;
+               uint64_t rtlplle:1;
+               uint64_t rtlpmal:1;
+               uint64_t spoison:1;
+       } s;
+       struct cvmx_pemx_dbg_info_s cn61xx;
+       struct cvmx_pemx_dbg_info_s cn63xx;
+       struct cvmx_pemx_dbg_info_s cn63xxp1;
+       struct cvmx_pemx_dbg_info_s cn66xx;
+       struct cvmx_pemx_dbg_info_s cn68xx;
+       struct cvmx_pemx_dbg_info_s cn68xxp1;
+};
+
+union cvmx_pemx_dbg_info_en {
+       uint64_t u64;
+       struct cvmx_pemx_dbg_info_en_s {
+               uint64_t reserved_31_63:33;
+               uint64_t ecrc_e:1;
+               uint64_t rawwpp:1;
+               uint64_t racpp:1;
+               uint64_t ramtlp:1;
+               uint64_t rarwdns:1;
+               uint64_t caar:1;
+               uint64_t racca:1;
+               uint64_t racur:1;
+               uint64_t rauc:1;
+               uint64_t rqo:1;
+               uint64_t fcuv:1;
+               uint64_t rpe:1;
+               uint64_t fcpvwt:1;
+               uint64_t dpeoosd:1;
+               uint64_t rtwdle:1;
+               uint64_t rdwdle:1;
+               uint64_t mre:1;
+               uint64_t rte:1;
+               uint64_t acto:1;
+               uint64_t rvdm:1;
+               uint64_t rumep:1;
+               uint64_t rptamrc:1;
+               uint64_t rpmerc:1;
+               uint64_t rfemrc:1;
+               uint64_t rnfemrc:1;
+               uint64_t rcemrc:1;
+               uint64_t rpoison:1;
+               uint64_t recrce:1;
+               uint64_t rtlplle:1;
+               uint64_t rtlpmal:1;
+               uint64_t spoison:1;
+       } s;
+       struct cvmx_pemx_dbg_info_en_s cn61xx;
+       struct cvmx_pemx_dbg_info_en_s cn63xx;
+       struct cvmx_pemx_dbg_info_en_s cn63xxp1;
+       struct cvmx_pemx_dbg_info_en_s cn66xx;
+       struct cvmx_pemx_dbg_info_en_s cn68xx;
+       struct cvmx_pemx_dbg_info_en_s cn68xxp1;
+};
+
+union cvmx_pemx_diag_status {
+       uint64_t u64;
+       struct cvmx_pemx_diag_status_s {
+               uint64_t reserved_4_63:60;
+               uint64_t pm_dst:1;
+               uint64_t pm_stat:1;
+               uint64_t pm_en:1;
+               uint64_t aux_en:1;
+       } s;
+       struct cvmx_pemx_diag_status_s cn61xx;
+       struct cvmx_pemx_diag_status_s cn63xx;
+       struct cvmx_pemx_diag_status_s cn63xxp1;
+       struct cvmx_pemx_diag_status_s cn66xx;
+       struct cvmx_pemx_diag_status_s cn68xx;
+       struct cvmx_pemx_diag_status_s cn68xxp1;
+};
+
+union cvmx_pemx_inb_read_credits {
+       uint64_t u64;
+       struct cvmx_pemx_inb_read_credits_s {
+               uint64_t reserved_6_63:58;
+               uint64_t num:6;
+       } s;
+       struct cvmx_pemx_inb_read_credits_s cn61xx;
+       struct cvmx_pemx_inb_read_credits_s cn66xx;
+       struct cvmx_pemx_inb_read_credits_s cn68xx;
+};
+
+union cvmx_pemx_int_enb {
+       uint64_t u64;
+       struct cvmx_pemx_int_enb_s {
+               uint64_t reserved_14_63:50;
+               uint64_t crs_dr:1;
+               uint64_t crs_er:1;
+               uint64_t rdlk:1;
+               uint64_t exc:1;
+               uint64_t un_bx:1;
+               uint64_t un_b2:1;
+               uint64_t un_b1:1;
+               uint64_t up_bx:1;
+               uint64_t up_b2:1;
+               uint64_t up_b1:1;
+               uint64_t pmem:1;
+               uint64_t pmei:1;
+               uint64_t se:1;
+               uint64_t 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;
+};
+
+union cvmx_pemx_int_enb_int {
+       uint64_t u64;
+       struct cvmx_pemx_int_enb_int_s {
+               uint64_t reserved_14_63:50;
+               uint64_t crs_dr:1;
+               uint64_t crs_er:1;
+               uint64_t rdlk:1;
+               uint64_t exc:1;
+               uint64_t un_bx:1;
+               uint64_t un_b2:1;
+               uint64_t un_b1:1;
+               uint64_t up_bx:1;
+               uint64_t up_b2:1;
+               uint64_t up_b1:1;
+               uint64_t pmem:1;
+               uint64_t pmei:1;
+               uint64_t se:1;
+               uint64_t 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;
+};
+
+union cvmx_pemx_int_sum {
+       uint64_t u64;
+       struct cvmx_pemx_int_sum_s {
+               uint64_t reserved_14_63:50;
+               uint64_t crs_dr:1;
+               uint64_t crs_er:1;
+               uint64_t rdlk:1;
+               uint64_t exc:1;
+               uint64_t un_bx:1;
+               uint64_t un_b2:1;
+               uint64_t un_b1:1;
+               uint64_t up_bx:1;
+               uint64_t up_b2:1;
+               uint64_t up_b1:1;
+               uint64_t pmem:1;
+               uint64_t pmei:1;
+               uint64_t se:1;
+               uint64_t aeri:1;
+       } s;
+       struct cvmx_pemx_int_sum_s cn61xx;
+       struct cvmx_pemx_int_sum_s cn63xx;
+       struct cvmx_pemx_int_sum_s cn63xxp1;
+       struct cvmx_pemx_int_sum_s cn66xx;
+       struct cvmx_pemx_int_sum_s cn68xx;
+       struct cvmx_pemx_int_sum_s cn68xxp1;
+};
+
+union cvmx_pemx_p2n_bar0_start {
+       uint64_t u64;
+       struct cvmx_pemx_p2n_bar0_start_s {
+               uint64_t addr:50;
+               uint64_t reserved_0_13:14;
+       } s;
+       struct cvmx_pemx_p2n_bar0_start_s cn61xx;
+       struct cvmx_pemx_p2n_bar0_start_s cn63xx;
+       struct cvmx_pemx_p2n_bar0_start_s cn63xxp1;
+       struct cvmx_pemx_p2n_bar0_start_s cn66xx;
+       struct cvmx_pemx_p2n_bar0_start_s cn68xx;
+       struct cvmx_pemx_p2n_bar0_start_s cn68xxp1;
+};
+
+union cvmx_pemx_p2n_bar1_start {
+       uint64_t u64;
+       struct cvmx_pemx_p2n_bar1_start_s {
+               uint64_t addr:38;
+               uint64_t 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;
+};
+
+union cvmx_pemx_p2n_bar2_start {
+       uint64_t u64;
+       struct cvmx_pemx_p2n_bar2_start_s {
+               uint64_t addr:23;
+               uint64_t reserved_0_40:41;
+       } s;
+       struct cvmx_pemx_p2n_bar2_start_s cn61xx;
+       struct cvmx_pemx_p2n_bar2_start_s cn63xx;
+       struct cvmx_pemx_p2n_bar2_start_s cn63xxp1;
+       struct cvmx_pemx_p2n_bar2_start_s cn66xx;
+       struct cvmx_pemx_p2n_bar2_start_s cn68xx;
+       struct cvmx_pemx_p2n_bar2_start_s cn68xxp1;
+};
+
+union cvmx_pemx_p2p_barx_end {
+       uint64_t u64;
+       struct cvmx_pemx_p2p_barx_end_s {
+               uint64_t addr:52;
+               uint64_t 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;
+};
+
+union cvmx_pemx_p2p_barx_start {
+       uint64_t u64;
+       struct cvmx_pemx_p2p_barx_start_s {
+               uint64_t addr:52;
+               uint64_t reserved_0_11:12;
+       } s;
+       struct cvmx_pemx_p2p_barx_start_s cn63xx;
+       struct cvmx_pemx_p2p_barx_start_s cn63xxp1;
+       struct cvmx_pemx_p2p_barx_start_s cn66xx;
+       struct cvmx_pemx_p2p_barx_start_s cn68xx;
+       struct cvmx_pemx_p2p_barx_start_s cn68xxp1;
+};
+
+union cvmx_pemx_tlp_credits {
+       uint64_t u64;
+       struct cvmx_pemx_tlp_credits_s {
+               uint64_t reserved_56_63:8;
+               uint64_t peai_ppf:8;
+               uint64_t pem_cpl:8;
+               uint64_t pem_np:8;
+               uint64_t pem_p:8;
+               uint64_t sli_cpl:8;
+               uint64_t sli_np:8;
+               uint64_t sli_p:8;
+       } s;
+       struct cvmx_pemx_tlp_credits_cn61xx {
+               uint64_t reserved_56_63:8;
+               uint64_t peai_ppf:8;
+               uint64_t reserved_24_47:24;
+               uint64_t sli_cpl:8;
+               uint64_t sli_np:8;
+               uint64_t 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;
+};
+
+#endif
index 5ab8679d89af0698d55d54441eb96910bb6752ec..4438d211988bfe5874a9f88b1eccc3ddfa3f5954 100644 (file)
@@ -4,7 +4,7 @@
  * Contact: support@caviumnetworks.com
  * This file is part of the OCTEON SDK
  *
- * Copyright (c) 2003-2010 Cavium Networks
+ * Copyright (c) 2003-2011 Cavium Networks
  *
  * This file is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License, Version 2, as
  * Contact Cavium Networks for more information
  ***********************license end**************************************/
 
-/**
- * cvmx-pexp-defs.h
- *
- * Configuration and status register (CSR) definitions for
- * OCTEON PEXP.
- *
- */
 #ifndef __CVMX_PEXP_DEFS_H__
 #define __CVMX_PEXP_DEFS_H__
 
 #define CVMX_PEXP_NPEI_STATE3 (CVMX_ADD_IO_SEG(0x00011F0000008640ull))
 #define CVMX_PEXP_NPEI_WINDOW_CTL (CVMX_ADD_IO_SEG(0x00011F0000008380ull))
 #define CVMX_PEXP_SLI_BIST_STATUS (CVMX_ADD_IO_SEG(0x00011F0000010580ull))
-#define CVMX_PEXP_SLI_CTL_PORTX(offset) (CVMX_ADD_IO_SEG(0x00011F0000010050ull) + ((offset) & 1) * 16)
+#define CVMX_PEXP_SLI_CTL_PORTX(offset) (CVMX_ADD_IO_SEG(0x00011F0000010050ull) + ((offset) & 3) * 16)
 #define CVMX_PEXP_SLI_CTL_STATUS (CVMX_ADD_IO_SEG(0x00011F0000010570ull))
 #define CVMX_PEXP_SLI_DATA_OUT_CNT (CVMX_ADD_IO_SEG(0x00011F00000105F0ull))
 #define CVMX_PEXP_SLI_DBG_DATA (CVMX_ADD_IO_SEG(0x00011F0000010310ull))
 #define CVMX_PEXP_SLI_INT_SUM (CVMX_ADD_IO_SEG(0x00011F0000010330ull))
 #define CVMX_PEXP_SLI_LAST_WIN_RDATA0 (CVMX_ADD_IO_SEG(0x00011F0000010600ull))
 #define CVMX_PEXP_SLI_LAST_WIN_RDATA1 (CVMX_ADD_IO_SEG(0x00011F0000010610ull))
+#define CVMX_PEXP_SLI_LAST_WIN_RDATA2 (CVMX_ADD_IO_SEG(0x00011F00000106C0ull))
+#define CVMX_PEXP_SLI_LAST_WIN_RDATA3 (CVMX_ADD_IO_SEG(0x00011F00000106D0ull))
 #define CVMX_PEXP_SLI_MAC_CREDIT_CNT (CVMX_ADD_IO_SEG(0x00011F0000013D70ull))
+#define CVMX_PEXP_SLI_MAC_CREDIT_CNT2 (CVMX_ADD_IO_SEG(0x00011F0000013E10ull))
 #define CVMX_PEXP_SLI_MEM_ACCESS_CTL (CVMX_ADD_IO_SEG(0x00011F00000102F0ull))
 #define CVMX_PEXP_SLI_MEM_ACCESS_SUBIDX(offset) (CVMX_ADD_IO_SEG(0x00011F00000100E0ull) + ((offset) & 31) * 16 - 16*12)
 #define CVMX_PEXP_SLI_MSI_ENB0 (CVMX_ADD_IO_SEG(0x00011F0000013C50ull))
 #define CVMX_PEXP_SLI_PKT_IPTR (CVMX_ADD_IO_SEG(0x00011F0000011070ull))
 #define CVMX_PEXP_SLI_PKT_OUTPUT_WMARK (CVMX_ADD_IO_SEG(0x00011F0000011180ull))
 #define CVMX_PEXP_SLI_PKT_OUT_BMODE (CVMX_ADD_IO_SEG(0x00011F00000110D0ull))
+#define CVMX_PEXP_SLI_PKT_OUT_BP_EN (CVMX_ADD_IO_SEG(0x00011F0000011240ull))
 #define CVMX_PEXP_SLI_PKT_OUT_ENB (CVMX_ADD_IO_SEG(0x00011F0000011010ull))
 #define CVMX_PEXP_SLI_PKT_PCIE_PORT (CVMX_ADD_IO_SEG(0x00011F00000110E0ull))
 #define CVMX_PEXP_SLI_PKT_PORT_IN_RST (CVMX_ADD_IO_SEG(0x00011F00000111F0ull))
 #define CVMX_PEXP_SLI_PKT_SLIST_ROR (CVMX_ADD_IO_SEG(0x00011F0000011030ull))
 #define CVMX_PEXP_SLI_PKT_TIME_INT (CVMX_ADD_IO_SEG(0x00011F0000011140ull))
 #define CVMX_PEXP_SLI_PKT_TIME_INT_ENB (CVMX_ADD_IO_SEG(0x00011F0000011160ull))
-#define CVMX_PEXP_SLI_S2M_PORTX_CTL(offset) (CVMX_ADD_IO_SEG(0x00011F0000013D80ull) + ((offset) & 1) * 16)
+#define CVMX_PEXP_SLI_PORTX_PKIND(offset) (CVMX_ADD_IO_SEG(0x00011F0000010800ull) + ((offset) & 31) * 16)
+#define CVMX_PEXP_SLI_S2M_PORTX_CTL(offset) (CVMX_ADD_IO_SEG(0x00011F0000013D80ull) + ((offset) & 3) * 16)
 #define CVMX_PEXP_SLI_SCRATCH_1 (CVMX_ADD_IO_SEG(0x00011F00000103C0ull))
 #define CVMX_PEXP_SLI_SCRATCH_2 (CVMX_ADD_IO_SEG(0x00011F00000103D0ull))
 #define CVMX_PEXP_SLI_STATE1 (CVMX_ADD_IO_SEG(0x00011F0000010620ull))
 #define CVMX_PEXP_SLI_STATE2 (CVMX_ADD_IO_SEG(0x00011F0000010630ull))
 #define CVMX_PEXP_SLI_STATE3 (CVMX_ADD_IO_SEG(0x00011F0000010640ull))
+#define CVMX_PEXP_SLI_TX_PIPE (CVMX_ADD_IO_SEG(0x00011F0000011230ull))
 #define CVMX_PEXP_SLI_WINDOW_CTL (CVMX_ADD_IO_SEG(0x00011F00000102E0ull))
 
 #endif
diff --git a/arch/mips/include/asm/octeon/cvmx-pip-defs.h b/arch/mips/include/asm/octeon/cvmx-pip-defs.h
new file mode 100644 (file)
index 0000000..5a36910
--- /dev/null
@@ -0,0 +1,1267 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+#ifndef __CVMX_PIP_DEFS_H__
+#define __CVMX_PIP_DEFS_H__
+
+/*
+ * Enumeration representing the amount of packet processing
+ * and validation performed by the input hardware.
+ */
+enum cvmx_pip_port_parse_mode {
+       /*
+        * Packet input doesn't perform any processing of the input
+        * packet.
+        */
+       CVMX_PIP_PORT_CFG_MODE_NONE = 0ull,
+       /*
+        * Full packet processing is performed with pointer starting
+        * at the L2 (ethernet MAC) header.
+        */
+       CVMX_PIP_PORT_CFG_MODE_SKIPL2 = 1ull,
+       /*
+        * Input packets are assumed to be IP.  Results from non IP
+        * packets is undefined. Pointers reference the beginning of
+        * the IP header.
+        */
+       CVMX_PIP_PORT_CFG_MODE_SKIPIP = 2ull
+};
+
+#define CVMX_PIP_BCK_PRS \
+        CVMX_ADD_IO_SEG(0x00011800A0000038ull)
+#define CVMX_PIP_BIST_STATUS \
+        CVMX_ADD_IO_SEG(0x00011800A0000000ull)
+#define CVMX_PIP_CRC_CTLX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0000040ull + (((offset) & 1) * 8))
+#define CVMX_PIP_CRC_IVX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0000050ull + (((offset) & 1) * 8))
+#define CVMX_PIP_DEC_IPSECX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0000080ull + (((offset) & 3) * 8))
+#define CVMX_PIP_DSA_SRC_GRP \
+        CVMX_ADD_IO_SEG(0x00011800A0000190ull)
+#define CVMX_PIP_DSA_VID_GRP \
+        CVMX_ADD_IO_SEG(0x00011800A0000198ull)
+#define CVMX_PIP_FRM_LEN_CHKX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0000180ull + (((offset) & 1) * 8))
+#define CVMX_PIP_GBL_CFG \
+        CVMX_ADD_IO_SEG(0x00011800A0000028ull)
+#define CVMX_PIP_GBL_CTL \
+        CVMX_ADD_IO_SEG(0x00011800A0000020ull)
+#define CVMX_PIP_HG_PRI_QOS \
+        CVMX_ADD_IO_SEG(0x00011800A00001A0ull)
+#define CVMX_PIP_INT_EN \
+        CVMX_ADD_IO_SEG(0x00011800A0000010ull)
+#define CVMX_PIP_INT_REG \
+        CVMX_ADD_IO_SEG(0x00011800A0000008ull)
+#define CVMX_PIP_IP_OFFSET \
+        CVMX_ADD_IO_SEG(0x00011800A0000060ull)
+#define CVMX_PIP_PRT_CFGX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0000200ull + (((offset) & 63) * 8))
+#define CVMX_PIP_PRT_TAGX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0000400ull + (((offset) & 63) * 8))
+#define CVMX_PIP_QOS_DIFFX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0000600ull + (((offset) & 63) * 8))
+#define CVMX_PIP_QOS_VLANX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A00000C0ull + (((offset) & 7) * 8))
+#define CVMX_PIP_QOS_WATCHX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0000100ull + (((offset) & 7) * 8))
+#define CVMX_PIP_RAW_WORD \
+        CVMX_ADD_IO_SEG(0x00011800A00000B0ull)
+#define CVMX_PIP_SFT_RST \
+        CVMX_ADD_IO_SEG(0x00011800A0000030ull)
+#define CVMX_PIP_STAT0_PRTX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0000800ull + (((offset) & 63) * 80))
+#define CVMX_PIP_STAT1_PRTX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0000808ull + (((offset) & 63) * 80))
+#define CVMX_PIP_STAT2_PRTX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0000810ull + (((offset) & 63) * 80))
+#define CVMX_PIP_STAT3_PRTX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0000818ull + (((offset) & 63) * 80))
+#define CVMX_PIP_STAT4_PRTX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0000820ull + (((offset) & 63) * 80))
+#define CVMX_PIP_STAT5_PRTX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0000828ull + (((offset) & 63) * 80))
+#define CVMX_PIP_STAT6_PRTX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0000830ull + (((offset) & 63) * 80))
+#define CVMX_PIP_STAT7_PRTX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0000838ull + (((offset) & 63) * 80))
+#define CVMX_PIP_STAT8_PRTX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0000840ull + (((offset) & 63) * 80))
+#define CVMX_PIP_STAT9_PRTX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0000848ull + (((offset) & 63) * 80))
+#define CVMX_PIP_STAT_CTL \
+        CVMX_ADD_IO_SEG(0x00011800A0000018ull)
+#define CVMX_PIP_STAT_INB_ERRSX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0001A10ull + (((offset) & 63) * 32))
+#define CVMX_PIP_STAT_INB_OCTSX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0001A08ull + (((offset) & 63) * 32))
+#define CVMX_PIP_STAT_INB_PKTSX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0001A00ull + (((offset) & 63) * 32))
+#define CVMX_PIP_TAG_INCX(offset) \
+        CVMX_ADD_IO_SEG(0x00011800A0001800ull + (((offset) & 63) * 8))
+#define CVMX_PIP_TAG_MASK \
+        CVMX_ADD_IO_SEG(0x00011800A0000070ull)
+#define CVMX_PIP_TAG_SECRET \
+        CVMX_ADD_IO_SEG(0x00011800A0000068ull)
+#define CVMX_PIP_TODO_ENTRY \
+        CVMX_ADD_IO_SEG(0x00011800A0000078ull)
+
+union cvmx_pip_bck_prs {
+       uint64_t u64;
+       struct cvmx_pip_bck_prs_s {
+               uint64_t bckprs:1;
+               uint64_t reserved_13_62:50;
+               uint64_t hiwater:5;
+               uint64_t reserved_5_7:3;
+               uint64_t 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;
+};
+
+union cvmx_pip_bist_status {
+       uint64_t u64;
+       struct cvmx_pip_bist_status_s {
+               uint64_t reserved_18_63:46;
+               uint64_t bist:18;
+       } s;
+       struct cvmx_pip_bist_status_s cn30xx;
+       struct cvmx_pip_bist_status_s cn31xx;
+       struct cvmx_pip_bist_status_s cn38xx;
+       struct cvmx_pip_bist_status_s cn38xxp2;
+       struct cvmx_pip_bist_status_cn50xx {
+               uint64_t reserved_17_63:47;
+               uint64_t bist:17;
+       } cn50xx;
+       struct cvmx_pip_bist_status_s cn52xx;
+       struct cvmx_pip_bist_status_s cn52xxp1;
+       struct cvmx_pip_bist_status_s cn56xx;
+       struct cvmx_pip_bist_status_s cn56xxp1;
+       struct cvmx_pip_bist_status_s cn58xx;
+       struct cvmx_pip_bist_status_s cn58xxp1;
+};
+
+union cvmx_pip_crc_ctlx {
+       uint64_t u64;
+       struct cvmx_pip_crc_ctlx_s {
+               uint64_t reserved_2_63:62;
+               uint64_t invres:1;
+               uint64_t 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;
+};
+
+union cvmx_pip_crc_ivx {
+       uint64_t u64;
+       struct cvmx_pip_crc_ivx_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_pip_dec_ipsecx {
+       uint64_t u64;
+       struct cvmx_pip_dec_ipsecx_s {
+               uint64_t reserved_18_63:46;
+               uint64_t tcp:1;
+               uint64_t udp:1;
+               uint64_t 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;
+};
+
+union cvmx_pip_dsa_src_grp {
+       uint64_t u64;
+       struct cvmx_pip_dsa_src_grp_s {
+               uint64_t map15:4;
+               uint64_t map14:4;
+               uint64_t map13:4;
+               uint64_t map12:4;
+               uint64_t map11:4;
+               uint64_t map10:4;
+               uint64_t map9:4;
+               uint64_t map8:4;
+               uint64_t map7:4;
+               uint64_t map6:4;
+               uint64_t map5:4;
+               uint64_t map4:4;
+               uint64_t map3:4;
+               uint64_t map2:4;
+               uint64_t map1:4;
+               uint64_t 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;
+};
+
+union cvmx_pip_dsa_vid_grp {
+       uint64_t u64;
+       struct cvmx_pip_dsa_vid_grp_s {
+               uint64_t map15:4;
+               uint64_t map14:4;
+               uint64_t map13:4;
+               uint64_t map12:4;
+               uint64_t map11:4;
+               uint64_t map10:4;
+               uint64_t map9:4;
+               uint64_t map8:4;
+               uint64_t map7:4;
+               uint64_t map6:4;
+               uint64_t map5:4;
+               uint64_t map4:4;
+               uint64_t map3:4;
+               uint64_t map2:4;
+               uint64_t map1:4;
+               uint64_t 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;
+};
+
+union cvmx_pip_frm_len_chkx {
+       uint64_t u64;
+       struct cvmx_pip_frm_len_chkx_s {
+               uint64_t reserved_32_63:32;
+               uint64_t maxlen:16;
+               uint64_t 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;
+};
+
+union cvmx_pip_gbl_cfg {
+       uint64_t u64;
+       struct cvmx_pip_gbl_cfg_s {
+               uint64_t reserved_19_63:45;
+               uint64_t tag_syn:1;
+               uint64_t ip6_udp:1;
+               uint64_t max_l2:1;
+               uint64_t reserved_11_15:5;
+               uint64_t raw_shf:3;
+               uint64_t reserved_3_7:5;
+               uint64_t 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;
+};
+
+union cvmx_pip_gbl_ctl {
+       uint64_t u64;
+       struct cvmx_pip_gbl_ctl_s {
+               uint64_t reserved_27_63:37;
+               uint64_t dsa_grp_tvid:1;
+               uint64_t dsa_grp_scmd:1;
+               uint64_t dsa_grp_sid:1;
+               uint64_t reserved_21_23:3;
+               uint64_t ring_en:1;
+               uint64_t reserved_17_19:3;
+               uint64_t ignrs:1;
+               uint64_t vs_wqe:1;
+               uint64_t vs_qos:1;
+               uint64_t l2_mal:1;
+               uint64_t tcp_flag:1;
+               uint64_t l4_len:1;
+               uint64_t l4_chk:1;
+               uint64_t l4_prt:1;
+               uint64_t l4_mal:1;
+               uint64_t reserved_6_7:2;
+               uint64_t ip6_eext:2;
+               uint64_t ip4_opts:1;
+               uint64_t ip_hop:1;
+               uint64_t ip_mal:1;
+               uint64_t ip_chk:1;
+       } s;
+       struct cvmx_pip_gbl_ctl_cn30xx {
+               uint64_t reserved_17_63:47;
+               uint64_t ignrs:1;
+               uint64_t vs_wqe:1;
+               uint64_t vs_qos:1;
+               uint64_t l2_mal:1;
+               uint64_t tcp_flag:1;
+               uint64_t l4_len:1;
+               uint64_t l4_chk:1;
+               uint64_t l4_prt:1;
+               uint64_t l4_mal:1;
+               uint64_t reserved_6_7:2;
+               uint64_t ip6_eext:2;
+               uint64_t ip4_opts:1;
+               uint64_t ip_hop:1;
+               uint64_t ip_mal:1;
+               uint64_t 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_s cn52xx;
+       struct cvmx_pip_gbl_ctl_s cn52xxp1;
+       struct cvmx_pip_gbl_ctl_s cn56xx;
+       struct cvmx_pip_gbl_ctl_cn56xxp1 {
+               uint64_t reserved_21_63:43;
+               uint64_t ring_en:1;
+               uint64_t reserved_17_19:3;
+               uint64_t ignrs:1;
+               uint64_t vs_wqe:1;
+               uint64_t vs_qos:1;
+               uint64_t l2_mal:1;
+               uint64_t tcp_flag:1;
+               uint64_t l4_len:1;
+               uint64_t l4_chk:1;
+               uint64_t l4_prt:1;
+               uint64_t l4_mal:1;
+               uint64_t reserved_6_7:2;
+               uint64_t ip6_eext:2;
+               uint64_t ip4_opts:1;
+               uint64_t ip_hop:1;
+               uint64_t ip_mal:1;
+               uint64_t ip_chk:1;
+       } cn56xxp1;
+       struct cvmx_pip_gbl_ctl_cn30xx cn58xx;
+       struct cvmx_pip_gbl_ctl_cn30xx cn58xxp1;
+};
+
+union cvmx_pip_hg_pri_qos {
+       uint64_t u64;
+       struct cvmx_pip_hg_pri_qos_s {
+               uint64_t reserved_11_63:53;
+               uint64_t qos:3;
+               uint64_t reserved_6_7:2;
+               uint64_t 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;
+};
+
+union cvmx_pip_int_en {
+       uint64_t u64;
+       struct cvmx_pip_int_en_s {
+               uint64_t reserved_13_63:51;
+               uint64_t punyerr:1;
+               uint64_t lenerr:1;
+               uint64_t maxerr:1;
+               uint64_t minerr:1;
+               uint64_t beperr:1;
+               uint64_t feperr:1;
+               uint64_t todoovr:1;
+               uint64_t skprunt:1;
+               uint64_t badtag:1;
+               uint64_t prtnxa:1;
+               uint64_t bckprs:1;
+               uint64_t crcerr:1;
+               uint64_t pktdrp:1;
+       } s;
+       struct cvmx_pip_int_en_cn30xx {
+               uint64_t reserved_9_63:55;
+               uint64_t beperr:1;
+               uint64_t feperr:1;
+               uint64_t todoovr:1;
+               uint64_t skprunt:1;
+               uint64_t badtag:1;
+               uint64_t prtnxa:1;
+               uint64_t bckprs:1;
+               uint64_t crcerr:1;
+               uint64_t 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 {
+               uint64_t reserved_12_63:52;
+               uint64_t lenerr:1;
+               uint64_t maxerr:1;
+               uint64_t minerr:1;
+               uint64_t beperr:1;
+               uint64_t feperr:1;
+               uint64_t todoovr:1;
+               uint64_t skprunt:1;
+               uint64_t badtag:1;
+               uint64_t prtnxa:1;
+               uint64_t bckprs:1;
+               uint64_t reserved_1_1:1;
+               uint64_t pktdrp:1;
+       } cn50xx;
+       struct cvmx_pip_int_en_cn52xx {
+               uint64_t reserved_13_63:51;
+               uint64_t punyerr:1;
+               uint64_t lenerr:1;
+               uint64_t maxerr:1;
+               uint64_t minerr:1;
+               uint64_t beperr:1;
+               uint64_t feperr:1;
+               uint64_t todoovr:1;
+               uint64_t skprunt:1;
+               uint64_t badtag:1;
+               uint64_t prtnxa:1;
+               uint64_t bckprs:1;
+               uint64_t reserved_1_1:1;
+               uint64_t pktdrp:1;
+       } cn52xx;
+       struct cvmx_pip_int_en_cn52xx cn52xxp1;
+       struct cvmx_pip_int_en_s cn56xx;
+       struct cvmx_pip_int_en_cn56xxp1 {
+               uint64_t reserved_12_63:52;
+               uint64_t lenerr:1;
+               uint64_t maxerr:1;
+               uint64_t minerr:1;
+               uint64_t beperr:1;
+               uint64_t feperr:1;
+               uint64_t todoovr:1;
+               uint64_t skprunt:1;
+               uint64_t badtag:1;
+               uint64_t prtnxa:1;
+               uint64_t bckprs:1;
+               uint64_t crcerr:1;
+               uint64_t pktdrp:1;
+       } cn56xxp1;
+       struct cvmx_pip_int_en_cn58xx {
+               uint64_t reserved_13_63:51;
+               uint64_t punyerr:1;
+               uint64_t reserved_9_11:3;
+               uint64_t beperr:1;
+               uint64_t feperr:1;
+               uint64_t todoovr:1;
+               uint64_t skprunt:1;
+               uint64_t badtag:1;
+               uint64_t prtnxa:1;
+               uint64_t bckprs:1;
+               uint64_t crcerr:1;
+               uint64_t pktdrp:1;
+       } cn58xx;
+       struct cvmx_pip_int_en_cn30xx cn58xxp1;
+};
+
+union cvmx_pip_int_reg {
+       uint64_t u64;
+       struct cvmx_pip_int_reg_s {
+               uint64_t reserved_13_63:51;
+               uint64_t punyerr:1;
+               uint64_t lenerr:1;
+               uint64_t maxerr:1;
+               uint64_t minerr:1;
+               uint64_t beperr:1;
+               uint64_t feperr:1;
+               uint64_t todoovr:1;
+               uint64_t skprunt:1;
+               uint64_t badtag:1;
+               uint64_t prtnxa:1;
+               uint64_t bckprs:1;
+               uint64_t crcerr:1;
+               uint64_t pktdrp:1;
+       } s;
+       struct cvmx_pip_int_reg_cn30xx {
+               uint64_t reserved_9_63:55;
+               uint64_t beperr:1;
+               uint64_t feperr:1;
+               uint64_t todoovr:1;
+               uint64_t skprunt:1;
+               uint64_t badtag:1;
+               uint64_t prtnxa:1;
+               uint64_t bckprs:1;
+               uint64_t crcerr:1;
+               uint64_t 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 {
+               uint64_t reserved_12_63:52;
+               uint64_t lenerr:1;
+               uint64_t maxerr:1;
+               uint64_t minerr:1;
+               uint64_t beperr:1;
+               uint64_t feperr:1;
+               uint64_t todoovr:1;
+               uint64_t skprunt:1;
+               uint64_t badtag:1;
+               uint64_t prtnxa:1;
+               uint64_t bckprs:1;
+               uint64_t reserved_1_1:1;
+               uint64_t pktdrp:1;
+       } cn50xx;
+       struct cvmx_pip_int_reg_cn52xx {
+               uint64_t reserved_13_63:51;
+               uint64_t punyerr:1;
+               uint64_t lenerr:1;
+               uint64_t maxerr:1;
+               uint64_t minerr:1;
+               uint64_t beperr:1;
+               uint64_t feperr:1;
+               uint64_t todoovr:1;
+               uint64_t skprunt:1;
+               uint64_t badtag:1;
+               uint64_t prtnxa:1;
+               uint64_t bckprs:1;
+               uint64_t reserved_1_1:1;
+               uint64_t pktdrp:1;
+       } cn52xx;
+       struct cvmx_pip_int_reg_cn52xx cn52xxp1;
+       struct cvmx_pip_int_reg_s cn56xx;
+       struct cvmx_pip_int_reg_cn56xxp1 {
+               uint64_t reserved_12_63:52;
+               uint64_t lenerr:1;
+               uint64_t maxerr:1;
+               uint64_t minerr:1;
+               uint64_t beperr:1;
+               uint64_t feperr:1;
+               uint64_t todoovr:1;
+               uint64_t skprunt:1;
+               uint64_t badtag:1;
+               uint64_t prtnxa:1;
+               uint64_t bckprs:1;
+               uint64_t crcerr:1;
+               uint64_t pktdrp:1;
+       } cn56xxp1;
+       struct cvmx_pip_int_reg_cn58xx {
+               uint64_t reserved_13_63:51;
+               uint64_t punyerr:1;
+               uint64_t reserved_9_11:3;
+               uint64_t beperr:1;
+               uint64_t feperr:1;
+               uint64_t todoovr:1;
+               uint64_t skprunt:1;
+               uint64_t badtag:1;
+               uint64_t prtnxa:1;
+               uint64_t bckprs:1;
+               uint64_t crcerr:1;
+               uint64_t pktdrp:1;
+       } cn58xx;
+       struct cvmx_pip_int_reg_cn30xx cn58xxp1;
+};
+
+union cvmx_pip_ip_offset {
+       uint64_t u64;
+       struct cvmx_pip_ip_offset_s {
+               uint64_t reserved_3_63:61;
+               uint64_t 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;
+};
+
+union cvmx_pip_prt_cfgx {
+       uint64_t u64;
+       struct cvmx_pip_prt_cfgx_s {
+               uint64_t reserved_53_63:11;
+               uint64_t pad_len:1;
+               uint64_t vlan_len:1;
+               uint64_t lenerr_en:1;
+               uint64_t maxerr_en:1;
+               uint64_t minerr_en:1;
+               uint64_t grp_wat_47:4;
+               uint64_t qos_wat_47:4;
+               uint64_t reserved_37_39:3;
+               uint64_t rawdrp:1;
+               uint64_t tag_inc:2;
+               uint64_t dyn_rs:1;
+               uint64_t inst_hdr:1;
+               uint64_t grp_wat:4;
+               uint64_t hg_qos:1;
+               uint64_t qos:3;
+               uint64_t qos_wat:4;
+               uint64_t qos_vsel:1;
+               uint64_t qos_vod:1;
+               uint64_t qos_diff:1;
+               uint64_t qos_vlan:1;
+               uint64_t reserved_13_15:3;
+               uint64_t crc_en:1;
+               uint64_t higig_en:1;
+               uint64_t dsa_en:1;
+               uint64_t mode:2;
+               uint64_t reserved_7_7:1;
+               uint64_t skip:7;
+       } s;
+       struct cvmx_pip_prt_cfgx_cn30xx {
+               uint64_t reserved_37_63:27;
+               uint64_t rawdrp:1;
+               uint64_t tag_inc:2;
+               uint64_t dyn_rs:1;
+               uint64_t inst_hdr:1;
+               uint64_t grp_wat:4;
+               uint64_t reserved_27_27:1;
+               uint64_t qos:3;
+               uint64_t qos_wat:4;
+               uint64_t reserved_18_19:2;
+               uint64_t qos_diff:1;
+               uint64_t qos_vlan:1;
+               uint64_t reserved_10_15:6;
+               uint64_t mode:2;
+               uint64_t reserved_7_7:1;
+               uint64_t skip:7;
+       } cn30xx;
+       struct cvmx_pip_prt_cfgx_cn30xx cn31xx;
+       struct cvmx_pip_prt_cfgx_cn38xx {
+               uint64_t reserved_37_63:27;
+               uint64_t rawdrp:1;
+               uint64_t tag_inc:2;
+               uint64_t dyn_rs:1;
+               uint64_t inst_hdr:1;
+               uint64_t grp_wat:4;
+               uint64_t reserved_27_27:1;
+               uint64_t qos:3;
+               uint64_t qos_wat:4;
+               uint64_t reserved_18_19:2;
+               uint64_t qos_diff:1;
+               uint64_t qos_vlan:1;
+               uint64_t reserved_13_15:3;
+               uint64_t crc_en:1;
+               uint64_t reserved_10_11:2;
+               uint64_t mode:2;
+               uint64_t reserved_7_7:1;
+               uint64_t skip:7;
+       } cn38xx;
+       struct cvmx_pip_prt_cfgx_cn38xx cn38xxp2;
+       struct cvmx_pip_prt_cfgx_cn50xx {
+               uint64_t reserved_53_63:11;
+               uint64_t pad_len:1;
+               uint64_t vlan_len:1;
+               uint64_t lenerr_en:1;
+               uint64_t maxerr_en:1;
+               uint64_t minerr_en:1;
+               uint64_t grp_wat_47:4;
+               uint64_t qos_wat_47:4;
+               uint64_t reserved_37_39:3;
+               uint64_t rawdrp:1;
+               uint64_t tag_inc:2;
+               uint64_t dyn_rs:1;
+               uint64_t inst_hdr:1;
+               uint64_t grp_wat:4;
+               uint64_t reserved_27_27:1;
+               uint64_t qos:3;
+               uint64_t qos_wat:4;
+               uint64_t reserved_19_19:1;
+               uint64_t qos_vod:1;
+               uint64_t qos_diff:1;
+               uint64_t qos_vlan:1;
+               uint64_t reserved_13_15:3;
+               uint64_t crc_en:1;
+               uint64_t reserved_10_11:2;
+               uint64_t mode:2;
+               uint64_t reserved_7_7:1;
+               uint64_t skip:7;
+       } cn50xx;
+       struct cvmx_pip_prt_cfgx_s cn52xx;
+       struct cvmx_pip_prt_cfgx_s cn52xxp1;
+       struct cvmx_pip_prt_cfgx_s cn56xx;
+       struct cvmx_pip_prt_cfgx_cn50xx cn56xxp1;
+       struct cvmx_pip_prt_cfgx_cn58xx {
+               uint64_t reserved_37_63:27;
+               uint64_t rawdrp:1;
+               uint64_t tag_inc:2;
+               uint64_t dyn_rs:1;
+               uint64_t inst_hdr:1;
+               uint64_t grp_wat:4;
+               uint64_t reserved_27_27:1;
+               uint64_t qos:3;
+               uint64_t qos_wat:4;
+               uint64_t reserved_19_19:1;
+               uint64_t qos_vod:1;
+               uint64_t qos_diff:1;
+               uint64_t qos_vlan:1;
+               uint64_t reserved_13_15:3;
+               uint64_t crc_en:1;
+               uint64_t reserved_10_11:2;
+               uint64_t mode:2;
+               uint64_t reserved_7_7:1;
+               uint64_t skip:7;
+       } cn58xx;
+       struct cvmx_pip_prt_cfgx_cn58xx cn58xxp1;
+};
+
+union cvmx_pip_prt_tagx {
+       uint64_t u64;
+       struct cvmx_pip_prt_tagx_s {
+               uint64_t reserved_40_63:24;
+               uint64_t grptagbase:4;
+               uint64_t grptagmask:4;
+               uint64_t grptag:1;
+               uint64_t grptag_mskip:1;
+               uint64_t tag_mode:2;
+               uint64_t inc_vs:2;
+               uint64_t inc_vlan:1;
+               uint64_t inc_prt_flag:1;
+               uint64_t ip6_dprt_flag:1;
+               uint64_t ip4_dprt_flag:1;
+               uint64_t ip6_sprt_flag:1;
+               uint64_t ip4_sprt_flag:1;
+               uint64_t ip6_nxth_flag:1;
+               uint64_t ip4_pctl_flag:1;
+               uint64_t ip6_dst_flag:1;
+               uint64_t ip4_dst_flag:1;
+               uint64_t ip6_src_flag:1;
+               uint64_t ip4_src_flag:1;
+               uint64_t tcp6_tag_type:2;
+               uint64_t tcp4_tag_type:2;
+               uint64_t ip6_tag_type:2;
+               uint64_t ip4_tag_type:2;
+               uint64_t non_tag_type:2;
+               uint64_t grp:4;
+       } s;
+       struct cvmx_pip_prt_tagx_cn30xx {
+               uint64_t reserved_40_63:24;
+               uint64_t grptagbase:4;
+               uint64_t grptagmask:4;
+               uint64_t grptag:1;
+               uint64_t reserved_30_30:1;
+               uint64_t tag_mode:2;
+               uint64_t inc_vs:2;
+               uint64_t inc_vlan:1;
+               uint64_t inc_prt_flag:1;
+               uint64_t ip6_dprt_flag:1;
+               uint64_t ip4_dprt_flag:1;
+               uint64_t ip6_sprt_flag:1;
+               uint64_t ip4_sprt_flag:1;
+               uint64_t ip6_nxth_flag:1;
+               uint64_t ip4_pctl_flag:1;
+               uint64_t ip6_dst_flag:1;
+               uint64_t ip4_dst_flag:1;
+               uint64_t ip6_src_flag:1;
+               uint64_t ip4_src_flag:1;
+               uint64_t tcp6_tag_type:2;
+               uint64_t tcp4_tag_type:2;
+               uint64_t ip6_tag_type:2;
+               uint64_t ip4_tag_type:2;
+               uint64_t non_tag_type:2;
+               uint64_t 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_s cn50xx;
+       struct cvmx_pip_prt_tagx_s cn52xx;
+       struct cvmx_pip_prt_tagx_s cn52xxp1;
+       struct cvmx_pip_prt_tagx_s cn56xx;
+       struct cvmx_pip_prt_tagx_s cn56xxp1;
+       struct cvmx_pip_prt_tagx_cn30xx cn58xx;
+       struct cvmx_pip_prt_tagx_cn30xx cn58xxp1;
+};
+
+union cvmx_pip_qos_diffx {
+       uint64_t u64;
+       struct cvmx_pip_qos_diffx_s {
+               uint64_t reserved_3_63:61;
+               uint64_t 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;
+};
+
+union cvmx_pip_qos_vlanx {
+       uint64_t u64;
+       struct cvmx_pip_qos_vlanx_s {
+               uint64_t reserved_7_63:57;
+               uint64_t qos1:3;
+               uint64_t reserved_3_3:1;
+               uint64_t qos:3;
+       } s;
+       struct cvmx_pip_qos_vlanx_cn30xx {
+               uint64_t reserved_3_63:61;
+               uint64_t 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;
+};
+
+union cvmx_pip_qos_watchx {
+       uint64_t u64;
+       struct cvmx_pip_qos_watchx_s {
+               uint64_t reserved_48_63:16;
+               uint64_t mask:16;
+               uint64_t reserved_28_31:4;
+               uint64_t grp:4;
+               uint64_t reserved_23_23:1;
+               uint64_t qos:3;
+               uint64_t reserved_19_19:1;
+               uint64_t match_type:3;
+               uint64_t match_value:16;
+       } s;
+       struct cvmx_pip_qos_watchx_cn30xx {
+               uint64_t reserved_48_63:16;
+               uint64_t mask:16;
+               uint64_t reserved_28_31:4;
+               uint64_t grp:4;
+               uint64_t reserved_23_23:1;
+               uint64_t qos:3;
+               uint64_t reserved_18_19:2;
+               uint64_t match_type:2;
+               uint64_t 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_s cn50xx;
+       struct cvmx_pip_qos_watchx_s cn52xx;
+       struct cvmx_pip_qos_watchx_s cn52xxp1;
+       struct cvmx_pip_qos_watchx_s cn56xx;
+       struct cvmx_pip_qos_watchx_s cn56xxp1;
+       struct cvmx_pip_qos_watchx_cn30xx cn58xx;
+       struct cvmx_pip_qos_watchx_cn30xx cn58xxp1;
+};
+
+union cvmx_pip_raw_word {
+       uint64_t u64;
+       struct cvmx_pip_raw_word_s {
+               uint64_t reserved_56_63:8;
+               uint64_t 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;
+};
+
+union cvmx_pip_sft_rst {
+       uint64_t u64;
+       struct cvmx_pip_sft_rst_s {
+               uint64_t reserved_1_63:63;
+               uint64_t 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;
+};
+
+union cvmx_pip_stat0_prtx {
+       uint64_t u64;
+       struct cvmx_pip_stat0_prtx_s {
+               uint64_t drp_pkts:32;
+               uint64_t 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;
+};
+
+union cvmx_pip_stat1_prtx {
+       uint64_t u64;
+       struct cvmx_pip_stat1_prtx_s {
+               uint64_t reserved_48_63:16;
+               uint64_t 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;
+};
+
+union cvmx_pip_stat2_prtx {
+       uint64_t u64;
+       struct cvmx_pip_stat2_prtx_s {
+               uint64_t pkts:32;
+               uint64_t 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;
+};
+
+union cvmx_pip_stat3_prtx {
+       uint64_t u64;
+       struct cvmx_pip_stat3_prtx_s {
+               uint64_t bcst:32;
+               uint64_t 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;
+};
+
+union cvmx_pip_stat4_prtx {
+       uint64_t u64;
+       struct cvmx_pip_stat4_prtx_s {
+               uint64_t h65to127:32;
+               uint64_t 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;
+};
+
+union cvmx_pip_stat5_prtx {
+       uint64_t u64;
+       struct cvmx_pip_stat5_prtx_s {
+               uint64_t h256to511:32;
+               uint64_t 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;
+};
+
+union cvmx_pip_stat6_prtx {
+       uint64_t u64;
+       struct cvmx_pip_stat6_prtx_s {
+               uint64_t h1024to1518:32;
+               uint64_t 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;
+};
+
+union cvmx_pip_stat7_prtx {
+       uint64_t u64;
+       struct cvmx_pip_stat7_prtx_s {
+               uint64_t fcs:32;
+               uint64_t 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;
+};
+
+union cvmx_pip_stat8_prtx {
+       uint64_t u64;
+       struct cvmx_pip_stat8_prtx_s {
+               uint64_t frag:32;
+               uint64_t 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;
+};
+
+union cvmx_pip_stat9_prtx {
+       uint64_t u64;
+       struct cvmx_pip_stat9_prtx_s {
+               uint64_t jabber:32;
+               uint64_t 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;
+};
+
+union cvmx_pip_stat_ctl {
+       uint64_t u64;
+       struct cvmx_pip_stat_ctl_s {
+               uint64_t reserved_1_63:63;
+               uint64_t rdclr:1;
+       } s;
+       struct cvmx_pip_stat_ctl_s cn30xx;
+       struct cvmx_pip_stat_ctl_s cn31xx;
+       struct cvmx_pip_stat_ctl_s cn38xx;
+       struct cvmx_pip_stat_ctl_s cn38xxp2;
+       struct cvmx_pip_stat_ctl_s cn50xx;
+       struct cvmx_pip_stat_ctl_s cn52xx;
+       struct cvmx_pip_stat_ctl_s cn52xxp1;
+       struct cvmx_pip_stat_ctl_s cn56xx;
+       struct cvmx_pip_stat_ctl_s cn56xxp1;
+       struct cvmx_pip_stat_ctl_s cn58xx;
+       struct cvmx_pip_stat_ctl_s cn58xxp1;
+};
+
+union cvmx_pip_stat_inb_errsx {
+       uint64_t u64;
+       struct cvmx_pip_stat_inb_errsx_s {
+               uint64_t reserved_16_63:48;
+               uint64_t 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;
+};
+
+union cvmx_pip_stat_inb_octsx {
+       uint64_t u64;
+       struct cvmx_pip_stat_inb_octsx_s {
+               uint64_t reserved_48_63:16;
+               uint64_t 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;
+};
+
+union cvmx_pip_stat_inb_pktsx {
+       uint64_t u64;
+       struct cvmx_pip_stat_inb_pktsx_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_pip_tag_incx {
+       uint64_t u64;
+       struct cvmx_pip_tag_incx_s {
+               uint64_t reserved_8_63:56;
+               uint64_t 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;
+};
+
+union cvmx_pip_tag_mask {
+       uint64_t u64;
+       struct cvmx_pip_tag_mask_s {
+               uint64_t reserved_16_63:48;
+               uint64_t 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;
+};
+
+union cvmx_pip_tag_secret {
+       uint64_t u64;
+       struct cvmx_pip_tag_secret_s {
+               uint64_t reserved_32_63:32;
+               uint64_t dst:16;
+               uint64_t 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;
+};
+
+union cvmx_pip_todo_entry {
+       uint64_t u64;
+       struct cvmx_pip_todo_entry_s {
+               uint64_t val:1;
+               uint64_t reserved_62_62:1;
+               uint64_t 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;
+};
+
+#endif
diff --git a/arch/mips/include/asm/octeon/cvmx-pip.h b/arch/mips/include/asm/octeon/cvmx-pip.h
new file mode 100644 (file)
index 0000000..78dbce8
--- /dev/null
@@ -0,0 +1,524 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ * Interface to the hardware Packet Input Processing unit.
+ *
+ */
+
+#ifndef __CVMX_PIP_H__
+#define __CVMX_PIP_H__
+
+#include "cvmx-wqe.h"
+#include "cvmx-fpa.h"
+#include "cvmx-pip-defs.h"
+
+#define CVMX_PIP_NUM_INPUT_PORTS                40
+#define CVMX_PIP_NUM_WATCHERS                   4
+
+/*
+ * 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,
+       /* RGM+SPI 1 = partially received packet (buffering/bandwidth
+        * not adequate) */
+       CVMX_PIP_PARTIAL_ERR = 1ull,
+       /* RGM+SPI 2 = receive packet too large and truncated */
+       CVMX_PIP_JABBER_ERR = 2ull,
+       /*
+        * RGM 3 = max frame error (pkt len > max frame len) (with FCS
+        * error)
+        */
+       CVMX_PIP_OVER_FCS_ERR = 3ull,
+       /* RGM+SPI 4 = max frame error (pkt len > max frame len) */
+       CVMX_PIP_OVER_ERR = 4ull,
+       /*
+        * RGM 5 = nibble error (data not byte multiple - 100M and 10M
+        * only)
+        */
+       CVMX_PIP_ALIGN_ERR = 5ull,
+       /*
+        * RGM 6 = min frame error (pkt len < min frame len) (with FCS
+        * error)
+        */
+       CVMX_PIP_UNDER_FCS_ERR = 6ull,
+       /* RGM     7 = FCS error */
+       CVMX_PIP_GMX_FCS_ERR = 7ull,
+       /* RGM+SPI 8 = min frame error (pkt len < min frame len) */
+       CVMX_PIP_UNDER_ERR = 8ull,
+       /* RGM     9 = Frame carrier extend error */
+       CVMX_PIP_EXTEND_ERR = 9ull,
+       /*
+        * RGM 10 = length mismatch (len did not match len in L2
+        * length/type)
+        */
+       CVMX_PIP_LENGTH_ERR = 10ull,
+       /* RGM 11 = Frame error (some or all data bits marked err) */
+       CVMX_PIP_DAT_ERR = 11ull,
+       /*     SPI 11 = DIP4 error */
+       CVMX_PIP_DIP_ERR = 11ull,
+       /*
+        * RGM 12 = packet was not large enough to pass the skipper -
+        * no inspection could occur.
+        */
+       CVMX_PIP_SKIP_ERR = 12ull,
+       /*
+        * RGM 13 = studder error (data not repeated - 100M and 10M
+        * only)
+        */
+       CVMX_PIP_NIBBLE_ERR = 13ull,
+       /* RGM+SPI 16 = FCS error */
+       CVMX_PIP_PIP_FCS = 16L,
+       /*
+        * RGM+SPI+PCI 17 = packet was not large enough to pass the
+        * skipper - no inspection could occur.
+        */
+       CVMX_PIP_PIP_SKIP_ERR = 17L,
+       /*
+        * RGM+SPI+PCI 18 = malformed l2 (packet not long enough to
+        * cover L2 hdr).
+        */
+       CVMX_PIP_PIP_L2_MAL_HDR = 18L
+       /*
+        * 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 {
+       /* Inbound octets marked to be dropped by the IPD */
+       uint32_t dropped_octets;
+       /* Inbound packets marked to be dropped by the IPD */
+       uint32_t dropped_packets;
+       /* RAW PCI Packets received by PIP per port */
+       uint32_t pci_raw_packets;
+       /* Number of octets processed by PIP */
+       uint32_t octets;
+       /* Number of packets processed by PIP */
+       uint32_t packets;
+       /*
+        * Number of indentified L2 multicast packets.  Does not
+        * include broadcast packets.  Only includes packets whose
+        * parse mode is SKIP_TO_L2
+        */
+       uint32_t multicast_packets;
+       /*
+        * Number of indentified L2 broadcast packets.  Does not
+        * include multicast packets.  Only includes packets whose
+        * parse mode is SKIP_TO_L2
+        */
+       uint32_t broadcast_packets;
+       /* Number of 64B packets */
+       uint32_t len_64_packets;
+       /* Number of 65-127B packets */
+       uint32_t len_65_127_packets;
+       /* Number of 128-255B packets */
+       uint32_t len_128_255_packets;
+       /* Number of 256-511B packets */
+       uint32_t len_256_511_packets;
+       /* Number of 512-1023B packets */
+       uint32_t len_512_1023_packets;
+       /* Number of 1024-1518B packets */
+       uint32_t len_1024_1518_packets;
+       /* Number of 1519-max packets */
+       uint32_t len_1519_max_packets;
+       /* Number of packets with FCS or Align opcode errors */
+       uint32_t fcs_align_err_packets;
+       /* Number of packets with length < min */
+       uint32_t runt_packets;
+       /* Number of packets with length < min and FCS error */
+       uint32_t runt_crc_packets;
+       /* Number of packets with length > max */
+       uint32_t oversize_packets;
+       /* Number of packets with length > max and FCS error */
+       uint32_t oversize_crc_packets;
+       /* Number of packets without GMX/SPX/PCI errors received by PIP */
+       uint32_t inb_packets;
+       /*
+        * Total number of octets from all packets received by PIP,
+        * including CRC
+        */
+       uint64_t inb_octets;
+       /* Number of packets with GMX/SPX/PCI errors received by PIP */
+       uint16_t inb_errors;
+} cvmx_pip_port_status_t;
+
+/**
+ * Definition of the PIP custom header that can be prepended
+ * to a packet by external hardware.
+ */
+typedef union {
+       uint64_t u64;
+       struct {
+               /*
+                * Documented as R - Set if the Packet is RAWFULL. If
+                * set, this header must be the full 8 bytes.
+                */
+               uint64_t rawfull:1;
+               /* Must be zero */
+               uint64_t reserved0:5;
+               /* PIP parse mode for this packet */
+               uint64_t parse_mode:2;
+               /* Must be zero */
+               uint64_t reserved1:1;
+               /*
+                * Skip amount, including this header, to the
+                * beginning of the packet
+                */
+               uint64_t skip_len:7;
+               /* Must be zero */
+               uint64_t reserved2:6;
+               /* POW input queue for this packet */
+               uint64_t qos:3;
+               /* POW input group for this packet */
+               uint64_t grp:4;
+               /*
+                * Flag to store this packet in the work queue entry,
+                * if possible
+                */
+               uint64_t rs:1;
+               /* POW input tag type */
+               uint64_t tag_type:2;
+               /* POW input tag */
+               uint64_t tag:32;
+       } s;
+} cvmx_pip_pkt_inst_hdr_t;
+
+/* CSR typedefs have been moved to cvmx-csr-*.h */
+
+/**
+ * Configure an ethernet input port
+ *
+ * @port_num: Port number to configure
+ * @port_cfg: Port hardware configuration
+ * @port_tag_cfg:
+ *                 Port POW tagging configuration
+ */
+static inline void cvmx_pip_config_port(uint64_t port_num,
+                                       union cvmx_pip_prt_cfgx port_cfg,
+                                       union cvmx_pip_prt_tagx port_tag_cfg)
+{
+       cvmx_write_csr(CVMX_PIP_PRT_CFGX(port_num), port_cfg.u64);
+       cvmx_write_csr(CVMX_PIP_PRT_TAGX(port_num), port_tag_cfg.u64);
+}
+#if 0
+/**
+ * @deprecated      This function is a thin wrapper around the Pass1 version
+ *                  of the CVMX_PIP_QOS_WATCHX CSR; Pass2 has added a field for
+ *                  setting the group that is incompatible with this function,
+ *                  the preferred upgrade path is to use the CSR directly.
+ *
+ * Configure the global QoS packet watchers. Each watcher is
+ * capable of matching a field in a packet to determine the
+ * QoS queue for scheduling.
+ *
+ * @watcher:    Watcher number to configure (0 - 3).
+ * @match_type: Watcher match type
+ * @match_value:
+ *                   Value the watcher will match against
+ * @qos:        QoS queue for packets matching this watcher
+ */
+static inline void cvmx_pip_config_watcher(uint64_t watcher,
+                                          cvmx_pip_qos_watch_types match_type,
+                                          uint64_t match_value, uint64_t qos)
+{
+       cvmx_pip_port_watcher_cfg_t watcher_config;
+
+       watcher_config.u64 = 0;
+       watcher_config.s.match_type = match_type;
+       watcher_config.s.match_value = match_value;
+       watcher_config.s.qos = qos;
+
+       cvmx_write_csr(CVMX_PIP_QOS_WATCHX(watcher), watcher_config.u64);
+}
+#endif
+/**
+ * Configure the VLAN priority to QoS queue mapping.
+ *
+ * @vlan_priority:
+ *               VLAN priority (0-7)
+ * @qos:    QoS queue for packets matching this watcher
+ */
+static inline void cvmx_pip_config_vlan_qos(uint64_t vlan_priority,
+                                           uint64_t qos)
+{
+       union cvmx_pip_qos_vlanx pip_qos_vlanx;
+       pip_qos_vlanx.u64 = 0;
+       pip_qos_vlanx.s.qos = qos;
+       cvmx_write_csr(CVMX_PIP_QOS_VLANX(vlan_priority), pip_qos_vlanx.u64);
+}
+
+/**
+ * Configure the Diffserv to QoS queue mapping.
+ *
+ * @diffserv: Diffserv field value (0-63)
+ * @qos:      QoS queue for packets matching this watcher
+ */
+static inline void cvmx_pip_config_diffserv_qos(uint64_t diffserv, uint64_t qos)
+{
+       union cvmx_pip_qos_diffx pip_qos_diffx;
+       pip_qos_diffx.u64 = 0;
+       pip_qos_diffx.s.qos = qos;
+       cvmx_write_csr(CVMX_PIP_QOS_DIFFX(diffserv), pip_qos_diffx.u64);
+}
+
+/**
+ * Get the status counters for a port.
+ *
+ * @port_num: Port number to get statistics for.
+ * @clear:    Set to 1 to clear the counters after they are read
+ * @status:   Where to put the results.
+ */
+static inline void cvmx_pip_get_port_status(uint64_t port_num, uint64_t clear,
+                                           cvmx_pip_port_status_t *status)
+{
+       union cvmx_pip_stat_ctl pip_stat_ctl;
+       union cvmx_pip_stat0_prtx stat0;
+       union cvmx_pip_stat1_prtx stat1;
+       union cvmx_pip_stat2_prtx stat2;
+       union cvmx_pip_stat3_prtx stat3;
+       union cvmx_pip_stat4_prtx stat4;
+       union cvmx_pip_stat5_prtx stat5;
+       union cvmx_pip_stat6_prtx stat6;
+       union cvmx_pip_stat7_prtx stat7;
+       union cvmx_pip_stat8_prtx stat8;
+       union cvmx_pip_stat9_prtx stat9;
+       union cvmx_pip_stat_inb_pktsx pip_stat_inb_pktsx;
+       union cvmx_pip_stat_inb_octsx pip_stat_inb_octsx;
+       union cvmx_pip_stat_inb_errsx pip_stat_inb_errsx;
+
+       pip_stat_ctl.u64 = 0;
+       pip_stat_ctl.s.rdclr = clear;
+       cvmx_write_csr(CVMX_PIP_STAT_CTL, pip_stat_ctl.u64);
+
+       stat0.u64 = cvmx_read_csr(CVMX_PIP_STAT0_PRTX(port_num));
+       stat1.u64 = cvmx_read_csr(CVMX_PIP_STAT1_PRTX(port_num));
+       stat2.u64 = cvmx_read_csr(CVMX_PIP_STAT2_PRTX(port_num));
+       stat3.u64 = cvmx_read_csr(CVMX_PIP_STAT3_PRTX(port_num));
+       stat4.u64 = cvmx_read_csr(CVMX_PIP_STAT4_PRTX(port_num));
+       stat5.u64 = cvmx_read_csr(CVMX_PIP_STAT5_PRTX(port_num));
+       stat6.u64 = cvmx_read_csr(CVMX_PIP_STAT6_PRTX(port_num));
+       stat7.u64 = cvmx_read_csr(CVMX_PIP_STAT7_PRTX(port_num));
+       stat8.u64 = cvmx_read_csr(CVMX_PIP_STAT8_PRTX(port_num));
+       stat9.u64 = cvmx_read_csr(CVMX_PIP_STAT9_PRTX(port_num));
+       pip_stat_inb_pktsx.u64 =
+           cvmx_read_csr(CVMX_PIP_STAT_INB_PKTSX(port_num));
+       pip_stat_inb_octsx.u64 =
+           cvmx_read_csr(CVMX_PIP_STAT_INB_OCTSX(port_num));
+       pip_stat_inb_errsx.u64 =
+           cvmx_read_csr(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;
+       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;
+
+       if (cvmx_octeon_is_pass1()) {
+               /*
+                * Kludge to fix Octeon Pass 1 errata - Drop counts
+                * don't work.
+                */
+               if (status->inb_packets > status->packets)
+                       status->dropped_packets =
+                           status->inb_packets - status->packets;
+               else
+                       status->dropped_packets = 0;
+               if (status->inb_octets - status->inb_packets * 4 >
+                   status->octets)
+                       status->dropped_octets =
+                           status->inb_octets - status->inb_packets * 4 -
+                           status->octets;
+               else
+                       status->dropped_octets = 0;
+       }
+}
+
+/**
+ * Configure the hardware CRC engine
+ *
+ * @interface: Interface to configure (0 or 1)
+ * @invert_result:
+ *                 Invert the result of the CRC
+ * @reflect:  Reflect
+ * @initialization_vector:
+ *                 CRC initialization vector
+ */
+static inline void cvmx_pip_config_crc(uint64_t interface,
+                                      uint64_t invert_result, uint64_t reflect,
+                                      uint32_t initialization_vector)
+{
+       if (OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX)) {
+               union cvmx_pip_crc_ctlx config;
+               union cvmx_pip_crc_ivx pip_crc_ivx;
+
+               config.u64 = 0;
+               config.s.invres = invert_result;
+               config.s.reflect = reflect;
+               cvmx_write_csr(CVMX_PIP_CRC_CTLX(interface), config.u64);
+
+               pip_crc_ivx.u64 = 0;
+               pip_crc_ivx.s.iv = initialization_vector;
+               cvmx_write_csr(CVMX_PIP_CRC_IVX(interface), pip_crc_ivx.u64);
+       }
+}
+
+/**
+ * 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.
+ *
+ * @mask_index: Which tag mask to clear (0..3)
+ */
+static inline void cvmx_pip_tag_mask_clear(uint64_t mask_index)
+{
+       uint64_t index;
+       union cvmx_pip_tag_incx 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++)
+               cvmx_write_csr(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.
+ *
+ * @mask_index: Which tag mask to modify (0..3)
+ * @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.
+ * @len:    Number of bytes to include. Usually this is the sizeof()
+ *          the field.
+ */
+static inline void cvmx_pip_tag_mask_set(uint64_t mask_index, uint64_t offset,
+                                        uint64_t len)
+{
+       while (len--) {
+               union cvmx_pip_tag_incx pip_tag_incx;
+               uint64_t index = mask_index * 16 + offset / 8;
+               pip_tag_incx.u64 = cvmx_read_csr(CVMX_PIP_TAG_INCX(index));
+               pip_tag_incx.s.en |= 0x80 >> (offset & 0x7);
+               cvmx_write_csr(CVMX_PIP_TAG_INCX(index), pip_tag_incx.u64);
+               offset++;
+       }
+}
+
+#endif /*  __CVMX_PIP_H__ */
diff --git a/arch/mips/include/asm/octeon/cvmx-pko-defs.h b/arch/mips/include/asm/octeon/cvmx-pko-defs.h
new file mode 100644 (file)
index 0000000..50e779c
--- /dev/null
@@ -0,0 +1,1133 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+#ifndef __CVMX_PKO_DEFS_H__
+#define __CVMX_PKO_DEFS_H__
+
+#define CVMX_PKO_MEM_COUNT0 \
+        CVMX_ADD_IO_SEG(0x0001180050001080ull)
+#define CVMX_PKO_MEM_COUNT1 \
+        CVMX_ADD_IO_SEG(0x0001180050001088ull)
+#define CVMX_PKO_MEM_DEBUG0 \
+        CVMX_ADD_IO_SEG(0x0001180050001100ull)
+#define CVMX_PKO_MEM_DEBUG1 \
+        CVMX_ADD_IO_SEG(0x0001180050001108ull)
+#define CVMX_PKO_MEM_DEBUG10 \
+        CVMX_ADD_IO_SEG(0x0001180050001150ull)
+#define CVMX_PKO_MEM_DEBUG11 \
+        CVMX_ADD_IO_SEG(0x0001180050001158ull)
+#define CVMX_PKO_MEM_DEBUG12 \
+        CVMX_ADD_IO_SEG(0x0001180050001160ull)
+#define CVMX_PKO_MEM_DEBUG13 \
+        CVMX_ADD_IO_SEG(0x0001180050001168ull)
+#define CVMX_PKO_MEM_DEBUG14 \
+        CVMX_ADD_IO_SEG(0x0001180050001170ull)
+#define CVMX_PKO_MEM_DEBUG2 \
+        CVMX_ADD_IO_SEG(0x0001180050001110ull)
+#define CVMX_PKO_MEM_DEBUG3 \
+        CVMX_ADD_IO_SEG(0x0001180050001118ull)
+#define CVMX_PKO_MEM_DEBUG4 \
+        CVMX_ADD_IO_SEG(0x0001180050001120ull)
+#define CVMX_PKO_MEM_DEBUG5 \
+        CVMX_ADD_IO_SEG(0x0001180050001128ull)
+#define CVMX_PKO_MEM_DEBUG6 \
+        CVMX_ADD_IO_SEG(0x0001180050001130ull)
+#define CVMX_PKO_MEM_DEBUG7 \
+        CVMX_ADD_IO_SEG(0x0001180050001138ull)
+#define CVMX_PKO_MEM_DEBUG8 \
+        CVMX_ADD_IO_SEG(0x0001180050001140ull)
+#define CVMX_PKO_MEM_DEBUG9 \
+        CVMX_ADD_IO_SEG(0x0001180050001148ull)
+#define CVMX_PKO_MEM_PORT_PTRS \
+        CVMX_ADD_IO_SEG(0x0001180050001010ull)
+#define CVMX_PKO_MEM_PORT_QOS \
+        CVMX_ADD_IO_SEG(0x0001180050001018ull)
+#define CVMX_PKO_MEM_PORT_RATE0 \
+        CVMX_ADD_IO_SEG(0x0001180050001020ull)
+#define CVMX_PKO_MEM_PORT_RATE1 \
+        CVMX_ADD_IO_SEG(0x0001180050001028ull)
+#define CVMX_PKO_MEM_QUEUE_PTRS \
+        CVMX_ADD_IO_SEG(0x0001180050001000ull)
+#define CVMX_PKO_MEM_QUEUE_QOS \
+        CVMX_ADD_IO_SEG(0x0001180050001008ull)
+#define CVMX_PKO_REG_BIST_RESULT \
+        CVMX_ADD_IO_SEG(0x0001180050000080ull)
+#define CVMX_PKO_REG_CMD_BUF \
+        CVMX_ADD_IO_SEG(0x0001180050000010ull)
+#define CVMX_PKO_REG_CRC_CTLX(offset) \
+        CVMX_ADD_IO_SEG(0x0001180050000028ull + (((offset) & 1) * 8))
+#define CVMX_PKO_REG_CRC_ENABLE \
+        CVMX_ADD_IO_SEG(0x0001180050000020ull)
+#define CVMX_PKO_REG_CRC_IVX(offset) \
+        CVMX_ADD_IO_SEG(0x0001180050000038ull + (((offset) & 1) * 8))
+#define CVMX_PKO_REG_DEBUG0 \
+        CVMX_ADD_IO_SEG(0x0001180050000098ull)
+#define CVMX_PKO_REG_DEBUG1 \
+        CVMX_ADD_IO_SEG(0x00011800500000A0ull)
+#define CVMX_PKO_REG_DEBUG2 \
+        CVMX_ADD_IO_SEG(0x00011800500000A8ull)
+#define CVMX_PKO_REG_DEBUG3 \
+        CVMX_ADD_IO_SEG(0x00011800500000B0ull)
+#define CVMX_PKO_REG_ENGINE_INFLIGHT \
+        CVMX_ADD_IO_SEG(0x0001180050000050ull)
+#define CVMX_PKO_REG_ENGINE_THRESH \
+        CVMX_ADD_IO_SEG(0x0001180050000058ull)
+#define CVMX_PKO_REG_ERROR \
+        CVMX_ADD_IO_SEG(0x0001180050000088ull)
+#define CVMX_PKO_REG_FLAGS \
+        CVMX_ADD_IO_SEG(0x0001180050000000ull)
+#define CVMX_PKO_REG_GMX_PORT_MODE \
+        CVMX_ADD_IO_SEG(0x0001180050000018ull)
+#define CVMX_PKO_REG_INT_MASK \
+        CVMX_ADD_IO_SEG(0x0001180050000090ull)
+#define CVMX_PKO_REG_QUEUE_MODE \
+        CVMX_ADD_IO_SEG(0x0001180050000048ull)
+#define CVMX_PKO_REG_QUEUE_PTRS1 \
+        CVMX_ADD_IO_SEG(0x0001180050000100ull)
+#define CVMX_PKO_REG_READ_IDX \
+        CVMX_ADD_IO_SEG(0x0001180050000008ull)
+
+union cvmx_pko_mem_count0 {
+       uint64_t u64;
+       struct cvmx_pko_mem_count0_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_pko_mem_count1 {
+       uint64_t u64;
+       struct cvmx_pko_mem_count1_s {
+               uint64_t reserved_48_63:16;
+               uint64_t 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;
+};
+
+union cvmx_pko_mem_debug0 {
+       uint64_t u64;
+       struct cvmx_pko_mem_debug0_s {
+               uint64_t fau:28;
+               uint64_t cmd:14;
+               uint64_t segs:6;
+               uint64_t 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;
+};
+
+union cvmx_pko_mem_debug1 {
+       uint64_t u64;
+       struct cvmx_pko_mem_debug1_s {
+               uint64_t i:1;
+               uint64_t back:4;
+               uint64_t pool:3;
+               uint64_t size:16;
+               uint64_t 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;
+};
+
+union cvmx_pko_mem_debug10 {
+       uint64_t u64;
+       struct cvmx_pko_mem_debug10_s {
+               uint64_t reserved_0_63:64;
+       } s;
+       struct cvmx_pko_mem_debug10_cn30xx {
+               uint64_t fau:28;
+               uint64_t cmd:14;
+               uint64_t segs:6;
+               uint64_t 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 {
+               uint64_t reserved_49_63:15;
+               uint64_t ptrs1:17;
+               uint64_t reserved_17_31:15;
+               uint64_t 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;
+};
+
+union cvmx_pko_mem_debug11 {
+       uint64_t u64;
+       struct cvmx_pko_mem_debug11_s {
+               uint64_t i:1;
+               uint64_t back:4;
+               uint64_t pool:3;
+               uint64_t size:16;
+               uint64_t reserved_0_39:40;
+       } s;
+       struct cvmx_pko_mem_debug11_cn30xx {
+               uint64_t i:1;
+               uint64_t back:4;
+               uint64_t pool:3;
+               uint64_t size:16;
+               uint64_t 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 {
+               uint64_t reserved_23_63:41;
+               uint64_t maj:1;
+               uint64_t uid:3;
+               uint64_t sop:1;
+               uint64_t len:1;
+               uint64_t chk:1;
+               uint64_t cnt:13;
+               uint64_t 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;
+};
+
+union cvmx_pko_mem_debug12 {
+       uint64_t u64;
+       struct cvmx_pko_mem_debug12_s {
+               uint64_t reserved_0_63:64;
+       } s;
+       struct cvmx_pko_mem_debug12_cn30xx {
+               uint64_t 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 {
+               uint64_t fau:28;
+               uint64_t cmd:14;
+               uint64_t segs:6;
+               uint64_t 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;
+};
+
+union cvmx_pko_mem_debug13 {
+       uint64_t u64;
+       struct cvmx_pko_mem_debug13_s {
+               uint64_t i:1;
+               uint64_t back:4;
+               uint64_t pool:3;
+               uint64_t reserved_0_55:56;
+       } s;
+       struct cvmx_pko_mem_debug13_cn30xx {
+               uint64_t reserved_51_63:13;
+               uint64_t widx:17;
+               uint64_t ridx2:17;
+               uint64_t 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 {
+               uint64_t i:1;
+               uint64_t back:4;
+               uint64_t pool:3;
+               uint64_t size:16;
+               uint64_t 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;
+};
+
+union cvmx_pko_mem_debug14 {
+       uint64_t u64;
+       struct cvmx_pko_mem_debug14_s {
+               uint64_t reserved_0_63:64;
+       } s;
+       struct cvmx_pko_mem_debug14_cn30xx {
+               uint64_t reserved_17_63:47;
+               uint64_t 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 {
+               uint64_t data:64;
+       } cn52xx;
+       struct cvmx_pko_mem_debug14_cn52xx cn52xxp1;
+       struct cvmx_pko_mem_debug14_cn52xx cn56xx;
+       struct cvmx_pko_mem_debug14_cn52xx cn56xxp1;
+};
+
+union cvmx_pko_mem_debug2 {
+       uint64_t u64;
+       struct cvmx_pko_mem_debug2_s {
+               uint64_t i:1;
+               uint64_t back:4;
+               uint64_t pool:3;
+               uint64_t size:16;
+               uint64_t 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;
+};
+
+union cvmx_pko_mem_debug3 {
+       uint64_t u64;
+       struct cvmx_pko_mem_debug3_s {
+               uint64_t reserved_0_63:64;
+       } s;
+       struct cvmx_pko_mem_debug3_cn30xx {
+               uint64_t i:1;
+               uint64_t back:4;
+               uint64_t pool:3;
+               uint64_t size:16;
+               uint64_t 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 {
+               uint64_t 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;
+};
+
+union cvmx_pko_mem_debug4 {
+       uint64_t u64;
+       struct cvmx_pko_mem_debug4_s {
+               uint64_t reserved_0_63:64;
+       } s;
+       struct cvmx_pko_mem_debug4_cn30xx {
+               uint64_t 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 {
+               uint64_t cmnd_segs:3;
+               uint64_t cmnd_siz:16;
+               uint64_t cmnd_off:6;
+               uint64_t uid:3;
+               uint64_t dread_sop:1;
+               uint64_t init_dwrite:1;
+               uint64_t chk_once:1;
+               uint64_t chk_mode:1;
+               uint64_t active:1;
+               uint64_t static_p:1;
+               uint64_t qos:3;
+               uint64_t qcb_ridx:5;
+               uint64_t qid_off_max:4;
+               uint64_t qid_off:4;
+               uint64_t qid_base:8;
+               uint64_t wait:1;
+               uint64_t minor:2;
+               uint64_t major:3;
+       } cn50xx;
+       struct cvmx_pko_mem_debug4_cn52xx {
+               uint64_t curr_siz:8;
+               uint64_t curr_off:16;
+               uint64_t cmnd_segs:6;
+               uint64_t cmnd_siz:16;
+               uint64_t cmnd_off:6;
+               uint64_t uid:2;
+               uint64_t dread_sop:1;
+               uint64_t init_dwrite:1;
+               uint64_t chk_once:1;
+               uint64_t chk_mode:1;
+               uint64_t wait:1;
+               uint64_t minor:2;
+               uint64_t 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;
+};
+
+union cvmx_pko_mem_debug5 {
+       uint64_t u64;
+       struct cvmx_pko_mem_debug5_s {
+               uint64_t reserved_0_63:64;
+       } s;
+       struct cvmx_pko_mem_debug5_cn30xx {
+               uint64_t dwri_mod:1;
+               uint64_t dwri_sop:1;
+               uint64_t dwri_len:1;
+               uint64_t dwri_cnt:13;
+               uint64_t cmnd_siz:16;
+               uint64_t uid:1;
+               uint64_t xfer_wor:1;
+               uint64_t xfer_dwr:1;
+               uint64_t cbuf_fre:1;
+               uint64_t reserved_27_27:1;
+               uint64_t chk_mode:1;
+               uint64_t active:1;
+               uint64_t qos:3;
+               uint64_t qcb_ridx:5;
+               uint64_t qid_off:3;
+               uint64_t qid_base:7;
+               uint64_t wait:1;
+               uint64_t minor:2;
+               uint64_t 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 {
+               uint64_t curr_ptr:29;
+               uint64_t curr_siz:16;
+               uint64_t curr_off:16;
+               uint64_t cmnd_segs:3;
+       } cn50xx;
+       struct cvmx_pko_mem_debug5_cn52xx {
+               uint64_t reserved_54_63:10;
+               uint64_t nxt_inflt:6;
+               uint64_t curr_ptr:40;
+               uint64_t 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;
+};
+
+union cvmx_pko_mem_debug6 {
+       uint64_t u64;
+       struct cvmx_pko_mem_debug6_s {
+               uint64_t reserved_37_63:27;
+               uint64_t qid_offres:4;
+               uint64_t qid_offths:4;
+               uint64_t preempter:1;
+               uint64_t preemptee:1;
+               uint64_t preempted:1;
+               uint64_t active:1;
+               uint64_t statc:1;
+               uint64_t qos:3;
+               uint64_t qcb_ridx:5;
+               uint64_t qid_offmax:4;
+               uint64_t reserved_0_11:12;
+       } s;
+       struct cvmx_pko_mem_debug6_cn30xx {
+               uint64_t reserved_11_63:53;
+               uint64_t qid_offm:3;
+               uint64_t static_p:1;
+               uint64_t work_min:3;
+               uint64_t dwri_chk:1;
+               uint64_t dwri_uid:1;
+               uint64_t 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 {
+               uint64_t reserved_11_63:53;
+               uint64_t curr_ptr:11;
+       } cn50xx;
+       struct cvmx_pko_mem_debug6_cn52xx {
+               uint64_t reserved_37_63:27;
+               uint64_t qid_offres:4;
+               uint64_t qid_offths:4;
+               uint64_t preempter:1;
+               uint64_t preemptee:1;
+               uint64_t preempted:1;
+               uint64_t active:1;
+               uint64_t statc:1;
+               uint64_t qos:3;
+               uint64_t qcb_ridx:5;
+               uint64_t qid_offmax:4;
+               uint64_t qid_off:4;
+               uint64_t 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;
+};
+
+union cvmx_pko_mem_debug7 {
+       uint64_t u64;
+       struct cvmx_pko_mem_debug7_s {
+               uint64_t qos:5;
+               uint64_t tail:1;
+               uint64_t reserved_0_57:58;
+       } s;
+       struct cvmx_pko_mem_debug7_cn30xx {
+               uint64_t reserved_58_63:6;
+               uint64_t dwb:9;
+               uint64_t start:33;
+               uint64_t 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 {
+               uint64_t qos:5;
+               uint64_t tail:1;
+               uint64_t buf_siz:13;
+               uint64_t buf_ptr:33;
+               uint64_t qcb_widx:6;
+               uint64_t 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;
+};
+
+union cvmx_pko_mem_debug8 {
+       uint64_t u64;
+       struct cvmx_pko_mem_debug8_s {
+               uint64_t reserved_59_63:5;
+               uint64_t tail:1;
+               uint64_t buf_siz:13;
+               uint64_t reserved_0_44:45;
+       } s;
+       struct cvmx_pko_mem_debug8_cn30xx {
+               uint64_t qos:5;
+               uint64_t tail:1;
+               uint64_t buf_siz:13;
+               uint64_t buf_ptr:33;
+               uint64_t qcb_widx:6;
+               uint64_t 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 {
+               uint64_t reserved_28_63:36;
+               uint64_t doorbell:20;
+               uint64_t reserved_6_7:2;
+               uint64_t static_p:1;
+               uint64_t s_tail:1;
+               uint64_t static_q:1;
+               uint64_t qos:3;
+       } cn50xx;
+       struct cvmx_pko_mem_debug8_cn52xx {
+               uint64_t reserved_29_63:35;
+               uint64_t preempter:1;
+               uint64_t doorbell:20;
+               uint64_t reserved_7_7:1;
+               uint64_t preemptee:1;
+               uint64_t static_p:1;
+               uint64_t s_tail:1;
+               uint64_t static_q:1;
+               uint64_t 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;
+};
+
+union cvmx_pko_mem_debug9 {
+       uint64_t u64;
+       struct cvmx_pko_mem_debug9_s {
+               uint64_t reserved_49_63:15;
+               uint64_t ptrs0:17;
+               uint64_t reserved_0_31:32;
+       } s;
+       struct cvmx_pko_mem_debug9_cn30xx {
+               uint64_t reserved_28_63:36;
+               uint64_t doorbell:20;
+               uint64_t reserved_5_7:3;
+               uint64_t s_tail:1;
+               uint64_t static_q:1;
+               uint64_t qos:3;
+       } cn30xx;
+       struct cvmx_pko_mem_debug9_cn30xx cn31xx;
+       struct cvmx_pko_mem_debug9_cn38xx {
+               uint64_t reserved_28_63:36;
+               uint64_t doorbell:20;
+               uint64_t reserved_6_7:2;
+               uint64_t static_p:1;
+               uint64_t s_tail:1;
+               uint64_t static_q:1;
+               uint64_t qos:3;
+       } cn38xx;
+       struct cvmx_pko_mem_debug9_cn38xx cn38xxp2;
+       struct cvmx_pko_mem_debug9_cn50xx {
+               uint64_t reserved_49_63:15;
+               uint64_t ptrs0:17;
+               uint64_t reserved_17_31:15;
+               uint64_t 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;
+};
+
+union cvmx_pko_mem_port_ptrs {
+       uint64_t u64;
+       struct cvmx_pko_mem_port_ptrs_s {
+               uint64_t reserved_62_63:2;
+               uint64_t static_p:1;
+               uint64_t qos_mask:8;
+               uint64_t reserved_16_52:37;
+               uint64_t bp_port:6;
+               uint64_t eid:4;
+               uint64_t 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;
+};
+
+union cvmx_pko_mem_port_qos {
+       uint64_t u64;
+       struct cvmx_pko_mem_port_qos_s {
+               uint64_t reserved_61_63:3;
+               uint64_t qos_mask:8;
+               uint64_t reserved_10_52:43;
+               uint64_t eid:4;
+               uint64_t 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;
+};
+
+union cvmx_pko_mem_port_rate0 {
+       uint64_t u64;
+       struct cvmx_pko_mem_port_rate0_s {
+               uint64_t reserved_51_63:13;
+               uint64_t rate_word:19;
+               uint64_t rate_pkt:24;
+               uint64_t reserved_6_7:2;
+               uint64_t pid:6;
+       } s;
+       struct cvmx_pko_mem_port_rate0_s cn52xx;
+       struct cvmx_pko_mem_port_rate0_s cn52xxp1;
+       struct cvmx_pko_mem_port_rate0_s cn56xx;
+       struct cvmx_pko_mem_port_rate0_s cn56xxp1;
+};
+
+union cvmx_pko_mem_port_rate1 {
+       uint64_t u64;
+       struct cvmx_pko_mem_port_rate1_s {
+               uint64_t reserved_32_63:32;
+               uint64_t rate_lim:24;
+               uint64_t reserved_6_7:2;
+               uint64_t pid:6;
+       } s;
+       struct cvmx_pko_mem_port_rate1_s cn52xx;
+       struct cvmx_pko_mem_port_rate1_s cn52xxp1;
+       struct cvmx_pko_mem_port_rate1_s cn56xx;
+       struct cvmx_pko_mem_port_rate1_s cn56xxp1;
+};
+
+union cvmx_pko_mem_queue_ptrs {
+       uint64_t u64;
+       struct cvmx_pko_mem_queue_ptrs_s {
+               uint64_t s_tail:1;
+               uint64_t static_p:1;
+               uint64_t static_q:1;
+               uint64_t qos_mask:8;
+               uint64_t buf_ptr:36;
+               uint64_t tail:1;
+               uint64_t index:3;
+               uint64_t port:6;
+               uint64_t 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;
+};
+
+union cvmx_pko_mem_queue_qos {
+       uint64_t u64;
+       struct cvmx_pko_mem_queue_qos_s {
+               uint64_t reserved_61_63:3;
+               uint64_t qos_mask:8;
+               uint64_t reserved_13_52:40;
+               uint64_t pid:6;
+               uint64_t 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;
+};
+
+union cvmx_pko_reg_bist_result {
+       uint64_t u64;
+       struct cvmx_pko_reg_bist_result_s {
+               uint64_t reserved_0_63:64;
+       } s;
+       struct cvmx_pko_reg_bist_result_cn30xx {
+               uint64_t reserved_27_63:37;
+               uint64_t psb2:5;
+               uint64_t count:1;
+               uint64_t rif:1;
+               uint64_t wif:1;
+               uint64_t ncb:1;
+               uint64_t out:1;
+               uint64_t crc:1;
+               uint64_t chk:1;
+               uint64_t qsb:2;
+               uint64_t qcb:2;
+               uint64_t pdb:4;
+               uint64_t 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 {
+               uint64_t reserved_33_63:31;
+               uint64_t csr:1;
+               uint64_t iob:1;
+               uint64_t out_crc:1;
+               uint64_t out_ctl:3;
+               uint64_t out_sta:1;
+               uint64_t out_wif:1;
+               uint64_t prt_chk:3;
+               uint64_t prt_nxt:1;
+               uint64_t prt_psb:6;
+               uint64_t ncb_inb:2;
+               uint64_t prt_qcb:2;
+               uint64_t prt_qsb:3;
+               uint64_t dat_dat:4;
+               uint64_t dat_ptr:4;
+       } cn50xx;
+       struct cvmx_pko_reg_bist_result_cn52xx {
+               uint64_t reserved_35_63:29;
+               uint64_t csr:1;
+               uint64_t iob:1;
+               uint64_t out_dat:1;
+               uint64_t out_ctl:3;
+               uint64_t out_sta:1;
+               uint64_t out_wif:1;
+               uint64_t prt_chk:3;
+               uint64_t prt_nxt:1;
+               uint64_t prt_psb:8;
+               uint64_t ncb_inb:2;
+               uint64_t prt_qcb:2;
+               uint64_t prt_qsb:3;
+               uint64_t prt_ctl:2;
+               uint64_t dat_dat:2;
+               uint64_t 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;
+};
+
+union cvmx_pko_reg_cmd_buf {
+       uint64_t u64;
+       struct cvmx_pko_reg_cmd_buf_s {
+               uint64_t reserved_23_63:41;
+               uint64_t pool:3;
+               uint64_t reserved_13_19:7;
+               uint64_t 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;
+};
+
+union cvmx_pko_reg_crc_ctlx {
+       uint64_t u64;
+       struct cvmx_pko_reg_crc_ctlx_s {
+               uint64_t reserved_2_63:62;
+               uint64_t invres:1;
+               uint64_t 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;
+};
+
+union cvmx_pko_reg_crc_enable {
+       uint64_t u64;
+       struct cvmx_pko_reg_crc_enable_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_pko_reg_crc_ivx {
+       uint64_t u64;
+       struct cvmx_pko_reg_crc_ivx_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_pko_reg_debug0 {
+       uint64_t u64;
+       struct cvmx_pko_reg_debug0_s {
+               uint64_t asserts:64;
+       } s;
+       struct cvmx_pko_reg_debug0_cn30xx {
+               uint64_t reserved_17_63:47;
+               uint64_t 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;
+};
+
+union cvmx_pko_reg_debug1 {
+       uint64_t u64;
+       struct cvmx_pko_reg_debug1_s {
+               uint64_t 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;
+};
+
+union cvmx_pko_reg_debug2 {
+       uint64_t u64;
+       struct cvmx_pko_reg_debug2_s {
+               uint64_t 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;
+};
+
+union cvmx_pko_reg_debug3 {
+       uint64_t u64;
+       struct cvmx_pko_reg_debug3_s {
+               uint64_t 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;
+};
+
+union cvmx_pko_reg_engine_inflight {
+       uint64_t u64;
+       struct cvmx_pko_reg_engine_inflight_s {
+               uint64_t reserved_40_63:24;
+               uint64_t engine9:4;
+               uint64_t engine8:4;
+               uint64_t engine7:4;
+               uint64_t engine6:4;
+               uint64_t engine5:4;
+               uint64_t engine4:4;
+               uint64_t engine3:4;
+               uint64_t engine2:4;
+               uint64_t engine1:4;
+               uint64_t engine0:4;
+       } s;
+       struct cvmx_pko_reg_engine_inflight_s cn52xx;
+       struct cvmx_pko_reg_engine_inflight_s cn52xxp1;
+       struct cvmx_pko_reg_engine_inflight_s cn56xx;
+       struct cvmx_pko_reg_engine_inflight_s cn56xxp1;
+};
+
+union cvmx_pko_reg_engine_thresh {
+       uint64_t u64;
+       struct cvmx_pko_reg_engine_thresh_s {
+               uint64_t reserved_10_63:54;
+               uint64_t mask:10;
+       } s;
+       struct cvmx_pko_reg_engine_thresh_s cn52xx;
+       struct cvmx_pko_reg_engine_thresh_s cn52xxp1;
+       struct cvmx_pko_reg_engine_thresh_s cn56xx;
+       struct cvmx_pko_reg_engine_thresh_s cn56xxp1;
+};
+
+union cvmx_pko_reg_error {
+       uint64_t u64;
+       struct cvmx_pko_reg_error_s {
+               uint64_t reserved_3_63:61;
+               uint64_t currzero:1;
+               uint64_t doorbell:1;
+               uint64_t parity:1;
+       } s;
+       struct cvmx_pko_reg_error_cn30xx {
+               uint64_t reserved_2_63:62;
+               uint64_t doorbell:1;
+               uint64_t 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_s cn50xx;
+       struct cvmx_pko_reg_error_s cn52xx;
+       struct cvmx_pko_reg_error_s cn52xxp1;
+       struct cvmx_pko_reg_error_s cn56xx;
+       struct cvmx_pko_reg_error_s cn56xxp1;
+       struct cvmx_pko_reg_error_s cn58xx;
+       struct cvmx_pko_reg_error_s cn58xxp1;
+};
+
+union cvmx_pko_reg_flags {
+       uint64_t u64;
+       struct cvmx_pko_reg_flags_s {
+               uint64_t reserved_4_63:60;
+               uint64_t reset:1;
+               uint64_t store_be:1;
+               uint64_t ena_dwb:1;
+               uint64_t ena_pko:1;
+       } s;
+       struct cvmx_pko_reg_flags_s cn30xx;
+       struct cvmx_pko_reg_flags_s cn31xx;
+       struct cvmx_pko_reg_flags_s cn38xx;
+       struct cvmx_pko_reg_flags_s cn38xxp2;
+       struct cvmx_pko_reg_flags_s cn50xx;
+       struct cvmx_pko_reg_flags_s cn52xx;
+       struct cvmx_pko_reg_flags_s cn52xxp1;
+       struct cvmx_pko_reg_flags_s cn56xx;
+       struct cvmx_pko_reg_flags_s cn56xxp1;
+       struct cvmx_pko_reg_flags_s cn58xx;
+       struct cvmx_pko_reg_flags_s cn58xxp1;
+};
+
+union cvmx_pko_reg_gmx_port_mode {
+       uint64_t u64;
+       struct cvmx_pko_reg_gmx_port_mode_s {
+               uint64_t reserved_6_63:58;
+               uint64_t mode1:3;
+               uint64_t 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;
+};
+
+union cvmx_pko_reg_int_mask {
+       uint64_t u64;
+       struct cvmx_pko_reg_int_mask_s {
+               uint64_t reserved_3_63:61;
+               uint64_t currzero:1;
+               uint64_t doorbell:1;
+               uint64_t parity:1;
+       } s;
+       struct cvmx_pko_reg_int_mask_cn30xx {
+               uint64_t reserved_2_63:62;
+               uint64_t doorbell:1;
+               uint64_t 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_s cn50xx;
+       struct cvmx_pko_reg_int_mask_s cn52xx;
+       struct cvmx_pko_reg_int_mask_s cn52xxp1;
+       struct cvmx_pko_reg_int_mask_s cn56xx;
+       struct cvmx_pko_reg_int_mask_s cn56xxp1;
+       struct cvmx_pko_reg_int_mask_s cn58xx;
+       struct cvmx_pko_reg_int_mask_s cn58xxp1;
+};
+
+union cvmx_pko_reg_queue_mode {
+       uint64_t u64;
+       struct cvmx_pko_reg_queue_mode_s {
+               uint64_t reserved_2_63:62;
+               uint64_t 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;
+};
+
+union cvmx_pko_reg_queue_ptrs1 {
+       uint64_t u64;
+       struct cvmx_pko_reg_queue_ptrs1_s {
+               uint64_t reserved_2_63:62;
+               uint64_t idx3:1;
+               uint64_t 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;
+};
+
+union cvmx_pko_reg_read_idx {
+       uint64_t u64;
+       struct cvmx_pko_reg_read_idx_s {
+               uint64_t reserved_16_63:48;
+               uint64_t inc:8;
+               uint64_t 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;
+};
+
+#endif
diff --git a/arch/mips/include/asm/octeon/cvmx-pko.h b/arch/mips/include/asm/octeon/cvmx-pko.h
new file mode 100644 (file)
index 0000000..de3412a
--- /dev/null
@@ -0,0 +1,610 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/**
+ *
+ * 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_PKO_H__
+#define __CVMX_PKO_H__
+
+#include "cvmx-fpa.h"
+#include "cvmx-pow.h"
+#include "cvmx-cmd-queue.h"
+#include "cvmx-pko-defs.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_MODEL(OCTEON_CN31XX) || \
+       OCTEON_IS_MODEL(OCTEON_CN3010) || OCTEON_IS_MODEL(OCTEON_CN3005) || \
+       OCTEON_IS_MODEL(OCTEON_CN50XX)) ? 32 : \
+               (OCTEON_IS_MODEL(OCTEON_CN58XX) || \
+               OCTEON_IS_MODEL(OCTEON_CN56XX)) ? 256 : 128)
+#define CVMX_PKO_NUM_OUTPUT_PORTS       40
+/* use this for queues that are not used */
+#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_status_t;
+
+/**
+ * This enumeration represents the differnet locking modes supported by PKO.
+ */
+typedef enum {
+       /*
+        * 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_NONE = 0,
+       /*
+        * PKO performs an atomic tagswitch to insure exclusive access
+        * to the output queue. This will maintain packet ordering on
+        * output.
+        */
+       CVMX_PKO_LOCK_ATOMIC_TAG = 1,
+       /*
+        * 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.
+        */
+       CVMX_PKO_LOCK_CMD_QUEUE = 2,
+} cvmx_pko_lock_t;
+
+typedef struct {
+       uint32_t packets;
+       uint64_t octets;
+       uint64_t doorbell;
+} cvmx_pko_port_status_t;
+
+/**
+ * This structure defines the address to use on a packet enqueue
+ */
+typedef union {
+       uint64_t u64;
+       struct {
+               /* Must CVMX_IO_SEG */
+               uint64_t mem_space:2;
+               /* Must be zero */
+               uint64_t reserved:13;
+               /* Must be one */
+               uint64_t is_io:1;
+               /* The ID of the device on the non-coherent bus */
+               uint64_t did:8;
+               /* Must be zero */
+               uint64_t reserved2:4;
+               /* Must be zero */
+               uint64_t reserved3:18;
+               /*
+                * The hardware likes to have the output port in
+                * addition to the output queue,
+                */
+               uint64_t port:6;
+               /*
+                * The output queue to send the packet to (0-127 are
+                * legal)
+                */
+               uint64_t queue:9;
+               /* Must be zero */
+               uint64_t reserved4:3;
+       } s;
+} cvmx_pko_doorbell_address_t;
+
+/**
+ * Structure of the first packet output command word.
+ */
+typedef union {
+       uint64_t u64;
+       struct {
+               /*
+                * The size of the reg1 operation - could be 8, 16,
+                * 32, or 64 bits.
+                */
+               uint64_t size1:2;
+               /*
+                * The size of the reg0 operation - could be 8, 16,
+                * 32, or 64 bits.
+                */
+               uint64_t size0:2;
+               /*
+                * If set, subtract 1, if clear, subtract packet
+                * size.
+                */
+               uint64_t subone1:1;
+               /*
+                * The register, subtract will be done if reg1 is
+                * non-zero.
+                */
+               uint64_t reg1:11;
+               /* If set, subtract 1, if clear, subtract packet size */
+               uint64_t subone0:1;
+               /* The register, subtract will be done if reg0 is non-zero */
+               uint64_t reg0:11;
+               /*
+                * When set, interpret segment pointer and segment
+                * bytes in little endian order.
+                */
+               uint64_t le:1;
+               /*
+                * When set, packet data not allocated in L2 cache by
+                * PKO.
+                */
+               uint64_t n2:1;
+               /*
+                * If set and rsp is set, word3 contains a pointer to
+                * a work queue entry.
+                */
+               uint64_t wqp:1;
+               /* If set, the hardware will send a response when done */
+               uint64_t rsp:1;
+               /*
+                * If set, the supplied pkt_ptr is really a pointer to
+                * a list of pkt_ptr's.
+                */
+               uint64_t gather:1;
+               /*
+                * If ipoffp1 is non zero, (ipoffp1-1) is the number
+                * of bytes to IP header, and the hardware will
+                * calculate and insert the UDP/TCP checksum.
+                */
+               uint64_t ipoffp1:7;
+               /*
+                * If set, ignore the I bit (force to zero) from all
+                * pointer structures.
+                */
+               uint64_t ignore_i:1;
+               /*
+                * If clear, the hardware will attempt to free the
+                * buffers containing the packet.
+                */
+               uint64_t dontfree:1;
+               /*
+                * The total number of segs in the packet, if gather
+                * set, also gather list length.
+                */
+               uint64_t segs:6;
+               /* Including L2, but no trailing CRC */
+               uint64_t total_bytes:16;
+       } s;
+} cvmx_pko_command_word0_t;
+
+/* CSR typedefs have been moved to cvmx-csr-*.h */
+
+/**
+ * Definition of internal state for Packet output processing
+ */
+typedef struct {
+       /* ptr to start of buffer, offset kept in FAU reg */
+       uint64_t *start_ptr;
+} cvmx_pko_state_elem_t;
+
+/**
+ * Call before any other calls to initialize the packet
+ * output system.
+ */
+extern void cvmx_pko_initialize_global(void);
+extern int cvmx_pko_initialize_local(void);
+
+/**
+ * Enables the packet output hardware. It must already be
+ * configured.
+ */
+extern void cvmx_pko_enable(void);
+
+/**
+ * Disables the packet output. Does not affect any configuration.
+ */
+extern void cvmx_pko_disable(void);
+
+/**
+ * Shutdown and free resources required by packet output.
+ */
+
+extern void cvmx_pko_shutdown(void);
+
+/**
+ * Configure a output port and the associated queues for use.
+ *
+ * @port:       Port to configure.
+ * @base_queue: First queue number to associate with this port.
+ * @num_queues: Number of queues t oassociate with this port
+ * @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.
+ */
+extern cvmx_pko_status_t cvmx_pko_config_port(uint64_t port,
+                                             uint64_t base_queue,
+                                             uint64_t num_queues,
+                                             const uint64_t 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.
+ *
+ * @port:   Port the packet is for
+ * @queue:  Queue the packet is for
+ * @len:    Length of the command in 64 bit words
+ */
+static inline void cvmx_pko_doorbell(uint64_t port, uint64_t queue,
+                                    uint64_t 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 = 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.
+ *
+ * @port:   Port to send it on
+ * @queue:  Queue to use
+ * @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(uint64_t port, uint64_t 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.
+                */
+               uint32_t 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);
+       }
+}
+
+/**
+ * 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().
+ *
+ * @port:   Port to send it on
+ * @queue:  Queue to use
+ * @pko_command:
+ *               PKO HW command word
+ * @packet: Packet to send
+ * @use_locking: CVMX_PKO_LOCK_NONE, CVMX_PKO_LOCK_ATOMIC_TAG, or
+ *               CVMX_PKO_LOCK_CMD_QUEUE
+ *
+ * Returns returns CVMX_PKO_SUCCESS on success, or error code on
+ * failure of output
+ */
+static inline cvmx_pko_status_t cvmx_pko_send_packet_finish(
+       uint64_t port,
+       uint64_t queue,
+       cvmx_pko_command_word0_t pko_command,
+       union cvmx_buf_ptr 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 (likely(result == CVMX_CMD_QUEUE_SUCCESS)) {
+               cvmx_pko_doorbell(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().
+ *
+ * @port:   Port to send it on
+ * @queue:  Queue to use
+ * @pko_command:
+ *               PKO HW command word
+ * @packet: Packet to send
+ * @addr: Plysical address of a work queue entry or physical address
+ *        to zero on complete.
+ * @use_locking: CVMX_PKO_LOCK_NONE, CVMX_PKO_LOCK_ATOMIC_TAG, or
+ *               CVMX_PKO_LOCK_CMD_QUEUE
+ *
+ * Returns returns CVMX_PKO_SUCCESS on success, or error code on
+ * failure of output
+ */
+static inline cvmx_pko_status_t cvmx_pko_send_packet_finish3(
+       uint64_t port,
+       uint64_t queue,
+       cvmx_pko_command_word0_t pko_command,
+       union cvmx_buf_ptr packet,
+       uint64_t 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 (likely(result == CVMX_CMD_QUEUE_SUCCESS)) {
+               cvmx_pko_doorbell(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;
+       }
+}
+
+/**
+ * Return the pko output queue associated with a port and a specific core.
+ * In normal mode (PKO lockless operation is disabled), the value returned
+ * is the base queue.
+ *
+ * @port:   Port number
+ * @core:   Core to get queue for
+ *
+ * Returns Core-specific output queue
+ */
+static inline int cvmx_pko_get_base_queue_per_core(int port, int core)
+{
+#ifndef CVMX_HELPER_PKO_MAX_PORTS_INTERFACE0
+#define CVMX_HELPER_PKO_MAX_PORTS_INTERFACE0 16
+#endif
+#ifndef CVMX_HELPER_PKO_MAX_PORTS_INTERFACE1
+#define CVMX_HELPER_PKO_MAX_PORTS_INTERFACE1 16
+#endif
+
+       if (port < CVMX_PKO_MAX_PORTS_INTERFACE0)
+               return port * CVMX_PKO_QUEUES_PER_PORT_INTERFACE0 + core;
+       else if (port >= 16 && port < 16 + CVMX_PKO_MAX_PORTS_INTERFACE1)
+               return CVMX_PKO_MAX_PORTS_INTERFACE0 *
+                   CVMX_PKO_QUEUES_PER_PORT_INTERFACE0 + (port -
+                                                          16) *
+                   CVMX_PKO_QUEUES_PER_PORT_INTERFACE1 + core;
+       else if ((port >= 32) && (port < 36))
+               return CVMX_PKO_MAX_PORTS_INTERFACE0 *
+                   CVMX_PKO_QUEUES_PER_PORT_INTERFACE0 +
+                   CVMX_PKO_MAX_PORTS_INTERFACE1 *
+                   CVMX_PKO_QUEUES_PER_PORT_INTERFACE1 + (port -
+                                                          32) *
+                   CVMX_PKO_QUEUES_PER_PORT_PCI;
+       else if ((port >= 36) && (port < 40))
+               return CVMX_PKO_MAX_PORTS_INTERFACE0 *
+                   CVMX_PKO_QUEUES_PER_PORT_INTERFACE0 +
+                   CVMX_PKO_MAX_PORTS_INTERFACE1 *
+                   CVMX_PKO_QUEUES_PER_PORT_INTERFACE1 +
+                   4 * CVMX_PKO_QUEUES_PER_PORT_PCI + (port -
+                                                       36) *
+                   CVMX_PKO_QUEUES_PER_PORT_LOOP;
+       else
+               /* Given the limit on the number of ports we can map to
+                * CVMX_MAX_OUTPUT_QUEUES_STATIC queues (currently 256,
+                * divided among all cores), the remaining unmapped ports
+                * are assigned an illegal queue number */
+               return CVMX_PKO_ILLEGAL_QUEUE;
+}
+
+/**
+ * For a given port number, return the base pko output queue
+ * for the port.
+ *
+ * @port:   Port number
+ * Returns Base output queue
+ */
+static inline int cvmx_pko_get_base_queue(int port)
+{
+       return cvmx_pko_get_base_queue_per_core(port, 0);
+}
+
+/**
+ * For a given port number, return the number of pko output queues.
+ *
+ * @port:   Port number
+ * Returns Number of output queues
+ */
+static inline int cvmx_pko_get_num_queues(int port)
+{
+       if (port < 16)
+               return CVMX_PKO_QUEUES_PER_PORT_INTERFACE0;
+       else if (port < 32)
+               return CVMX_PKO_QUEUES_PER_PORT_INTERFACE1;
+       else if (port < 36)
+               return CVMX_PKO_QUEUES_PER_PORT_PCI;
+       else if (port < 40)
+               return CVMX_PKO_QUEUES_PER_PORT_LOOP;
+       else
+               return 0;
+}
+
+/**
+ * Get the status counters for a port.
+ *
+ * @port_num: Port number to get statistics for.
+ * @clear:    Set to 1 to clear the counters after they are read
+ * @status:   Where to put the results.
+ */
+static inline void cvmx_pko_get_port_status(uint64_t port_num, uint64_t clear,
+                                           cvmx_pko_port_status_t *status)
+{
+       union cvmx_pko_reg_read_idx pko_reg_read_idx;
+       union cvmx_pko_mem_count0 pko_mem_count0;
+       union cvmx_pko_mem_count1 pko_mem_count1;
+
+       pko_reg_read_idx.u64 = 0;
+       pko_reg_read_idx.s.index = port_num;
+       cvmx_write_csr(CVMX_PKO_REG_READ_IDX, pko_reg_read_idx.u64);
+
+       pko_mem_count0.u64 = cvmx_read_csr(CVMX_PKO_MEM_COUNT0);
+       status->packets = pko_mem_count0.s.count;
+       if (clear) {
+               pko_mem_count0.s.count = port_num;
+               cvmx_write_csr(CVMX_PKO_MEM_COUNT0, pko_mem_count0.u64);
+       }
+
+       pko_mem_count1.u64 = cvmx_read_csr(CVMX_PKO_MEM_COUNT1);
+       status->octets = pko_mem_count1.s.count;
+       if (clear) {
+               pko_mem_count1.s.count = port_num;
+               cvmx_write_csr(CVMX_PKO_MEM_COUNT1, pko_mem_count1.u64);
+       }
+
+       if (OCTEON_IS_MODEL(OCTEON_CN3XXX)) {
+               union cvmx_pko_mem_debug9 debug9;
+               pko_reg_read_idx.s.index = cvmx_pko_get_base_queue(port_num);
+               cvmx_write_csr(CVMX_PKO_REG_READ_IDX, pko_reg_read_idx.u64);
+               debug9.u64 = cvmx_read_csr(CVMX_PKO_MEM_DEBUG9);
+               status->doorbell = debug9.cn38xx.doorbell;
+       } else {
+               union cvmx_pko_mem_debug8 debug8;
+               pko_reg_read_idx.s.index = cvmx_pko_get_base_queue(port_num);
+               cvmx_write_csr(CVMX_PKO_REG_READ_IDX, pko_reg_read_idx.u64);
+               debug8.u64 = cvmx_read_csr(CVMX_PKO_MEM_DEBUG8);
+               status->doorbell = debug8.cn58xx.doorbell;
+       }
+}
+
+/**
+ * Rate limit a PKO port to a max packets/sec. This function is only
+ * supported on CN57XX, CN56XX, CN55XX, and CN54XX.
+ *
+ * @port:      Port to rate limit
+ * @packets_s: Maximum packet/sec
+ * @burst:     Maximum number of packets to burst in a row before rate
+ *                  limiting cuts in.
+ *
+ * Returns Zero on success, negative on failure
+ */
+extern 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.
+ *
+ * @port:   Port to rate limit
+ * @bits_s: PKO rate limit in bits/sec
+ * @burst:  Maximum number of bits to burst before rate
+ *               limiting cuts in.
+ *
+ * Returns Zero on success, negative on failure
+ */
+extern int cvmx_pko_rate_limit_bits(int port, uint64_t bits_s, int burst);
+
+#endif /* __CVMX_PKO_H__ */
diff --git a/arch/mips/include/asm/octeon/cvmx-pow.h b/arch/mips/include/asm/octeon/cvmx-pow.h
new file mode 100644 (file)
index 0000000..999aefe
--- /dev/null
@@ -0,0 +1,1982 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/**
+ * Interface to the hardware Packet Order / Work 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 <asm/octeon/cvmx-pow-defs.h>
+
+#include "cvmx-scratch.h"
+#include "cvmx-wqe.h"
+
+/* Default to having all POW constancy checks turned on */
+#ifndef CVMX_ENABLE_POW_CHECKS
+#define CVMX_ENABLE_POW_CHECKS 1
+#endif
+
+enum cvmx_pow_tag_type {
+       /* Tag ordering is maintained */
+       CVMX_POW_TAG_TYPE_ORDERED   = 0L,
+       /* Tag ordering is maintained, and at most one PP has the tag */
+       CVMX_POW_TAG_TYPE_ATOMIC    = 1L,
+       /*
+        * The work queue entry from the order - NEVER tag switch from
+        * NULL to NULL
+        */
+       CVMX_POW_TAG_TYPE_NULL      = 2L,
+       /* A tag switch to NULL, and there is no space reserved in POW
+        * - NEVER tag switch to NULL_NULL
+        * - NEVER tag switch from NULL_NULL
+        * - NULL_NULL is entered at the beginning of time and on a deschedule.
+        * - NULL_NULL can be exited by a new work request. A NULL_SWITCH
+        * load can also switch the state to NULL
+        */
+       CVMX_POW_TAG_TYPE_NULL_NULL = 3L
+};
+
+/**
+ * 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 {
+       /*
+        * switch the tag (only) for this PP
+        * - the previous tag should be non-NULL in this case
+        * - tag switch response required
+        * - fields used: op, type, tag
+        */
+       CVMX_POW_TAG_OP_SWTAG = 0L,
+       /*
+        * switch the tag for this PP, with full information
+        * - this should be used when the previous tag is NULL
+        * - tag switch response required
+        * - fields used: address, op, grp, type, tag
+        */
+       CVMX_POW_TAG_OP_SWTAG_FULL = 1L,
+       /*
+        * switch the tag (and/or group) for this PP and de-schedule
+        * - OK to keep the tag the same and only change the group
+        * - fields used: op, no_sched, grp, type, tag
+        */
+       CVMX_POW_TAG_OP_SWTAG_DESCH = 2L,
+       /*
+        * just de-schedule
+        * - fields used: op, no_sched
+        */
+       CVMX_POW_TAG_OP_DESCH = 3L,
+       /*
+        * create an entirely new work queue entry
+        * - fields used: address, op, qos, grp, type, tag
+        */
+       CVMX_POW_TAG_OP_ADDWQ = 4L,
+       /*
+        * just update the work queue pointer and grp for this PP
+        * - fields used: address, op, grp
+        */
+       CVMX_POW_TAG_OP_UPDATE_WQP_GRP = 5L,
+       /*
+        * set the no_sched bit on the de-schedule list
+        *
+        * - does nothing if the selected entry is not on the
+        *   de-schedule list
+        *
+        * - does nothing if the stored work queue pointer does not
+        *   match the address field
+        *
+        * - fields used: address, index, op
+        *
+        *  Before issuing a *_NSCHED operation, SW must guarantee
+        *  that all prior deschedules and set/clr NSCHED operations
+        *  are complete and all prior switches are complete. The
+        *  hardware provides the opsdone bit and swdone bit for SW
+        *  polling. After issuing a *_NSCHED operation, SW must
+        *  guarantee that the set/clr NSCHED is complete before any
+        *  subsequent operations.
+        */
+       CVMX_POW_TAG_OP_SET_NSCHED = 6L,
+       /*
+        * clears the no_sched bit on the de-schedule list
+        *
+        * - does nothing if the selected entry is not on the
+        *   de-schedule list
+        *
+        * - does nothing if the stored work queue pointer does not
+        *   match the address field
+        *
+        * - fields used: address, index, op
+        *
+        * Before issuing a *_NSCHED operation, SW must guarantee that
+        * all prior deschedules and set/clr NSCHED operations are
+        * complete and all prior switches are complete. The hardware
+        * provides the opsdone bit and swdone bit for SW
+        * polling. After issuing a *_NSCHED operation, SW must
+        * guarantee that the set/clr NSCHED is complete before any
+        * subsequent operations.
+        */
+       CVMX_POW_TAG_OP_CLR_NSCHED = 7L,
+       /* do nothing */
+       CVMX_POW_TAG_OP_NOP = 15L
+} cvmx_pow_tag_op_t;
+
+/**
+ * This structure defines the store data on a store to POW
+ */
+typedef union {
+       uint64_t u64;
+       struct {
+               /*
+                * Don't reschedule this entry. no_sched is used for
+                * CVMX_POW_TAG_OP_SWTAG_DESCH and
+                * CVMX_POW_TAG_OP_DESCH
+                */
+               uint64_t no_sched:1;
+               uint64_t unused:2;
+               /* Tontains index of entry for a CVMX_POW_TAG_OP_*_NSCHED */
+               uint64_t index:13;
+               /* The operation to perform */
+               cvmx_pow_tag_op_t op:4;
+               uint64_t unused2:2;
+               /*
+                * The QOS level for the packet. qos is only used for
+                * CVMX_POW_TAG_OP_ADDWQ
+                */
+               uint64_t qos:3;
+               /*
+                * The group that the work queue entry will be
+                * scheduled to grp is used for CVMX_POW_TAG_OP_ADDWQ,
+                * CVMX_POW_TAG_OP_SWTAG_FULL,
+                * CVMX_POW_TAG_OP_SWTAG_DESCH, and
+                * CVMX_POW_TAG_OP_UPDATE_WQP_GRP
+                */
+               uint64_t grp:4;
+               /*
+                * The type of the tag. type is used for everything
+                * except CVMX_POW_TAG_OP_DESCH,
+                * CVMX_POW_TAG_OP_UPDATE_WQP_GRP, and
+                * CVMX_POW_TAG_OP_*_NSCHED
+                */
+               uint64_t type:3;
+               /*
+                * The actual tag. tag is used for everything except
+                * CVMX_POW_TAG_OP_DESCH,
+                * CVMX_POW_TAG_OP_UPDATE_WQP_GRP, and
+                * CVMX_POW_TAG_OP_*_NSCHED
+                */
+               uint64_t tag:32;
+       } s;
+} cvmx_pow_tag_req_t;
+
+/**
+ * This structure describes the address to load stuff from POW
+ */
+typedef union {
+       uint64_t u64;
+
+    /**
+     * Address for new work request loads (did<2:0> == 0)
+     */
+       struct {
+               /* Mips64 address region. Should be CVMX_IO_SEG */
+               uint64_t mem_region:2;
+               /* Must be zero */
+               uint64_t reserved_49_61:13;
+               /* Must be one */
+               uint64_t is_io:1;
+               /* the ID of POW -- did<2:0> == 0 in this case */
+               uint64_t did:8;
+               /* Must be zero */
+               uint64_t reserved_4_39:36;
+               /*
+                * If set, don't return load response until work is
+                * available.
+                */
+               uint64_t wait:1;
+               /* Must be zero */
+               uint64_t reserved_0_2:3;
+       } swork;
+
+    /**
+     * Address for loads to get POW internal status
+     */
+       struct {
+               /* Mips64 address region. Should be CVMX_IO_SEG */
+               uint64_t mem_region:2;
+               /* Must be zero */
+               uint64_t reserved_49_61:13;
+               /* Must be one */
+               uint64_t is_io:1;
+               /* the ID of POW -- did<2:0> == 1 in this case */
+               uint64_t did:8;
+               /* Must be zero */
+               uint64_t reserved_10_39:30;
+               /* The core id to get status for */
+               uint64_t coreid:4;
+               /*
+                * If set and get_cur is set, return reverse tag-list
+                * pointer rather than forward tag-list pointer.
+                */
+               uint64_t get_rev:1;
+               /*
+                * If set, return current status rather than pending
+                * status.
+                */
+               uint64_t get_cur:1;
+               /*
+                * If set, get the work-queue pointer rather than
+                * tag/type.
+                */
+               uint64_t get_wqp:1;
+               /* Must be zero */
+               uint64_t reserved_0_2:3;
+       } sstatus;
+
+    /**
+     * Address for memory loads to get POW internal state
+     */
+       struct {
+               /* Mips64 address region. Should be CVMX_IO_SEG */
+               uint64_t mem_region:2;
+               /* Must be zero */
+               uint64_t reserved_49_61:13;
+               /* Must be one */
+               uint64_t is_io:1;
+               /* the ID of POW -- did<2:0> == 2 in this case */
+               uint64_t did:8;
+               /* Must be zero */
+               uint64_t reserved_16_39:24;
+               /* POW memory index */
+               uint64_t index:11;
+               /*
+                * If set, return deschedule information rather than
+                * the standard response for work-queue index (invalid
+                * if the work-queue entry is not on the deschedule
+                * list).
+                */
+               uint64_t get_des:1;
+               /*
+                * If set, get the work-queue pointer rather than
+                * tag/type (no effect when get_des set).
+                */
+               uint64_t get_wqp:1;
+               /* Must be zero */
+               uint64_t reserved_0_2:3;
+       } smemload;
+
+    /**
+     * Address for index/pointer loads
+     */
+       struct {
+               /* Mips64 address region. Should be CVMX_IO_SEG */
+               uint64_t mem_region:2;
+               /* Must be zero */
+               uint64_t reserved_49_61:13;
+               /* Must be one */
+               uint64_t is_io:1;
+               /* the ID of POW -- did<2:0> == 3 in this case */
+               uint64_t did:8;
+               /* Must be zero */
+               uint64_t reserved_9_39:31;
+               /*
+                * when {get_rmt ==0 AND get_des_get_tail == 0}, this
+                * field selects one of eight POW internal-input
+                * queues (0-7), one per QOS level; values 8-15 are
+                * illegal in this case; when {get_rmt ==0 AND
+                * get_des_get_tail == 1}, this field selects one of
+                * 16 deschedule lists (per group); when get_rmt ==1,
+                * this field selects one of 16 memory-input queue
+                * lists.  The two memory-input queue lists associated
+                * with each QOS level are:
+                *
+                * - qosgrp = 0, qosgrp = 8:      QOS0
+                * - qosgrp = 1, qosgrp = 9:      QOS1
+                * - qosgrp = 2, qosgrp = 10:     QOS2
+                * - qosgrp = 3, qosgrp = 11:     QOS3
+                * - qosgrp = 4, qosgrp = 12:     QOS4
+                * - qosgrp = 5, qosgrp = 13:     QOS5
+                * - qosgrp = 6, qosgrp = 14:     QOS6
+                * - qosgrp = 7, qosgrp = 15:     QOS7
+                */
+               uint64_t qosgrp:4;
+               /*
+                * If set and get_rmt is clear, return deschedule list
+                * indexes rather than indexes for the specified qos
+                * level; if set and get_rmt is set, return the tail
+                * pointer rather than the head pointer for the
+                * specified qos level.
+                */
+               uint64_t get_des_get_tail:1;
+               /*
+                * If set, return remote pointers rather than the
+                * local indexes for the specified qos level.
+                */
+               uint64_t get_rmt:1;
+               /* Must be zero */
+               uint64_t reserved_0_2:3;
+       } sindexload;
+
+    /**
+     * 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 {
+               /* Mips64 address region. Should be CVMX_IO_SEG */
+               uint64_t mem_region:2;
+               /* Must be zero */
+               uint64_t reserved_49_61:13;
+               /* Must be one */
+               uint64_t is_io:1;
+               /* the ID of POW -- did<2:0> == 4 in this case */
+               uint64_t did:8;
+               /* Must be zero */
+               uint64_t 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 {
+       uint64_t u64;
+
+    /**
+     * Response to new work request loads
+     */
+       struct {
+               /*
+                * Set when no new work queue entry was returned.  *
+                * If there was de-scheduled work, the HW will
+                * definitely return it. When this bit is set, it
+                * could mean either mean:
+                *
+                * - There was no work, or
+                *
+                * - There was no work that the HW could find. This
+                *   case can happen, regardless of the wait bit value
+                *   in the original request, when there is work in
+                *   the IQ's that is too deep down the list.
+                */
+               uint64_t no_work:1;
+               /* Must be zero */
+               uint64_t reserved_40_62:23;
+               /* 36 in O1 -- the work queue pointer */
+               uint64_t addr:40;
+       } s_work;
+
+    /**
+     * Result for a POW Status Load (when get_cur==0 and get_wqp==0)
+     */
+       struct {
+               uint64_t reserved_62_63:2;
+               /* Set when there is a pending non-NULL SWTAG or
+                * SWTAG_FULL, and the POW entry has not left the list
+                * for the original tag. */
+               uint64_t pend_switch:1;
+               /* Set when SWTAG_FULL and pend_switch is set. */
+               uint64_t pend_switch_full:1;
+               /*
+                * Set when there is a pending NULL SWTAG, or an
+                * implicit switch to NULL.
+                */
+               uint64_t pend_switch_null:1;
+               /* Set when there is a pending DESCHED or SWTAG_DESCHED. */
+               uint64_t pend_desched:1;
+               /*
+                * Set when there is a pending SWTAG_DESCHED and
+                * pend_desched is set.
+                */
+               uint64_t pend_desched_switch:1;
+               /* Set when nosched is desired and pend_desched is set. */
+               uint64_t pend_nosched:1;
+               /* Set when there is a pending GET_WORK. */
+               uint64_t pend_new_work:1;
+               /*
+                * When pend_new_work is set, this bit indicates that
+                * the wait bit was set.
+                */
+               uint64_t pend_new_work_wait:1;
+               /* Set when there is a pending NULL_RD. */
+               uint64_t pend_null_rd:1;
+               /* Set when there is a pending CLR_NSCHED. */
+               uint64_t pend_nosched_clr:1;
+               uint64_t reserved_51:1;
+               /* This is the index when pend_nosched_clr is set. */
+               uint64_t pend_index:11;
+               /*
+                * This is the new_grp when (pend_desched AND
+                * pend_desched_switch) is set.
+                */
+               uint64_t pend_grp:4;
+               uint64_t reserved_34_35:2;
+               /*
+                * This is the tag type when pend_switch or
+                * (pend_desched AND pend_desched_switch) are set.
+                */
+               uint64_t pend_type:2;
+               /*
+                * - this is the tag when pend_switch or (pend_desched
+                *    AND pend_desched_switch) are set.
+                */
+               uint64_t pend_tag:32;
+       } s_sstatus0;
+
+    /**
+     * Result for a POW Status Load (when get_cur==0 and get_wqp==1)
+     */
+       struct {
+               uint64_t reserved_62_63:2;
+               /*
+                * Set when there is a pending non-NULL SWTAG or
+                * SWTAG_FULL, and the POW entry has not left the list
+                * for the original tag.
+                */
+               uint64_t pend_switch:1;
+               /* Set when SWTAG_FULL and pend_switch is set. */
+               uint64_t pend_switch_full:1;
+               /*
+                * Set when there is a pending NULL SWTAG, or an
+                * implicit switch to NULL.
+                */
+               uint64_t pend_switch_null:1;
+               /*
+                * Set when there is a pending DESCHED or
+                * SWTAG_DESCHED.
+                */
+               uint64_t pend_desched:1;
+               /*
+                * Set when there is a pending SWTAG_DESCHED and
+                * pend_desched is set.
+                */
+               uint64_t pend_desched_switch:1;
+               /* Set when nosched is desired and pend_desched is set. */
+               uint64_t pend_nosched:1;
+               /* Set when there is a pending GET_WORK. */
+               uint64_t pend_new_work:1;
+               /*
+                * When pend_new_work is set, this bit indicates that
+                * the wait bit was set.
+                */
+               uint64_t pend_new_work_wait:1;
+               /* Set when there is a pending NULL_RD. */
+               uint64_t pend_null_rd:1;
+               /* Set when there is a pending CLR_NSCHED. */
+               uint64_t pend_nosched_clr:1;
+               uint64_t reserved_51:1;
+               /* This is the index when pend_nosched_clr is set. */
+               uint64_t pend_index:11;
+               /*
+                * This is the new_grp when (pend_desched AND
+                * pend_desched_switch) is set.
+                */
+               uint64_t pend_grp:4;
+               /* This is the wqp when pend_nosched_clr is set. */
+               uint64_t pend_wqp:36;
+       } s_sstatus1;
+
+    /**
+     * Result for a POW Status Load (when get_cur==1, get_wqp==0, and
+     * get_rev==0)
+     */
+       struct {
+               uint64_t reserved_62_63:2;
+               /*
+                * Points to the next POW entry in the tag list when
+                * tail == 0 (and tag_type is not NULL or NULL_NULL).
+                */
+               uint64_t link_index:11;
+               /* The POW entry attached to the core. */
+               uint64_t index:11;
+               /*
+                * The group attached to the core (updated when new
+                * tag list entered on SWTAG_FULL).
+                */
+               uint64_t grp:4;
+               /*
+                * Set when this POW entry is at the head of its tag
+                * list (also set when in the NULL or NULL_NULL
+                * state).
+                */
+               uint64_t head:1;
+               /*
+                * Set when this POW entry is at the tail of its tag
+                * list (also set when in the NULL or NULL_NULL
+                * state).
+                */
+               uint64_t tail:1;
+               /*
+                * The tag type attached to the core (updated when new
+                * tag list entered on SWTAG, SWTAG_FULL, or
+                * SWTAG_DESCHED).
+                */
+               uint64_t tag_type:2;
+               /*
+                * The tag attached to the core (updated when new tag
+                * list entered on SWTAG, SWTAG_FULL, or
+                * SWTAG_DESCHED).
+                */
+               uint64_t tag:32;
+       } s_sstatus2;
+
+    /**
+     * Result for a POW Status Load (when get_cur==1, get_wqp==0, and get_rev==1)
+     */
+       struct {
+               uint64_t reserved_62_63:2;
+               /*
+                * Points to the prior POW entry in the tag list when
+                * head == 0 (and tag_type is not NULL or
+                * NULL_NULL). This field is unpredictable when the
+                * core's state is NULL or NULL_NULL.
+                */
+               uint64_t revlink_index:11;
+               /* The POW entry attached to the core. */
+               uint64_t index:11;
+               /*
+                * The group attached to the core (updated when new
+                * tag list entered on SWTAG_FULL).
+                */
+               uint64_t grp:4;
+               /* Set when this POW entry is at the head of its tag
+                * list (also set when in the NULL or NULL_NULL
+                * state).
+                */
+               uint64_t head:1;
+               /*
+                * Set when this POW entry is at the tail of its tag
+                * list (also set when in the NULL or NULL_NULL
+                * state).
+                */
+               uint64_t tail:1;
+               /*
+                * The tag type attached to the core (updated when new
+                * tag list entered on SWTAG, SWTAG_FULL, or
+                * SWTAG_DESCHED).
+                */
+               uint64_t tag_type:2;
+               /*
+                * The tag attached to the core (updated when new tag
+                * list entered on SWTAG, SWTAG_FULL, or
+                * SWTAG_DESCHED).
+                */
+               uint64_t tag:32;
+       } s_sstatus3;
+
+    /**
+     * Result for a POW Status Load (when get_cur==1, get_wqp==1, and
+     * get_rev==0)
+     */
+       struct {
+               uint64_t reserved_62_63:2;
+               /*
+                * Points to the next POW entry in the tag list when
+                * tail == 0 (and tag_type is not NULL or NULL_NULL).
+                */
+               uint64_t link_index:11;
+               /* The POW entry attached to the core. */
+               uint64_t index:11;
+               /*
+                * The group attached to the core (updated when new
+                * tag list entered on SWTAG_FULL).
+                */
+               uint64_t grp:4;
+               /*
+                * The wqp attached to the core (updated when new tag
+                * list entered on SWTAG_FULL).
+                */
+               uint64_t wqp:36;
+       } s_sstatus4;
+
+    /**
+     * Result for a POW Status Load (when get_cur==1, get_wqp==1, and
+     * get_rev==1)
+     */
+       struct {
+               uint64_t reserved_62_63:2;
+               /*
+                * Points to the prior POW entry in the tag list when
+                * head == 0 (and tag_type is not NULL or
+                * NULL_NULL). This field is unpredictable when the
+                * core's state is NULL or NULL_NULL.
+                */
+               uint64_t revlink_index:11;
+               /* The POW entry attached to the core. */
+               uint64_t index:11;
+               /*
+                * The group attached to the core (updated when new
+                * tag list entered on SWTAG_FULL).
+                */
+               uint64_t grp:4;
+               /*
+                * The wqp attached to the core (updated when new tag
+                * list entered on SWTAG_FULL).
+                */
+               uint64_t wqp:36;
+       } s_sstatus5;
+
+    /**
+     * Result For POW Memory Load (get_des == 0 and get_wqp == 0)
+     */
+       struct {
+               uint64_t reserved_51_63:13;
+               /*
+                * The next entry in the input, free, descheduled_head
+                * list (unpredictable if entry is the tail of the
+                * list).
+                */
+               uint64_t next_index:11;
+               /* The group of the POW entry. */
+               uint64_t grp:4;
+               uint64_t reserved_35:1;
+               /*
+                * Set when this POW entry is at the tail of its tag
+                * list (also set when in the NULL or NULL_NULL
+                * state).
+                */
+               uint64_t tail:1;
+               /* The tag type of the POW entry. */
+               uint64_t tag_type:2;
+               /* The tag of the POW entry. */
+               uint64_t tag:32;
+       } s_smemload0;
+
+    /**
+     * Result For POW Memory Load (get_des == 0 and get_wqp == 1)
+     */
+       struct {
+               uint64_t reserved_51_63:13;
+               /*
+                * The next entry in the input, free, descheduled_head
+                * list (unpredictable if entry is the tail of the
+                * list).
+                */
+               uint64_t next_index:11;
+               /* The group of the POW entry. */
+               uint64_t grp:4;
+               /* The WQP held in the POW entry. */
+               uint64_t wqp:36;
+       } s_smemload1;
+
+    /**
+     * Result For POW Memory Load (get_des == 1)
+     */
+       struct {
+               uint64_t reserved_51_63:13;
+               /*
+                * The next entry in the tag list connected to the
+                * descheduled head.
+                */
+               uint64_t fwd_index:11;
+               /* The group of the POW entry. */
+               uint64_t grp:4;
+               /* The nosched bit for the POW entry. */
+               uint64_t nosched:1;
+               /* There is a pending tag switch */
+               uint64_t pend_switch:1;
+               /*
+                * The next tag type for the new tag list when
+                * pend_switch is set.
+                */
+               uint64_t pend_type:2;
+               /*
+                * The next tag for the new tag list when pend_switch
+                * is set.
+                */
+               uint64_t pend_tag:32;
+       } s_smemload2;
+
+    /**
+     * Result For POW Index/Pointer Load (get_rmt == 0/get_des_get_tail == 0)
+     */
+       struct {
+               uint64_t reserved_52_63:12;
+               /*
+                * set when there is one or more POW entries on the
+                * free list.
+                */
+               uint64_t free_val:1;
+               /*
+                * set when there is exactly one POW entry on the free
+                * list.
+                */
+               uint64_t free_one:1;
+               uint64_t reserved_49:1;
+               /*
+                * when free_val is set, indicates the first entry on
+                * the free list.
+                */
+               uint64_t free_head:11;
+               uint64_t reserved_37:1;
+               /*
+                * when free_val is set, indicates the last entry on
+                * the free list.
+                */
+               uint64_t free_tail:11;
+               /*
+                * set when there is one or more POW entries on the
+                * input Q list selected by qosgrp.
+                */
+               uint64_t loc_val:1;
+               /*
+                * set when there is exactly one POW entry on the
+                * input Q list selected by qosgrp.
+                */
+               uint64_t loc_one:1;
+               uint64_t reserved_23:1;
+               /*
+                * when loc_val is set, indicates the first entry on
+                * the input Q list selected by qosgrp.
+                */
+               uint64_t loc_head:11;
+               uint64_t reserved_11:1;
+               /*
+                * when loc_val is set, indicates the last entry on
+                * the input Q list selected by qosgrp.
+                */
+               uint64_t loc_tail:11;
+       } sindexload0;
+
+    /**
+     * Result For POW Index/Pointer Load (get_rmt == 0/get_des_get_tail == 1)
+     */
+       struct {
+               uint64_t reserved_52_63:12;
+               /*
+                * set when there is one or more POW entries on the
+                * nosched list.
+                */
+               uint64_t nosched_val:1;
+               /*
+                * set when there is exactly one POW entry on the
+                * nosched list.
+                */
+               uint64_t nosched_one:1;
+               uint64_t reserved_49:1;
+               /*
+                * when nosched_val is set, indicates the first entry
+                * on the nosched list.
+                */
+               uint64_t nosched_head:11;
+               uint64_t reserved_37:1;
+               /*
+                * when nosched_val is set, indicates the last entry
+                * on the nosched list.
+                */
+               uint64_t nosched_tail:11;
+               /*
+                * set when there is one or more descheduled heads on
+                * the descheduled list selected by qosgrp.
+                */
+               uint64_t des_val:1;
+               /*
+                * set when there is exactly one descheduled head on
+                * the descheduled list selected by qosgrp.
+                */
+               uint64_t des_one:1;
+               uint64_t reserved_23:1;
+               /*
+                * when des_val is set, indicates the first
+                * descheduled head on the descheduled list selected
+                * by qosgrp.
+                */
+               uint64_t des_head:11;
+               uint64_t reserved_11:1;
+               /*
+                * when des_val is set, indicates the last descheduled
+                * head on the descheduled list selected by qosgrp.
+                */
+               uint64_t des_tail:11;
+       } sindexload1;
+
+    /**
+     * Result For POW Index/Pointer Load (get_rmt == 1/get_des_get_tail == 0)
+     */
+       struct {
+               uint64_t reserved_39_63:25;
+               /*
+                * Set when this DRAM list is the current head
+                * (i.e. is the next to be reloaded when the POW
+                * hardware reloads a POW entry from DRAM). The POW
+                * hardware alternates between the two DRAM lists
+                * associated with a QOS level when it reloads work
+                * from DRAM into the POW unit.
+                */
+               uint64_t rmt_is_head:1;
+               /*
+                * Set when the DRAM portion of the input Q list
+                * selected by qosgrp contains one or more pieces of
+                * work.
+                */
+               uint64_t rmt_val:1;
+               /*
+                * Set when the DRAM portion of the input Q list
+                * selected by qosgrp contains exactly one piece of
+                * work.
+                */
+               uint64_t rmt_one:1;
+               /*
+                * When rmt_val is set, indicates the first piece of
+                * work on the DRAM input Q list selected by
+                * qosgrp.
+                */
+               uint64_t rmt_head:36;
+       } sindexload2;
+
+    /**
+     * Result For POW Index/Pointer Load (get_rmt ==
+     * 1/get_des_get_tail == 1)
+     */
+       struct {
+               uint64_t reserved_39_63:25;
+               /*
+                * set when this DRAM list is the current head
+                * (i.e. is the next to be reloaded when the POW
+                * hardware reloads a POW entry from DRAM). The POW
+                * hardware alternates between the two DRAM lists
+                * associated with a QOS level when it reloads work
+                * from DRAM into the POW unit.
+                */
+               uint64_t rmt_is_head:1;
+               /*
+                * set when the DRAM portion of the input Q list
+                * selected by qosgrp contains one or more pieces of
+                * work.
+                */
+               uint64_t rmt_val:1;
+               /*
+                * set when the DRAM portion of the input Q list
+                * selected by qosgrp contains exactly one piece of
+                * work.
+                */
+               uint64_t rmt_one:1;
+               /*
+                * when rmt_val is set, indicates the last piece of
+                * work on the DRAM input Q list selected by
+                * qosgrp.
+                */
+               uint64_t rmt_tail:36;
+       } sindexload3;
+
+    /**
+     * Response to NULL_RD request loads
+     */
+       struct {
+               uint64_t unused:62;
+               /* of type cvmx_pow_tag_type_t. state is one of the
+                * following:
+                *
+                * - CVMX_POW_TAG_TYPE_ORDERED
+                * - CVMX_POW_TAG_TYPE_ATOMIC
+                * - CVMX_POW_TAG_TYPE_NULL
+                * - CVMX_POW_TAG_TYPE_NULL_NULL
+                */
+               uint64_t state:2;
+       } s_null_rd;
+
+} cvmx_pow_tag_load_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 {
+    /**
+     * Unsigned 64 bit integer representation of store address
+     */
+       uint64_t u64;
+
+       struct {
+               /* Memory region.  Should be CVMX_IO_SEG in most cases */
+               uint64_t mem_reg:2;
+               uint64_t reserved_49_61:13;     /* Must be zero */
+               uint64_t is_io:1;       /* Must be one */
+               /* Device ID of POW.  Note that different sub-dids are used. */
+               uint64_t did:8;
+               uint64_t reserved_36_39:4;      /* Must be zero */
+               /* Address field. addr<2:0> must be zero */
+               uint64_t addr:36;
+       } stag;
+} cvmx_pow_tag_store_addr_t;
+
+/**
+ * decode of the store data when an IOBDMA SENDSINGLE is sent to POW
+ */
+typedef union {
+       uint64_t u64;
+
+       struct {
+               /*
+                * the (64-bit word) location in scratchpad to write
+                * to (if len != 0)
+                */
+               uint64_t scraddr:8;
+               /* the number of words in the response (0 => no response) */
+               uint64_t len:8;
+               /* the ID of the device on the non-coherent bus */
+               uint64_t did:8;
+               uint64_t unused:36;
+               /* if set, don't return load response until work is available */
+               uint64_t wait:1;
+               uint64_t unused2:3;
+       } s;
+
+} cvmx_pow_iobdma_store_t;
+
+/* CSR typedefs have been moved to cvmx-csr-*.h */
+
+/**
+ * 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.
+ *
+ * Returns Current tag
+ */
+static inline cvmx_pow_tag_req_t cvmx_pow_get_current_tag(void)
+{
+       cvmx_pow_load_addr_t load_addr;
+       cvmx_pow_tag_load_resp_t load_resp;
+       cvmx_pow_tag_req_t result;
+
+       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 = cvmx_read_csr(load_addr.u64);
+       result.u64 = 0;
+       result.s.grp = load_resp.s_sstatus2.grp;
+       result.s.index = load_resp.s_sstatus2.index;
+       result.s.type = load_resp.s_sstatus2.tag_type;
+       result.s.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.
+ *
+ * Returns 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;
+
+       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 = cvmx_read_csr(load_addr.u64);
+       return (cvmx_wqe_t *) cvmx_phys_to_ptr(load_resp.s_sstatus4.wqp);
+}
+
+#ifndef CVMX_MF_CHORD
+#define CVMX_MF_CHORD(dest)         CVMX_RDHWR(dest, 30)
+#endif
+
+/**
+ * Print a warning if a tag switch is pending for this core
+ *
+ * @function: Function name checking for a pending tag switch
+ */
+static inline void __cvmx_pow_warn_if_pending_switch(const char *function)
+{
+       uint64_t switch_complete;
+       CVMX_MF_CHORD(switch_complete);
+       if (!switch_complete)
+               pr_warning("%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 uint64_t MAX_CYCLES = 1ull << 31;
+       uint64_t switch_complete;
+       uint64_t start_cycle = cvmx_get_cycle();
+       while (1) {
+               CVMX_MF_CHORD(switch_complete);
+               if (unlikely(switch_complete))
+                       break;
+               if (unlikely(cvmx_get_cycle() > start_cycle + MAX_CYCLES)) {
+                       pr_warning("Tag switch is taking a long time, "
+                                  "possible deadlock\n");
+                       start_cycle = -MAX_CYCLES - 1;
+               }
+       }
+}
+
+/**
+ * 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.
+ *
+ * @wait:   When set, call stalls until work becomes avaiable, or times out.
+ *               If not set, returns immediately.
+ *
+ * Returns 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;
+       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 = cvmx_read_csr(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.
+ *
+ * @wait:   When set, call stalls until work becomes avaiable, or times out.
+ *               If not set, returns immediately.
+ *
+ * Returns 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)
+{
+       if (CVMX_ENABLE_POW_CHECKS)
+               __cvmx_pow_warn_if_pending_switch(__func__);
+
+       /* 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.
+ *
+ * Returns Returns the POW state of type cvmx_pow_tag_type_t.
+ */
+static inline enum cvmx_pow_tag_type cvmx_pow_work_request_null_rd(void)
+{
+       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__);
+
+       /* Must not have a switch pending when requesting work */
+       cvmx_pow_tag_sw_wait();
+
+       ptr.u64 = 0;
+       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 = cvmx_read_csr(ptr.u64);
+
+       return (enum cvmx_pow_tag_type) 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.
+ *
+ * @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.
+ *
+ * @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.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.
+ *
+ * @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.
+ *
+ * @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)
+{
+       if (CVMX_ENABLE_POW_CHECKS)
+               __cvmx_pow_warn_if_pending_switch(__func__);
+
+       /* 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.
+ *
+ * @scr_addr: Scratch memory address to get result from Byte address,
+ *            must be 8 byte aligned.
+ *
+ * Returns 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.
+ *
+ * @wqe_ptr: pointer to a work queue entry returned by the POW
+ *
+ * Returns 0 if pointer is valid
+ *         1 if invalid (no work was returned)
+ */
+static inline uint64_t cvmx_pow_work_invalid(cvmx_wqe_t *wqe_ptr)
+{
+       return wqe_ptr == NULL;
+}
+
+/**
+ * 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.
+ *
+ * @tag:      new tag value
+ * @tag_type: new tag type (ordered or atomic)
+ */
+static inline void cvmx_pow_tag_sw_nocheck(uint32_t tag,
+                                          enum cvmx_pow_tag_type tag_type)
+{
+       cvmx_addr_t ptr;
+       cvmx_pow_tag_req_t tag_req;
+
+       if (CVMX_ENABLE_POW_CHECKS) {
+               cvmx_pow_tag_req_t current_tag;
+               __cvmx_pow_warn_if_pending_switch(__func__);
+               current_tag = cvmx_pow_get_current_tag();
+               if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL_NULL)
+                       pr_warning("%s called with NULL_NULL tag\n",
+                                  __func__);
+               if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL)
+                       pr_warning("%s called with NULL tag\n", __func__);
+               if ((current_tag.s.type == tag_type)
+                  && (current_tag.s.tag == tag))
+                       pr_warning("%s called to perform a tag switch to the "
+                                  "same tag\n",
+                            __func__);
+               if (tag_type == CVMX_POW_TAG_TYPE_NULL)
+                       pr_warning("%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;
+       tag_req.s.op = CVMX_POW_TAG_OP_SWTAG;
+       tag_req.s.tag = tag;
+       tag_req.s.type = tag_type;
+
+       ptr.u64 = 0;
+       ptr.sio.mem_region = CVMX_IO_SEG;
+       ptr.sio.is_io = 1;
+       ptr.sio.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.
+ *
+ * @tag:      new tag value
+ * @tag_type: new tag type (ordered or atomic)
+ */
+static inline void cvmx_pow_tag_sw(uint32_t tag,
+                                  enum cvmx_pow_tag_type tag_type)
+{
+       if (CVMX_ENABLE_POW_CHECKS)
+               __cvmx_pow_warn_if_pending_switch(__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.
+        */
+
+       /*
+        * 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.
+ *
+ * @wqp:      pointer to work queue entry to submit.  This entry is
+ *            updated to match the other parameters
+ * @tag:      tag value to be assigned to work queue entry
+ * @tag_type: type of tag
+ * @group:    group value for the work queue entry.
+ */
+static inline void cvmx_pow_tag_sw_full_nocheck(cvmx_wqe_t *wqp, uint32_t tag,
+                                               enum cvmx_pow_tag_type tag_type,
+                                               uint64_t group)
+{
+       cvmx_addr_t ptr;
+       cvmx_pow_tag_req_t tag_req;
+
+       if (CVMX_ENABLE_POW_CHECKS) {
+               cvmx_pow_tag_req_t current_tag;
+               __cvmx_pow_warn_if_pending_switch(__func__);
+               current_tag = cvmx_pow_get_current_tag();
+               if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL_NULL)
+                       pr_warning("%s called with NULL_NULL tag\n",
+                                  __func__);
+               if ((current_tag.s.type == tag_type)
+                  && (current_tag.s.tag == tag))
+                       pr_warning("%s called to perform a tag switch to "
+                                  "the same tag\n",
+                            __func__);
+               if (tag_type == CVMX_POW_TAG_TYPE_NULL)
+                       pr_warning("%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))
+                       if (wqp != cvmx_pow_get_current_wqp())
+                               pr_warning("%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;
+       tag_req.s.op = CVMX_POW_TAG_OP_SWTAG_FULL;
+       tag_req.s.tag = tag;
+       tag_req.s.type = tag_type;
+       tag_req.s.grp = group;
+
+       ptr.u64 = 0;
+       ptr.sio.mem_region = CVMX_IO_SEG;
+       ptr.sio.is_io = 1;
+       ptr.sio.did = CVMX_OCT_DID_TAG_SWTAG;
+       ptr.sio.offset = CAST64(wqp);
+
+       /*
+        * 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.
+ *
+ * @wqp:      pointer to work queue entry to submit.  This entry is updated
+ *            to match the other parameters
+ * @tag:      tag value to be assigned to work queue entry
+ * @tag_type: type of tag
+ * @group:      group value for the work queue entry.
+ */
+static inline void cvmx_pow_tag_sw_full(cvmx_wqe_t *wqp, uint32_t tag,
+                                       enum cvmx_pow_tag_type tag_type,
+                                       uint64_t group)
+{
+       if (CVMX_ENABLE_POW_CHECKS)
+               __cvmx_pow_warn_if_pending_switch(__func__);
+
+       /*
+        * 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)
+{
+       cvmx_addr_t ptr;
+       cvmx_pow_tag_req_t tag_req;
+
+       if (CVMX_ENABLE_POW_CHECKS) {
+               cvmx_pow_tag_req_t current_tag;
+               __cvmx_pow_warn_if_pending_switch(__func__);
+               current_tag = cvmx_pow_get_current_tag();
+               if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL_NULL)
+                       pr_warning("%s called with NULL_NULL tag\n",
+                                  __func__);
+               if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL)
+                       pr_warning("%s called when we already have a "
+                                  "NULL tag\n",
+                            __func__);
+       }
+
+       tag_req.u64 = 0;
+       tag_req.s.op = CVMX_POW_TAG_OP_SWTAG;
+       tag_req.s.type = CVMX_POW_TAG_TYPE_NULL;
+
+       ptr.u64 = 0;
+       ptr.sio.mem_region = CVMX_IO_SEG;
+       ptr.sio.is_io = 1;
+       ptr.sio.did = CVMX_OCT_DID_TAG_TAG1;
+
+       cvmx_write_io(ptr.u64, tag_req.u64);
+
+       /* switch to NULL completes immediately */
+}
+
+/**
+ * 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)
+{
+       if (CVMX_ENABLE_POW_CHECKS)
+               __cvmx_pow_warn_if_pending_switch(__func__);
+
+       /*
+        * 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();
+
+       /* switch to NULL completes immediately */
+}
+
+/**
+ * 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.
+ *
+ * @wqp:      pointer to work queue entry to submit.  This entry is
+ *            updated to match the other parameters
+ * @tag:      tag value to be assigned to work queue entry
+ * @tag_type: type of tag
+ * @qos:      Input queue to add to.
+ * @grp:      group value for the work queue entry.
+ */
+static inline void cvmx_pow_work_submit(cvmx_wqe_t *wqp, uint32_t tag,
+                                       enum cvmx_pow_tag_type tag_type,
+                                       uint64_t qos, uint64_t grp)
+{
+       cvmx_addr_t ptr;
+       cvmx_pow_tag_req_t tag_req;
+
+       wqp->qos = qos;
+       wqp->tag = tag;
+       wqp->tag_type = tag_type;
+       wqp->grp = grp;
+
+       tag_req.u64 = 0;
+       tag_req.s.op = CVMX_POW_TAG_OP_ADDWQ;
+       tag_req.s.type = tag_type;
+       tag_req.s.tag = tag;
+       tag_req.s.qos = qos;
+       tag_req.s.grp = grp;
+
+       ptr.u64 = 0;
+       ptr.sio.mem_region = CVMX_IO_SEG;
+       ptr.sio.is_io = 1;
+       ptr.sio.did = CVMX_OCT_DID_TAG_TAG1;
+       ptr.sio.offset = 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.
+ *
+ * @core_num:   core to apply mask to
+ * @mask:   Group mask. There are 16 groups, so only bits 0-15 are valid,
+ *               representing groups 0-15.
+ *               Each 1 bit in the mask enables the core to accept work from
+ *               the corresponding group.
+ */
+static inline void cvmx_pow_set_group_mask(uint64_t core_num, uint64_t mask)
+{
+       union cvmx_pow_pp_grp_mskx grp_msk;
+
+       grp_msk.u64 = cvmx_read_csr(CVMX_POW_PP_GRP_MSKX(core_num));
+       grp_msk.s.grp_msk = mask;
+       cvmx_write_csr(CVMX_POW_PP_GRP_MSKX(core_num), grp_msk.u64);
+}
+
+/**
+ * This function sets POW static priorities for a core. Each input queue has
+ * an associated priority value.
+ *
+ * @core_num:   core to apply priorities to
+ * @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(uint64_t core_num,
+                                        const uint8_t priority[])
+{
+       /* POW priorities are supported on CN5xxx and later */
+       if (!OCTEON_IS_MODEL(OCTEON_CN3XXX)) {
+               union cvmx_pow_pp_grp_mskx grp_msk;
+
+               grp_msk.u64 = cvmx_read_csr(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];
+
+               /* Detect gaps between priorities and flag error */
+               {
+                       int i;
+                       uint32_t 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)) {
+                               pr_err("POW static priorities should be "
+                                      "contiguous (0x%llx)\n",
+                                    (unsigned long long)prio_mask);
+                               return;
+                       }
+               }
+
+               cvmx_write_csr(CVMX_POW_PP_GRP_MSKX(core_num), grp_msk.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 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.
+ *
+ * @tag:      New tag value
+ * @tag_type: New tag type
+ * @group:    New group value
+ * @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(
+       uint32_t tag,
+       enum cvmx_pow_tag_type tag_type,
+       uint64_t group,
+       uint64_t no_sched)
+{
+       cvmx_addr_t ptr;
+       cvmx_pow_tag_req_t tag_req;
+
+       if (CVMX_ENABLE_POW_CHECKS) {
+               cvmx_pow_tag_req_t current_tag;
+               __cvmx_pow_warn_if_pending_switch(__func__);
+               current_tag = cvmx_pow_get_current_tag();
+               if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL_NULL)
+                       pr_warning("%s called with NULL_NULL tag\n",
+                                  __func__);
+               if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL)
+                       pr_warning("%s called with NULL tag. Deschedule not "
+                                  "allowed from NULL state\n",
+                            __func__);
+               if ((current_tag.s.type != CVMX_POW_TAG_TYPE_ATOMIC)
+                       && (tag_type != CVMX_POW_TAG_TYPE_ATOMIC))
+                       pr_warning("%s called where neither the before or "
+                                  "after tag is ATOMIC\n",
+                            __func__);
+       }
+
+       tag_req.u64 = 0;
+       tag_req.s.op = CVMX_POW_TAG_OP_SWTAG_DESCH;
+       tag_req.s.tag = tag;
+       tag_req.s.type = tag_type;
+       tag_req.s.grp = group;
+       tag_req.s.no_sched = no_sched;
+
+       ptr.u64 = 0;
+       ptr.sio.mem_region = CVMX_IO_SEG;
+       ptr.sio.is_io = 1;
+       ptr.sio.did = CVMX_OCT_DID_TAG_TAG3;
+       /*
+        * since TAG3 is used, this store will clear the local pending
+        * switch bit.
+        */
+       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.
+ *
+ * @tag:      New tag value
+ * @tag_type: New tag type
+ * @group:    New group value
+ * @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(uint32_t tag,
+                                          enum cvmx_pow_tag_type tag_type,
+                                          uint64_t group, uint64_t no_sched)
+{
+       if (CVMX_ENABLE_POW_CHECKS)
+               __cvmx_pow_warn_if_pending_switch(__func__);
+
+       /* 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.
+ *
+ * @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(uint64_t no_sched)
+{
+       cvmx_addr_t ptr;
+       cvmx_pow_tag_req_t tag_req;
+
+       if (CVMX_ENABLE_POW_CHECKS) {
+               cvmx_pow_tag_req_t current_tag;
+               __cvmx_pow_warn_if_pending_switch(__func__);
+               current_tag = cvmx_pow_get_current_tag();
+               if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL_NULL)
+                       pr_warning("%s called with NULL_NULL tag\n",
+                                  __func__);
+               if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL)
+                       pr_warning("%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;
+       tag_req.s.op = CVMX_POW_TAG_OP_DESCH;
+       tag_req.s.no_sched = no_sched;
+
+       ptr.u64 = 0;
+       ptr.sio.mem_region = CVMX_IO_SEG;
+       ptr.sio.is_io = 1;
+       ptr.sio.did = CVMX_OCT_DID_TAG_TAG3;
+       /*
+        * since TAG3 is used, this store will clear the local pending
+        * switch bit.
+        */
+       cvmx_write_io(ptr.u64, tag_req.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.
+ *
+ * @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.
+ *
+ * @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.
+ *
+ * Returns 32 bit value of the combined hw and sw bits.
+ */
+static inline uint32_t cvmx_pow_tag_compose(uint64_t sw_bits, uint64_t 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
+ *
+ * @tag:    32 bit tag value
+ *
+ * Returns N bit software tag value, where N is configurable with the
+ * CVMX_TAG_SW_BITS define
+ */
+static inline uint32_t cvmx_pow_tag_get_sw_bits(uint64_t 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
+ *
+ * @tag:    32 bit tag value
+ *
+ * Returns (32 - N) bit software tag value, where N is configurable
+ * with the CVMX_TAG_SW_BITS define
+ */
+static inline uint32_t cvmx_pow_tag_get_hw_bits(uint64_t tag)
+{
+       return tag & cvmx_build_mask(32 - CVMX_TAG_SW_BITS);
+}
+
+/**
+ * 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.
+ *
+ * @buffer: Buffer to store capture into
+ * @buffer_size:
+ *               The size of the supplied buffer
+ *
+ * Returns Zero on success, negative on failure
+ */
+extern int cvmx_pow_capture(void *buffer, int buffer_size);
+
+/**
+ * Dump a POW capture to the console in a human readable format.
+ *
+ * @buffer: POW capture from cvmx_pow_capture()
+ * @buffer_size:
+ *               Size of the buffer
+ */
+extern void cvmx_pow_display(void *buffer, int buffer_size);
+
+/**
+ * Return the number of POW entries supported by this chip
+ *
+ * Returns Number of POW entries
+ */
+extern int cvmx_pow_get_num_entries(void);
+
+#endif /* __CVMX_POW_H__ */
diff --git a/arch/mips/include/asm/octeon/cvmx-scratch.h b/arch/mips/include/asm/octeon/cvmx-scratch.h
new file mode 100644 (file)
index 0000000..96b70cf
--- /dev/null
@@ -0,0 +1,139 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/**
+ *
+ * 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 */
+
+/**
+ * Reads an 8 bit value from the processor local scratchpad memory.
+ *
+ * @address: byte address to read from
+ *
+ * Returns value read
+ */
+static inline uint8_t cvmx_scratch_read8(uint64_t address)
+{
+       return *CASTPTR(volatile uint8_t, CVMX_SCRATCH_BASE + address);
+}
+
+/**
+ * Reads a 16 bit value from the processor local scratchpad memory.
+ *
+ * @address: byte address to read from
+ *
+ * Returns value read
+ */
+static inline uint16_t cvmx_scratch_read16(uint64_t address)
+{
+       return *CASTPTR(volatile uint16_t, CVMX_SCRATCH_BASE + address);
+}
+
+/**
+ * Reads a 32 bit value from the processor local scratchpad memory.
+ *
+ * @address: byte address to read from
+ *
+ * Returns value read
+ */
+static inline uint32_t cvmx_scratch_read32(uint64_t address)
+{
+       return *CASTPTR(volatile uint32_t, CVMX_SCRATCH_BASE + address);
+}
+
+/**
+ * Reads a 64 bit value from the processor local scratchpad memory.
+ *
+ * @address: byte address to read from
+ *
+ * Returns value read
+ */
+static inline uint64_t cvmx_scratch_read64(uint64_t address)
+{
+       return *CASTPTR(volatile uint64_t, CVMX_SCRATCH_BASE + address);
+}
+
+/**
+ * Writes an 8 bit value to the processor local scratchpad memory.
+ *
+ * @address: byte address to write to
+ * @value:   value to write
+ */
+static inline void cvmx_scratch_write8(uint64_t address, uint64_t value)
+{
+       *CASTPTR(volatile uint8_t, CVMX_SCRATCH_BASE + address) =
+           (uint8_t) value;
+}
+
+/**
+ * Writes a 32 bit value to the processor local scratchpad memory.
+ *
+ * @address: byte address to write to
+ * @value:   value to write
+ */
+static inline void cvmx_scratch_write16(uint64_t address, uint64_t value)
+{
+       *CASTPTR(volatile uint16_t, CVMX_SCRATCH_BASE + address) =
+           (uint16_t) value;
+}
+
+/**
+ * Writes a 16 bit value to the processor local scratchpad memory.
+ *
+ * @address: byte address to write to
+ * @value:   value to write
+ */
+static inline void cvmx_scratch_write32(uint64_t address, uint64_t value)
+{
+       *CASTPTR(volatile uint32_t, CVMX_SCRATCH_BASE + address) =
+           (uint32_t) value;
+}
+
+/**
+ * Writes a 64 bit value to the processor local scratchpad memory.
+ *
+ * @address: byte address to write to
+ * @value:   value to write
+ */
+static inline void cvmx_scratch_write64(uint64_t address, uint64_t value)
+{
+       *CASTPTR(volatile uint64_t, CVMX_SCRATCH_BASE + address) = value;
+}
+
+#endif /* __CVMX_SCRATCH_H__ */
diff --git a/arch/mips/include/asm/octeon/cvmx-sli-defs.h b/arch/mips/include/asm/octeon/cvmx-sli-defs.h
new file mode 100644 (file)
index 0000000..7c6c901
--- /dev/null
@@ -0,0 +1,2172 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2011 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+#ifndef __CVMX_SLI_DEFS_H__
+#define __CVMX_SLI_DEFS_H__
+
+#define CVMX_SLI_BIST_STATUS (0x0000000000000580ull)
+#define CVMX_SLI_CTL_PORTX(offset) (0x0000000000000050ull + ((offset) & 3) * 16)
+#define CVMX_SLI_CTL_STATUS (0x0000000000000570ull)
+#define CVMX_SLI_DATA_OUT_CNT (0x00000000000005F0ull)
+#define CVMX_SLI_DBG_DATA (0x0000000000000310ull)
+#define CVMX_SLI_DBG_SELECT (0x0000000000000300ull)
+#define CVMX_SLI_DMAX_CNT(offset) (0x0000000000000400ull + ((offset) & 1) * 16)
+#define CVMX_SLI_DMAX_INT_LEVEL(offset) (0x00000000000003E0ull + ((offset) & 1) * 16)
+#define CVMX_SLI_DMAX_TIM(offset) (0x0000000000000420ull + ((offset) & 1) * 16)
+#define CVMX_SLI_INT_ENB_CIU (0x0000000000003CD0ull)
+#define CVMX_SLI_INT_ENB_PORTX(offset) (0x0000000000000340ull + ((offset) & 1) * 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_MAC_CREDIT_CNT (0x0000000000003D70ull)
+#define CVMX_SLI_MAC_CREDIT_CNT2 (0x0000000000003E10ull)
+#define CVMX_SLI_MAC_NUMBER (0x0000000000003E00ull)
+#define CVMX_SLI_MEM_ACCESS_CTL (0x00000000000002F0ull)
+#define CVMX_SLI_MEM_ACCESS_SUBIDX(offset) (0x00000000000000E0ull + ((offset) & 31) * 16 - 16*12)
+#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 (0x0000000000003C10ull)
+#define CVMX_SLI_MSI_RCV1 (0x0000000000003C20ull)
+#define CVMX_SLI_MSI_RCV2 (0x0000000000003C30ull)
+#define CVMX_SLI_MSI_RCV3 (0x0000000000003C40ull)
+#define CVMX_SLI_MSI_RD_MAP (0x0000000000003CA0ull)
+#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 (0x0000000000003C90ull)
+#define CVMX_SLI_PCIE_MSI_RCV (0x0000000000003CB0ull)
+#define CVMX_SLI_PCIE_MSI_RCV_B1 (0x0000000000000650ull)
+#define CVMX_SLI_PCIE_MSI_RCV_B2 (0x0000000000000660ull)
+#define CVMX_SLI_PCIE_MSI_RCV_B3 (0x0000000000000670ull)
+#define CVMX_SLI_PKTX_CNTS(offset) (0x0000000000002400ull + ((offset) & 31) * 16)
+#define CVMX_SLI_PKTX_INSTR_BADDR(offset) (0x0000000000002800ull + ((offset) & 31) * 16)
+#define CVMX_SLI_PKTX_INSTR_BAOFF_DBELL(offset) (0x0000000000002C00ull + ((offset) & 31) * 16)
+#define CVMX_SLI_PKTX_INSTR_FIFO_RSIZE(offset) (0x0000000000003000ull + ((offset) & 31) * 16)
+#define CVMX_SLI_PKTX_INSTR_HEADER(offset) (0x0000000000003400ull + ((offset) & 31) * 16)
+#define CVMX_SLI_PKTX_IN_BP(offset) (0x0000000000003800ull + ((offset) & 31) * 16)
+#define CVMX_SLI_PKTX_OUT_SIZE(offset) (0x0000000000000C00ull + ((offset) & 31) * 16)
+#define CVMX_SLI_PKTX_SLIST_BADDR(offset) (0x0000000000001400ull + ((offset) & 31) * 16)
+#define CVMX_SLI_PKTX_SLIST_BAOFF_DBELL(offset) (0x0000000000001800ull + ((offset) & 31) * 16)
+#define CVMX_SLI_PKTX_SLIST_FIFO_RSIZE(offset) (0x0000000000001C00ull + ((offset) & 31) * 16)
+#define CVMX_SLI_PKT_CNT_INT (0x0000000000001130ull)
+#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_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_LEVELS (0x0000000000001120ull)
+#define CVMX_SLI_PKT_IN_BP (0x0000000000001210ull)
+#define CVMX_SLI_PKT_IN_DONEX_CNTS(offset) (0x0000000000002000ull + ((offset) & 31) * 16)
+#define CVMX_SLI_PKT_IN_INSTR_COUNTS (0x0000000000001200ull)
+#define CVMX_SLI_PKT_IN_PCIE_PORT (0x00000000000011B0ull)
+#define CVMX_SLI_PKT_IPTR (0x0000000000001070ull)
+#define CVMX_SLI_PKT_OUTPUT_WMARK (0x0000000000001180ull)
+#define CVMX_SLI_PKT_OUT_BMODE (0x00000000000010D0ull)
+#define CVMX_SLI_PKT_OUT_BP_EN (0x0000000000001240ull)
+#define CVMX_SLI_PKT_OUT_ENB (0x0000000000001010ull)
+#define CVMX_SLI_PKT_PCIE_PORT (0x00000000000010E0ull)
+#define CVMX_SLI_PKT_PORT_IN_RST (0x00000000000011F0ull)
+#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 (0x0000000000001140ull)
+#define CVMX_SLI_PKT_TIME_INT_ENB (0x0000000000001160ull)
+#define CVMX_SLI_PORTX_PKIND(offset) (0x0000000000000800ull + ((offset) & 31) * 16)
+#define CVMX_SLI_S2M_PORTX_CTL(offset) (0x0000000000003D80ull + ((offset) & 3) * 16)
+#define CVMX_SLI_SCRATCH_1 (0x00000000000003C0ull)
+#define CVMX_SLI_SCRATCH_2 (0x00000000000003D0ull)
+#define CVMX_SLI_STATE1 (0x0000000000000620ull)
+#define CVMX_SLI_STATE2 (0x0000000000000630ull)
+#define CVMX_SLI_STATE3 (0x0000000000000640ull)
+#define CVMX_SLI_TX_PIPE (0x0000000000001230ull)
+#define CVMX_SLI_WINDOW_CTL (0x00000000000002E0ull)
+#define CVMX_SLI_WIN_RD_ADDR (0x0000000000000010ull)
+#define CVMX_SLI_WIN_RD_DATA (0x0000000000000040ull)
+#define CVMX_SLI_WIN_WR_ADDR (0x0000000000000000ull)
+#define CVMX_SLI_WIN_WR_DATA (0x0000000000000020ull)
+#define CVMX_SLI_WIN_WR_MASK (0x0000000000000030ull)
+
+union cvmx_sli_bist_status {
+       uint64_t u64;
+       struct cvmx_sli_bist_status_s {
+               uint64_t reserved_32_63:32;
+               uint64_t ncb_req:1;
+               uint64_t n2p0_c:1;
+               uint64_t n2p0_o:1;
+               uint64_t n2p1_c:1;
+               uint64_t n2p1_o:1;
+               uint64_t cpl_p0:1;
+               uint64_t cpl_p1:1;
+               uint64_t reserved_19_24:6;
+               uint64_t p2n0_c0:1;
+               uint64_t p2n0_c1:1;
+               uint64_t p2n0_n:1;
+               uint64_t p2n0_p0:1;
+               uint64_t p2n0_p1:1;
+               uint64_t p2n1_c0:1;
+               uint64_t p2n1_c1:1;
+               uint64_t p2n1_n:1;
+               uint64_t p2n1_p0:1;
+               uint64_t p2n1_p1:1;
+               uint64_t reserved_6_8:3;
+               uint64_t dsi1_1:1;
+               uint64_t dsi1_0:1;
+               uint64_t dsi0_1:1;
+               uint64_t dsi0_0:1;
+               uint64_t msi:1;
+               uint64_t ncb_cmd:1;
+       } s;
+       struct cvmx_sli_bist_status_cn61xx {
+               uint64_t reserved_31_63:33;
+               uint64_t n2p0_c:1;
+               uint64_t n2p0_o:1;
+               uint64_t reserved_27_28:2;
+               uint64_t cpl_p0:1;
+               uint64_t cpl_p1:1;
+               uint64_t reserved_19_24:6;
+               uint64_t p2n0_c0:1;
+               uint64_t p2n0_c1:1;
+               uint64_t p2n0_n:1;
+               uint64_t p2n0_p0:1;
+               uint64_t p2n0_p1:1;
+               uint64_t p2n1_c0:1;
+               uint64_t p2n1_c1:1;
+               uint64_t p2n1_n:1;
+               uint64_t p2n1_p0:1;
+               uint64_t p2n1_p1:1;
+               uint64_t reserved_6_8:3;
+               uint64_t dsi1_1:1;
+               uint64_t dsi1_0:1;
+               uint64_t dsi0_1:1;
+               uint64_t dsi0_0:1;
+               uint64_t msi:1;
+               uint64_t ncb_cmd:1;
+       } cn61xx;
+       struct cvmx_sli_bist_status_cn63xx {
+               uint64_t reserved_31_63:33;
+               uint64_t n2p0_c:1;
+               uint64_t n2p0_o:1;
+               uint64_t n2p1_c:1;
+               uint64_t n2p1_o:1;
+               uint64_t cpl_p0:1;
+               uint64_t cpl_p1:1;
+               uint64_t reserved_19_24:6;
+               uint64_t p2n0_c0:1;
+               uint64_t p2n0_c1:1;
+               uint64_t p2n0_n:1;
+               uint64_t p2n0_p0:1;
+               uint64_t p2n0_p1:1;
+               uint64_t p2n1_c0:1;
+               uint64_t p2n1_c1:1;
+               uint64_t p2n1_n:1;
+               uint64_t p2n1_p0:1;
+               uint64_t p2n1_p1:1;
+               uint64_t reserved_6_8:3;
+               uint64_t dsi1_1:1;
+               uint64_t dsi1_0:1;
+               uint64_t dsi0_1:1;
+               uint64_t dsi0_0:1;
+               uint64_t msi:1;
+               uint64_t 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;
+};
+
+union cvmx_sli_ctl_portx {
+       uint64_t u64;
+       struct cvmx_sli_ctl_portx_s {
+               uint64_t reserved_22_63:42;
+               uint64_t intd:1;
+               uint64_t intc:1;
+               uint64_t intb:1;
+               uint64_t inta:1;
+               uint64_t dis_port:1;
+               uint64_t waitl_com:1;
+               uint64_t intd_map:2;
+               uint64_t intc_map:2;
+               uint64_t intb_map:2;
+               uint64_t inta_map:2;
+               uint64_t ctlp_ro:1;
+               uint64_t reserved_6_6:1;
+               uint64_t ptlp_ro:1;
+               uint64_t reserved_1_4:4;
+               uint64_t 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;
+};
+
+union cvmx_sli_ctl_status {
+       uint64_t u64;
+       struct cvmx_sli_ctl_status_s {
+               uint64_t reserved_20_63:44;
+               uint64_t p1_ntags:6;
+               uint64_t p0_ntags:6;
+               uint64_t chip_rev:8;
+       } s;
+       struct cvmx_sli_ctl_status_cn61xx {
+               uint64_t reserved_14_63:50;
+               uint64_t p0_ntags:6;
+               uint64_t chip_rev:8;
+       } cn61xx;
+       struct cvmx_sli_ctl_status_s cn63xx;
+       struct cvmx_sli_ctl_status_s cn63xxp1;
+       struct cvmx_sli_ctl_status_cn61xx cn66xx;
+       struct cvmx_sli_ctl_status_s cn68xx;
+       struct cvmx_sli_ctl_status_s cn68xxp1;
+};
+
+union cvmx_sli_data_out_cnt {
+       uint64_t u64;
+       struct cvmx_sli_data_out_cnt_s {
+               uint64_t reserved_44_63:20;
+               uint64_t p1_ucnt:16;
+               uint64_t p1_fcnt:6;
+               uint64_t p0_ucnt:16;
+               uint64_t 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;
+};
+
+union cvmx_sli_dbg_data {
+       uint64_t u64;
+       struct cvmx_sli_dbg_data_s {
+               uint64_t reserved_18_63:46;
+               uint64_t dsel_ext:1;
+               uint64_t 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;
+};
+
+union cvmx_sli_dbg_select {
+       uint64_t u64;
+       struct cvmx_sli_dbg_select_s {
+               uint64_t reserved_33_63:31;
+               uint64_t adbg_sel:1;
+               uint64_t 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;
+};
+
+union cvmx_sli_dmax_cnt {
+       uint64_t u64;
+       struct cvmx_sli_dmax_cnt_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_dmax_int_level {
+       uint64_t u64;
+       struct cvmx_sli_dmax_int_level_s {
+               uint64_t time:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_dmax_tim {
+       uint64_t u64;
+       struct cvmx_sli_dmax_tim_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_int_enb_ciu {
+       uint64_t u64;
+       struct cvmx_sli_int_enb_ciu_s {
+               uint64_t reserved_62_63:2;
+               uint64_t pipe_err:1;
+               uint64_t ill_pad:1;
+               uint64_t sprt3_err:1;
+               uint64_t sprt2_err:1;
+               uint64_t sprt1_err:1;
+               uint64_t sprt0_err:1;
+               uint64_t pins_err:1;
+               uint64_t pop_err:1;
+               uint64_t pdi_err:1;
+               uint64_t pgl_err:1;
+               uint64_t pin_bp:1;
+               uint64_t pout_err:1;
+               uint64_t psldbof:1;
+               uint64_t pidbof:1;
+               uint64_t reserved_38_47:10;
+               uint64_t dtime:2;
+               uint64_t dcnt:2;
+               uint64_t dmafi:2;
+               uint64_t reserved_28_31:4;
+               uint64_t m3_un_wi:1;
+               uint64_t m3_un_b0:1;
+               uint64_t m3_up_wi:1;
+               uint64_t m3_up_b0:1;
+               uint64_t m2_un_wi:1;
+               uint64_t m2_un_b0:1;
+               uint64_t m2_up_wi:1;
+               uint64_t m2_up_b0:1;
+               uint64_t reserved_18_19:2;
+               uint64_t mio_int1:1;
+               uint64_t mio_int0:1;
+               uint64_t m1_un_wi:1;
+               uint64_t m1_un_b0:1;
+               uint64_t m1_up_wi:1;
+               uint64_t m1_up_b0:1;
+               uint64_t m0_un_wi:1;
+               uint64_t m0_un_b0:1;
+               uint64_t m0_up_wi:1;
+               uint64_t m0_up_b0:1;
+               uint64_t reserved_6_7:2;
+               uint64_t ptime:1;
+               uint64_t pcnt:1;
+               uint64_t iob2big:1;
+               uint64_t bar0_to:1;
+               uint64_t reserved_1_1:1;
+               uint64_t rml_to:1;
+       } s;
+       struct cvmx_sli_int_enb_ciu_cn61xx {
+               uint64_t reserved_61_63:3;
+               uint64_t ill_pad:1;
+               uint64_t sprt3_err:1;
+               uint64_t sprt2_err:1;
+               uint64_t sprt1_err:1;
+               uint64_t sprt0_err:1;
+               uint64_t pins_err:1;
+               uint64_t pop_err:1;
+               uint64_t pdi_err:1;
+               uint64_t pgl_err:1;
+               uint64_t pin_bp:1;
+               uint64_t pout_err:1;
+               uint64_t psldbof:1;
+               uint64_t pidbof:1;
+               uint64_t reserved_38_47:10;
+               uint64_t dtime:2;
+               uint64_t dcnt:2;
+               uint64_t dmafi:2;
+               uint64_t reserved_28_31:4;
+               uint64_t m3_un_wi:1;
+               uint64_t m3_un_b0:1;
+               uint64_t m3_up_wi:1;
+               uint64_t m3_up_b0:1;
+               uint64_t m2_un_wi:1;
+               uint64_t m2_un_b0:1;
+               uint64_t m2_up_wi:1;
+               uint64_t m2_up_b0:1;
+               uint64_t reserved_18_19:2;
+               uint64_t mio_int1:1;
+               uint64_t mio_int0:1;
+               uint64_t m1_un_wi:1;
+               uint64_t m1_un_b0:1;
+               uint64_t m1_up_wi:1;
+               uint64_t m1_up_b0:1;
+               uint64_t m0_un_wi:1;
+               uint64_t m0_un_b0:1;
+               uint64_t m0_up_wi:1;
+               uint64_t m0_up_b0:1;
+               uint64_t reserved_6_7:2;
+               uint64_t ptime:1;
+               uint64_t pcnt:1;
+               uint64_t iob2big:1;
+               uint64_t bar0_to:1;
+               uint64_t reserved_1_1:1;
+               uint64_t rml_to:1;
+       } cn61xx;
+       struct cvmx_sli_int_enb_ciu_cn63xx {
+               uint64_t reserved_61_63:3;
+               uint64_t ill_pad:1;
+               uint64_t reserved_58_59:2;
+               uint64_t sprt1_err:1;
+               uint64_t sprt0_err:1;
+               uint64_t pins_err:1;
+               uint64_t pop_err:1;
+               uint64_t pdi_err:1;
+               uint64_t pgl_err:1;
+               uint64_t pin_bp:1;
+               uint64_t pout_err:1;
+               uint64_t psldbof:1;
+               uint64_t pidbof:1;
+               uint64_t reserved_38_47:10;
+               uint64_t dtime:2;
+               uint64_t dcnt:2;
+               uint64_t dmafi:2;
+               uint64_t reserved_18_31:14;
+               uint64_t mio_int1:1;
+               uint64_t mio_int0:1;
+               uint64_t m1_un_wi:1;
+               uint64_t m1_un_b0:1;
+               uint64_t m1_up_wi:1;
+               uint64_t m1_up_b0:1;
+               uint64_t m0_un_wi:1;
+               uint64_t m0_un_b0:1;
+               uint64_t m0_up_wi:1;
+               uint64_t m0_up_b0:1;
+               uint64_t reserved_6_7:2;
+               uint64_t ptime:1;
+               uint64_t pcnt:1;
+               uint64_t iob2big:1;
+               uint64_t bar0_to:1;
+               uint64_t reserved_1_1:1;
+               uint64_t 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 {
+               uint64_t reserved_62_63:2;
+               uint64_t pipe_err:1;
+               uint64_t ill_pad:1;
+               uint64_t reserved_58_59:2;
+               uint64_t sprt1_err:1;
+               uint64_t sprt0_err:1;
+               uint64_t pins_err:1;
+               uint64_t pop_err:1;
+               uint64_t pdi_err:1;
+               uint64_t pgl_err:1;
+               uint64_t reserved_51_51:1;
+               uint64_t pout_err:1;
+               uint64_t psldbof:1;
+               uint64_t pidbof:1;
+               uint64_t reserved_38_47:10;
+               uint64_t dtime:2;
+               uint64_t dcnt:2;
+               uint64_t dmafi:2;
+               uint64_t reserved_18_31:14;
+               uint64_t mio_int1:1;
+               uint64_t mio_int0:1;
+               uint64_t m1_un_wi:1;
+               uint64_t m1_un_b0:1;
+               uint64_t m1_up_wi:1;
+               uint64_t m1_up_b0:1;
+               uint64_t m0_un_wi:1;
+               uint64_t m0_un_b0:1;
+               uint64_t m0_up_wi:1;
+               uint64_t m0_up_b0:1;
+               uint64_t reserved_6_7:2;
+               uint64_t ptime:1;
+               uint64_t pcnt:1;
+               uint64_t iob2big:1;
+               uint64_t bar0_to:1;
+               uint64_t reserved_1_1:1;
+               uint64_t rml_to:1;
+       } cn68xx;
+       struct cvmx_sli_int_enb_ciu_cn68xx cn68xxp1;
+};
+
+union cvmx_sli_int_enb_portx {
+       uint64_t u64;
+       struct cvmx_sli_int_enb_portx_s {
+               uint64_t reserved_62_63:2;
+               uint64_t pipe_err:1;
+               uint64_t ill_pad:1;
+               uint64_t sprt3_err:1;
+               uint64_t sprt2_err:1;
+               uint64_t sprt1_err:1;
+               uint64_t sprt0_err:1;
+               uint64_t pins_err:1;
+               uint64_t pop_err:1;
+               uint64_t pdi_err:1;
+               uint64_t pgl_err:1;
+               uint64_t pin_bp:1;
+               uint64_t pout_err:1;
+               uint64_t psldbof:1;
+               uint64_t pidbof:1;
+               uint64_t reserved_38_47:10;
+               uint64_t dtime:2;
+               uint64_t dcnt:2;
+               uint64_t dmafi:2;
+               uint64_t reserved_28_31:4;
+               uint64_t m3_un_wi:1;
+               uint64_t m3_un_b0:1;
+               uint64_t m3_up_wi:1;
+               uint64_t m3_up_b0:1;
+               uint64_t m2_un_wi:1;
+               uint64_t m2_un_b0:1;
+               uint64_t m2_up_wi:1;
+               uint64_t m2_up_b0:1;
+               uint64_t mac1_int:1;
+               uint64_t mac0_int:1;
+               uint64_t mio_int1:1;
+               uint64_t mio_int0:1;
+               uint64_t m1_un_wi:1;
+               uint64_t m1_un_b0:1;
+               uint64_t m1_up_wi:1;
+               uint64_t m1_up_b0:1;
+               uint64_t m0_un_wi:1;
+               uint64_t m0_un_b0:1;
+               uint64_t m0_up_wi:1;
+               uint64_t m0_up_b0:1;
+               uint64_t reserved_6_7:2;
+               uint64_t ptime:1;
+               uint64_t pcnt:1;
+               uint64_t iob2big:1;
+               uint64_t bar0_to:1;
+               uint64_t reserved_1_1:1;
+               uint64_t rml_to:1;
+       } s;
+       struct cvmx_sli_int_enb_portx_cn61xx {
+               uint64_t reserved_61_63:3;
+               uint64_t ill_pad:1;
+               uint64_t sprt3_err:1;
+               uint64_t sprt2_err:1;
+               uint64_t sprt1_err:1;
+               uint64_t sprt0_err:1;
+               uint64_t pins_err:1;
+               uint64_t pop_err:1;
+               uint64_t pdi_err:1;
+               uint64_t pgl_err:1;
+               uint64_t pin_bp:1;
+               uint64_t pout_err:1;
+               uint64_t psldbof:1;
+               uint64_t pidbof:1;
+               uint64_t reserved_38_47:10;
+               uint64_t dtime:2;
+               uint64_t dcnt:2;
+               uint64_t dmafi:2;
+               uint64_t reserved_28_31:4;
+               uint64_t m3_un_wi:1;
+               uint64_t m3_un_b0:1;
+               uint64_t m3_up_wi:1;
+               uint64_t m3_up_b0:1;
+               uint64_t m2_un_wi:1;
+               uint64_t m2_un_b0:1;
+               uint64_t m2_up_wi:1;
+               uint64_t m2_up_b0:1;
+               uint64_t mac1_int:1;
+               uint64_t mac0_int:1;
+               uint64_t mio_int1:1;
+               uint64_t mio_int0:1;
+               uint64_t m1_un_wi:1;
+               uint64_t m1_un_b0:1;
+               uint64_t m1_up_wi:1;
+               uint64_t m1_up_b0:1;
+               uint64_t m0_un_wi:1;
+               uint64_t m0_un_b0:1;
+               uint64_t m0_up_wi:1;
+               uint64_t m0_up_b0:1;
+               uint64_t reserved_6_7:2;
+               uint64_t ptime:1;
+               uint64_t pcnt:1;
+               uint64_t iob2big:1;
+               uint64_t bar0_to:1;
+               uint64_t reserved_1_1:1;
+               uint64_t rml_to:1;
+       } cn61xx;
+       struct cvmx_sli_int_enb_portx_cn63xx {
+               uint64_t reserved_61_63:3;
+               uint64_t ill_pad:1;
+               uint64_t reserved_58_59:2;
+               uint64_t sprt1_err:1;
+               uint64_t sprt0_err:1;
+               uint64_t pins_err:1;
+               uint64_t pop_err:1;
+               uint64_t pdi_err:1;
+               uint64_t pgl_err:1;
+               uint64_t pin_bp:1;
+               uint64_t pout_err:1;
+               uint64_t psldbof:1;
+               uint64_t pidbof:1;
+               uint64_t reserved_38_47:10;
+               uint64_t dtime:2;
+               uint64_t dcnt:2;
+               uint64_t dmafi:2;
+               uint64_t reserved_20_31:12;
+               uint64_t mac1_int:1;
+               uint64_t mac0_int:1;
+               uint64_t mio_int1:1;
+               uint64_t mio_int0:1;
+               uint64_t m1_un_wi:1;
+               uint64_t m1_un_b0:1;
+               uint64_t m1_up_wi:1;
+               uint64_t m1_up_b0:1;
+               uint64_t m0_un_wi:1;
+               uint64_t m0_un_b0:1;
+               uint64_t m0_up_wi:1;
+               uint64_t m0_up_b0:1;
+               uint64_t reserved_6_7:2;
+               uint64_t ptime:1;
+               uint64_t pcnt:1;
+               uint64_t iob2big:1;
+               uint64_t bar0_to:1;
+               uint64_t reserved_1_1:1;
+               uint64_t 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 {
+               uint64_t reserved_62_63:2;
+               uint64_t pipe_err:1;
+               uint64_t ill_pad:1;
+               uint64_t reserved_58_59:2;
+               uint64_t sprt1_err:1;
+               uint64_t sprt0_err:1;
+               uint64_t pins_err:1;
+               uint64_t pop_err:1;
+               uint64_t pdi_err:1;
+               uint64_t pgl_err:1;
+               uint64_t reserved_51_51:1;
+               uint64_t pout_err:1;
+               uint64_t psldbof:1;
+               uint64_t pidbof:1;
+               uint64_t reserved_38_47:10;
+               uint64_t dtime:2;
+               uint64_t dcnt:2;
+               uint64_t dmafi:2;
+               uint64_t reserved_20_31:12;
+               uint64_t mac1_int:1;
+               uint64_t mac0_int:1;
+               uint64_t mio_int1:1;
+               uint64_t mio_int0:1;
+               uint64_t m1_un_wi:1;
+               uint64_t m1_un_b0:1;
+               uint64_t m1_up_wi:1;
+               uint64_t m1_up_b0:1;
+               uint64_t m0_un_wi:1;
+               uint64_t m0_un_b0:1;
+               uint64_t m0_up_wi:1;
+               uint64_t m0_up_b0:1;
+               uint64_t reserved_6_7:2;
+               uint64_t ptime:1;
+               uint64_t pcnt:1;
+               uint64_t iob2big:1;
+               uint64_t bar0_to:1;
+               uint64_t reserved_1_1:1;
+               uint64_t rml_to:1;
+       } cn68xx;
+       struct cvmx_sli_int_enb_portx_cn68xx cn68xxp1;
+};
+
+union cvmx_sli_int_sum {
+       uint64_t u64;
+       struct cvmx_sli_int_sum_s {
+               uint64_t reserved_62_63:2;
+               uint64_t pipe_err:1;
+               uint64_t ill_pad:1;
+               uint64_t sprt3_err:1;
+               uint64_t sprt2_err:1;
+               uint64_t sprt1_err:1;
+               uint64_t sprt0_err:1;
+               uint64_t pins_err:1;
+               uint64_t pop_err:1;
+               uint64_t pdi_err:1;
+               uint64_t pgl_err:1;
+               uint64_t pin_bp:1;
+               uint64_t pout_err:1;
+               uint64_t psldbof:1;
+               uint64_t pidbof:1;
+               uint64_t reserved_38_47:10;
+               uint64_t dtime:2;
+               uint64_t dcnt:2;
+               uint64_t dmafi:2;
+               uint64_t reserved_28_31:4;
+               uint64_t m3_un_wi:1;
+               uint64_t m3_un_b0:1;
+               uint64_t m3_up_wi:1;
+               uint64_t m3_up_b0:1;
+               uint64_t m2_un_wi:1;
+               uint64_t m2_un_b0:1;
+               uint64_t m2_up_wi:1;
+               uint64_t m2_up_b0:1;
+               uint64_t mac1_int:1;
+               uint64_t mac0_int:1;
+               uint64_t mio_int1:1;
+               uint64_t mio_int0:1;
+               uint64_t m1_un_wi:1;
+               uint64_t m1_un_b0:1;
+               uint64_t m1_up_wi:1;
+               uint64_t m1_up_b0:1;
+               uint64_t m0_un_wi:1;
+               uint64_t m0_un_b0:1;
+               uint64_t m0_up_wi:1;
+               uint64_t m0_up_b0:1;
+               uint64_t reserved_6_7:2;
+               uint64_t ptime:1;
+               uint64_t pcnt:1;
+               uint64_t iob2big:1;
+               uint64_t bar0_to:1;
+               uint64_t reserved_1_1:1;
+               uint64_t rml_to:1;
+       } s;
+       struct cvmx_sli_int_sum_cn61xx {
+               uint64_t reserved_61_63:3;
+               uint64_t ill_pad:1;
+               uint64_t sprt3_err:1;
+               uint64_t sprt2_err:1;
+               uint64_t sprt1_err:1;
+               uint64_t sprt0_err:1;
+               uint64_t pins_err:1;
+               uint64_t pop_err:1;
+               uint64_t pdi_err:1;
+               uint64_t pgl_err:1;
+               uint64_t pin_bp:1;
+               uint64_t pout_err:1;
+               uint64_t psldbof:1;
+               uint64_t pidbof:1;
+               uint64_t reserved_38_47:10;
+               uint64_t dtime:2;
+               uint64_t dcnt:2;
+               uint64_t dmafi:2;
+               uint64_t reserved_28_31:4;
+               uint64_t m3_un_wi:1;
+               uint64_t m3_un_b0:1;
+               uint64_t m3_up_wi:1;
+               uint64_t m3_up_b0:1;
+               uint64_t m2_un_wi:1;
+               uint64_t m2_un_b0:1;
+               uint64_t m2_up_wi:1;
+               uint64_t m2_up_b0:1;
+               uint64_t mac1_int:1;
+               uint64_t mac0_int:1;
+               uint64_t mio_int1:1;
+               uint64_t mio_int0:1;
+               uint64_t m1_un_wi:1;
+               uint64_t m1_un_b0:1;
+               uint64_t m1_up_wi:1;
+               uint64_t m1_up_b0:1;
+               uint64_t m0_un_wi:1;
+               uint64_t m0_un_b0:1;
+               uint64_t m0_up_wi:1;
+               uint64_t m0_up_b0:1;
+               uint64_t reserved_6_7:2;
+               uint64_t ptime:1;
+               uint64_t pcnt:1;
+               uint64_t iob2big:1;
+               uint64_t bar0_to:1;
+               uint64_t reserved_1_1:1;
+               uint64_t rml_to:1;
+       } cn61xx;
+       struct cvmx_sli_int_sum_cn63xx {
+               uint64_t reserved_61_63:3;
+               uint64_t ill_pad:1;
+               uint64_t reserved_58_59:2;
+               uint64_t sprt1_err:1;
+               uint64_t sprt0_err:1;
+               uint64_t pins_err:1;
+               uint64_t pop_err:1;
+               uint64_t pdi_err:1;
+               uint64_t pgl_err:1;
+               uint64_t pin_bp:1;
+               uint64_t pout_err:1;
+               uint64_t psldbof:1;
+               uint64_t pidbof:1;
+               uint64_t reserved_38_47:10;
+               uint64_t dtime:2;
+               uint64_t dcnt:2;
+               uint64_t dmafi:2;
+               uint64_t reserved_20_31:12;
+               uint64_t mac1_int:1;
+               uint64_t mac0_int:1;
+               uint64_t mio_int1:1;
+               uint64_t mio_int0:1;
+               uint64_t m1_un_wi:1;
+               uint64_t m1_un_b0:1;
+               uint64_t m1_up_wi:1;
+               uint64_t m1_up_b0:1;
+               uint64_t m0_un_wi:1;
+               uint64_t m0_un_b0:1;
+               uint64_t m0_up_wi:1;
+               uint64_t m0_up_b0:1;
+               uint64_t reserved_6_7:2;
+               uint64_t ptime:1;
+               uint64_t pcnt:1;
+               uint64_t iob2big:1;
+               uint64_t bar0_to:1;
+               uint64_t reserved_1_1:1;
+               uint64_t rml_to:1;
+       } cn63xx;
+       struct cvmx_sli_int_sum_cn63xx cn63xxp1;
+       struct cvmx_sli_int_sum_cn61xx cn66xx;
+       struct cvmx_sli_int_sum_cn68xx {
+               uint64_t reserved_62_63:2;
+               uint64_t pipe_err:1;
+               uint64_t ill_pad:1;
+               uint64_t reserved_58_59:2;
+               uint64_t sprt1_err:1;
+               uint64_t sprt0_err:1;
+               uint64_t pins_err:1;
+               uint64_t pop_err:1;
+               uint64_t pdi_err:1;
+               uint64_t pgl_err:1;
+               uint64_t reserved_51_51:1;
+               uint64_t pout_err:1;
+               uint64_t psldbof:1;
+               uint64_t pidbof:1;
+               uint64_t reserved_38_47:10;
+               uint64_t dtime:2;
+               uint64_t dcnt:2;
+               uint64_t dmafi:2;
+               uint64_t reserved_20_31:12;
+               uint64_t mac1_int:1;
+               uint64_t mac0_int:1;
+               uint64_t mio_int1:1;
+               uint64_t mio_int0:1;
+               uint64_t m1_un_wi:1;
+               uint64_t m1_un_b0:1;
+               uint64_t m1_up_wi:1;
+               uint64_t m1_up_b0:1;
+               uint64_t m0_un_wi:1;
+               uint64_t m0_un_b0:1;
+               uint64_t m0_up_wi:1;
+               uint64_t m0_up_b0:1;
+               uint64_t reserved_6_7:2;
+               uint64_t ptime:1;
+               uint64_t pcnt:1;
+               uint64_t iob2big:1;
+               uint64_t bar0_to:1;
+               uint64_t reserved_1_1:1;
+               uint64_t rml_to:1;
+       } cn68xx;
+       struct cvmx_sli_int_sum_cn68xx cn68xxp1;
+};
+
+union cvmx_sli_last_win_rdata0 {
+       uint64_t u64;
+       struct cvmx_sli_last_win_rdata0_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_last_win_rdata1 {
+       uint64_t u64;
+       struct cvmx_sli_last_win_rdata1_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_last_win_rdata2 {
+       uint64_t u64;
+       struct cvmx_sli_last_win_rdata2_s {
+               uint64_t data:64;
+       } s;
+       struct cvmx_sli_last_win_rdata2_s cn61xx;
+       struct cvmx_sli_last_win_rdata2_s cn66xx;
+};
+
+union cvmx_sli_last_win_rdata3 {
+       uint64_t u64;
+       struct cvmx_sli_last_win_rdata3_s {
+               uint64_t data:64;
+       } s;
+       struct cvmx_sli_last_win_rdata3_s cn61xx;
+       struct cvmx_sli_last_win_rdata3_s cn66xx;
+};
+
+union cvmx_sli_mac_credit_cnt {
+       uint64_t u64;
+       struct cvmx_sli_mac_credit_cnt_s {
+               uint64_t reserved_54_63:10;
+               uint64_t p1_c_d:1;
+               uint64_t p1_n_d:1;
+               uint64_t p1_p_d:1;
+               uint64_t p0_c_d:1;
+               uint64_t p0_n_d:1;
+               uint64_t p0_p_d:1;
+               uint64_t p1_ccnt:8;
+               uint64_t p1_ncnt:8;
+               uint64_t p1_pcnt:8;
+               uint64_t p0_ccnt:8;
+               uint64_t p0_ncnt:8;
+               uint64_t 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 {
+               uint64_t reserved_48_63:16;
+               uint64_t p1_ccnt:8;
+               uint64_t p1_ncnt:8;
+               uint64_t p1_pcnt:8;
+               uint64_t p0_ccnt:8;
+               uint64_t p0_ncnt:8;
+               uint64_t 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;
+};
+
+union cvmx_sli_mac_credit_cnt2 {
+       uint64_t u64;
+       struct cvmx_sli_mac_credit_cnt2_s {
+               uint64_t reserved_54_63:10;
+               uint64_t p3_c_d:1;
+               uint64_t p3_n_d:1;
+               uint64_t p3_p_d:1;
+               uint64_t p2_c_d:1;
+               uint64_t p2_n_d:1;
+               uint64_t p2_p_d:1;
+               uint64_t p3_ccnt:8;
+               uint64_t p3_ncnt:8;
+               uint64_t p3_pcnt:8;
+               uint64_t p2_ccnt:8;
+               uint64_t p2_ncnt:8;
+               uint64_t p2_pcnt:8;
+       } s;
+       struct cvmx_sli_mac_credit_cnt2_s cn61xx;
+       struct cvmx_sli_mac_credit_cnt2_s cn66xx;
+};
+
+union cvmx_sli_mac_number {
+       uint64_t u64;
+       struct cvmx_sli_mac_number_s {
+               uint64_t reserved_9_63:55;
+               uint64_t a_mode:1;
+               uint64_t num:8;
+       } s;
+       struct cvmx_sli_mac_number_s cn61xx;
+       struct cvmx_sli_mac_number_cn63xx {
+               uint64_t reserved_8_63:56;
+               uint64_t num:8;
+       } cn63xx;
+       struct cvmx_sli_mac_number_s cn66xx;
+       struct cvmx_sli_mac_number_cn63xx cn68xx;
+       struct cvmx_sli_mac_number_cn63xx cn68xxp1;
+};
+
+union cvmx_sli_mem_access_ctl {
+       uint64_t u64;
+       struct cvmx_sli_mem_access_ctl_s {
+               uint64_t reserved_14_63:50;
+               uint64_t max_word:4;
+               uint64_t 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;
+};
+
+union cvmx_sli_mem_access_subidx {
+       uint64_t u64;
+       struct cvmx_sli_mem_access_subidx_s {
+               uint64_t reserved_43_63:21;
+               uint64_t zero:1;
+               uint64_t port:3;
+               uint64_t nmerge:1;
+               uint64_t esr:2;
+               uint64_t esw:2;
+               uint64_t wtype:2;
+               uint64_t rtype:2;
+               uint64_t reserved_0_29:30;
+       } s;
+       struct cvmx_sli_mem_access_subidx_cn61xx {
+               uint64_t reserved_43_63:21;
+               uint64_t zero:1;
+               uint64_t port:3;
+               uint64_t nmerge:1;
+               uint64_t esr:2;
+               uint64_t esw:2;
+               uint64_t wtype:2;
+               uint64_t rtype:2;
+               uint64_t 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 {
+               uint64_t reserved_43_63:21;
+               uint64_t zero:1;
+               uint64_t port:3;
+               uint64_t nmerge:1;
+               uint64_t esr:2;
+               uint64_t esw:2;
+               uint64_t wtype:2;
+               uint64_t rtype:2;
+               uint64_t ba:28;
+               uint64_t reserved_0_1:2;
+       } cn68xx;
+       struct cvmx_sli_mem_access_subidx_cn68xx cn68xxp1;
+};
+
+union cvmx_sli_msi_enb0 {
+       uint64_t u64;
+       struct cvmx_sli_msi_enb0_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_msi_enb1 {
+       uint64_t u64;
+       struct cvmx_sli_msi_enb1_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_msi_enb2 {
+       uint64_t u64;
+       struct cvmx_sli_msi_enb2_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_msi_enb3 {
+       uint64_t u64;
+       struct cvmx_sli_msi_enb3_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_msi_rcv0 {
+       uint64_t u64;
+       struct cvmx_sli_msi_rcv0_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_msi_rcv1 {
+       uint64_t u64;
+       struct cvmx_sli_msi_rcv1_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_msi_rcv2 {
+       uint64_t u64;
+       struct cvmx_sli_msi_rcv2_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_msi_rcv3 {
+       uint64_t u64;
+       struct cvmx_sli_msi_rcv3_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_msi_rd_map {
+       uint64_t u64;
+       struct cvmx_sli_msi_rd_map_s {
+               uint64_t reserved_16_63:48;
+               uint64_t rd_int:8;
+               uint64_t 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;
+};
+
+union cvmx_sli_msi_w1c_enb0 {
+       uint64_t u64;
+       struct cvmx_sli_msi_w1c_enb0_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_msi_w1c_enb1 {
+       uint64_t u64;
+       struct cvmx_sli_msi_w1c_enb1_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_msi_w1c_enb2 {
+       uint64_t u64;
+       struct cvmx_sli_msi_w1c_enb2_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_msi_w1c_enb3 {
+       uint64_t u64;
+       struct cvmx_sli_msi_w1c_enb3_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_msi_w1s_enb0 {
+       uint64_t u64;
+       struct cvmx_sli_msi_w1s_enb0_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_msi_w1s_enb1 {
+       uint64_t u64;
+       struct cvmx_sli_msi_w1s_enb1_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_msi_w1s_enb2 {
+       uint64_t u64;
+       struct cvmx_sli_msi_w1s_enb2_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_msi_w1s_enb3 {
+       uint64_t u64;
+       struct cvmx_sli_msi_w1s_enb3_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_msi_wr_map {
+       uint64_t u64;
+       struct cvmx_sli_msi_wr_map_s {
+               uint64_t reserved_16_63:48;
+               uint64_t ciu_int:8;
+               uint64_t 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;
+};
+
+union cvmx_sli_pcie_msi_rcv {
+       uint64_t u64;
+       struct cvmx_sli_pcie_msi_rcv_s {
+               uint64_t reserved_8_63:56;
+               uint64_t 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;
+};
+
+union cvmx_sli_pcie_msi_rcv_b1 {
+       uint64_t u64;
+       struct cvmx_sli_pcie_msi_rcv_b1_s {
+               uint64_t reserved_16_63:48;
+               uint64_t intr:8;
+               uint64_t 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;
+};
+
+union cvmx_sli_pcie_msi_rcv_b2 {
+       uint64_t u64;
+       struct cvmx_sli_pcie_msi_rcv_b2_s {
+               uint64_t reserved_24_63:40;
+               uint64_t intr:8;
+               uint64_t 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;
+};
+
+union cvmx_sli_pcie_msi_rcv_b3 {
+       uint64_t u64;
+       struct cvmx_sli_pcie_msi_rcv_b3_s {
+               uint64_t reserved_32_63:32;
+               uint64_t intr:8;
+               uint64_t 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;
+};
+
+union cvmx_sli_pktx_cnts {
+       uint64_t u64;
+       struct cvmx_sli_pktx_cnts_s {
+               uint64_t reserved_54_63:10;
+               uint64_t timer:22;
+               uint64_t cnt:32;
+       } s;
+       struct cvmx_sli_pktx_cnts_s cn61xx;
+       struct cvmx_sli_pktx_cnts_s cn63xx;
+       struct cvmx_sli_pktx_cnts_s cn63xxp1;
+       struct cvmx_sli_pktx_cnts_s cn66xx;
+       struct cvmx_sli_pktx_cnts_s cn68xx;
+       struct cvmx_sli_pktx_cnts_s cn68xxp1;
+};
+
+union cvmx_sli_pktx_in_bp {
+       uint64_t u64;
+       struct cvmx_sli_pktx_in_bp_s {
+               uint64_t wmark:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_pktx_instr_baddr {
+       uint64_t u64;
+       struct cvmx_sli_pktx_instr_baddr_s {
+               uint64_t addr:61;
+               uint64_t 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;
+};
+
+union cvmx_sli_pktx_instr_baoff_dbell {
+       uint64_t u64;
+       struct cvmx_sli_pktx_instr_baoff_dbell_s {
+               uint64_t aoff:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_pktx_instr_fifo_rsize {
+       uint64_t u64;
+       struct cvmx_sli_pktx_instr_fifo_rsize_s {
+               uint64_t max:9;
+               uint64_t rrp:9;
+               uint64_t wrp:9;
+               uint64_t fcnt:5;
+               uint64_t 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;
+};
+
+union cvmx_sli_pktx_instr_header {
+       uint64_t u64;
+       struct cvmx_sli_pktx_instr_header_s {
+               uint64_t reserved_44_63:20;
+               uint64_t pbp:1;
+               uint64_t reserved_38_42:5;
+               uint64_t rparmode:2;
+               uint64_t reserved_35_35:1;
+               uint64_t rskp_len:7;
+               uint64_t rngrpext:2;
+               uint64_t rnqos:1;
+               uint64_t rngrp:1;
+               uint64_t rntt:1;
+               uint64_t rntag:1;
+               uint64_t use_ihdr:1;
+               uint64_t reserved_16_20:5;
+               uint64_t par_mode:2;
+               uint64_t reserved_13_13:1;
+               uint64_t skp_len:7;
+               uint64_t ngrpext:2;
+               uint64_t nqos:1;
+               uint64_t ngrp:1;
+               uint64_t ntt:1;
+               uint64_t ntag:1;
+       } s;
+       struct cvmx_sli_pktx_instr_header_cn61xx {
+               uint64_t reserved_44_63:20;
+               uint64_t pbp:1;
+               uint64_t reserved_38_42:5;
+               uint64_t rparmode:2;
+               uint64_t reserved_35_35:1;
+               uint64_t rskp_len:7;
+               uint64_t reserved_26_27:2;
+               uint64_t rnqos:1;
+               uint64_t rngrp:1;
+               uint64_t rntt:1;
+               uint64_t rntag:1;
+               uint64_t use_ihdr:1;
+               uint64_t reserved_16_20:5;
+               uint64_t par_mode:2;
+               uint64_t reserved_13_13:1;
+               uint64_t skp_len:7;
+               uint64_t reserved_4_5:2;
+               uint64_t nqos:1;
+               uint64_t ngrp:1;
+               uint64_t ntt:1;
+               uint64_t 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;
+};
+
+union cvmx_sli_pktx_out_size {
+       uint64_t u64;
+       struct cvmx_sli_pktx_out_size_s {
+               uint64_t reserved_23_63:41;
+               uint64_t isize:7;
+               uint64_t 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;
+};
+
+union cvmx_sli_pktx_slist_baddr {
+       uint64_t u64;
+       struct cvmx_sli_pktx_slist_baddr_s {
+               uint64_t addr:60;
+               uint64_t 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;
+};
+
+union cvmx_sli_pktx_slist_baoff_dbell {
+       uint64_t u64;
+       struct cvmx_sli_pktx_slist_baoff_dbell_s {
+               uint64_t aoff:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_pktx_slist_fifo_rsize {
+       uint64_t u64;
+       struct cvmx_sli_pktx_slist_fifo_rsize_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_cnt_int {
+       uint64_t u64;
+       struct cvmx_sli_pkt_cnt_int_s {
+               uint64_t reserved_32_63:32;
+               uint64_t port:32;
+       } s;
+       struct cvmx_sli_pkt_cnt_int_s cn61xx;
+       struct cvmx_sli_pkt_cnt_int_s cn63xx;
+       struct cvmx_sli_pkt_cnt_int_s cn63xxp1;
+       struct cvmx_sli_pkt_cnt_int_s cn66xx;
+       struct cvmx_sli_pkt_cnt_int_s cn68xx;
+       struct cvmx_sli_pkt_cnt_int_s cn68xxp1;
+};
+
+union cvmx_sli_pkt_cnt_int_enb {
+       uint64_t u64;
+       struct cvmx_sli_pkt_cnt_int_enb_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_ctl {
+       uint64_t u64;
+       struct cvmx_sli_pkt_ctl_s {
+               uint64_t reserved_5_63:59;
+               uint64_t ring_en:1;
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_data_out_es {
+       uint64_t u64;
+       struct cvmx_sli_pkt_data_out_es_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_data_out_ns {
+       uint64_t u64;
+       struct cvmx_sli_pkt_data_out_ns_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_data_out_ror {
+       uint64_t u64;
+       struct cvmx_sli_pkt_data_out_ror_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_dpaddr {
+       uint64_t u64;
+       struct cvmx_sli_pkt_dpaddr_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_in_bp {
+       uint64_t u64;
+       struct cvmx_sli_pkt_in_bp_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_in_donex_cnts {
+       uint64_t u64;
+       struct cvmx_sli_pkt_in_donex_cnts_s {
+               uint64_t reserved_32_63:32;
+               uint64_t cnt:32;
+       } s;
+       struct cvmx_sli_pkt_in_donex_cnts_s cn61xx;
+       struct cvmx_sli_pkt_in_donex_cnts_s cn63xx;
+       struct cvmx_sli_pkt_in_donex_cnts_s cn63xxp1;
+       struct cvmx_sli_pkt_in_donex_cnts_s cn66xx;
+       struct cvmx_sli_pkt_in_donex_cnts_s cn68xx;
+       struct cvmx_sli_pkt_in_donex_cnts_s cn68xxp1;
+};
+
+union cvmx_sli_pkt_in_instr_counts {
+       uint64_t u64;
+       struct cvmx_sli_pkt_in_instr_counts_s {
+               uint64_t wr_cnt:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_in_pcie_port {
+       uint64_t u64;
+       struct cvmx_sli_pkt_in_pcie_port_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_input_control {
+       uint64_t u64;
+       struct cvmx_sli_pkt_input_control_s {
+               uint64_t prd_erst:1;
+               uint64_t prd_rds:7;
+               uint64_t gii_erst:1;
+               uint64_t gii_rds:7;
+               uint64_t reserved_41_47:7;
+               uint64_t prc_idle:1;
+               uint64_t reserved_24_39:16;
+               uint64_t pin_rst:1;
+               uint64_t pkt_rr:1;
+               uint64_t pbp_dhi:13;
+               uint64_t d_nsr:1;
+               uint64_t d_esr:2;
+               uint64_t d_ror:1;
+               uint64_t use_csr:1;
+               uint64_t nsr:1;
+               uint64_t esr:2;
+               uint64_t ror:1;
+       } s;
+       struct cvmx_sli_pkt_input_control_s cn61xx;
+       struct cvmx_sli_pkt_input_control_cn63xx {
+               uint64_t reserved_23_63:41;
+               uint64_t pkt_rr:1;
+               uint64_t pbp_dhi:13;
+               uint64_t d_nsr:1;
+               uint64_t d_esr:2;
+               uint64_t d_ror:1;
+               uint64_t use_csr:1;
+               uint64_t nsr:1;
+               uint64_t esr:2;
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_instr_enb {
+       uint64_t u64;
+       struct cvmx_sli_pkt_instr_enb_s {
+               uint64_t reserved_32_63:32;
+               uint64_t enb:32;
+       } s;
+       struct cvmx_sli_pkt_instr_enb_s cn61xx;
+       struct cvmx_sli_pkt_instr_enb_s cn63xx;
+       struct cvmx_sli_pkt_instr_enb_s cn63xxp1;
+       struct cvmx_sli_pkt_instr_enb_s cn66xx;
+       struct cvmx_sli_pkt_instr_enb_s cn68xx;
+       struct cvmx_sli_pkt_instr_enb_s cn68xxp1;
+};
+
+union cvmx_sli_pkt_instr_rd_size {
+       uint64_t u64;
+       struct cvmx_sli_pkt_instr_rd_size_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_instr_size {
+       uint64_t u64;
+       struct cvmx_sli_pkt_instr_size_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_int_levels {
+       uint64_t u64;
+       struct cvmx_sli_pkt_int_levels_s {
+               uint64_t reserved_54_63:10;
+               uint64_t time:22;
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_iptr {
+       uint64_t u64;
+       struct cvmx_sli_pkt_iptr_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_out_bmode {
+       uint64_t u64;
+       struct cvmx_sli_pkt_out_bmode_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_out_bp_en {
+       uint64_t u64;
+       struct cvmx_sli_pkt_out_bp_en_s {
+               uint64_t reserved_32_63:32;
+               uint64_t bp_en:32;
+       } s;
+       struct cvmx_sli_pkt_out_bp_en_s cn68xx;
+       struct cvmx_sli_pkt_out_bp_en_s cn68xxp1;
+};
+
+union cvmx_sli_pkt_out_enb {
+       uint64_t u64;
+       struct cvmx_sli_pkt_out_enb_s {
+               uint64_t reserved_32_63:32;
+               uint64_t enb:32;
+       } s;
+       struct cvmx_sli_pkt_out_enb_s cn61xx;
+       struct cvmx_sli_pkt_out_enb_s cn63xx;
+       struct cvmx_sli_pkt_out_enb_s cn63xxp1;
+       struct cvmx_sli_pkt_out_enb_s cn66xx;
+       struct cvmx_sli_pkt_out_enb_s cn68xx;
+       struct cvmx_sli_pkt_out_enb_s cn68xxp1;
+};
+
+union cvmx_sli_pkt_output_wmark {
+       uint64_t u64;
+       struct cvmx_sli_pkt_output_wmark_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_pcie_port {
+       uint64_t u64;
+       struct cvmx_sli_pkt_pcie_port_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_port_in_rst {
+       uint64_t u64;
+       struct cvmx_sli_pkt_port_in_rst_s {
+               uint64_t in_rst:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_slist_es {
+       uint64_t u64;
+       struct cvmx_sli_pkt_slist_es_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_slist_ns {
+       uint64_t u64;
+       struct cvmx_sli_pkt_slist_ns_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_slist_ror {
+       uint64_t u64;
+       struct cvmx_sli_pkt_slist_ror_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_pkt_time_int {
+       uint64_t u64;
+       struct cvmx_sli_pkt_time_int_s {
+               uint64_t reserved_32_63:32;
+               uint64_t port:32;
+       } s;
+       struct cvmx_sli_pkt_time_int_s cn61xx;
+       struct cvmx_sli_pkt_time_int_s cn63xx;
+       struct cvmx_sli_pkt_time_int_s cn63xxp1;
+       struct cvmx_sli_pkt_time_int_s cn66xx;
+       struct cvmx_sli_pkt_time_int_s cn68xx;
+       struct cvmx_sli_pkt_time_int_s cn68xxp1;
+};
+
+union cvmx_sli_pkt_time_int_enb {
+       uint64_t u64;
+       struct cvmx_sli_pkt_time_int_enb_s {
+               uint64_t reserved_32_63:32;
+               uint64_t 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;
+};
+
+union cvmx_sli_portx_pkind {
+       uint64_t u64;
+       struct cvmx_sli_portx_pkind_s {
+               uint64_t reserved_25_63:39;
+               uint64_t rpk_enb:1;
+               uint64_t reserved_22_23:2;
+               uint64_t pkindr:6;
+               uint64_t reserved_14_15:2;
+               uint64_t bpkind:6;
+               uint64_t reserved_6_7:2;
+               uint64_t pkind:6;
+       } s;
+       struct cvmx_sli_portx_pkind_s cn68xx;
+       struct cvmx_sli_portx_pkind_cn68xxp1 {
+               uint64_t reserved_14_63:50;
+               uint64_t bpkind:6;
+               uint64_t reserved_6_7:2;
+               uint64_t pkind:6;
+       } cn68xxp1;
+};
+
+union cvmx_sli_s2m_portx_ctl {
+       uint64_t u64;
+       struct cvmx_sli_s2m_portx_ctl_s {
+               uint64_t reserved_5_63:59;
+               uint64_t wind_d:1;
+               uint64_t bar0_d:1;
+               uint64_t mrrs:3;
+       } s;
+       struct cvmx_sli_s2m_portx_ctl_s cn61xx;
+       struct cvmx_sli_s2m_portx_ctl_s cn63xx;
+       struct cvmx_sli_s2m_portx_ctl_s cn63xxp1;
+       struct cvmx_sli_s2m_portx_ctl_s cn66xx;
+       struct cvmx_sli_s2m_portx_ctl_s cn68xx;
+       struct cvmx_sli_s2m_portx_ctl_s cn68xxp1;
+};
+
+union cvmx_sli_scratch_1 {
+       uint64_t u64;
+       struct cvmx_sli_scratch_1_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_scratch_2 {
+       uint64_t u64;
+       struct cvmx_sli_scratch_2_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_state1 {
+       uint64_t u64;
+       struct cvmx_sli_state1_s {
+               uint64_t cpl1:12;
+               uint64_t cpl0:12;
+               uint64_t arb:1;
+               uint64_t 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;
+};
+
+union cvmx_sli_state2 {
+       uint64_t u64;
+       struct cvmx_sli_state2_s {
+               uint64_t reserved_56_63:8;
+               uint64_t nnp1:8;
+               uint64_t reserved_47_47:1;
+               uint64_t rac:1;
+               uint64_t csm1:15;
+               uint64_t csm0:15;
+               uint64_t nnp0:8;
+               uint64_t nnd:8;
+       } s;
+       struct cvmx_sli_state2_s cn61xx;
+       struct cvmx_sli_state2_s cn63xx;
+       struct cvmx_sli_state2_s cn63xxp1;
+       struct cvmx_sli_state2_s cn66xx;
+       struct cvmx_sli_state2_s cn68xx;
+       struct cvmx_sli_state2_s cn68xxp1;
+};
+
+union cvmx_sli_state3 {
+       uint64_t u64;
+       struct cvmx_sli_state3_s {
+               uint64_t reserved_56_63:8;
+               uint64_t psm1:15;
+               uint64_t psm0:15;
+               uint64_t nsm1:13;
+               uint64_t nsm0:13;
+       } s;
+       struct cvmx_sli_state3_s cn61xx;
+       struct cvmx_sli_state3_s cn63xx;
+       struct cvmx_sli_state3_s cn63xxp1;
+       struct cvmx_sli_state3_s cn66xx;
+       struct cvmx_sli_state3_s cn68xx;
+       struct cvmx_sli_state3_s cn68xxp1;
+};
+
+union cvmx_sli_tx_pipe {
+       uint64_t u64;
+       struct cvmx_sli_tx_pipe_s {
+               uint64_t reserved_24_63:40;
+               uint64_t nump:8;
+               uint64_t reserved_7_15:9;
+               uint64_t base:7;
+       } s;
+       struct cvmx_sli_tx_pipe_s cn68xx;
+       struct cvmx_sli_tx_pipe_s cn68xxp1;
+};
+
+union cvmx_sli_win_rd_addr {
+       uint64_t u64;
+       struct cvmx_sli_win_rd_addr_s {
+               uint64_t reserved_51_63:13;
+               uint64_t ld_cmd:2;
+               uint64_t iobit:1;
+               uint64_t 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;
+};
+
+union cvmx_sli_win_rd_data {
+       uint64_t u64;
+       struct cvmx_sli_win_rd_data_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_win_wr_addr {
+       uint64_t u64;
+       struct cvmx_sli_win_wr_addr_s {
+               uint64_t reserved_49_63:15;
+               uint64_t iobit:1;
+               uint64_t wr_addr:45;
+               uint64_t 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;
+};
+
+union cvmx_sli_win_wr_data {
+       uint64_t u64;
+       struct cvmx_sli_win_wr_data_s {
+               uint64_t 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;
+};
+
+union cvmx_sli_win_wr_mask {
+       uint64_t u64;
+       struct cvmx_sli_win_wr_mask_s {
+               uint64_t reserved_8_63:56;
+               uint64_t 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;
+};
+
+union cvmx_sli_window_ctl {
+       uint64_t u64;
+       struct cvmx_sli_window_ctl_s {
+               uint64_t reserved_32_63:32;
+               uint64_t time:32;
+       } s;
+       struct cvmx_sli_window_ctl_s cn61xx;
+       struct cvmx_sli_window_ctl_s cn63xx;
+       struct cvmx_sli_window_ctl_s cn63xxp1;
+       struct cvmx_sli_window_ctl_s cn66xx;
+       struct cvmx_sli_window_ctl_s cn68xx;
+       struct cvmx_sli_window_ctl_s cn68xxp1;
+};
+
+#endif
diff --git a/arch/mips/include/asm/octeon/cvmx-spi.h b/arch/mips/include/asm/octeon/cvmx-spi.h
new file mode 100644 (file)
index 0000000..e814648
--- /dev/null
@@ -0,0 +1,269 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/*
+ *
+ * This file contains defines for the SPI interface
+ */
+#ifndef __CVMX_SPI_H__
+#define __CVMX_SPI_H__
+
+#include "cvmx-gmxx-defs.h"
+
+/* CSR typedefs have been moved to cvmx-csr-*.h */
+
+typedef enum {
+       CVMX_SPI_MODE_UNKNOWN = 0,
+       CVMX_SPI_MODE_TX_HALFPLEX = 1,
+       CVMX_SPI_MODE_RX_HALFPLEX = 2,
+       CVMX_SPI_MODE_DUPLEX = 3
+} cvmx_spi_mode_t;
+
+/** Callbacks structure to customize SPI4 initialization sequence */
+typedef struct {
+    /** Called to reset SPI4 DLL */
+       int (*reset_cb) (int interface, cvmx_spi_mode_t mode);
+
+    /** Called to setup calendar */
+       int (*calendar_setup_cb) (int interface, cvmx_spi_mode_t mode,
+                                 int num_ports);
+
+    /** Called for Tx and Rx clock detection */
+       int (*clock_detect_cb) (int interface, cvmx_spi_mode_t mode,
+                               int timeout);
+
+    /** Called to perform link training */
+       int (*training_cb) (int interface, cvmx_spi_mode_t mode, int timeout);
+
+    /** Called for calendar data synchronization */
+       int (*calendar_sync_cb) (int interface, cvmx_spi_mode_t mode,
+                                int timeout);
+
+    /** Called when interface is up */
+       int (*interface_up_cb) (int interface, cvmx_spi_mode_t mode);
+
+} cvmx_spi_callbacks_t;
+
+/**
+ * Return true if the supplied interface is configured for SPI
+ *
+ * @interface: Interface to check
+ * Returns True if interface is SPI
+ */
+static inline int cvmx_spi_is_spi_interface(int interface)
+{
+       uint64_t gmxState = cvmx_read_csr(CVMX_GMXX_INF_MODE(interface));
+       return (gmxState & 0x2) && (gmxState & 0x1);
+}
+
+/**
+ * Initialize and start the SPI interface.
+ *
+ * @interface: The identifier of the packet interface to configure and
+ *                  use as a SPI interface.
+ * @mode:      The operating mode for the SPI interface. The interface
+ *                  can operate as a full duplex (both Tx and Rx data paths
+ *                  active) or as a halfplex (either the Tx data path is
+ *                  active or the Rx data path is active, but not both).
+ * @timeout:   Timeout to wait for clock synchronization in seconds
+ * @num_ports: Number of SPI ports to configure
+ *
+ * Returns Zero on success, negative of failure.
+ */
+extern int cvmx_spi_start_interface(int interface, cvmx_spi_mode_t mode,
+                                   int timeout, int num_ports);
+
+/**
+ * This routine restarts the SPI interface after it has lost synchronization
+ * with its corespondant system.
+ *
+ * @interface: The identifier of the packet interface to configure and
+ *                  use as a SPI interface.
+ * @mode:      The operating mode for the SPI interface. The interface
+ *                  can operate as a full duplex (both Tx and Rx data paths
+ *                  active) or as a halfplex (either the Tx data path is
+ *                  active or the Rx data path is active, but not both).
+ * @timeout:   Timeout to wait for clock synchronization in seconds
+ * Returns Zero on success, negative of failure.
+ */
+extern int cvmx_spi_restart_interface(int interface, cvmx_spi_mode_t mode,
+                                     int timeout);
+
+/**
+ * Return non-zero if the SPI interface has a SPI4000 attached
+ *
+ * @interface: SPI interface the SPI4000 is connected to
+ *
+ * Returns
+ */
+static inline int cvmx_spi4000_is_present(int interface)
+{
+       return 0;
+}
+
+/**
+ * Initialize the SPI4000 for use
+ *
+ * @interface: SPI interface the SPI4000 is connected to
+ */
+static inline int cvmx_spi4000_initialize(int interface)
+{
+       return 0;
+}
+
+/**
+ * Poll all the SPI4000 port and check its speed
+ *
+ * @interface: Interface the SPI4000 is on
+ * @port:      Port to poll (0-9)
+ * Returns Status of the port. 0=down. All other values the port is up.
+ */
+static inline union cvmx_gmxx_rxx_rx_inbnd cvmx_spi4000_check_speed(
+       int interface,
+       int port)
+{
+       union cvmx_gmxx_rxx_rx_inbnd r;
+       r.u64 = 0;
+       return r;
+}
+
+/**
+ * Get current SPI4 initialization callbacks
+ *
+ * @callbacks:  Pointer to the callbacks structure.to fill
+ *
+ * Returns Pointer to cvmx_spi_callbacks_t structure.
+ */
+extern void cvmx_spi_get_callbacks(cvmx_spi_callbacks_t *callbacks);
+
+/**
+ * Set new SPI4 initialization callbacks
+ *
+ * @new_callbacks:  Pointer to an updated callbacks structure.
+ */
+extern void cvmx_spi_set_callbacks(cvmx_spi_callbacks_t *new_callbacks);
+
+/**
+ * Callback to perform SPI4 reset
+ *
+ * @interface: The identifier of the packet interface to configure and
+ *                  use as a SPI interface.
+ * @mode:      The operating mode for the SPI interface. The interface
+ *                  can operate as a full duplex (both Tx and Rx data paths
+ *                  active) or as a halfplex (either the Tx data path is
+ *                  active or the Rx data path is active, but not both).
+ *
+ * Returns Zero on success, non-zero error code on failure (will cause
+ * SPI initialization to abort)
+ */
+extern int cvmx_spi_reset_cb(int interface, cvmx_spi_mode_t mode);
+
+/**
+ * Callback to setup calendar and miscellaneous settings before clock
+ * detection
+ *
+ * @interface: The identifier of the packet interface to configure and
+ *                  use as a SPI interface.
+ * @mode:      The operating mode for the SPI interface. The interface
+ *                  can operate as a full duplex (both Tx and Rx data paths
+ *                  active) or as a halfplex (either the Tx data path is
+ *                  active or the Rx data path is active, but not both).
+ * @num_ports: Number of ports to configure on SPI
+ *
+ * Returns Zero on success, non-zero error code on failure (will cause
+ * SPI initialization to abort)
+ */
+extern int cvmx_spi_calendar_setup_cb(int interface, cvmx_spi_mode_t mode,
+                                     int num_ports);
+
+/**
+ * Callback to perform clock detection
+ *
+ * @interface: The identifier of the packet interface to configure and
+ *                  use as a SPI interface.
+ * @mode:      The operating mode for the SPI interface. The interface
+ *                  can operate as a full duplex (both Tx and Rx data paths
+ *                  active) or as a halfplex (either the Tx data path is
+ *                  active or the Rx data path is active, but not both).
+ * @timeout:   Timeout to wait for clock synchronization in seconds
+ *
+ * Returns Zero on success, non-zero error code on failure (will cause
+ * SPI initialization to abort)
+ */
+extern int cvmx_spi_clock_detect_cb(int interface, cvmx_spi_mode_t mode,
+                                   int timeout);
+
+/**
+ * Callback to perform link training
+ *
+ * @interface: The identifier of the packet interface to configure and
+ *                  use as a SPI interface.
+ * @mode:      The operating mode for the SPI interface. The interface
+ *                  can operate as a full duplex (both Tx and Rx data paths
+ *                  active) or as a halfplex (either the Tx data path is
+ *                  active or the Rx data path is active, but not both).
+ * @timeout:   Timeout to wait for link to be trained (in seconds)
+ *
+ * Returns Zero on success, non-zero error code on failure (will cause
+ * SPI initialization to abort)
+ */
+extern int cvmx_spi_training_cb(int interface, cvmx_spi_mode_t mode,
+                               int timeout);
+
+/**
+ * Callback to perform calendar data synchronization
+ *
+ * @interface: The identifier of the packet interface to configure and
+ *                  use as a SPI interface.
+ * @mode:      The operating mode for the SPI interface. The interface
+ *                  can operate as a full duplex (both Tx and Rx data paths
+ *                  active) or as a halfplex (either the Tx data path is
+ *                  active or the Rx data path is active, but not both).
+ * @timeout:   Timeout to wait for calendar data in seconds
+ *
+ * Returns Zero on success, non-zero error code on failure (will cause
+ * SPI initialization to abort)
+ */
+extern int cvmx_spi_calendar_sync_cb(int interface, cvmx_spi_mode_t mode,
+                                    int timeout);
+
+/**
+ * Callback to handle interface up
+ *
+ * @interface: The identifier of the packet interface to configure and
+ *                  use as a SPI interface.
+ * @mode:      The operating mode for the SPI interface. The interface
+ *                  can operate as a full duplex (both Tx and Rx data paths
+ *                  active) or as a halfplex (either the Tx data path is
+ *                  active or the Rx data path is active, but not both).
+ *
+ * Returns Zero on success, non-zero error code on failure (will cause
+ * SPI initialization to abort)
+ */
+extern int cvmx_spi_interface_up_cb(int interface, cvmx_spi_mode_t mode);
+
+#endif /* __CVMX_SPI_H__ */
diff --git a/arch/mips/include/asm/octeon/cvmx-spxx-defs.h b/arch/mips/include/asm/octeon/cvmx-spxx-defs.h
new file mode 100644 (file)
index 0000000..b16940e
--- /dev/null
@@ -0,0 +1,347 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+#ifndef __CVMX_SPXX_DEFS_H__
+#define __CVMX_SPXX_DEFS_H__
+
+#define CVMX_SPXX_BCKPRS_CNT(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000340ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_SPXX_BIST_STAT(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800900007F8ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_SPXX_CLK_CTL(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000348ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_SPXX_CLK_STAT(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000350ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_SPXX_DBG_DESKEW_CTL(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000368ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_SPXX_DBG_DESKEW_STATE(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000370ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_SPXX_DRV_CTL(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000358ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_SPXX_ERR_CTL(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000320ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_SPXX_INT_DAT(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000318ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_SPXX_INT_MSK(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000308ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_SPXX_INT_REG(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000300ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_SPXX_INT_SYNC(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000310ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_SPXX_TPA_ACC(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000338ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_SPXX_TPA_MAX(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000330ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_SPXX_TPA_SEL(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000328ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_SPXX_TRN4_CTL(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000360ull + (((block_id) & 1) * 0x8000000ull))
+
+union cvmx_spxx_bckprs_cnt {
+       uint64_t u64;
+       struct cvmx_spxx_bckprs_cnt_s {
+               uint64_t reserved_32_63:32;
+               uint64_t cnt:32;
+       } s;
+       struct cvmx_spxx_bckprs_cnt_s cn38xx;
+       struct cvmx_spxx_bckprs_cnt_s cn38xxp2;
+       struct cvmx_spxx_bckprs_cnt_s cn58xx;
+       struct cvmx_spxx_bckprs_cnt_s cn58xxp1;
+};
+
+union cvmx_spxx_bist_stat {
+       uint64_t u64;
+       struct cvmx_spxx_bist_stat_s {
+               uint64_t reserved_3_63:61;
+               uint64_t stat2:1;
+               uint64_t stat1:1;
+               uint64_t stat0:1;
+       } s;
+       struct cvmx_spxx_bist_stat_s cn38xx;
+       struct cvmx_spxx_bist_stat_s cn38xxp2;
+       struct cvmx_spxx_bist_stat_s cn58xx;
+       struct cvmx_spxx_bist_stat_s cn58xxp1;
+};
+
+union cvmx_spxx_clk_ctl {
+       uint64_t u64;
+       struct cvmx_spxx_clk_ctl_s {
+               uint64_t reserved_17_63:47;
+               uint64_t seetrn:1;
+               uint64_t reserved_12_15:4;
+               uint64_t clkdly:5;
+               uint64_t runbist:1;
+               uint64_t statdrv:1;
+               uint64_t statrcv:1;
+               uint64_t sndtrn:1;
+               uint64_t drptrn:1;
+               uint64_t rcvtrn:1;
+               uint64_t srxdlck:1;
+       } s;
+       struct cvmx_spxx_clk_ctl_s cn38xx;
+       struct cvmx_spxx_clk_ctl_s cn38xxp2;
+       struct cvmx_spxx_clk_ctl_s cn58xx;
+       struct cvmx_spxx_clk_ctl_s cn58xxp1;
+};
+
+union cvmx_spxx_clk_stat {
+       uint64_t u64;
+       struct cvmx_spxx_clk_stat_s {
+               uint64_t reserved_11_63:53;
+               uint64_t stxcal:1;
+               uint64_t reserved_9_9:1;
+               uint64_t srxtrn:1;
+               uint64_t s4clk1:1;
+               uint64_t s4clk0:1;
+               uint64_t d4clk1:1;
+               uint64_t d4clk0:1;
+               uint64_t reserved_0_3:4;
+       } s;
+       struct cvmx_spxx_clk_stat_s cn38xx;
+       struct cvmx_spxx_clk_stat_s cn38xxp2;
+       struct cvmx_spxx_clk_stat_s cn58xx;
+       struct cvmx_spxx_clk_stat_s cn58xxp1;
+};
+
+union cvmx_spxx_dbg_deskew_ctl {
+       uint64_t u64;
+       struct cvmx_spxx_dbg_deskew_ctl_s {
+               uint64_t reserved_30_63:34;
+               uint64_t fallnop:1;
+               uint64_t fall8:1;
+               uint64_t reserved_26_27:2;
+               uint64_t sstep_go:1;
+               uint64_t sstep:1;
+               uint64_t reserved_22_23:2;
+               uint64_t clrdly:1;
+               uint64_t dec:1;
+               uint64_t inc:1;
+               uint64_t mux:1;
+               uint64_t offset:5;
+               uint64_t bitsel:5;
+               uint64_t offdly:6;
+               uint64_t dllfrc:1;
+               uint64_t dlldis:1;
+       } s;
+       struct cvmx_spxx_dbg_deskew_ctl_s cn38xx;
+       struct cvmx_spxx_dbg_deskew_ctl_s cn38xxp2;
+       struct cvmx_spxx_dbg_deskew_ctl_s cn58xx;
+       struct cvmx_spxx_dbg_deskew_ctl_s cn58xxp1;
+};
+
+union cvmx_spxx_dbg_deskew_state {
+       uint64_t u64;
+       struct cvmx_spxx_dbg_deskew_state_s {
+               uint64_t reserved_9_63:55;
+               uint64_t testres:1;
+               uint64_t unxterm:1;
+               uint64_t muxsel:2;
+               uint64_t offset:5;
+       } s;
+       struct cvmx_spxx_dbg_deskew_state_s cn38xx;
+       struct cvmx_spxx_dbg_deskew_state_s cn38xxp2;
+       struct cvmx_spxx_dbg_deskew_state_s cn58xx;
+       struct cvmx_spxx_dbg_deskew_state_s cn58xxp1;
+};
+
+union cvmx_spxx_drv_ctl {
+       uint64_t u64;
+       struct cvmx_spxx_drv_ctl_s {
+               uint64_t reserved_0_63:64;
+       } s;
+       struct cvmx_spxx_drv_ctl_cn38xx {
+               uint64_t reserved_16_63:48;
+               uint64_t stx4ncmp:4;
+               uint64_t stx4pcmp:4;
+               uint64_t srx4cmp:8;
+       } cn38xx;
+       struct cvmx_spxx_drv_ctl_cn38xx cn38xxp2;
+       struct cvmx_spxx_drv_ctl_cn58xx {
+               uint64_t reserved_24_63:40;
+               uint64_t stx4ncmp:4;
+               uint64_t stx4pcmp:4;
+               uint64_t reserved_10_15:6;
+               uint64_t srx4cmp:10;
+       } cn58xx;
+       struct cvmx_spxx_drv_ctl_cn58xx cn58xxp1;
+};
+
+union cvmx_spxx_err_ctl {
+       uint64_t u64;
+       struct cvmx_spxx_err_ctl_s {
+               uint64_t reserved_9_63:55;
+               uint64_t prtnxa:1;
+               uint64_t dipcls:1;
+               uint64_t dippay:1;
+               uint64_t reserved_4_5:2;
+               uint64_t errcnt:4;
+       } s;
+       struct cvmx_spxx_err_ctl_s cn38xx;
+       struct cvmx_spxx_err_ctl_s cn38xxp2;
+       struct cvmx_spxx_err_ctl_s cn58xx;
+       struct cvmx_spxx_err_ctl_s cn58xxp1;
+};
+
+union cvmx_spxx_int_dat {
+       uint64_t u64;
+       struct cvmx_spxx_int_dat_s {
+               uint64_t reserved_32_63:32;
+               uint64_t mul:1;
+               uint64_t reserved_14_30:17;
+               uint64_t calbnk:2;
+               uint64_t rsvop:4;
+               uint64_t prt:8;
+       } s;
+       struct cvmx_spxx_int_dat_s cn38xx;
+       struct cvmx_spxx_int_dat_s cn38xxp2;
+       struct cvmx_spxx_int_dat_s cn58xx;
+       struct cvmx_spxx_int_dat_s cn58xxp1;
+};
+
+union cvmx_spxx_int_msk {
+       uint64_t u64;
+       struct cvmx_spxx_int_msk_s {
+               uint64_t reserved_12_63:52;
+               uint64_t calerr:1;
+               uint64_t syncerr:1;
+               uint64_t diperr:1;
+               uint64_t tpaovr:1;
+               uint64_t rsverr:1;
+               uint64_t drwnng:1;
+               uint64_t clserr:1;
+               uint64_t spiovr:1;
+               uint64_t reserved_2_3:2;
+               uint64_t abnorm:1;
+               uint64_t prtnxa:1;
+       } s;
+       struct cvmx_spxx_int_msk_s cn38xx;
+       struct cvmx_spxx_int_msk_s cn38xxp2;
+       struct cvmx_spxx_int_msk_s cn58xx;
+       struct cvmx_spxx_int_msk_s cn58xxp1;
+};
+
+union cvmx_spxx_int_reg {
+       uint64_t u64;
+       struct cvmx_spxx_int_reg_s {
+               uint64_t reserved_32_63:32;
+               uint64_t spf:1;
+               uint64_t reserved_12_30:19;
+               uint64_t calerr:1;
+               uint64_t syncerr:1;
+               uint64_t diperr:1;
+               uint64_t tpaovr:1;
+               uint64_t rsverr:1;
+               uint64_t drwnng:1;
+               uint64_t clserr:1;
+               uint64_t spiovr:1;
+               uint64_t reserved_2_3:2;
+               uint64_t abnorm:1;
+               uint64_t prtnxa:1;
+       } s;
+       struct cvmx_spxx_int_reg_s cn38xx;
+       struct cvmx_spxx_int_reg_s cn38xxp2;
+       struct cvmx_spxx_int_reg_s cn58xx;
+       struct cvmx_spxx_int_reg_s cn58xxp1;
+};
+
+union cvmx_spxx_int_sync {
+       uint64_t u64;
+       struct cvmx_spxx_int_sync_s {
+               uint64_t reserved_12_63:52;
+               uint64_t calerr:1;
+               uint64_t syncerr:1;
+               uint64_t diperr:1;
+               uint64_t tpaovr:1;
+               uint64_t rsverr:1;
+               uint64_t drwnng:1;
+               uint64_t clserr:1;
+               uint64_t spiovr:1;
+               uint64_t reserved_2_3:2;
+               uint64_t abnorm:1;
+               uint64_t prtnxa:1;
+       } s;
+       struct cvmx_spxx_int_sync_s cn38xx;
+       struct cvmx_spxx_int_sync_s cn38xxp2;
+       struct cvmx_spxx_int_sync_s cn58xx;
+       struct cvmx_spxx_int_sync_s cn58xxp1;
+};
+
+union cvmx_spxx_tpa_acc {
+       uint64_t u64;
+       struct cvmx_spxx_tpa_acc_s {
+               uint64_t reserved_32_63:32;
+               uint64_t cnt:32;
+       } s;
+       struct cvmx_spxx_tpa_acc_s cn38xx;
+       struct cvmx_spxx_tpa_acc_s cn38xxp2;
+       struct cvmx_spxx_tpa_acc_s cn58xx;
+       struct cvmx_spxx_tpa_acc_s cn58xxp1;
+};
+
+union cvmx_spxx_tpa_max {
+       uint64_t u64;
+       struct cvmx_spxx_tpa_max_s {
+               uint64_t reserved_32_63:32;
+               uint64_t max:32;
+       } s;
+       struct cvmx_spxx_tpa_max_s cn38xx;
+       struct cvmx_spxx_tpa_max_s cn38xxp2;
+       struct cvmx_spxx_tpa_max_s cn58xx;
+       struct cvmx_spxx_tpa_max_s cn58xxp1;
+};
+
+union cvmx_spxx_tpa_sel {
+       uint64_t u64;
+       struct cvmx_spxx_tpa_sel_s {
+               uint64_t reserved_4_63:60;
+               uint64_t prtsel:4;
+       } s;
+       struct cvmx_spxx_tpa_sel_s cn38xx;
+       struct cvmx_spxx_tpa_sel_s cn38xxp2;
+       struct cvmx_spxx_tpa_sel_s cn58xx;
+       struct cvmx_spxx_tpa_sel_s cn58xxp1;
+};
+
+union cvmx_spxx_trn4_ctl {
+       uint64_t u64;
+       struct cvmx_spxx_trn4_ctl_s {
+               uint64_t reserved_13_63:51;
+               uint64_t trntest:1;
+               uint64_t jitter:3;
+               uint64_t clr_boot:1;
+               uint64_t set_boot:1;
+               uint64_t maxdist:5;
+               uint64_t macro_en:1;
+               uint64_t mux_en:1;
+       } s;
+       struct cvmx_spxx_trn4_ctl_s cn38xx;
+       struct cvmx_spxx_trn4_ctl_s cn38xxp2;
+       struct cvmx_spxx_trn4_ctl_s cn58xx;
+       struct cvmx_spxx_trn4_ctl_s cn58xxp1;
+};
+
+#endif
diff --git a/arch/mips/include/asm/octeon/cvmx-sriox-defs.h b/arch/mips/include/asm/octeon/cvmx-sriox-defs.h
new file mode 100644 (file)
index 0000000..7be7e9e
--- /dev/null
@@ -0,0 +1,1036 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2011 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+#ifndef __CVMX_SRIOX_DEFS_H__
+#define __CVMX_SRIOX_DEFS_H__
+
+#define CVMX_SRIOX_ACC_CTRL(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000148ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_ASMBLY_ID(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000200ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_ASMBLY_INFO(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000208ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_BELL_RESP_CTRL(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000310ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_BIST_STATUS(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000108ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_IMSG_CTRL(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000508ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_IMSG_INST_HDRX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C8000510ull) + (((offset) & 1) + ((block_id) & 3) * 0x200000ull) * 8)
+#define CVMX_SRIOX_IMSG_QOS_GRPX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C8000600ull) + (((offset) & 31) + ((block_id) & 3) * 0x200000ull) * 8)
+#define CVMX_SRIOX_IMSG_STATUSX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C8000700ull) + (((offset) & 31) + ((block_id) & 3) * 0x200000ull) * 8)
+#define CVMX_SRIOX_IMSG_VPORT_THR(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000500ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_IMSG_VPORT_THR2(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000528ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_INT2_ENABLE(block_id) (CVMX_ADD_IO_SEG(0x00011800C80003E0ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_INT2_REG(block_id) (CVMX_ADD_IO_SEG(0x00011800C80003E8ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_INT_ENABLE(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000110ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_INT_INFO0(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000120ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_INT_INFO1(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000128ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_INT_INFO2(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000130ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_INT_INFO3(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000138ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_INT_REG(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000118ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_IP_FEATURE(block_id) (CVMX_ADD_IO_SEG(0x00011800C80003F8ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_MAC_BUFFERS(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000390ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_MAINT_OP(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000158ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_MAINT_RD_DATA(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000160ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_MCE_TX_CTL(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000240ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_MEM_OP_CTRL(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000168ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_OMSG_CTRLX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C8000488ull) + (((offset) & 1) + ((block_id) & 3) * 0x40000ull) * 64)
+#define CVMX_SRIOX_OMSG_DONE_COUNTSX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C80004B0ull) + (((offset) & 1) + ((block_id) & 3) * 0x40000ull) * 64)
+#define CVMX_SRIOX_OMSG_FMP_MRX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C8000498ull) + (((offset) & 1) + ((block_id) & 3) * 0x40000ull) * 64)
+#define CVMX_SRIOX_OMSG_NMP_MRX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C80004A0ull) + (((offset) & 1) + ((block_id) & 3) * 0x40000ull) * 64)
+#define CVMX_SRIOX_OMSG_PORTX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C8000480ull) + (((offset) & 1) + ((block_id) & 3) * 0x40000ull) * 64)
+#define CVMX_SRIOX_OMSG_SILO_THR(block_id) (CVMX_ADD_IO_SEG(0x00011800C80004F8ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_OMSG_SP_MRX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C8000490ull) + (((offset) & 1) + ((block_id) & 3) * 0x40000ull) * 64)
+#define CVMX_SRIOX_PRIOX_IN_USE(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C80003C0ull) + (((offset) & 3) + ((block_id) & 3) * 0x200000ull) * 8)
+#define CVMX_SRIOX_RX_BELL(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000308ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_RX_BELL_SEQ(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000300ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_RX_STATUS(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000380ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_S2M_TYPEX(offset, block_id) (CVMX_ADD_IO_SEG(0x00011800C8000180ull) + (((offset) & 15) + ((block_id) & 3) * 0x200000ull) * 8)
+#define CVMX_SRIOX_SEQ(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000278ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_STATUS_REG(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000100ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_TAG_CTRL(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000178ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_TLP_CREDITS(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000150ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_TX_BELL(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000280ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_TX_BELL_INFO(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000288ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_TX_CTRL(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000170ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_TX_EMPHASIS(block_id) (CVMX_ADD_IO_SEG(0x00011800C80003F0ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_TX_STATUS(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000388ull) + ((block_id) & 3) * 0x1000000ull)
+#define CVMX_SRIOX_WR_DONE_COUNTS(block_id) (CVMX_ADD_IO_SEG(0x00011800C8000340ull) + ((block_id) & 3) * 0x1000000ull)
+
+union cvmx_sriox_acc_ctrl {
+       uint64_t u64;
+       struct cvmx_sriox_acc_ctrl_s {
+               uint64_t reserved_7_63:57;
+               uint64_t deny_adr2:1;
+               uint64_t deny_adr1:1;
+               uint64_t deny_adr0:1;
+               uint64_t reserved_3_3:1;
+               uint64_t deny_bar2:1;
+               uint64_t deny_bar1:1;
+               uint64_t deny_bar0:1;
+       } s;
+       struct cvmx_sriox_acc_ctrl_cn63xx {
+               uint64_t reserved_3_63:61;
+               uint64_t deny_bar2:1;
+               uint64_t deny_bar1:1;
+               uint64_t deny_bar0:1;
+       } cn63xx;
+       struct cvmx_sriox_acc_ctrl_cn63xx cn63xxp1;
+       struct cvmx_sriox_acc_ctrl_s cn66xx;
+};
+
+union cvmx_sriox_asmbly_id {
+       uint64_t u64;
+       struct cvmx_sriox_asmbly_id_s {
+               uint64_t reserved_32_63:32;
+               uint64_t assy_id:16;
+               uint64_t assy_ven:16;
+       } s;
+       struct cvmx_sriox_asmbly_id_s cn63xx;
+       struct cvmx_sriox_asmbly_id_s cn63xxp1;
+       struct cvmx_sriox_asmbly_id_s cn66xx;
+};
+
+union cvmx_sriox_asmbly_info {
+       uint64_t u64;
+       struct cvmx_sriox_asmbly_info_s {
+               uint64_t reserved_32_63:32;
+               uint64_t assy_rev:16;
+               uint64_t reserved_0_15:16;
+       } s;
+       struct cvmx_sriox_asmbly_info_s cn63xx;
+       struct cvmx_sriox_asmbly_info_s cn63xxp1;
+       struct cvmx_sriox_asmbly_info_s cn66xx;
+};
+
+union cvmx_sriox_bell_resp_ctrl {
+       uint64_t u64;
+       struct cvmx_sriox_bell_resp_ctrl_s {
+               uint64_t reserved_6_63:58;
+               uint64_t rp1_sid:1;
+               uint64_t rp0_sid:2;
+               uint64_t rp1_pid:1;
+               uint64_t rp0_pid:2;
+       } s;
+       struct cvmx_sriox_bell_resp_ctrl_s cn63xx;
+       struct cvmx_sriox_bell_resp_ctrl_s cn63xxp1;
+       struct cvmx_sriox_bell_resp_ctrl_s cn66xx;
+};
+
+union cvmx_sriox_bist_status {
+       uint64_t u64;
+       struct cvmx_sriox_bist_status_s {
+               uint64_t reserved_45_63:19;
+               uint64_t lram:1;
+               uint64_t mram:2;
+               uint64_t cram:2;
+               uint64_t bell:2;
+               uint64_t otag:2;
+               uint64_t itag:1;
+               uint64_t ofree:1;
+               uint64_t rtn:2;
+               uint64_t obulk:4;
+               uint64_t optrs:4;
+               uint64_t oarb2:2;
+               uint64_t rxbuf2:2;
+               uint64_t oarb:2;
+               uint64_t ispf:1;
+               uint64_t ospf:1;
+               uint64_t txbuf:2;
+               uint64_t rxbuf:2;
+               uint64_t imsg:5;
+               uint64_t omsg:7;
+       } s;
+       struct cvmx_sriox_bist_status_cn63xx {
+               uint64_t reserved_44_63:20;
+               uint64_t mram:2;
+               uint64_t cram:2;
+               uint64_t bell:2;
+               uint64_t otag:2;
+               uint64_t itag:1;
+               uint64_t ofree:1;
+               uint64_t rtn:2;
+               uint64_t obulk:4;
+               uint64_t optrs:4;
+               uint64_t oarb2:2;
+               uint64_t rxbuf2:2;
+               uint64_t oarb:2;
+               uint64_t ispf:1;
+               uint64_t ospf:1;
+               uint64_t txbuf:2;
+               uint64_t rxbuf:2;
+               uint64_t imsg:5;
+               uint64_t omsg:7;
+       } cn63xx;
+       struct cvmx_sriox_bist_status_cn63xxp1 {
+               uint64_t reserved_44_63:20;
+               uint64_t mram:2;
+               uint64_t cram:2;
+               uint64_t bell:2;
+               uint64_t otag:2;
+               uint64_t itag:1;
+               uint64_t ofree:1;
+               uint64_t rtn:2;
+               uint64_t obulk:4;
+               uint64_t optrs:4;
+               uint64_t reserved_20_23:4;
+               uint64_t oarb:2;
+               uint64_t ispf:1;
+               uint64_t ospf:1;
+               uint64_t txbuf:2;
+               uint64_t rxbuf:2;
+               uint64_t imsg:5;
+               uint64_t omsg:7;
+       } cn63xxp1;
+       struct cvmx_sriox_bist_status_s cn66xx;
+};
+
+union cvmx_sriox_imsg_ctrl {
+       uint64_t u64;
+       struct cvmx_sriox_imsg_ctrl_s {
+               uint64_t reserved_32_63:32;
+               uint64_t to_mode:1;
+               uint64_t reserved_30_30:1;
+               uint64_t rsp_thr:6;
+               uint64_t reserved_22_23:2;
+               uint64_t rp1_sid:1;
+               uint64_t rp0_sid:2;
+               uint64_t rp1_pid:1;
+               uint64_t rp0_pid:2;
+               uint64_t reserved_15_15:1;
+               uint64_t prt_sel:3;
+               uint64_t lttr:4;
+               uint64_t prio:4;
+               uint64_t mbox:4;
+       } s;
+       struct cvmx_sriox_imsg_ctrl_s cn63xx;
+       struct cvmx_sriox_imsg_ctrl_s cn63xxp1;
+       struct cvmx_sriox_imsg_ctrl_s cn66xx;
+};
+
+union cvmx_sriox_imsg_inst_hdrx {
+       uint64_t u64;
+       struct cvmx_sriox_imsg_inst_hdrx_s {
+               uint64_t r:1;
+               uint64_t reserved_58_62:5;
+               uint64_t pm:2;
+               uint64_t reserved_55_55:1;
+               uint64_t sl:7;
+               uint64_t reserved_46_47:2;
+               uint64_t nqos:1;
+               uint64_t ngrp:1;
+               uint64_t ntt:1;
+               uint64_t ntag:1;
+               uint64_t reserved_35_41:7;
+               uint64_t rs:1;
+               uint64_t tt:2;
+               uint64_t tag:32;
+       } s;
+       struct cvmx_sriox_imsg_inst_hdrx_s cn63xx;
+       struct cvmx_sriox_imsg_inst_hdrx_s cn63xxp1;
+       struct cvmx_sriox_imsg_inst_hdrx_s cn66xx;
+};
+
+union cvmx_sriox_imsg_qos_grpx {
+       uint64_t u64;
+       struct cvmx_sriox_imsg_qos_grpx_s {
+               uint64_t reserved_63_63:1;
+               uint64_t qos7:3;
+               uint64_t grp7:4;
+               uint64_t reserved_55_55:1;
+               uint64_t qos6:3;
+               uint64_t grp6:4;
+               uint64_t reserved_47_47:1;
+               uint64_t qos5:3;
+               uint64_t grp5:4;
+               uint64_t reserved_39_39:1;
+               uint64_t qos4:3;
+               uint64_t grp4:4;
+               uint64_t reserved_31_31:1;
+               uint64_t qos3:3;
+               uint64_t grp3:4;
+               uint64_t reserved_23_23:1;
+               uint64_t qos2:3;
+               uint64_t grp2:4;
+               uint64_t reserved_15_15:1;
+               uint64_t qos1:3;
+               uint64_t grp1:4;
+               uint64_t reserved_7_7:1;
+               uint64_t qos0:3;
+               uint64_t grp0:4;
+       } s;
+       struct cvmx_sriox_imsg_qos_grpx_s cn63xx;
+       struct cvmx_sriox_imsg_qos_grpx_s cn63xxp1;
+       struct cvmx_sriox_imsg_qos_grpx_s cn66xx;
+};
+
+union cvmx_sriox_imsg_statusx {
+       uint64_t u64;
+       struct cvmx_sriox_imsg_statusx_s {
+               uint64_t val1:1;
+               uint64_t err1:1;
+               uint64_t toe1:1;
+               uint64_t toc1:1;
+               uint64_t prt1:1;
+               uint64_t reserved_58_58:1;
+               uint64_t tt1:1;
+               uint64_t dis1:1;
+               uint64_t seg1:4;
+               uint64_t mbox1:2;
+               uint64_t lttr1:2;
+               uint64_t sid1:16;
+               uint64_t val0:1;
+               uint64_t err0:1;
+               uint64_t toe0:1;
+               uint64_t toc0:1;
+               uint64_t prt0:1;
+               uint64_t reserved_26_26:1;
+               uint64_t tt0:1;
+               uint64_t dis0:1;
+               uint64_t seg0:4;
+               uint64_t mbox0:2;
+               uint64_t lttr0:2;
+               uint64_t sid0:16;
+       } s;
+       struct cvmx_sriox_imsg_statusx_s cn63xx;
+       struct cvmx_sriox_imsg_statusx_s cn63xxp1;
+       struct cvmx_sriox_imsg_statusx_s cn66xx;
+};
+
+union cvmx_sriox_imsg_vport_thr {
+       uint64_t u64;
+       struct cvmx_sriox_imsg_vport_thr_s {
+               uint64_t reserved_54_63:10;
+               uint64_t max_tot:6;
+               uint64_t reserved_46_47:2;
+               uint64_t max_s1:6;
+               uint64_t reserved_38_39:2;
+               uint64_t max_s0:6;
+               uint64_t sp_vport:1;
+               uint64_t reserved_20_30:11;
+               uint64_t buf_thr:4;
+               uint64_t reserved_14_15:2;
+               uint64_t max_p1:6;
+               uint64_t reserved_6_7:2;
+               uint64_t max_p0:6;
+       } s;
+       struct cvmx_sriox_imsg_vport_thr_s cn63xx;
+       struct cvmx_sriox_imsg_vport_thr_s cn63xxp1;
+       struct cvmx_sriox_imsg_vport_thr_s cn66xx;
+};
+
+union cvmx_sriox_imsg_vport_thr2 {
+       uint64_t u64;
+       struct cvmx_sriox_imsg_vport_thr2_s {
+               uint64_t reserved_46_63:18;
+               uint64_t max_s3:6;
+               uint64_t reserved_38_39:2;
+               uint64_t max_s2:6;
+               uint64_t reserved_0_31:32;
+       } s;
+       struct cvmx_sriox_imsg_vport_thr2_s cn66xx;
+};
+
+union cvmx_sriox_int2_enable {
+       uint64_t u64;
+       struct cvmx_sriox_int2_enable_s {
+               uint64_t reserved_1_63:63;
+               uint64_t pko_rst:1;
+       } s;
+       struct cvmx_sriox_int2_enable_s cn63xx;
+       struct cvmx_sriox_int2_enable_s cn66xx;
+};
+
+union cvmx_sriox_int2_reg {
+       uint64_t u64;
+       struct cvmx_sriox_int2_reg_s {
+               uint64_t reserved_32_63:32;
+               uint64_t int_sum:1;
+               uint64_t reserved_1_30:30;
+               uint64_t pko_rst:1;
+       } s;
+       struct cvmx_sriox_int2_reg_s cn63xx;
+       struct cvmx_sriox_int2_reg_s cn66xx;
+};
+
+union cvmx_sriox_int_enable {
+       uint64_t u64;
+       struct cvmx_sriox_int_enable_s {
+               uint64_t reserved_27_63:37;
+               uint64_t zero_pkt:1;
+               uint64_t ttl_tout:1;
+               uint64_t fail:1;
+               uint64_t degrade:1;
+               uint64_t mac_buf:1;
+               uint64_t f_error:1;
+               uint64_t rtry_err:1;
+               uint64_t pko_err:1;
+               uint64_t omsg_err:1;
+               uint64_t omsg1:1;
+               uint64_t omsg0:1;
+               uint64_t link_up:1;
+               uint64_t link_dwn:1;
+               uint64_t phy_erb:1;
+               uint64_t log_erb:1;
+               uint64_t soft_rx:1;
+               uint64_t soft_tx:1;
+               uint64_t mce_rx:1;
+               uint64_t mce_tx:1;
+               uint64_t wr_done:1;
+               uint64_t sli_err:1;
+               uint64_t deny_wr:1;
+               uint64_t bar_err:1;
+               uint64_t maint_op:1;
+               uint64_t rxbell:1;
+               uint64_t bell_err:1;
+               uint64_t txbell:1;
+       } s;
+       struct cvmx_sriox_int_enable_s cn63xx;
+       struct cvmx_sriox_int_enable_cn63xxp1 {
+               uint64_t reserved_22_63:42;
+               uint64_t f_error:1;
+               uint64_t rtry_err:1;
+               uint64_t pko_err:1;
+               uint64_t omsg_err:1;
+               uint64_t omsg1:1;
+               uint64_t omsg0:1;
+               uint64_t link_up:1;
+               uint64_t link_dwn:1;
+               uint64_t phy_erb:1;
+               uint64_t log_erb:1;
+               uint64_t soft_rx:1;
+               uint64_t soft_tx:1;
+               uint64_t mce_rx:1;
+               uint64_t mce_tx:1;
+               uint64_t wr_done:1;
+               uint64_t sli_err:1;
+               uint64_t deny_wr:1;
+               uint64_t bar_err:1;
+               uint64_t maint_op:1;
+               uint64_t rxbell:1;
+               uint64_t bell_err:1;
+               uint64_t txbell:1;
+       } cn63xxp1;
+       struct cvmx_sriox_int_enable_s cn66xx;
+};
+
+union cvmx_sriox_int_info0 {
+       uint64_t u64;
+       struct cvmx_sriox_int_info0_s {
+               uint64_t cmd:4;
+               uint64_t type:4;
+               uint64_t tag:8;
+               uint64_t reserved_42_47:6;
+               uint64_t length:10;
+               uint64_t status:3;
+               uint64_t reserved_16_28:13;
+               uint64_t be0:8;
+               uint64_t be1:8;
+       } s;
+       struct cvmx_sriox_int_info0_s cn63xx;
+       struct cvmx_sriox_int_info0_s cn63xxp1;
+       struct cvmx_sriox_int_info0_s cn66xx;
+};
+
+union cvmx_sriox_int_info1 {
+       uint64_t u64;
+       struct cvmx_sriox_int_info1_s {
+               uint64_t info1:64;
+       } s;
+       struct cvmx_sriox_int_info1_s cn63xx;
+       struct cvmx_sriox_int_info1_s cn63xxp1;
+       struct cvmx_sriox_int_info1_s cn66xx;
+};
+
+union cvmx_sriox_int_info2 {
+       uint64_t u64;
+       struct cvmx_sriox_int_info2_s {
+               uint64_t prio:2;
+               uint64_t tt:1;
+               uint64_t sis:1;
+               uint64_t ssize:4;
+               uint64_t did:16;
+               uint64_t xmbox:4;
+               uint64_t mbox:2;
+               uint64_t letter:2;
+               uint64_t rsrvd:30;
+               uint64_t lns:1;
+               uint64_t intr:1;
+       } s;
+       struct cvmx_sriox_int_info2_s cn63xx;
+       struct cvmx_sriox_int_info2_s cn63xxp1;
+       struct cvmx_sriox_int_info2_s cn66xx;
+};
+
+union cvmx_sriox_int_info3 {
+       uint64_t u64;
+       struct cvmx_sriox_int_info3_s {
+               uint64_t prio:2;
+               uint64_t tt:2;
+               uint64_t type:4;
+               uint64_t other:48;
+               uint64_t reserved_0_7:8;
+       } s;
+       struct cvmx_sriox_int_info3_s cn63xx;
+       struct cvmx_sriox_int_info3_s cn63xxp1;
+       struct cvmx_sriox_int_info3_s cn66xx;
+};
+
+union cvmx_sriox_int_reg {
+       uint64_t u64;
+       struct cvmx_sriox_int_reg_s {
+               uint64_t reserved_32_63:32;
+               uint64_t int2_sum:1;
+               uint64_t reserved_27_30:4;
+               uint64_t zero_pkt:1;
+               uint64_t ttl_tout:1;
+               uint64_t fail:1;
+               uint64_t degrad:1;
+               uint64_t mac_buf:1;
+               uint64_t f_error:1;
+               uint64_t rtry_err:1;
+               uint64_t pko_err:1;
+               uint64_t omsg_err:1;
+               uint64_t omsg1:1;
+               uint64_t omsg0:1;
+               uint64_t link_up:1;
+               uint64_t link_dwn:1;
+               uint64_t phy_erb:1;
+               uint64_t log_erb:1;
+               uint64_t soft_rx:1;
+               uint64_t soft_tx:1;
+               uint64_t mce_rx:1;
+               uint64_t mce_tx:1;
+               uint64_t wr_done:1;
+               uint64_t sli_err:1;
+               uint64_t deny_wr:1;
+               uint64_t bar_err:1;
+               uint64_t maint_op:1;
+               uint64_t rxbell:1;
+               uint64_t bell_err:1;
+               uint64_t txbell:1;
+       } s;
+       struct cvmx_sriox_int_reg_s cn63xx;
+       struct cvmx_sriox_int_reg_cn63xxp1 {
+               uint64_t reserved_22_63:42;
+               uint64_t f_error:1;
+               uint64_t rtry_err:1;
+               uint64_t pko_err:1;
+               uint64_t omsg_err:1;
+               uint64_t omsg1:1;
+               uint64_t omsg0:1;
+               uint64_t link_up:1;
+               uint64_t link_dwn:1;
+               uint64_t phy_erb:1;
+               uint64_t log_erb:1;
+               uint64_t soft_rx:1;
+               uint64_t soft_tx:1;
+               uint64_t mce_rx:1;
+               uint64_t mce_tx:1;
+               uint64_t wr_done:1;
+               uint64_t sli_err:1;
+               uint64_t deny_wr:1;
+               uint64_t bar_err:1;
+               uint64_t maint_op:1;
+               uint64_t rxbell:1;
+               uint64_t bell_err:1;
+               uint64_t txbell:1;
+       } cn63xxp1;
+       struct cvmx_sriox_int_reg_s cn66xx;
+};
+
+union cvmx_sriox_ip_feature {
+       uint64_t u64;
+       struct cvmx_sriox_ip_feature_s {
+               uint64_t ops:32;
+               uint64_t reserved_15_31:17;
+               uint64_t no_vmin:1;
+               uint64_t a66:1;
+               uint64_t a50:1;
+               uint64_t reserved_11_11:1;
+               uint64_t tx_flow:1;
+               uint64_t pt_width:2;
+               uint64_t tx_pol:4;
+               uint64_t rx_pol:4;
+       } s;
+       struct cvmx_sriox_ip_feature_cn63xx {
+               uint64_t ops:32;
+               uint64_t reserved_14_31:18;
+               uint64_t a66:1;
+               uint64_t a50:1;
+               uint64_t reserved_11_11:1;
+               uint64_t tx_flow:1;
+               uint64_t pt_width:2;
+               uint64_t tx_pol:4;
+               uint64_t rx_pol:4;
+       } cn63xx;
+       struct cvmx_sriox_ip_feature_cn63xx cn63xxp1;
+       struct cvmx_sriox_ip_feature_s cn66xx;
+};
+
+union cvmx_sriox_mac_buffers {
+       uint64_t u64;
+       struct cvmx_sriox_mac_buffers_s {
+               uint64_t reserved_56_63:8;
+               uint64_t tx_enb:8;
+               uint64_t reserved_44_47:4;
+               uint64_t tx_inuse:4;
+               uint64_t tx_stat:8;
+               uint64_t reserved_24_31:8;
+               uint64_t rx_enb:8;
+               uint64_t reserved_12_15:4;
+               uint64_t rx_inuse:4;
+               uint64_t rx_stat:8;
+       } s;
+       struct cvmx_sriox_mac_buffers_s cn63xx;
+       struct cvmx_sriox_mac_buffers_s cn66xx;
+};
+
+union cvmx_sriox_maint_op {
+       uint64_t u64;
+       struct cvmx_sriox_maint_op_s {
+               uint64_t wr_data:32;
+               uint64_t reserved_27_31:5;
+               uint64_t fail:1;
+               uint64_t pending:1;
+               uint64_t op:1;
+               uint64_t addr:24;
+       } s;
+       struct cvmx_sriox_maint_op_s cn63xx;
+       struct cvmx_sriox_maint_op_s cn63xxp1;
+       struct cvmx_sriox_maint_op_s cn66xx;
+};
+
+union cvmx_sriox_maint_rd_data {
+       uint64_t u64;
+       struct cvmx_sriox_maint_rd_data_s {
+               uint64_t reserved_33_63:31;
+               uint64_t valid:1;
+               uint64_t rd_data:32;
+       } s;
+       struct cvmx_sriox_maint_rd_data_s cn63xx;
+       struct cvmx_sriox_maint_rd_data_s cn63xxp1;
+       struct cvmx_sriox_maint_rd_data_s cn66xx;
+};
+
+union cvmx_sriox_mce_tx_ctl {
+       uint64_t u64;
+       struct cvmx_sriox_mce_tx_ctl_s {
+               uint64_t reserved_1_63:63;
+               uint64_t mce:1;
+       } s;
+       struct cvmx_sriox_mce_tx_ctl_s cn63xx;
+       struct cvmx_sriox_mce_tx_ctl_s cn63xxp1;
+       struct cvmx_sriox_mce_tx_ctl_s cn66xx;
+};
+
+union cvmx_sriox_mem_op_ctrl {
+       uint64_t u64;
+       struct cvmx_sriox_mem_op_ctrl_s {
+               uint64_t reserved_10_63:54;
+               uint64_t rr_ro:1;
+               uint64_t w_ro:1;
+               uint64_t reserved_6_7:2;
+               uint64_t rp1_sid:1;
+               uint64_t rp0_sid:2;
+               uint64_t rp1_pid:1;
+               uint64_t rp0_pid:2;
+       } s;
+       struct cvmx_sriox_mem_op_ctrl_s cn63xx;
+       struct cvmx_sriox_mem_op_ctrl_s cn63xxp1;
+       struct cvmx_sriox_mem_op_ctrl_s cn66xx;
+};
+
+union cvmx_sriox_omsg_ctrlx {
+       uint64_t u64;
+       struct cvmx_sriox_omsg_ctrlx_s {
+               uint64_t testmode:1;
+               uint64_t reserved_37_62:26;
+               uint64_t silo_max:5;
+               uint64_t rtry_thr:16;
+               uint64_t rtry_en:1;
+               uint64_t reserved_11_14:4;
+               uint64_t idm_tt:1;
+               uint64_t idm_sis:1;
+               uint64_t idm_did:1;
+               uint64_t lttr_sp:4;
+               uint64_t lttr_mp:4;
+       } s;
+       struct cvmx_sriox_omsg_ctrlx_s cn63xx;
+       struct cvmx_sriox_omsg_ctrlx_cn63xxp1 {
+               uint64_t testmode:1;
+               uint64_t reserved_32_62:31;
+               uint64_t rtry_thr:16;
+               uint64_t rtry_en:1;
+               uint64_t reserved_11_14:4;
+               uint64_t idm_tt:1;
+               uint64_t idm_sis:1;
+               uint64_t idm_did:1;
+               uint64_t lttr_sp:4;
+               uint64_t lttr_mp:4;
+       } cn63xxp1;
+       struct cvmx_sriox_omsg_ctrlx_s cn66xx;
+};
+
+union cvmx_sriox_omsg_done_countsx {
+       uint64_t u64;
+       struct cvmx_sriox_omsg_done_countsx_s {
+               uint64_t reserved_32_63:32;
+               uint64_t bad:16;
+               uint64_t good:16;
+       } s;
+       struct cvmx_sriox_omsg_done_countsx_s cn63xx;
+       struct cvmx_sriox_omsg_done_countsx_s cn66xx;
+};
+
+union cvmx_sriox_omsg_fmp_mrx {
+       uint64_t u64;
+       struct cvmx_sriox_omsg_fmp_mrx_s {
+               uint64_t reserved_15_63:49;
+               uint64_t ctlr_sp:1;
+               uint64_t ctlr_fmp:1;
+               uint64_t ctlr_nmp:1;
+               uint64_t id_sp:1;
+               uint64_t id_fmp:1;
+               uint64_t id_nmp:1;
+               uint64_t id_psd:1;
+               uint64_t mbox_sp:1;
+               uint64_t mbox_fmp:1;
+               uint64_t mbox_nmp:1;
+               uint64_t mbox_psd:1;
+               uint64_t all_sp:1;
+               uint64_t all_fmp:1;
+               uint64_t all_nmp:1;
+               uint64_t all_psd:1;
+       } s;
+       struct cvmx_sriox_omsg_fmp_mrx_s cn63xx;
+       struct cvmx_sriox_omsg_fmp_mrx_s cn63xxp1;
+       struct cvmx_sriox_omsg_fmp_mrx_s cn66xx;
+};
+
+union cvmx_sriox_omsg_nmp_mrx {
+       uint64_t u64;
+       struct cvmx_sriox_omsg_nmp_mrx_s {
+               uint64_t reserved_15_63:49;
+               uint64_t ctlr_sp:1;
+               uint64_t ctlr_fmp:1;
+               uint64_t ctlr_nmp:1;
+               uint64_t id_sp:1;
+               uint64_t id_fmp:1;
+               uint64_t id_nmp:1;
+               uint64_t reserved_8_8:1;
+               uint64_t mbox_sp:1;
+               uint64_t mbox_fmp:1;
+               uint64_t mbox_nmp:1;
+               uint64_t reserved_4_4:1;
+               uint64_t all_sp:1;
+               uint64_t all_fmp:1;
+               uint64_t all_nmp:1;
+               uint64_t reserved_0_0:1;
+       } s;
+       struct cvmx_sriox_omsg_nmp_mrx_s cn63xx;
+       struct cvmx_sriox_omsg_nmp_mrx_s cn63xxp1;
+       struct cvmx_sriox_omsg_nmp_mrx_s cn66xx;
+};
+
+union cvmx_sriox_omsg_portx {
+       uint64_t u64;
+       struct cvmx_sriox_omsg_portx_s {
+               uint64_t reserved_32_63:32;
+               uint64_t enable:1;
+               uint64_t reserved_3_30:28;
+               uint64_t port:3;
+       } s;
+       struct cvmx_sriox_omsg_portx_cn63xx {
+               uint64_t reserved_32_63:32;
+               uint64_t enable:1;
+               uint64_t reserved_2_30:29;
+               uint64_t port:2;
+       } cn63xx;
+       struct cvmx_sriox_omsg_portx_cn63xx cn63xxp1;
+       struct cvmx_sriox_omsg_portx_s cn66xx;
+};
+
+union cvmx_sriox_omsg_silo_thr {
+       uint64_t u64;
+       struct cvmx_sriox_omsg_silo_thr_s {
+               uint64_t reserved_5_63:59;
+               uint64_t tot_silo:5;
+       } s;
+       struct cvmx_sriox_omsg_silo_thr_s cn63xx;
+       struct cvmx_sriox_omsg_silo_thr_s cn66xx;
+};
+
+union cvmx_sriox_omsg_sp_mrx {
+       uint64_t u64;
+       struct cvmx_sriox_omsg_sp_mrx_s {
+               uint64_t reserved_16_63:48;
+               uint64_t xmbox_sp:1;
+               uint64_t ctlr_sp:1;
+               uint64_t ctlr_fmp:1;
+               uint64_t ctlr_nmp:1;
+               uint64_t id_sp:1;
+               uint64_t id_fmp:1;
+               uint64_t id_nmp:1;
+               uint64_t id_psd:1;
+               uint64_t mbox_sp:1;
+               uint64_t mbox_fmp:1;
+               uint64_t mbox_nmp:1;
+               uint64_t mbox_psd:1;
+               uint64_t all_sp:1;
+               uint64_t all_fmp:1;
+               uint64_t all_nmp:1;
+               uint64_t all_psd:1;
+       } s;
+       struct cvmx_sriox_omsg_sp_mrx_s cn63xx;
+       struct cvmx_sriox_omsg_sp_mrx_s cn63xxp1;
+       struct cvmx_sriox_omsg_sp_mrx_s cn66xx;
+};
+
+union cvmx_sriox_priox_in_use {
+       uint64_t u64;
+       struct cvmx_sriox_priox_in_use_s {
+               uint64_t reserved_32_63:32;
+               uint64_t end_cnt:16;
+               uint64_t start_cnt:16;
+       } s;
+       struct cvmx_sriox_priox_in_use_s cn63xx;
+       struct cvmx_sriox_priox_in_use_s cn66xx;
+};
+
+union cvmx_sriox_rx_bell {
+       uint64_t u64;
+       struct cvmx_sriox_rx_bell_s {
+               uint64_t reserved_48_63:16;
+               uint64_t data:16;
+               uint64_t src_id:16;
+               uint64_t count:8;
+               uint64_t reserved_5_7:3;
+               uint64_t dest_id:1;
+               uint64_t id16:1;
+               uint64_t reserved_2_2:1;
+               uint64_t priority:2;
+       } s;
+       struct cvmx_sriox_rx_bell_s cn63xx;
+       struct cvmx_sriox_rx_bell_s cn63xxp1;
+       struct cvmx_sriox_rx_bell_s cn66xx;
+};
+
+union cvmx_sriox_rx_bell_seq {
+       uint64_t u64;
+       struct cvmx_sriox_rx_bell_seq_s {
+               uint64_t reserved_40_63:24;
+               uint64_t count:8;
+               uint64_t seq:32;
+       } s;
+       struct cvmx_sriox_rx_bell_seq_s cn63xx;
+       struct cvmx_sriox_rx_bell_seq_s cn63xxp1;
+       struct cvmx_sriox_rx_bell_seq_s cn66xx;
+};
+
+union cvmx_sriox_rx_status {
+       uint64_t u64;
+       struct cvmx_sriox_rx_status_s {
+               uint64_t rtn_pr3:8;
+               uint64_t rtn_pr2:8;
+               uint64_t rtn_pr1:8;
+               uint64_t reserved_28_39:12;
+               uint64_t mbox:4;
+               uint64_t comp:8;
+               uint64_t reserved_13_15:3;
+               uint64_t n_post:5;
+               uint64_t post:8;
+       } s;
+       struct cvmx_sriox_rx_status_s cn63xx;
+       struct cvmx_sriox_rx_status_s cn63xxp1;
+       struct cvmx_sriox_rx_status_s cn66xx;
+};
+
+union cvmx_sriox_s2m_typex {
+       uint64_t u64;
+       struct cvmx_sriox_s2m_typex_s {
+               uint64_t reserved_19_63:45;
+               uint64_t wr_op:3;
+               uint64_t reserved_15_15:1;
+               uint64_t rd_op:3;
+               uint64_t wr_prior:2;
+               uint64_t rd_prior:2;
+               uint64_t reserved_6_7:2;
+               uint64_t src_id:1;
+               uint64_t id16:1;
+               uint64_t reserved_2_3:2;
+               uint64_t iaow_sel:2;
+       } s;
+       struct cvmx_sriox_s2m_typex_s cn63xx;
+       struct cvmx_sriox_s2m_typex_s cn63xxp1;
+       struct cvmx_sriox_s2m_typex_s cn66xx;
+};
+
+union cvmx_sriox_seq {
+       uint64_t u64;
+       struct cvmx_sriox_seq_s {
+               uint64_t reserved_32_63:32;
+               uint64_t seq:32;
+       } s;
+       struct cvmx_sriox_seq_s cn63xx;
+       struct cvmx_sriox_seq_s cn63xxp1;
+       struct cvmx_sriox_seq_s cn66xx;
+};
+
+union cvmx_sriox_status_reg {
+       uint64_t u64;
+       struct cvmx_sriox_status_reg_s {
+               uint64_t reserved_2_63:62;
+               uint64_t access:1;
+               uint64_t srio:1;
+       } s;
+       struct cvmx_sriox_status_reg_s cn63xx;
+       struct cvmx_sriox_status_reg_s cn63xxp1;
+       struct cvmx_sriox_status_reg_s cn66xx;
+};
+
+union cvmx_sriox_tag_ctrl {
+       uint64_t u64;
+       struct cvmx_sriox_tag_ctrl_s {
+               uint64_t reserved_17_63:47;
+               uint64_t o_clr:1;
+               uint64_t reserved_13_15:3;
+               uint64_t otag:5;
+               uint64_t reserved_5_7:3;
+               uint64_t itag:5;
+       } s;
+       struct cvmx_sriox_tag_ctrl_s cn63xx;
+       struct cvmx_sriox_tag_ctrl_s cn63xxp1;
+       struct cvmx_sriox_tag_ctrl_s cn66xx;
+};
+
+union cvmx_sriox_tlp_credits {
+       uint64_t u64;
+       struct cvmx_sriox_tlp_credits_s {
+               uint64_t reserved_28_63:36;
+               uint64_t mbox:4;
+               uint64_t comp:8;
+               uint64_t reserved_13_15:3;
+               uint64_t n_post:5;
+               uint64_t post:8;
+       } s;
+       struct cvmx_sriox_tlp_credits_s cn63xx;
+       struct cvmx_sriox_tlp_credits_s cn63xxp1;
+       struct cvmx_sriox_tlp_credits_s cn66xx;
+};
+
+union cvmx_sriox_tx_bell {
+       uint64_t u64;
+       struct cvmx_sriox_tx_bell_s {
+               uint64_t reserved_48_63:16;
+               uint64_t data:16;
+               uint64_t dest_id:16;
+               uint64_t reserved_9_15:7;
+               uint64_t pending:1;
+               uint64_t reserved_5_7:3;
+               uint64_t src_id:1;
+               uint64_t id16:1;
+               uint64_t reserved_2_2:1;
+               uint64_t priority:2;
+       } s;
+       struct cvmx_sriox_tx_bell_s cn63xx;
+       struct cvmx_sriox_tx_bell_s cn63xxp1;
+       struct cvmx_sriox_tx_bell_s cn66xx;
+};
+
+union cvmx_sriox_tx_bell_info {
+       uint64_t u64;
+       struct cvmx_sriox_tx_bell_info_s {
+               uint64_t reserved_48_63:16;
+               uint64_t data:16;
+               uint64_t dest_id:16;
+               uint64_t reserved_8_15:8;
+               uint64_t timeout:1;
+               uint64_t error:1;
+               uint64_t retry:1;
+               uint64_t src_id:1;
+               uint64_t id16:1;
+               uint64_t reserved_2_2:1;
+               uint64_t priority:2;
+       } s;
+       struct cvmx_sriox_tx_bell_info_s cn63xx;
+       struct cvmx_sriox_tx_bell_info_s cn63xxp1;
+       struct cvmx_sriox_tx_bell_info_s cn66xx;
+};
+
+union cvmx_sriox_tx_ctrl {
+       uint64_t u64;
+       struct cvmx_sriox_tx_ctrl_s {
+               uint64_t reserved_53_63:11;
+               uint64_t tag_th2:5;
+               uint64_t reserved_45_47:3;
+               uint64_t tag_th1:5;
+               uint64_t reserved_37_39:3;
+               uint64_t tag_th0:5;
+               uint64_t reserved_20_31:12;
+               uint64_t tx_th2:4;
+               uint64_t reserved_12_15:4;
+               uint64_t tx_th1:4;
+               uint64_t reserved_4_7:4;
+               uint64_t tx_th0:4;
+       } s;
+       struct cvmx_sriox_tx_ctrl_s cn63xx;
+       struct cvmx_sriox_tx_ctrl_s cn63xxp1;
+       struct cvmx_sriox_tx_ctrl_s cn66xx;
+};
+
+union cvmx_sriox_tx_emphasis {
+       uint64_t u64;
+       struct cvmx_sriox_tx_emphasis_s {
+               uint64_t reserved_4_63:60;
+               uint64_t emph:4;
+       } s;
+       struct cvmx_sriox_tx_emphasis_s cn63xx;
+       struct cvmx_sriox_tx_emphasis_s cn66xx;
+};
+
+union cvmx_sriox_tx_status {
+       uint64_t u64;
+       struct cvmx_sriox_tx_status_s {
+               uint64_t reserved_32_63:32;
+               uint64_t s2m_pr3:8;
+               uint64_t s2m_pr2:8;
+               uint64_t s2m_pr1:8;
+               uint64_t s2m_pr0:8;
+       } s;
+       struct cvmx_sriox_tx_status_s cn63xx;
+       struct cvmx_sriox_tx_status_s cn63xxp1;
+       struct cvmx_sriox_tx_status_s cn66xx;
+};
+
+union cvmx_sriox_wr_done_counts {
+       uint64_t u64;
+       struct cvmx_sriox_wr_done_counts_s {
+               uint64_t reserved_32_63:32;
+               uint64_t bad:16;
+               uint64_t good:16;
+       } s;
+       struct cvmx_sriox_wr_done_counts_s cn63xx;
+       struct cvmx_sriox_wr_done_counts_s cn66xx;
+};
+
+#endif
diff --git a/arch/mips/include/asm/octeon/cvmx-srxx-defs.h b/arch/mips/include/asm/octeon/cvmx-srxx-defs.h
new file mode 100644 (file)
index 0000000..d82b366
--- /dev/null
@@ -0,0 +1,126 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+#ifndef __CVMX_SRXX_DEFS_H__
+#define __CVMX_SRXX_DEFS_H__
+
+#define CVMX_SRXX_COM_CTL(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000200ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_SRXX_IGN_RX_FULL(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000218ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_SRXX_SPI4_CALX(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000000ull + (((offset) & 31) * 8) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_SRXX_SPI4_STAT(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000208ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_SRXX_SW_TICK_CTL(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000220ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_SRXX_SW_TICK_DAT(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000228ull + (((block_id) & 1) * 0x8000000ull))
+
+union cvmx_srxx_com_ctl {
+       uint64_t u64;
+       struct cvmx_srxx_com_ctl_s {
+               uint64_t reserved_8_63:56;
+               uint64_t prts:4;
+               uint64_t st_en:1;
+               uint64_t reserved_1_2:2;
+               uint64_t inf_en:1;
+       } s;
+       struct cvmx_srxx_com_ctl_s cn38xx;
+       struct cvmx_srxx_com_ctl_s cn38xxp2;
+       struct cvmx_srxx_com_ctl_s cn58xx;
+       struct cvmx_srxx_com_ctl_s cn58xxp1;
+};
+
+union cvmx_srxx_ign_rx_full {
+       uint64_t u64;
+       struct cvmx_srxx_ign_rx_full_s {
+               uint64_t reserved_16_63:48;
+               uint64_t ignore:16;
+       } s;
+       struct cvmx_srxx_ign_rx_full_s cn38xx;
+       struct cvmx_srxx_ign_rx_full_s cn38xxp2;
+       struct cvmx_srxx_ign_rx_full_s cn58xx;
+       struct cvmx_srxx_ign_rx_full_s cn58xxp1;
+};
+
+union cvmx_srxx_spi4_calx {
+       uint64_t u64;
+       struct cvmx_srxx_spi4_calx_s {
+               uint64_t reserved_17_63:47;
+               uint64_t oddpar:1;
+               uint64_t prt3:4;
+               uint64_t prt2:4;
+               uint64_t prt1:4;
+               uint64_t prt0:4;
+       } s;
+       struct cvmx_srxx_spi4_calx_s cn38xx;
+       struct cvmx_srxx_spi4_calx_s cn38xxp2;
+       struct cvmx_srxx_spi4_calx_s cn58xx;
+       struct cvmx_srxx_spi4_calx_s cn58xxp1;
+};
+
+union cvmx_srxx_spi4_stat {
+       uint64_t u64;
+       struct cvmx_srxx_spi4_stat_s {
+               uint64_t reserved_16_63:48;
+               uint64_t m:8;
+               uint64_t reserved_7_7:1;
+               uint64_t len:7;
+       } s;
+       struct cvmx_srxx_spi4_stat_s cn38xx;
+       struct cvmx_srxx_spi4_stat_s cn38xxp2;
+       struct cvmx_srxx_spi4_stat_s cn58xx;
+       struct cvmx_srxx_spi4_stat_s cn58xxp1;
+};
+
+union cvmx_srxx_sw_tick_ctl {
+       uint64_t u64;
+       struct cvmx_srxx_sw_tick_ctl_s {
+               uint64_t reserved_14_63:50;
+               uint64_t eop:1;
+               uint64_t sop:1;
+               uint64_t mod:4;
+               uint64_t opc:4;
+               uint64_t adr:4;
+       } s;
+       struct cvmx_srxx_sw_tick_ctl_s cn38xx;
+       struct cvmx_srxx_sw_tick_ctl_s cn58xx;
+       struct cvmx_srxx_sw_tick_ctl_s cn58xxp1;
+};
+
+union cvmx_srxx_sw_tick_dat {
+       uint64_t u64;
+       struct cvmx_srxx_sw_tick_dat_s {
+               uint64_t dat:64;
+       } s;
+       struct cvmx_srxx_sw_tick_dat_s cn38xx;
+       struct cvmx_srxx_sw_tick_dat_s cn58xx;
+       struct cvmx_srxx_sw_tick_dat_s cn58xxp1;
+};
+
+#endif
diff --git a/arch/mips/include/asm/octeon/cvmx-stxx-defs.h b/arch/mips/include/asm/octeon/cvmx-stxx-defs.h
new file mode 100644 (file)
index 0000000..4f209b6
--- /dev/null
@@ -0,0 +1,292 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+#ifndef __CVMX_STXX_DEFS_H__
+#define __CVMX_STXX_DEFS_H__
+
+#define CVMX_STXX_ARB_CTL(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000608ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_STXX_BCKPRS_CNT(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000688ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_STXX_COM_CTL(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000600ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_STXX_DIP_CNT(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000690ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_STXX_IGN_CAL(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000610ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_STXX_INT_MSK(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800900006A0ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_STXX_INT_REG(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000698ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_STXX_INT_SYNC(block_id) \
+        CVMX_ADD_IO_SEG(0x00011800900006A8ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_STXX_MIN_BST(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000618ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_STXX_SPI4_CALX(offset, block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000400ull + (((offset) & 31) * 8) + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_STXX_SPI4_DAT(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000628ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_STXX_SPI4_STAT(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000630ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_STXX_STAT_BYTES_HI(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000648ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_STXX_STAT_BYTES_LO(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000680ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_STXX_STAT_CTL(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000638ull + (((block_id) & 1) * 0x8000000ull))
+#define CVMX_STXX_STAT_PKT_XMT(block_id) \
+        CVMX_ADD_IO_SEG(0x0001180090000640ull + (((block_id) & 1) * 0x8000000ull))
+
+union cvmx_stxx_arb_ctl {
+       uint64_t u64;
+       struct cvmx_stxx_arb_ctl_s {
+               uint64_t reserved_6_63:58;
+               uint64_t mintrn:1;
+               uint64_t reserved_4_4:1;
+               uint64_t igntpa:1;
+               uint64_t reserved_0_2:3;
+       } s;
+       struct cvmx_stxx_arb_ctl_s cn38xx;
+       struct cvmx_stxx_arb_ctl_s cn38xxp2;
+       struct cvmx_stxx_arb_ctl_s cn58xx;
+       struct cvmx_stxx_arb_ctl_s cn58xxp1;
+};
+
+union cvmx_stxx_bckprs_cnt {
+       uint64_t u64;
+       struct cvmx_stxx_bckprs_cnt_s {
+               uint64_t reserved_32_63:32;
+               uint64_t cnt:32;
+       } s;
+       struct cvmx_stxx_bckprs_cnt_s cn38xx;
+       struct cvmx_stxx_bckprs_cnt_s cn38xxp2;
+       struct cvmx_stxx_bckprs_cnt_s cn58xx;
+       struct cvmx_stxx_bckprs_cnt_s cn58xxp1;
+};
+
+union cvmx_stxx_com_ctl {
+       uint64_t u64;
+       struct cvmx_stxx_com_ctl_s {
+               uint64_t reserved_4_63:60;
+               uint64_t st_en:1;
+               uint64_t reserved_1_2:2;
+               uint64_t inf_en:1;
+       } s;
+       struct cvmx_stxx_com_ctl_s cn38xx;
+       struct cvmx_stxx_com_ctl_s cn38xxp2;
+       struct cvmx_stxx_com_ctl_s cn58xx;
+       struct cvmx_stxx_com_ctl_s cn58xxp1;
+};
+
+union cvmx_stxx_dip_cnt {
+       uint64_t u64;
+       struct cvmx_stxx_dip_cnt_s {
+               uint64_t reserved_8_63:56;
+               uint64_t frmmax:4;
+               uint64_t dipmax:4;
+       } s;
+       struct cvmx_stxx_dip_cnt_s cn38xx;
+       struct cvmx_stxx_dip_cnt_s cn38xxp2;
+       struct cvmx_stxx_dip_cnt_s cn58xx;
+       struct cvmx_stxx_dip_cnt_s cn58xxp1;
+};
+
+union cvmx_stxx_ign_cal {
+       uint64_t u64;
+       struct cvmx_stxx_ign_cal_s {
+               uint64_t reserved_16_63:48;
+               uint64_t igntpa:16;
+       } s;
+       struct cvmx_stxx_ign_cal_s cn38xx;
+       struct cvmx_stxx_ign_cal_s cn38xxp2;
+       struct cvmx_stxx_ign_cal_s cn58xx;
+       struct cvmx_stxx_ign_cal_s cn58xxp1;
+};
+
+union cvmx_stxx_int_msk {
+       uint64_t u64;
+       struct cvmx_stxx_int_msk_s {
+               uint64_t reserved_8_63:56;
+               uint64_t frmerr:1;
+               uint64_t unxfrm:1;
+               uint64_t nosync:1;
+               uint64_t diperr:1;
+               uint64_t datovr:1;
+               uint64_t ovrbst:1;
+               uint64_t calpar1:1;
+               uint64_t calpar0:1;
+       } s;
+       struct cvmx_stxx_int_msk_s cn38xx;
+       struct cvmx_stxx_int_msk_s cn38xxp2;
+       struct cvmx_stxx_int_msk_s cn58xx;
+       struct cvmx_stxx_int_msk_s cn58xxp1;
+};
+
+union cvmx_stxx_int_reg {
+       uint64_t u64;
+       struct cvmx_stxx_int_reg_s {
+               uint64_t reserved_9_63:55;
+               uint64_t syncerr:1;
+               uint64_t frmerr:1;
+               uint64_t unxfrm:1;
+               uint64_t nosync:1;
+               uint64_t diperr:1;
+               uint64_t datovr:1;
+               uint64_t ovrbst:1;
+               uint64_t calpar1:1;
+               uint64_t calpar0:1;
+       } s;
+       struct cvmx_stxx_int_reg_s cn38xx;
+       struct cvmx_stxx_int_reg_s cn38xxp2;
+       struct cvmx_stxx_int_reg_s cn58xx;
+       struct cvmx_stxx_int_reg_s cn58xxp1;
+};
+
+union cvmx_stxx_int_sync {
+       uint64_t u64;
+       struct cvmx_stxx_int_sync_s {
+               uint64_t reserved_8_63:56;
+               uint64_t frmerr:1;
+               uint64_t unxfrm:1;
+               uint64_t nosync:1;
+               uint64_t diperr:1;
+               uint64_t datovr:1;
+               uint64_t ovrbst:1;
+               uint64_t calpar1:1;
+               uint64_t calpar0:1;
+       } s;
+       struct cvmx_stxx_int_sync_s cn38xx;
+       struct cvmx_stxx_int_sync_s cn38xxp2;
+       struct cvmx_stxx_int_sync_s cn58xx;
+       struct cvmx_stxx_int_sync_s cn58xxp1;
+};
+
+union cvmx_stxx_min_bst {
+       uint64_t u64;
+       struct cvmx_stxx_min_bst_s {
+               uint64_t reserved_9_63:55;
+               uint64_t minb:9;
+       } s;
+       struct cvmx_stxx_min_bst_s cn38xx;
+       struct cvmx_stxx_min_bst_s cn38xxp2;
+       struct cvmx_stxx_min_bst_s cn58xx;
+       struct cvmx_stxx_min_bst_s cn58xxp1;
+};
+
+union cvmx_stxx_spi4_calx {
+       uint64_t u64;
+       struct cvmx_stxx_spi4_calx_s {
+               uint64_t reserved_17_63:47;
+               uint64_t oddpar:1;
+               uint64_t prt3:4;
+               uint64_t prt2:4;
+               uint64_t prt1:4;
+               uint64_t prt0:4;
+       } s;
+       struct cvmx_stxx_spi4_calx_s cn38xx;
+       struct cvmx_stxx_spi4_calx_s cn38xxp2;
+       struct cvmx_stxx_spi4_calx_s cn58xx;
+       struct cvmx_stxx_spi4_calx_s cn58xxp1;
+};
+
+union cvmx_stxx_spi4_dat {
+       uint64_t u64;
+       struct cvmx_stxx_spi4_dat_s {
+               uint64_t reserved_32_63:32;
+               uint64_t alpha:16;
+               uint64_t max_t:16;
+       } s;
+       struct cvmx_stxx_spi4_dat_s cn38xx;
+       struct cvmx_stxx_spi4_dat_s cn38xxp2;
+       struct cvmx_stxx_spi4_dat_s cn58xx;
+       struct cvmx_stxx_spi4_dat_s cn58xxp1;
+};
+
+union cvmx_stxx_spi4_stat {
+       uint64_t u64;
+       struct cvmx_stxx_spi4_stat_s {
+               uint64_t reserved_16_63:48;
+               uint64_t m:8;
+               uint64_t reserved_7_7:1;
+               uint64_t len:7;
+       } s;
+       struct cvmx_stxx_spi4_stat_s cn38xx;
+       struct cvmx_stxx_spi4_stat_s cn38xxp2;
+       struct cvmx_stxx_spi4_stat_s cn58xx;
+       struct cvmx_stxx_spi4_stat_s cn58xxp1;
+};
+
+union cvmx_stxx_stat_bytes_hi {
+       uint64_t u64;
+       struct cvmx_stxx_stat_bytes_hi_s {
+               uint64_t reserved_32_63:32;
+               uint64_t cnt:32;
+       } s;
+       struct cvmx_stxx_stat_bytes_hi_s cn38xx;
+       struct cvmx_stxx_stat_bytes_hi_s cn38xxp2;
+       struct cvmx_stxx_stat_bytes_hi_s cn58xx;
+       struct cvmx_stxx_stat_bytes_hi_s cn58xxp1;
+};
+
+union cvmx_stxx_stat_bytes_lo {
+       uint64_t u64;
+       struct cvmx_stxx_stat_bytes_lo_s {
+               uint64_t reserved_32_63:32;
+               uint64_t cnt:32;
+       } s;
+       struct cvmx_stxx_stat_bytes_lo_s cn38xx;
+       struct cvmx_stxx_stat_bytes_lo_s cn38xxp2;
+       struct cvmx_stxx_stat_bytes_lo_s cn58xx;
+       struct cvmx_stxx_stat_bytes_lo_s cn58xxp1;
+};
+
+union cvmx_stxx_stat_ctl {
+       uint64_t u64;
+       struct cvmx_stxx_stat_ctl_s {
+               uint64_t reserved_5_63:59;
+               uint64_t clr:1;
+               uint64_t bckprs:4;
+       } s;
+       struct cvmx_stxx_stat_ctl_s cn38xx;
+       struct cvmx_stxx_stat_ctl_s cn38xxp2;
+       struct cvmx_stxx_stat_ctl_s cn58xx;
+       struct cvmx_stxx_stat_ctl_s cn58xxp1;
+};
+
+union cvmx_stxx_stat_pkt_xmt {
+       uint64_t u64;
+       struct cvmx_stxx_stat_pkt_xmt_s {
+               uint64_t reserved_32_63:32;
+               uint64_t cnt:32;
+       } s;
+       struct cvmx_stxx_stat_pkt_xmt_s cn38xx;
+       struct cvmx_stxx_stat_pkt_xmt_s cn38xxp2;
+       struct cvmx_stxx_stat_pkt_xmt_s cn58xx;
+       struct cvmx_stxx_stat_pkt_xmt_s cn58xxp1;
+};
+
+#endif
diff --git a/arch/mips/include/asm/octeon/cvmx-wqe.h b/arch/mips/include/asm/octeon/cvmx-wqe.h
new file mode 100644 (file)
index 0000000..6536109
--- /dev/null
@@ -0,0 +1,397 @@
+/***********************license start***************
+ * Author: Cavium Networks
+ *
+ * Contact: support@caviumnetworks.com
+ * This file is part of the OCTEON SDK
+ *
+ * Copyright (c) 2003-2008 Cavium Networks
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, Version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+ * NONINFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ * or visit http://www.gnu.org/licenses/.
+ *
+ * This file may also be available under a different license from Cavium.
+ * Contact Cavium Networks for more information
+ ***********************license end**************************************/
+
+/**
+ *
+ * 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"
+
+
+#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")))
+
+/**
+ * HW decode / err_code in work queue entry
+ */
+typedef union {
+       uint64_t u64;
+
+       /* Use this struct if the hardware determines that the packet is IP */
+       struct {
+               /* HW sets this to the number of buffers used by this packet */
+               uint64_t bufs:8;
+               /* HW sets to the number of L2 bytes prior to the IP */
+               uint64_t ip_offset:8;
+               /* set to 1 if we found DSA/VLAN in the L2 */
+               uint64_t vlan_valid:1;
+               /* Set to 1 if the DSA/VLAN tag is stacked */
+               uint64_t vlan_stacked:1;
+               uint64_t unassigned:1;
+               /* HW sets to the DSA/VLAN CFI flag (valid when vlan_valid) */
+               uint64_t vlan_cfi:1;
+               /* HW sets to the DSA/VLAN_ID field (valid when vlan_valid) */
+               uint64_t vlan_id:12;
+               /* Ring Identifier (if PCIe). Requires PIP_GBL_CTL[RING_EN]=1 */
+               uint64_t pr:4;
+               uint64_t unassigned2:8;
+               /* the packet needs to be decompressed */
+               uint64_t dec_ipcomp:1;
+               /* the packet is either TCP or UDP */
+               uint64_t tcp_or_udp:1;
+               /* the packet needs to be decrypted (ESP or AH) */
+               uint64_t dec_ipsec:1;
+               /* the packet is IPv6 */
+               uint64_t is_v6:1;
+
+               /*
+                * (rcv_error, not_IP, IP_exc, is_frag, L4_error,
+                * software, etc.).
+                */
+
+               /*
+                * reserved for software use, hardware will clear on
+                * packet creation.
+                */
+               uint64_t software:1;
+               /* exceptional conditions below */
+               /* the receive interface hardware detected an L4 error
+                * (only applies if !is_frag) (only applies if
+                * !rcv_error && !not_IP && !IP_exc && !is_frag)
+                * failure indicated in err_code below, decode:
+                *
+                * - 1 = Malformed L4
+                * - 2 = L4 Checksum Error: the L4 checksum value is
+                * - 3 = UDP Length Error: The UDP length field would
+                *       make the UDP data longer than what remains in
+                *       the IP packet (as defined by the IP header
+                *       length field).
+                * - 4 = Bad L4 Port: either the source or destination
+                *       TCP/UDP port is 0.
+                * - 8 = TCP FIN Only: the packet is TCP and only the
+                *       FIN flag set.
+                * - 9 = TCP No Flags: the packet is TCP and no flags
+                *       are set.
+                * - 10 = TCP FIN RST: the packet is TCP and both FIN
+                *        and RST are set.
+                * - 11 = TCP SYN URG: the packet is TCP and both SYN
+                *        and URG are set.
+                * - 12 = TCP SYN RST: the packet is TCP and both SYN
+                *        and RST are set.
+                * - 13 = TCP SYN FIN: the packet is TCP and both SYN
+                *        and FIN are set.
+                */
+               uint64_t L4_error:1;
+               /* set if the packet is a fragment */
+               uint64_t is_frag:1;
+               /* the receive interface hardware detected an IP error
+                * / exception (only applies if !rcv_error && !not_IP)
+                * failure indicated in err_code below, decode:
+                *
+                * - 1 = Not IP: the IP version field is neither 4 nor
+                *       6.
+                * - 2 = IPv4 Header Checksum Error: the IPv4 header
+                *       has a checksum violation.
+                * - 3 = IP Malformed Header: the packet is not long
+                *       enough to contain the IP header.
+                * - 4 = IP Malformed: the packet is not long enough
+                *       to contain the bytes indicated by the IP
+                *       header. Pad is allowed.
+                * - 5 = IP TTL Hop: the IPv4 TTL field or the IPv6
+                *       Hop Count field are zero.
+                * - 6 = IP Options
+                */
+               uint64_t IP_exc:1;
+               /*
+                * Set if the hardware determined that the packet is a
+                * broadcast.
+                */
+               uint64_t is_bcast:1;
+               /*
+                * St if the hardware determined that the packet is a
+                * multi-cast.
+                */
+               uint64_t is_mcast:1;
+               /*
+                * Set if the packet may not be IP (must be zero in
+                * this case).
+                */
+               uint64_t not_IP:1;
+               /*
+                * The receive interface hardware detected a receive
+                * error (must be zero in this case).
+                */
+               uint64_t rcv_error:1;
+               /* lower err_code = first-level descriptor of the
+                * work */
+               /* zero for packet submitted by hardware that isn't on
+                * the slow path */
+               /* type is cvmx_pip_err_t */
+               uint64_t err_code:8;
+       } s;
+
+       /* use this to get at the 16 vlan bits */
+       struct {
+               uint64_t unused1:16;
+               uint64_t vlan:16;
+               uint64_t unused2:32;
+       } svlan;
+
+       /*
+        * use this struct if the hardware could not determine that
+        * the packet is ip.
+        */
+       struct {
+               /*
+                * HW sets this to the number of buffers used by this
+                * packet.
+                */
+               uint64_t bufs:8;
+               uint64_t unused:8;
+               /* set to 1 if we found DSA/VLAN in the L2 */
+               uint64_t vlan_valid:1;
+               /* Set to 1 if the DSA/VLAN tag is stacked */
+               uint64_t vlan_stacked:1;
+               uint64_t unassigned:1;
+               /*
+                * HW sets to the DSA/VLAN CFI flag (valid when
+                * vlan_valid)
+                */
+               uint64_t vlan_cfi:1;
+               /*
+                * HW sets to the DSA/VLAN_ID field (valid when
+                * vlan_valid).
+                */
+               uint64_t vlan_id:12;
+               /*
+                * Ring Identifier (if PCIe). Requires
+                * PIP_GBL_CTL[RING_EN]=1
+                */
+               uint64_t pr:4;
+               uint64_t unassigned2:12;
+               /*
+                * reserved for software use, hardware will clear on
+                * packet creation.
+                */
+               uint64_t software:1;
+               uint64_t unassigned3:1;
+               /*
+                * set if the hardware determined that the packet is
+                * rarp.
+                */
+               uint64_t is_rarp:1;
+               /*
+                * set if the hardware determined that the packet is
+                * arp
+                */
+               uint64_t is_arp:1;
+               /*
+                * set if the hardware determined that the packet is a
+                * broadcast.
+                */
+               uint64_t is_bcast:1;
+               /*
+                * set if the hardware determined that the packet is a
+                * multi-cast
+                */
+               uint64_t is_mcast:1;
+               /*
+                * set if the packet may not be IP (must be one in
+                * this case)
+                */
+               uint64_t not_IP:1;
+               /* The receive interface hardware detected a receive
+                * error.  Failure indicated in err_code below,
+                * decode:
+                *
+                * - 1 = partial error: a packet was partially
+                *       received, but internal buffering / bandwidth
+                *       was not adequate to receive the entire
+                *       packet.
+                * - 2 = jabber error: the RGMII packet was too large
+                *       and is truncated.
+                * - 3 = overrun error: the RGMII packet is longer
+                *       than allowed and had an FCS error.
+                * - 4 = oversize error: the RGMII packet is longer
+                *       than allowed.
+                * - 5 = alignment error: the RGMII packet is not an
+                *       integer number of bytes
+                *       and had an FCS error (100M and 10M only).
+                * - 6 = fragment error: the RGMII packet is shorter
+                *       than allowed and had an FCS error.
+                * - 7 = GMX FCS error: the RGMII packet had an FCS
+                *       error.
+                * - 8 = undersize error: the RGMII packet is shorter
+                *       than allowed.
+                * - 9 = extend error: the RGMII packet had an extend
+                *       error.
+                * - 10 = length mismatch error: the RGMII packet had
+                *        a length that did not match the length field
+                *        in the L2 HDR.
+                * - 11 = RGMII RX error/SPI4 DIP4 Error: the RGMII
+                *        packet had one or more data reception errors
+                *        (RXERR) or the SPI4 packet had one or more
+                *        DIP4 errors.
+                * - 12 = RGMII skip error/SPI4 Abort Error: the RGMII
+                *        packet was not large enough to cover the
+                *        skipped bytes or the SPI4 packet was
+                *        terminated with an About EOPS.
+                * - 13 = RGMII nibble error/SPI4 Port NXA Error: the
+                *        RGMII packet had a studder error (data not
+                *        repeated - 10/100M only) or the SPI4 packet
+                *        was sent to an NXA.
+                * - 16 = FCS error: a SPI4.2 packet had an FCS error.
+                * - 17 = Skip error: a packet was not large enough to
+                *        cover the skipped bytes.
+                * - 18 = L2 header malformed: the packet is not long
+                *        enough to contain the L2.
+                */
+
+               uint64_t rcv_error:1;
+               /*
+                * lower err_code = first-level descriptor of the
+                * work
+                */
+               /*
+                * zero for packet submitted by hardware that isn't on
+                * the slow path
+                */
+               /* type is cvmx_pip_err_t (union, so can't use directly */
+               uint64_t err_code:8;
+       } snoip;
+
+} cvmx_pip_wqe_word2;
+
+/**
+ * Work queue entry format
+ *
+ * must be 8-byte aligned
+ */
+typedef struct {
+
+    /*****************************************************************
+     * WORD 0
+     *  HW WRITE: the following 64 bits are filled by HW when a packet arrives
+     */
+
+    /**
+     * raw chksum result generated by the HW
+     */
+       uint16_t hw_chksum;
+    /**
+     * Field unused by hardware - available for software
+     */
+       uint8_t unused;
+    /**
+     * Next pointer used by hardware for list maintenance.
+     * May be written/read by HW before the work queue
+     *           entry is scheduled to a PP
+     * (Only 36 bits used in Octeon 1)
+     */
+       uint64_t next_ptr:40;
+
+    /*****************************************************************
+     * WORD 1
+     *  HW WRITE: the following 64 bits are filled by HW when a packet arrives
+     */
+
+    /**
+     * HW sets to the total number of bytes in the packet
+     */
+       uint64_t len:16;
+    /**
+     * HW sets this to input physical port
+     */
+       uint64_t ipprt:6;
+
+    /**
+     * HW sets this to what it thought the priority of the input packet was
+     */
+       uint64_t qos:3;
+
+    /**
+     * the group that the work queue entry will be scheduled to
+     */
+       uint64_t grp:4;
+    /**
+     * the type of the tag (ORDERED, ATOMIC, NULL)
+     */
+       uint64_t tag_type:3;
+    /**
+     * the synchronization/ordering tag
+     */
+       uint64_t tag:32;
+
+    /**
+     * 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 word2;
+
+    /**
+     * Pointer to the first segment of the packet.
+     */
+       union cvmx_buf_ptr 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.
+     */
+       uint8_t 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;
+
+#endif /* __CVMX_WQE_H__ */
index 7e1286706d4644e8b6393bc063d157ef142e8c68..740be97a32513cfd4ace7517d731ad6e68258422 100644 (file)
 #include <linux/kernel.h>
 #include <linux/string.h>
 
+enum cvmx_mips_space {
+       CVMX_MIPS_SPACE_XKSEG = 3LL,
+       CVMX_MIPS_SPACE_XKPHYS = 2LL,
+       CVMX_MIPS_SPACE_XSSEG = 1LL,
+       CVMX_MIPS_SPACE_XUSEG = 0LL
+};
+
+/* These macros for use when using 32 bit pointers. */
+#define CVMX_MIPS32_SPACE_KSEG0 1l
+#define CVMX_ADD_SEG32(segment, add) \
+       (((int32_t)segment << 31) | (int32_t)(add))
+
+#define CVMX_IO_SEG CVMX_MIPS_SPACE_XKPHYS
+
+/* These macros simplify the process of creating common IO addresses */
+#define CVMX_ADD_SEG(segment, add) \
+       ((((uint64_t)segment) << 62) | (add))
+#ifndef CVMX_ADD_IO_SEG
+#define CVMX_ADD_IO_SEG(add) CVMX_ADD_SEG(CVMX_IO_SEG, (add))
+#endif
+
 #include "cvmx-asm.h"
 #include "cvmx-packet.h"
 #include "cvmx-sysinfo.h"
@@ -129,27 +150,6 @@ static inline uint64_t cvmx_build_bits(uint64_t high_bit,
        return (value & cvmx_build_mask(high_bit - low_bit + 1)) << low_bit;
 }
 
-enum cvmx_mips_space {
-       CVMX_MIPS_SPACE_XKSEG = 3LL,
-       CVMX_MIPS_SPACE_XKPHYS = 2LL,
-       CVMX_MIPS_SPACE_XSSEG = 1LL,
-       CVMX_MIPS_SPACE_XUSEG = 0LL
-};
-
-/* These macros for use when using 32 bit pointers. */
-#define CVMX_MIPS32_SPACE_KSEG0 1l
-#define CVMX_ADD_SEG32(segment, add) \
-       (((int32_t)segment << 31) | (int32_t)(add))
-
-#define CVMX_IO_SEG CVMX_MIPS_SPACE_XKPHYS
-
-/* These macros simplify the process of creating common IO addresses */
-#define CVMX_ADD_SEG(segment, add) \
-       ((((uint64_t)segment) << 62) | (add))
-#ifndef CVMX_ADD_IO_SEG
-#define CVMX_ADD_IO_SEG(add) CVMX_ADD_SEG(CVMX_IO_SEG, (add))
-#endif
-
 /**
  * Convert a memory pointer (void*) into a hardware compatible
  * memory address (uint64_t). Octeon hardware widgets don't
index cba6fbed9f438249fde6cd3f346577a77fa7c3e2..8008da2f87794f2d4e564d891ebb93dac5a1022e 100644 (file)
 
 #ifndef __OCTEON_FEATURE_H__
 #define __OCTEON_FEATURE_H__
+#include <asm/octeon/cvmx-mio-defs.h>
+#include <asm/octeon/cvmx-rnm-defs.h>
 
 enum octeon_feature {
+        /* CN68XX uses port kinds for packet interface */
+       OCTEON_FEATURE_PKND,
+       /* CN68XX has different fields in word0 - word2 */
+       OCTEON_FEATURE_CN68XX_WQE,
        /*
         * Octeon models in the CN5XXX family and higher support
         * atomic add instructions to memory (saa/saad).
@@ -42,8 +48,13 @@ enum octeon_feature {
        OCTEON_FEATURE_ZIP,
        /* Does this Octeon support crypto acceleration using COP2? */
        OCTEON_FEATURE_CRYPTO,
+       OCTEON_FEATURE_DORM_CRYPTO,
        /* Does this Octeon support PCI express? */
        OCTEON_FEATURE_PCIE,
+        /* Does this Octeon support SRIOs */
+       OCTEON_FEATURE_SRIO,
+       /*  Does this Octeon support Interlaken */
+       OCTEON_FEATURE_ILK,
        /* Some Octeon models support internal memory for storing
         * cryptographic keys */
        OCTEON_FEATURE_KEY_MEMORY,
@@ -64,6 +75,15 @@ enum octeon_feature {
        /* Octeon MDIO block supports clause 45 transactions for 10
         * Gig support */
        OCTEON_FEATURE_MDIO_CLAUSE_45,
+        /*
+        *  CN52XX and CN56XX used a block named NPEI for PCIe
+        *  access. Newer chips replaced this with SLI+DPI.
+        */
+       OCTEON_FEATURE_NPEI,
+       OCTEON_FEATURE_HFA,
+       OCTEON_FEATURE_DFM,
+       OCTEON_FEATURE_CIU2,
+       OCTEON_MAX_FEATURE
 };
 
 static inline int cvmx_fuse_read(int fuse);
@@ -96,30 +116,78 @@ static inline int octeon_has_feature(enum octeon_feature feature)
                        return !cvmx_fuse_read(121);
 
        case OCTEON_FEATURE_CRYPTO:
-               return !cvmx_fuse_read(90);
+               if (OCTEON_IS_MODEL(OCTEON_CN6XXX)) {
+                       union cvmx_mio_fus_dat2 fus_2;
+                       fus_2.u64 = cvmx_read_csr(CVMX_MIO_FUS_DAT2);
+                       if (fus_2.s.nocrypto || fus_2.s.nomul) {
+                               return 0;
+                       } else if (!fus_2.s.dorm_crypto) {
+                               return 1;
+                       } else {
+                               union cvmx_rnm_ctl_status st;
+                               st.u64 = cvmx_read_csr(CVMX_RNM_CTL_STATUS);
+                               return st.s.eer_val;
+                       }
+               } else {
+                       return !cvmx_fuse_read(90);
+               }
+
+       case OCTEON_FEATURE_DORM_CRYPTO:
+               if (OCTEON_IS_MODEL(OCTEON_CN6XXX)) {
+                       union cvmx_mio_fus_dat2 fus_2;
+                       fus_2.u64 = cvmx_read_csr(CVMX_MIO_FUS_DAT2);
+                       return !fus_2.s.nocrypto && !fus_2.s.nomul && fus_2.s.dorm_crypto;
+               } else {
+                       return 0;
+               }
 
        case OCTEON_FEATURE_PCIE:
-       case OCTEON_FEATURE_MGMT_PORT:
-       case OCTEON_FEATURE_RAID:
                return OCTEON_IS_MODEL(OCTEON_CN56XX)
-                       || OCTEON_IS_MODEL(OCTEON_CN52XX);
+                       || OCTEON_IS_MODEL(OCTEON_CN52XX)
+                       || OCTEON_IS_MODEL(OCTEON_CN6XXX);
+
+       case OCTEON_FEATURE_SRIO:
+               return OCTEON_IS_MODEL(OCTEON_CN63XX)
+                       || OCTEON_IS_MODEL(OCTEON_CN66XX);
+
+       case OCTEON_FEATURE_ILK:
+               return (OCTEON_IS_MODEL(OCTEON_CN68XX));
 
        case OCTEON_FEATURE_KEY_MEMORY:
+               return OCTEON_IS_MODEL(OCTEON_CN38XX)
+                       || OCTEON_IS_MODEL(OCTEON_CN58XX)
+                       || OCTEON_IS_MODEL(OCTEON_CN56XX)
+                       || OCTEON_IS_MODEL(OCTEON_CN6XXX);
+
        case OCTEON_FEATURE_LED_CONTROLLER:
                return OCTEON_IS_MODEL(OCTEON_CN38XX)
                        || OCTEON_IS_MODEL(OCTEON_CN58XX)
                        || OCTEON_IS_MODEL(OCTEON_CN56XX);
+
        case OCTEON_FEATURE_TRA:
                return !(OCTEON_IS_MODEL(OCTEON_CN30XX)
                         || OCTEON_IS_MODEL(OCTEON_CN50XX));
+       case OCTEON_FEATURE_MGMT_PORT:
+               return OCTEON_IS_MODEL(OCTEON_CN56XX)
+                       || OCTEON_IS_MODEL(OCTEON_CN52XX)
+                       || OCTEON_IS_MODEL(OCTEON_CN6XXX);
+
+       case OCTEON_FEATURE_RAID:
+               return OCTEON_IS_MODEL(OCTEON_CN56XX)
+                       || OCTEON_IS_MODEL(OCTEON_CN52XX)
+                       || OCTEON_IS_MODEL(OCTEON_CN6XXX);
+
        case OCTEON_FEATURE_USB:
                return !(OCTEON_IS_MODEL(OCTEON_CN38XX)
                         || OCTEON_IS_MODEL(OCTEON_CN58XX));
+
        case OCTEON_FEATURE_NO_WPTR:
                return (OCTEON_IS_MODEL(OCTEON_CN56XX)
-                        || OCTEON_IS_MODEL(OCTEON_CN52XX))
-                       && !OCTEON_IS_MODEL(OCTEON_CN56XX_PASS1_X)
-                       && !OCTEON_IS_MODEL(OCTEON_CN52XX_PASS1_X);
+                       || OCTEON_IS_MODEL(OCTEON_CN52XX)
+                       || OCTEON_IS_MODEL(OCTEON_CN6XXX))
+                         && !OCTEON_IS_MODEL(OCTEON_CN56XX_PASS1_X)
+                         && !OCTEON_IS_MODEL(OCTEON_CN52XX_PASS1_X);
+
        case OCTEON_FEATURE_DFA:
                if (!OCTEON_IS_MODEL(OCTEON_CN38XX)
                    && !OCTEON_IS_MODEL(OCTEON_CN31XX)
@@ -127,14 +195,42 @@ static inline int octeon_has_feature(enum octeon_feature feature)
                        return 0;
                else if (OCTEON_IS_MODEL(OCTEON_CN3020))
                        return 0;
-               else if (OCTEON_IS_MODEL(OCTEON_CN38XX_PASS1))
-                       return 1;
                else
                        return !cvmx_fuse_read(120);
+
+       case OCTEON_FEATURE_HFA:
+               if (!OCTEON_IS_MODEL(OCTEON_CN6XXX))
+                       return 0;
+               else
+                       return !cvmx_fuse_read(90);
+
+       case OCTEON_FEATURE_DFM:
+               if (!(OCTEON_IS_MODEL(OCTEON_CN63XX)
+                     || OCTEON_IS_MODEL(OCTEON_CN66XX)))
+                       return 0;
+               else
+                       return !cvmx_fuse_read(90);
+
        case OCTEON_FEATURE_MDIO_CLAUSE_45:
                return !(OCTEON_IS_MODEL(OCTEON_CN3XXX)
                         || OCTEON_IS_MODEL(OCTEON_CN58XX)
                         || OCTEON_IS_MODEL(OCTEON_CN50XX));
+
+       case OCTEON_FEATURE_NPEI:
+               return OCTEON_IS_MODEL(OCTEON_CN56XX)
+                       || OCTEON_IS_MODEL(OCTEON_CN52XX);
+
+       case OCTEON_FEATURE_PKND:
+               return OCTEON_IS_MODEL(OCTEON_CN68XX);
+
+       case OCTEON_FEATURE_CN68XX_WQE:
+               return OCTEON_IS_MODEL(OCTEON_CN68XX);
+
+       case OCTEON_FEATURE_CIU2:
+               return OCTEON_IS_MODEL(OCTEON_CN68XX);
+
+       default:
+               break;
        }
        return 0;
 }
index 700f88e31cad8a14b5a10741dc5b5c369bc75e27..4e338a4d94242edc5fa913da82954076142aac51 100644 (file)
@@ -4,7 +4,7 @@
  * Contact: support@caviumnetworks.com
  * This file is part of the OCTEON SDK
  *
- * Copyright (c) 2003-2008 Cavium Networks
+ * Copyright (c) 2003-2010 Cavium Networks
  *
  * This file is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License, Version 2, as
  * This file may also be available under a different license from Cavium.
  * Contact Cavium Networks for more information
  ***********************license end**************************************/
-
-/*
- *
- * File defining different Octeon model IDs and macros to
- * compare them.
- *
- */
-
 #ifndef __OCTEON_MODEL_H__
 #define __OCTEON_MODEL_H__
 
@@ -52,6 +44,8 @@
  * for internal use only, and may change without notice.
  */
 
+#define OCTEON_FAMILY_MASK      0x00ffff00
+
 /* Flag bits in top byte */
 /* Ignores revision in model checks */
 #define OM_IGNORE_REVISION        0x01000000
 #define OM_IGNORE_MINOR_REVISION  0x08000000
 #define OM_FLAG_MASK              0xff000000
 
-#define OM_MATCH_5XXX_FAMILY_MODELS     0x20000000 /* Match all cn5XXX Octeon models. */
-#define OM_MATCH_6XXX_FAMILY_MODELS     0x40000000 /* Match all cn6XXX Octeon models. */
+/* Match all cn5XXX Octeon models. */
+#define OM_MATCH_5XXX_FAMILY_MODELS     0x20000000
+/* Match all cn6XXX Octeon models. */
+#define OM_MATCH_6XXX_FAMILY_MODELS     0x40000000
 
 /*
  * CN6XXX models with new revision encoding
  */
+#define OCTEON_CN68XX_PASS1_0   0x000d9100
+#define OCTEON_CN68XX_PASS1_1   0x000d9101
+#define OCTEON_CN68XX_PASS1_2   0x000d9102
+#define OCTEON_CN68XX_PASS2_0   0x000d9108
+
+#define OCTEON_CN68XX           (OCTEON_CN68XX_PASS2_0 | OM_IGNORE_REVISION)
+#define OCTEON_CN68XX_PASS1_X   (OCTEON_CN68XX_PASS1_0 | OM_IGNORE_MINOR_REVISION)
+#define OCTEON_CN68XX_PASS2_X   (OCTEON_CN68XX_PASS2_0 | OM_IGNORE_MINOR_REVISION)
+
+#define OCTEON_CN68XX_PASS1    OCTEON_CN68XX_PASS1_X
+#define OCTEON_CN68XX_PASS2    OCTEON_CN68XX_PASS2_X
+
+#define OCTEON_CN66XX_PASS1_0   0x000d9200
+#define OCTEON_CN66XX_PASS1_2   0x000d9202
+
+#define OCTEON_CN66XX           (OCTEON_CN66XX_PASS1_0 | OM_IGNORE_REVISION)
+#define OCTEON_CN66XX_PASS1_X   (OCTEON_CN66XX_PASS1_0 | OM_IGNORE_MINOR_REVISION)
+
 #define OCTEON_CN63XX_PASS1_0   0x000d9000
 #define OCTEON_CN63XX_PASS1_1   0x000d9001
 #define OCTEON_CN63XX_PASS1_2   0x000d9002
 #define OCTEON_CN63XX_PASS2_0   0x000d9008
+#define OCTEON_CN63XX_PASS2_1   0x000d9009
+#define OCTEON_CN63XX_PASS2_2   0x000d900a
 
 #define OCTEON_CN63XX           (OCTEON_CN63XX_PASS2_0 | OM_IGNORE_REVISION)
 #define OCTEON_CN63XX_PASS1_X   (OCTEON_CN63XX_PASS1_0 | OM_IGNORE_MINOR_REVISION)
 #define OCTEON_CN63XX_PASS2_X   (OCTEON_CN63XX_PASS2_0 | OM_IGNORE_MINOR_REVISION)
 
+#define OCTEON_CN61XX_PASS1_0   0x000d9300
+
+#define OCTEON_CN61XX           (OCTEON_CN61XX_PASS1_0 | OM_IGNORE_REVISION)
+#define OCTEON_CN61XX_PASS1_X   (OCTEON_CN61XX_PASS1_0 | OM_IGNORE_MINOR_REVISION)
+
 /*
  * CN5XXX models with new revision encoding
  */
 #define OCTEON_CN58XX_PASS2_3   0x000d030b
 
 #define OCTEON_CN58XX           (OCTEON_CN58XX_PASS1_0 | OM_IGNORE_REVISION)
-#define OCTEON_CN58XX_PASS1_X   (OCTEON_CN58XX_PASS1_0 \
-                                | OM_IGNORE_MINOR_REVISION)
-#define OCTEON_CN58XX_PASS2_X   (OCTEON_CN58XX_PASS2_0 \
-                                | OM_IGNORE_MINOR_REVISION)
+#define OCTEON_CN58XX_PASS1_X   (OCTEON_CN58XX_PASS1_0 | OM_IGNORE_MINOR_REVISION)
+#define OCTEON_CN58XX_PASS2_X   (OCTEON_CN58XX_PASS2_0 | OM_IGNORE_MINOR_REVISION)
 #define OCTEON_CN58XX_PASS1     OCTEON_CN58XX_PASS1_X
 #define OCTEON_CN58XX_PASS2     OCTEON_CN58XX_PASS2_X
 
 #define OCTEON_CN56XX_PASS2_1   0x000d0409
 
 #define OCTEON_CN56XX           (OCTEON_CN56XX_PASS2_0 | OM_IGNORE_REVISION)
-#define OCTEON_CN56XX_PASS1_X   (OCTEON_CN56XX_PASS1_0 \
-                                | OM_IGNORE_MINOR_REVISION)
-#define OCTEON_CN56XX_PASS2_X   (OCTEON_CN56XX_PASS2_0 \
-                                | OM_IGNORE_MINOR_REVISION)
+#define OCTEON_CN56XX_PASS1_X   (OCTEON_CN56XX_PASS1_0 | OM_IGNORE_MINOR_REVISION)
+#define OCTEON_CN56XX_PASS2_X   (OCTEON_CN56XX_PASS2_0 | OM_IGNORE_MINOR_REVISION)
 #define OCTEON_CN56XX_PASS1     OCTEON_CN56XX_PASS1_X
 #define OCTEON_CN56XX_PASS2     OCTEON_CN56XX_PASS2_X
 
 #define OCTEON_CN50XX_PASS1_0   0x000d0600
 
 #define OCTEON_CN50XX           (OCTEON_CN50XX_PASS1_0 | OM_IGNORE_REVISION)
-#define OCTEON_CN50XX_PASS1_X   (OCTEON_CN50XX_PASS1_0 \
-                                | OM_IGNORE_MINOR_REVISION)
+#define OCTEON_CN50XX_PASS1_X   (OCTEON_CN50XX_PASS1_0 | OM_IGNORE_MINOR_REVISION)
 #define OCTEON_CN50XX_PASS1     OCTEON_CN50XX_PASS1_X
 
 /*
 #define OCTEON_CN52XX_PASS2_0   0x000d0708
 
 #define OCTEON_CN52XX           (OCTEON_CN52XX_PASS2_0 | OM_IGNORE_REVISION)
-#define OCTEON_CN52XX_PASS1_X   (OCTEON_CN52XX_PASS1_0 \
-                                | OM_IGNORE_MINOR_REVISION)
-#define OCTEON_CN52XX_PASS2_X   (OCTEON_CN52XX_PASS2_0 \
-                                | OM_IGNORE_MINOR_REVISION)
+#define OCTEON_CN52XX_PASS1_X   (OCTEON_CN52XX_PASS1_0 | OM_IGNORE_MINOR_REVISION)
+#define OCTEON_CN52XX_PASS2_X   (OCTEON_CN52XX_PASS2_0 | OM_IGNORE_MINOR_REVISION)
 #define OCTEON_CN52XX_PASS1     OCTEON_CN52XX_PASS1_X
 #define OCTEON_CN52XX_PASS2     OCTEON_CN52XX_PASS2_X
 
 #define OCTEON_CN3005_PASS1     (0x000d0210 | OM_CHECK_SUBMODEL)
 #define OCTEON_CN3005_PASS1_0   (0x000d0210 | OM_CHECK_SUBMODEL)
 #define OCTEON_CN3005_PASS1_1   (0x000d0212 | OM_CHECK_SUBMODEL)
-#define OCTEON_CN3005           (OCTEON_CN3005_PASS1 | OM_IGNORE_REVISION \
-                                | OM_CHECK_SUBMODEL)
+#define OCTEON_CN3005           (OCTEON_CN3005_PASS1 | OM_IGNORE_REVISION | OM_CHECK_SUBMODEL)
 
 #define OCTEON_CN3010_PASS1     (0x000d0200 | OM_CHECK_SUBMODEL)
 #define OCTEON_CN3010_PASS1_0   (0x000d0200 | OM_CHECK_SUBMODEL)
 #define OCTEON_CN3010_PASS1_1   (0x000d0202 | OM_CHECK_SUBMODEL)
-#define OCTEON_CN3010           (OCTEON_CN3010_PASS1 | OM_IGNORE_REVISION \
-                                | OM_CHECK_SUBMODEL)
+#define OCTEON_CN3010           (OCTEON_CN3010_PASS1 | OM_IGNORE_REVISION | OM_CHECK_SUBMODEL)
 
 #define OCTEON_CN3020_PASS1     (0x000d0110 | OM_CHECK_SUBMODEL)
 #define OCTEON_CN3020_PASS1_0   (0x000d0110 | OM_CHECK_SUBMODEL)
 #define OCTEON_CN3020_PASS1_1   (0x000d0112 | OM_CHECK_SUBMODEL)
-#define OCTEON_CN3020           (OCTEON_CN3020_PASS1 | OM_IGNORE_REVISION \
-                                | OM_CHECK_SUBMODEL)
-
-
-
-/* This matches the complete family of CN3xxx CPUs, and not subsequent models */
-#define OCTEON_CN3XXX           (OCTEON_CN58XX_PASS1_0 \
-                                | OM_MATCH_PREVIOUS_MODELS \
-                                | OM_IGNORE_REVISION)
+#define OCTEON_CN3020           (OCTEON_CN3020_PASS1 | OM_IGNORE_REVISION | OM_CHECK_SUBMODEL)
 
+/*
+ * This matches the complete family of CN3xxx CPUs, and not subsequent
+ * models
+ */
+#define OCTEON_CN3XXX           (OCTEON_CN58XX_PASS1_0 | OM_MATCH_PREVIOUS_MODELS | OM_IGNORE_REVISION)
 #define OCTEON_CN5XXX           (OCTEON_CN58XX_PASS1_0 | OM_MATCH_5XXX_FAMILY_MODELS)
 #define OCTEON_CN6XXX           (OCTEON_CN63XX_PASS1_0 | OM_MATCH_6XXX_FAMILY_MODELS)
 
 #define OCTEON_38XX_FAMILY_MASK      0x00ffff00
 #define OCTEON_38XX_FAMILY_REV_MASK  0x00ffff0f
 #define OCTEON_38XX_MODEL_MASK       0x00ffff10
-#define OCTEON_38XX_MODEL_REV_MASK   (OCTEON_38XX_FAMILY_REV_MASK \
-                                     | OCTEON_38XX_MODEL_MASK)
+#define OCTEON_38XX_MODEL_REV_MASK   (OCTEON_38XX_FAMILY_REV_MASK | OCTEON_38XX_MODEL_MASK)
 
 /* CN5XXX and later use different layout of bits in the revision ID field */
 #define OCTEON_58XX_FAMILY_MASK      OCTEON_38XX_FAMILY_MASK
 #define OCTEON_58XX_FAMILY_REV_MASK  0x00ffff3f
 #define OCTEON_58XX_MODEL_MASK       0x00ffffc0
-#define OCTEON_58XX_MODEL_REV_MASK   (OCTEON_58XX_FAMILY_REV_MASK \
-                                     | OCTEON_58XX_MODEL_MASK)
-#define OCTEON_58XX_MODEL_MINOR_REV_MASK (OCTEON_58XX_MODEL_REV_MASK \
-                                         & 0x00fffff8)
+#define OCTEON_58XX_MODEL_REV_MASK   (OCTEON_58XX_FAMILY_REV_MASK | OCTEON_58XX_MODEL_MASK)
+#define OCTEON_58XX_MODEL_MINOR_REV_MASK (OCTEON_58XX_MODEL_REV_MASK & 0x00fffff8)
 #define OCTEON_5XXX_MODEL_MASK       0x00ff0fc0
 
-#define __OCTEON_MATCH_MASK__(x, y, z) (((x) & (z)) == ((y) & (z)))
-
-/* NOTE: This is for internal (to this file) use only. */
-static inline int __OCTEON_IS_MODEL_COMPILE__(uint32_t arg_model,
-                                             uint32_t chip_model)
-{
-       uint32_t rev_and_sub = OM_IGNORE_REVISION | OM_CHECK_SUBMODEL;
-
-       if ((arg_model & OCTEON_38XX_FAMILY_MASK) < OCTEON_CN58XX_PASS1_0) {
-               if (((arg_model & OM_FLAG_MASK) == rev_and_sub) &&
-                   __OCTEON_MATCH_MASK__(chip_model, arg_model,
-                                         OCTEON_38XX_MODEL_MASK))
-                       return 1;
-               if (((arg_model & OM_FLAG_MASK) == 0) &&
-                   __OCTEON_MATCH_MASK__(chip_model, arg_model,
-                                         OCTEON_38XX_FAMILY_REV_MASK))
-                       return 1;
-               if (((arg_model & OM_FLAG_MASK) == OM_IGNORE_REVISION) &&
-                   __OCTEON_MATCH_MASK__(chip_model, arg_model,
-                                         OCTEON_38XX_FAMILY_MASK))
-                       return 1;
-               if (((arg_model & OM_FLAG_MASK) == OM_CHECK_SUBMODEL) &&
-                   __OCTEON_MATCH_MASK__((chip_model), (arg_model),
-                                         OCTEON_38XX_MODEL_REV_MASK))
-                       return 1;
-               if ((arg_model & OM_MATCH_PREVIOUS_MODELS) &&
-                   ((chip_model & OCTEON_38XX_MODEL_MASK) <
-                           (arg_model & OCTEON_38XX_MODEL_MASK)))
-                       return 1;
-       } else {
-               if (((arg_model & OM_FLAG_MASK) == rev_and_sub) &&
-                   __OCTEON_MATCH_MASK__((chip_model), (arg_model),
-                                         OCTEON_58XX_MODEL_MASK))
-                       return 1;
-               if (((arg_model & OM_FLAG_MASK) == 0) &&
-                   __OCTEON_MATCH_MASK__((chip_model), (arg_model),
-                                         OCTEON_58XX_FAMILY_REV_MASK))
-                       return 1;
-               if (((arg_model & OM_FLAG_MASK) == OM_IGNORE_MINOR_REVISION) &&
-                   __OCTEON_MATCH_MASK__((chip_model), (arg_model),
-                                         OCTEON_58XX_MODEL_MINOR_REV_MASK))
-                       return 1;
-               if (((arg_model & OM_FLAG_MASK) == OM_IGNORE_REVISION) &&
-                   __OCTEON_MATCH_MASK__((chip_model), (arg_model),
-                                         OCTEON_58XX_FAMILY_MASK))
-                       return 1;
-               if (((arg_model & OM_FLAG_MASK) == OM_CHECK_SUBMODEL) &&
-                   __OCTEON_MATCH_MASK__((chip_model), (arg_model),
-                                         OCTEON_58XX_MODEL_REV_MASK))
-                       return 1;
-
-               if (((arg_model & OM_MATCH_5XXX_FAMILY_MODELS) == OM_MATCH_5XXX_FAMILY_MODELS) &&
-                   ((chip_model) >= OCTEON_CN58XX_PASS1_0) && ((chip_model) < OCTEON_CN63XX_PASS1_0))
-                       return 1;
-
-               if (((arg_model & OM_MATCH_6XXX_FAMILY_MODELS) == OM_MATCH_6XXX_FAMILY_MODELS) &&
-                   ((chip_model) >= OCTEON_CN63XX_PASS1_0))
-                       return 1;
-
-               if ((arg_model & OM_MATCH_PREVIOUS_MODELS) &&
-                   ((chip_model & OCTEON_58XX_MODEL_MASK) <
-                           (arg_model & OCTEON_58XX_MODEL_MASK)))
-                       return 1;
-       }
-       return 0;
-}
-
 /* forward declarations */
 static inline uint32_t cvmx_get_proc_id(void) __attribute__ ((pure));
 static inline uint64_t cvmx_read_csr(uint64_t csr_addr);
 
+#define __OCTEON_MATCH_MASK__(x, y, z) (((x) & (z)) == ((y) & (z)))
+
+/* NOTE: This for internal use only! */
+#define __OCTEON_IS_MODEL_COMPILE__(arg_model, chip_model)             \
+((((arg_model & OCTEON_38XX_FAMILY_MASK) < OCTEON_CN58XX_PASS1_0)  && (        \
+               ((((arg_model) & (OM_FLAG_MASK)) == (OM_IGNORE_REVISION | OM_CHECK_SUBMODEL)) \
+                       && __OCTEON_MATCH_MASK__((chip_model), (arg_model), OCTEON_38XX_MODEL_MASK)) || \
+               ((((arg_model) & (OM_FLAG_MASK)) == 0)                  \
+                       && __OCTEON_MATCH_MASK__((chip_model), (arg_model), OCTEON_38XX_FAMILY_REV_MASK)) || \
+               ((((arg_model) & (OM_FLAG_MASK)) == OM_IGNORE_REVISION) \
+                       && __OCTEON_MATCH_MASK__((chip_model), (arg_model), OCTEON_38XX_FAMILY_MASK)) || \
+               ((((arg_model) & (OM_FLAG_MASK)) == OM_CHECK_SUBMODEL)  \
+                       && __OCTEON_MATCH_MASK__((chip_model), (arg_model), OCTEON_38XX_MODEL_REV_MASK)) || \
+               ((((arg_model) & (OM_MATCH_PREVIOUS_MODELS)) == OM_MATCH_PREVIOUS_MODELS) \
+                       && (((chip_model) & OCTEON_38XX_MODEL_MASK) < ((arg_model) & OCTEON_38XX_MODEL_MASK))) \
+               )) ||                                                   \
+       (((arg_model & OCTEON_38XX_FAMILY_MASK) >= OCTEON_CN58XX_PASS1_0)  && ( \
+               ((((arg_model) & (OM_FLAG_MASK)) == (OM_IGNORE_REVISION | OM_CHECK_SUBMODEL)) \
+                       && __OCTEON_MATCH_MASK__((chip_model), (arg_model), OCTEON_58XX_MODEL_MASK)) || \
+               ((((arg_model) & (OM_FLAG_MASK)) == 0)                  \
+                       && __OCTEON_MATCH_MASK__((chip_model), (arg_model), OCTEON_58XX_FAMILY_REV_MASK)) || \
+               ((((arg_model) & (OM_FLAG_MASK)) == OM_IGNORE_MINOR_REVISION) \
+                       && __OCTEON_MATCH_MASK__((chip_model), (arg_model), OCTEON_58XX_MODEL_MINOR_REV_MASK)) || \
+               ((((arg_model) & (OM_FLAG_MASK)) == OM_IGNORE_REVISION) \
+                       && __OCTEON_MATCH_MASK__((chip_model), (arg_model), OCTEON_58XX_FAMILY_MASK)) || \
+               ((((arg_model) & (OM_FLAG_MASK)) == OM_CHECK_SUBMODEL)  \
+                       && __OCTEON_MATCH_MASK__((chip_model), (arg_model), OCTEON_58XX_MODEL_REV_MASK)) || \
+               ((((arg_model) & (OM_MATCH_5XXX_FAMILY_MODELS)) == OM_MATCH_5XXX_FAMILY_MODELS) \
+                       && ((chip_model) >= OCTEON_CN58XX_PASS1_0) && ((chip_model) < OCTEON_CN63XX_PASS1_0)) || \
+               ((((arg_model) & (OM_MATCH_6XXX_FAMILY_MODELS)) == OM_MATCH_6XXX_FAMILY_MODELS) \
+                       && ((chip_model) >= OCTEON_CN63XX_PASS1_0)) ||  \
+               ((((arg_model) & (OM_MATCH_PREVIOUS_MODELS)) == OM_MATCH_PREVIOUS_MODELS) \
+                       && (((chip_model) & OCTEON_58XX_MODEL_MASK) < ((arg_model) & OCTEON_58XX_MODEL_MASK))) \
+               )))
+
 /* NOTE: This for internal use only!!!!! */
 static inline int __octeon_is_model_runtime__(uint32_t model)
 {
@@ -312,22 +286,25 @@ static inline int __octeon_is_model_runtime__(uint32_t model)
 
        /*
         * Check for special case of mismarked 3005 samples. We only
-        * need to check if the sub model isn't being ignored.
+        * need to check if the sub model isn't being ignored
         */
        if ((model & OM_CHECK_SUBMODEL) == OM_CHECK_SUBMODEL) {
-               if (cpuid == OCTEON_CN3010_PASS1 \
-                   && (cvmx_read_csr(0x80011800800007B8ull) & (1ull << 34)))
+               if (cpuid == OCTEON_CN3010_PASS1 && (cvmx_read_csr(0x80011800800007B8ull) & (1ull << 34)))
                        cpuid |= 0x10;
        }
        return __OCTEON_IS_MODEL_COMPILE__(model, cpuid);
 }
 
 /*
- * The OCTEON_IS_MODEL macro should be used for all Octeon model
- * checking done in a program.  This should be kept runtime if at all
- * possible.  Any compile time (#if OCTEON_IS_MODEL) usage must be
- * condtionalized with OCTEON_IS_COMMON_BINARY() if runtime checking
- * support is required.
+ * The OCTEON_IS_MODEL macro should be used for all Octeon model checking done
+ * in a program.
+ * This should be kept runtime if at all possible  and must be conditionalized
+ * with OCTEON_IS_COMMON_BINARY() if runtime checking support is required.
+ *
+ * Use of the macro in preprocessor directives ( #if OCTEON_IS_MODEL(...) )
+ * is NOT SUPPORTED, and should be replaced with CVMX_COMPILED_FOR()
+ * I.e.:
+ *  #if OCTEON_IS_MODEL(OCTEON_CN56XX)  ->  #if CVMX_COMPILED_FOR(OCTEON_CN56XX)
  */
 #define OCTEON_IS_MODEL(x) __octeon_is_model_runtime__(x)
 #define OCTEON_IS_COMMON_BINARY() 1
index fba2ba200f587a885d559b71fbda755d2c92b5a9..c66734bd33821a1549d72eb1f7163e7fe5de108a 100644 (file)
@@ -56,7 +56,8 @@ enum octeon_dma_bar_type {
        OCTEON_DMA_BAR_TYPE_INVALID,
        OCTEON_DMA_BAR_TYPE_SMALL,
        OCTEON_DMA_BAR_TYPE_BIG,
-       OCTEON_DMA_BAR_TYPE_PCIE
+       OCTEON_DMA_BAR_TYPE_PCIE,
+       OCTEON_DMA_BAR_TYPE_PCIE2
 };
 
 /*
index d169c07c38eeeb46b5fdb0c16457ceb63ec5f90d..5d56bb2303454e1ff3937d2acd0a99f97bba864f 100644 (file)
 #include <asm-generic/pgtable-nopmd.h>
 
 /*
- * - add_wired_entry() add a fixed TLB entry, and move wired register
- */
-extern void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1,
-                              unsigned long entryhi, unsigned long pagemask);
-
-/* Basically we have the same two-level (which is the logical three level
+ * Basically we have the same two-level (which is the logical three level
  * Linux page table layout folded) page tables as the i386.  Some day
  * when we have proper page coloring support we can have a 1% quicker
  * tlb refill handling mechanism, but for now it is a bit slower but
diff --git a/arch/mips/include/asm/tlbmisc.h b/arch/mips/include/asm/tlbmisc.h
new file mode 100644 (file)
index 0000000..3a45228
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef __ASM_TLBMISC_H
+#define __ASM_TLBMISC_H
+
+/*
+ * - add_wired_entry() add a fixed TLB entry, and move wired register
+ */
+extern void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1,
+       unsigned long entryhi, unsigned long pagemask);
+
+#endif /* __ASM_TLBMISC_H */
index 90ff2f497c500f84d925773584c4c148356dd793..ff74aec3561a3f0a88829db33c15b87887fdcbc9 100644 (file)
@@ -24,5 +24,18 @@ extern int (*board_be_handler)(struct pt_regs *regs, int is_fixup);
 extern void (*board_nmi_handler_setup)(void);
 extern void (*board_ejtag_handler_setup)(void);
 extern void (*board_bind_eic_interrupt)(int irq, int regset);
+extern void (*board_ebase_setup)(void);
+
+extern int register_nmi_notifier(struct notifier_block *nb);
+
+#define nmi_notifier(fn, pri)                                          \
+({                                                                     \
+       static struct notifier_block fn##_nb = {                        \
+               .notifier_call = fn,                                    \
+               .priority = pri                                         \
+       };                                                              \
+                                                                       \
+       register_nmi_notifier(&fn##_nb);                                \
+})
 
 #endif /* _ASM_TRAPS_H */
index 0f4a14752a7bf4d9568e281757faf3af5f5476ec..f21868b28b24e19575d49210bb709333d3653309 100644 (file)
@@ -20,6 +20,7 @@
 #include <asm/io.h>
 #include <asm/jazz.h>
 #include <asm/pgtable.h>
+#include <asm/tlbmisc.h>
 
 static DEFINE_RAW_SPINLOCK(r4030_lock);
 
index 0d0f054a02f4bfc309ad3b7290b83a90dae26cfd..820e926dacbc5856167fdd34893d4b1c59ead161 100644 (file)
@@ -21,6 +21,7 @@
 #include <asm/jazzdma.h>
 #include <asm/reboot.h>
 #include <asm/pgtable.h>
+#include <asm/tlbmisc.h>
 
 extern asmlinkage void jazz_handle_int(void);
 
index c3b04be3fb2bb4c056e2cb531b5c473d53d23c9f..639e3ce6c264d4f8af8137efffff5fdf280992cf 100644 (file)
@@ -488,7 +488,7 @@ static int __init qi_lb60_board_setup(void)
        board_gpio_setup();
 
        if (qi_lb60_init_platform_devices())
-               panic("Failed to initialize platform devices\n");
+               panic("Failed to initialize platform devices");
 
        return 0;
 }
index 1a966183e3531c4c9f5dd735310364e82526cf6d..0c6877ea900495f547e087be39c11870d1d95dd7 100644 (file)
@@ -55,9 +55,11 @@ obj-$(CONFIG_CPU_TX49XX)     += r4k_fpu.o r4k_switch.o
 obj-$(CONFIG_CPU_VR41XX)       += r4k_fpu.o r4k_switch.o
 obj-$(CONFIG_CPU_CAVIUM_OCTEON)        += octeon_switch.o
 obj-$(CONFIG_CPU_XLR)          += r4k_fpu.o r4k_switch.o
+obj-$(CONFIG_CPU_XLP)          += r4k_fpu.o r4k_switch.o
 
 obj-$(CONFIG_SMP)              += smp.o
 obj-$(CONFIG_SMP_UP)           += smp-up.o
+obj-$(CONFIG_CPU_BMIPS)                += smp-bmips.o bmips_vec.o
 
 obj-$(CONFIG_MIPS_MT)          += mips-mt.o
 obj-$(CONFIG_MIPS_MT_FPAFF)    += mips-mt-fpaff.o
diff --git a/arch/mips/kernel/bmips_vec.S b/arch/mips/kernel/bmips_vec.S
new file mode 100644 (file)
index 0000000..e908e81
--- /dev/null
@@ -0,0 +1,255 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2011 by Kevin Cernekee (cernekee@gmail.com)
+ *
+ * Reset/NMI/re-entry vectors for BMIPS processors
+ */
+
+#include <linux/init.h>
+
+#include <asm/asm.h>
+#include <asm/asmmacro.h>
+#include <asm/cacheops.h>
+#include <asm/regdef.h>
+#include <asm/mipsregs.h>
+#include <asm/stackframe.h>
+#include <asm/addrspace.h>
+#include <asm/hazards.h>
+#include <asm/bmips.h>
+
+       .macro  BARRIER
+       .set    mips32
+       _ssnop
+       _ssnop
+       _ssnop
+       .set    mips0
+       .endm
+
+       __CPUINIT
+
+/***********************************************************************
+ * Alternate CPU1 startup vector for BMIPS4350
+ *
+ * On some systems the bootloader has already started CPU1 and configured
+ * it to resume execution at 0x8000_0200 (!BEV IV vector) when it is
+ * triggered by the SW1 interrupt.  If that is the case we try to move
+ * it to a more convenient place: BMIPS_WARM_RESTART_VEC @ 0x8000_0380.
+ ***********************************************************************/
+
+LEAF(bmips_smp_movevec)
+       la      k0, 1f
+       li      k1, CKSEG1
+       or      k0, k1
+       jr      k0
+
+1:
+       /* clear IV, pending IPIs */
+       mtc0    zero, CP0_CAUSE
+
+       /* re-enable IRQs to wait for SW1 */
+       li      k0, ST0_IE | ST0_BEV | STATUSF_IP1
+       mtc0    k0, CP0_STATUS
+
+       /* set up CPU1 CBR; move BASE to 0xa000_0000 */
+       li      k0, 0xff400000
+       mtc0    k0, $22, 6
+       li      k1, CKSEG1 | BMIPS_RELO_VECTOR_CONTROL_1
+       or      k0, k1
+       li      k1, 0xa0080000
+       sw      k1, 0(k0)
+
+       /* wait here for SW1 interrupt from bmips_boot_secondary() */
+       wait
+
+       la      k0, bmips_reset_nmi_vec
+       li      k1, CKSEG1
+       or      k0, k1
+       jr      k0
+END(bmips_smp_movevec)
+
+/***********************************************************************
+ * Reset/NMI vector
+ * For BMIPS processors that can relocate their exception vectors, this
+ * entire function gets copied to 0x8000_0000.
+ ***********************************************************************/
+
+NESTED(bmips_reset_nmi_vec, PT_SIZE, sp)
+       .set    push
+       .set    noat
+       .align  4
+
+#ifdef CONFIG_SMP
+       /* if the NMI bit is clear, assume this is a CPU1 reset instead */
+       li      k1, (1 << 19)
+       mfc0    k0, CP0_STATUS
+       and     k0, k1
+       beqz    k0, bmips_smp_entry
+
+#if defined(CONFIG_CPU_BMIPS5000)
+       /* if we're not on core 0, this must be the SMP boot signal */
+       li      k1, (3 << 25)
+       mfc0    k0, $22
+       and     k0, k1
+       bnez    k0, bmips_smp_entry
+#endif
+#endif /* CONFIG_SMP */
+
+       /* nope, it's just a regular NMI */
+       SAVE_ALL
+       move    a0, sp
+
+       /* clear EXL, ERL, BEV so that TLB refills still work */
+       mfc0    k0, CP0_STATUS
+       li      k1, ST0_ERL | ST0_EXL | ST0_BEV | ST0_IE
+       or      k0, k1
+       xor     k0, k1
+       mtc0    k0, CP0_STATUS
+       BARRIER
+
+       /* jump to the NMI handler function */
+       la      k0, nmi_handler
+       jr      k0
+
+       RESTORE_ALL
+       .set    mips3
+       eret
+
+/***********************************************************************
+ * CPU1 reset vector (used for the initial boot only)
+ * This is still part of bmips_reset_nmi_vec().
+ ***********************************************************************/
+
+#ifdef CONFIG_SMP
+
+bmips_smp_entry:
+
+       /* set up CP0 STATUS; enable FPU */
+       li      k0, 0x30000000
+       mtc0    k0, CP0_STATUS
+       BARRIER
+
+       /* set local CP0 CONFIG to make kseg0 cacheable, write-back */
+       mfc0    k0, CP0_CONFIG
+       ori     k0, 0x07
+       xori    k0, 0x04
+       mtc0    k0, CP0_CONFIG
+
+#if defined(CONFIG_CPU_BMIPS4350) || defined(CONFIG_CPU_BMIPS4380)
+       /* initialize CPU1's local I-cache */
+       li      k0, 0x80000000
+       li      k1, 0x80010000
+       mtc0    zero, $28
+       mtc0    zero, $28, 1
+       BARRIER
+
+1:     cache   Index_Store_Tag_I, 0(k0)
+       addiu   k0, 16
+       bne     k0, k1, 1b
+#elif defined(CONFIG_CPU_BMIPS5000)
+       /* set exception vector base */
+       la      k0, ebase
+       lw      k0, 0(k0)
+       mtc0    k0, $15, 1
+       BARRIER
+#endif
+
+       /* jump back to kseg0 in case we need to remap the kseg1 area */
+       la      k0, 1f
+       jr      k0
+1:
+       la      k0, bmips_enable_xks01
+       jalr    k0
+
+       /* use temporary stack to set up upper memory TLB */
+       li      sp, BMIPS_WARM_RESTART_VEC
+       la      k0, plat_wired_tlb_setup
+       jalr    k0
+
+       /* switch to permanent stack and continue booting */
+
+       .global bmips_secondary_reentry
+bmips_secondary_reentry:
+       la      k0, bmips_smp_boot_sp
+       lw      sp, 0(k0)
+       la      k0, bmips_smp_boot_gp
+       lw      gp, 0(k0)
+       la      k0, start_secondary
+       jr      k0
+
+#endif /* CONFIG_SMP */
+
+       .align  4
+       .global bmips_reset_nmi_vec_end
+bmips_reset_nmi_vec_end:
+
+END(bmips_reset_nmi_vec)
+
+       .set    pop
+       .previous
+
+/***********************************************************************
+ * CPU1 warm restart vector (used for second and subsequent boots).
+ * Also used for S2 standby recovery (PM).
+ * This entire function gets copied to (BMIPS_WARM_RESTART_VEC)
+ ***********************************************************************/
+
+LEAF(bmips_smp_int_vec)
+
+       .align  4
+       mfc0    k0, CP0_STATUS
+       ori     k0, 0x01
+       xori    k0, 0x01
+       mtc0    k0, CP0_STATUS
+       eret
+
+       .align  4
+       .global bmips_smp_int_vec_end
+bmips_smp_int_vec_end:
+
+END(bmips_smp_int_vec)
+
+/***********************************************************************
+ * XKS01 support
+ * Certain CPUs support extending kseg0 to 1024MB.
+ ***********************************************************************/
+
+       __CPUINIT
+
+LEAF(bmips_enable_xks01)
+
+#if defined(CONFIG_XKS01)
+
+#if defined(CONFIG_CPU_BMIPS4380)
+       mfc0    t0, $22, 3
+       li      t1, 0x1ff0
+       li      t2, (1 << 12) | (1 << 9)
+       or      t0, t1
+       xor     t0, t1
+       or      t0, t2
+       mtc0    t0, $22, 3
+       BARRIER
+#elif defined(CONFIG_CPU_BMIPS5000)
+       mfc0    t0, $22, 5
+       li      t1, 0x01ff
+       li      t2, (1 << 8) | (1 << 5)
+       or      t0, t1
+       xor     t0, t1
+       or      t0, t2
+       mtc0    t0, $22, 5
+       BARRIER
+#else
+
+#error Missing XKS01 setup
+
+#endif
+
+#endif /* defined(CONFIG_XKS01) */
+
+       jr      ra
+
+END(bmips_enable_xks01)
+
+       .previous
index 32103cc2a2576877592d91050b86c8944a2479d9..4d735d0e58f5c9caea2ae5936054e0ce1a66dd08 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/signal.h>
+#include <linux/module.h>
 #include <asm/branch.h>
 #include <asm/cpu.h>
 #include <asm/cpu-features.h>
 #include <asm/ptrace.h>
 #include <asm/uaccess.h>
 
-/*
- * Compute the return address and do emulate branch simulation, if required.
+/**
+ * __compute_return_epc_for_insn - Computes the return address and do emulate
+ *                                 branch simulation, if required.
+ *
+ * @regs:      Pointer to pt_regs
+ * @insn:      branch instruction to decode
+ * @returns:   -EFAULT on error and forces SIGBUS, and on success
+ *             returns 0 or BRANCH_LIKELY_TAKEN as appropriate after
+ *             evaluating the branch.
  */
-int __compute_return_epc(struct pt_regs *regs)
+int __compute_return_epc_for_insn(struct pt_regs *regs,
+                                  union mips_instruction insn)
 {
-       unsigned int __user *addr;
        unsigned int bit, fcr31, dspcontrol;
-       long epc;
-       union mips_instruction insn;
-
-       epc = regs->cp0_epc;
-       if (epc & 3)
-               goto unaligned;
-
-       /*
-        * Read the instruction
-        */
-       addr = (unsigned int __user *) epc;
-       if (__get_user(insn.word, addr)) {
-               force_sig(SIGSEGV, current);
-               return -EFAULT;
-       }
+       long epc = regs->cp0_epc;
+       int ret = 0;
 
        switch (insn.i_format.opcode) {
        /*
@@ -64,18 +59,22 @@ int __compute_return_epc(struct pt_regs *regs)
                switch (insn.i_format.rt) {
                case bltz_op:
                case bltzl_op:
-                       if ((long)regs->regs[insn.i_format.rs] < 0)
+                       if ((long)regs->regs[insn.i_format.rs] < 0) {
                                epc = epc + 4 + (insn.i_format.simmediate << 2);
-                       else
+                               if (insn.i_format.rt == bltzl_op)
+                                       ret = BRANCH_LIKELY_TAKEN;
+                       } else
                                epc += 8;
                        regs->cp0_epc = epc;
                        break;
 
                case bgez_op:
                case bgezl_op:
-                       if ((long)regs->regs[insn.i_format.rs] >= 0)
+                       if ((long)regs->regs[insn.i_format.rs] >= 0) {
                                epc = epc + 4 + (insn.i_format.simmediate << 2);
-                       else
+                               if (insn.i_format.rt == bgezl_op)
+                                       ret = BRANCH_LIKELY_TAKEN;
+                       } else
                                epc += 8;
                        regs->cp0_epc = epc;
                        break;
@@ -83,9 +82,11 @@ int __compute_return_epc(struct pt_regs *regs)
                case bltzal_op:
                case bltzall_op:
                        regs->regs[31] = epc + 8;
-                       if ((long)regs->regs[insn.i_format.rs] < 0)
+                       if ((long)regs->regs[insn.i_format.rs] < 0) {
                                epc = epc + 4 + (insn.i_format.simmediate << 2);
-                       else
+                               if (insn.i_format.rt == bltzall_op)
+                                       ret = BRANCH_LIKELY_TAKEN;
+                       } else
                                epc += 8;
                        regs->cp0_epc = epc;
                        break;
@@ -93,12 +94,15 @@ int __compute_return_epc(struct pt_regs *regs)
                case bgezal_op:
                case bgezall_op:
                        regs->regs[31] = epc + 8;
-                       if ((long)regs->regs[insn.i_format.rs] >= 0)
+                       if ((long)regs->regs[insn.i_format.rs] >= 0) {
                                epc = epc + 4 + (insn.i_format.simmediate << 2);
-                       else
+                               if (insn.i_format.rt == bgezall_op)
+                                       ret = BRANCH_LIKELY_TAKEN;
+                       } else
                                epc += 8;
                        regs->cp0_epc = epc;
                        break;
+
                case bposge32_op:
                        if (!cpu_has_dsp)
                                goto sigill;
@@ -133,9 +137,11 @@ int __compute_return_epc(struct pt_regs *regs)
        case beq_op:
        case beql_op:
                if (regs->regs[insn.i_format.rs] ==
-                   regs->regs[insn.i_format.rt])
+                   regs->regs[insn.i_format.rt]) {
                        epc = epc + 4 + (insn.i_format.simmediate << 2);
-               else
+                       if (insn.i_format.rt == beql_op)
+                               ret = BRANCH_LIKELY_TAKEN;
+               } else
                        epc += 8;
                regs->cp0_epc = epc;
                break;
@@ -143,9 +149,11 @@ int __compute_return_epc(struct pt_regs *regs)
        case bne_op:
        case bnel_op:
                if (regs->regs[insn.i_format.rs] !=
-                   regs->regs[insn.i_format.rt])
+                   regs->regs[insn.i_format.rt]) {
                        epc = epc + 4 + (insn.i_format.simmediate << 2);
-               else
+                       if (insn.i_format.rt == bnel_op)
+                               ret = BRANCH_LIKELY_TAKEN;
+               } else
                        epc += 8;
                regs->cp0_epc = epc;
                break;
@@ -153,9 +161,11 @@ int __compute_return_epc(struct pt_regs *regs)
        case blez_op: /* not really i_format */
        case blezl_op:
                /* rt field assumed to be zero */
-               if ((long)regs->regs[insn.i_format.rs] <= 0)
+               if ((long)regs->regs[insn.i_format.rs] <= 0) {
                        epc = epc + 4 + (insn.i_format.simmediate << 2);
-               else
+                       if (insn.i_format.rt == bnel_op)
+                               ret = BRANCH_LIKELY_TAKEN;
+               } else
                        epc += 8;
                regs->cp0_epc = epc;
                break;
@@ -163,9 +173,11 @@ int __compute_return_epc(struct pt_regs *regs)
        case bgtz_op:
        case bgtzl_op:
                /* rt field assumed to be zero */
-               if ((long)regs->regs[insn.i_format.rs] > 0)
+               if ((long)regs->regs[insn.i_format.rs] > 0) {
                        epc = epc + 4 + (insn.i_format.simmediate << 2);
-               else
+                       if (insn.i_format.rt == bnel_op)
+                               ret = BRANCH_LIKELY_TAKEN;
+               } else
                        epc += 8;
                regs->cp0_epc = epc;
                break;
@@ -187,18 +199,22 @@ int __compute_return_epc(struct pt_regs *regs)
                switch (insn.i_format.rt & 3) {
                case 0: /* bc1f */
                case 2: /* bc1fl */
-                       if (~fcr31 & (1 << bit))
+                       if (~fcr31 & (1 << bit)) {
                                epc = epc + 4 + (insn.i_format.simmediate << 2);
-                       else
+                               if (insn.i_format.rt == 2)
+                                       ret = BRANCH_LIKELY_TAKEN;
+                       } else
                                epc += 8;
                        regs->cp0_epc = epc;
                        break;
 
                case 1: /* bc1t */
                case 3: /* bc1tl */
-                       if (fcr31 & (1 << bit))
+                       if (fcr31 & (1 << bit)) {
                                epc = epc + 4 + (insn.i_format.simmediate << 2);
-                       else
+                               if (insn.i_format.rt == 3)
+                                       ret = BRANCH_LIKELY_TAKEN;
+                       } else
                                epc += 8;
                        regs->cp0_epc = epc;
                        break;
@@ -239,15 +255,39 @@ int __compute_return_epc(struct pt_regs *regs)
 #endif
        }
 
-       return 0;
+       return ret;
 
-unaligned:
-       printk("%s: unaligned epc - sending SIGBUS.\n", current->comm);
+sigill:
+       printk("%s: DSP branch but not DSP ASE - sending SIGBUS.\n", current->comm);
        force_sig(SIGBUS, current);
        return -EFAULT;
+}
+EXPORT_SYMBOL_GPL(__compute_return_epc_for_insn);
 
-sigill:
-       printk("%s: DSP branch but not DSP ASE - sending SIGBUS.\n", current->comm);
+int __compute_return_epc(struct pt_regs *regs)
+{
+       unsigned int __user *addr;
+       long epc;
+       union mips_instruction insn;
+
+       epc = regs->cp0_epc;
+       if (epc & 3)
+               goto unaligned;
+
+       /*
+        * Read the instruction
+        */
+       addr = (unsigned int __user *) epc;
+       if (__get_user(insn.word, addr)) {
+               force_sig(SIGSEGV, current);
+               return -EFAULT;
+       }
+
+       return __compute_return_epc_for_insn(regs, insn);
+
+unaligned:
+       printk("%s: unaligned epc - sending SIGBUS.\n", current->comm);
        force_sig(SIGBUS, current);
        return -EFAULT;
+
 }
index c7d3cf1ce46e275b11df8c210f1553c5eb0bd74c..0bab464b8e33be322e64dacc1263189c71dbb1ac 100644 (file)
@@ -191,6 +191,8 @@ void __init check_wait(void)
        case CPU_CAVIUM_OCTEON_PLUS:
        case CPU_CAVIUM_OCTEON2:
        case CPU_JZRISC:
+       case CPU_XLR:
+       case CPU_XLP:
                cpu_wait = r4k_wait;
                break;
 
@@ -1014,6 +1016,13 @@ static inline void cpu_probe_netlogic(struct cpuinfo_mips *c, int cpu)
 {
        decode_configs(c);
 
+       if ((c->processor_id & 0xff00) == PRID_IMP_NETLOGIC_AU13XX) {
+               c->cputype = CPU_ALCHEMY;
+               __cpu_name[cpu] = "Au1300";
+               /* following stuff is not for Alchemy */
+               return;
+       }
+
        c->options = (MIPS_CPU_TLB       |
                        MIPS_CPU_4KEX    |
                        MIPS_CPU_COUNTER |
@@ -1023,6 +1032,12 @@ static inline void cpu_probe_netlogic(struct cpuinfo_mips *c, int cpu)
                        MIPS_CPU_LLSC);
 
        switch (c->processor_id & 0xff00) {
+       case PRID_IMP_NETLOGIC_XLP8XX:
+       case PRID_IMP_NETLOGIC_XLP3XX:
+               c->cputype = CPU_XLP;
+               __cpu_name[cpu] = "Netlogic XLP";
+               break;
+
        case PRID_IMP_NETLOGIC_XLR732:
        case PRID_IMP_NETLOGIC_XLR716:
        case PRID_IMP_NETLOGIC_XLR532:
@@ -1053,14 +1068,21 @@ static inline void cpu_probe_netlogic(struct cpuinfo_mips *c, int cpu)
                break;
 
        default:
-               printk(KERN_INFO "Unknown Netlogic chip id [%02x]!\n",
+               pr_info("Unknown Netlogic chip id [%02x]!\n",
                       c->processor_id);
                c->cputype = CPU_XLR;
                break;
        }
 
-       c->isa_level = MIPS_CPU_ISA_M64R1;
-       c->tlbsize = ((read_c0_config1() >> 25) & 0x3f) + 1;
+       if (c->cputype == CPU_XLP) {
+               c->isa_level = MIPS_CPU_ISA_M64R2;
+               c->options |= (MIPS_CPU_FPU | MIPS_CPU_ULRI | MIPS_CPU_MCHECK);
+               /* This will be updated again after all threads are woken up */
+               c->tlbsize = ((read_c0_config6() >> 16) & 0xffff) + 1;
+       } else {
+               c->isa_level = MIPS_CPU_ISA_M64R1;
+               c->tlbsize = ((read_c0_config1() >> 25) & 0x3f) + 1;
+       }
 }
 
 #ifdef CONFIG_64BIT
index ee28683fc2acbb7168d437702f2f0fdf453a4a3d..158467da9bc1cd134d797ef4a6c3993617523d34 100644 (file)
 
 #include <linux/kprobes.h>
 #include <linux/preempt.h>
+#include <linux/uaccess.h>
 #include <linux/kdebug.h>
 #include <linux/slab.h>
 
 #include <asm/ptrace.h>
+#include <asm/branch.h>
 #include <asm/break.h>
 #include <asm/inst.h>
 
@@ -112,17 +114,49 @@ insn_ok:
        return 0;
 }
 
+/*
+ * insn_has_ll_or_sc function checks whether instruction is ll or sc
+ * one; putting breakpoint on top of atomic ll/sc pair is bad idea;
+ * so we need to prevent it and refuse kprobes insertion for such
+ * instructions; cannot do much about breakpoint in the middle of
+ * ll/sc pair; it is upto user to avoid those places
+ */
+static int __kprobes insn_has_ll_or_sc(union mips_instruction insn)
+{
+       int ret = 0;
+
+       switch (insn.i_format.opcode) {
+       case ll_op:
+       case lld_op:
+       case sc_op:
+       case scd_op:
+               ret = 1;
+               break;
+       default:
+               break;
+       }
+       return ret;
+}
+
 int __kprobes arch_prepare_kprobe(struct kprobe *p)
 {
        union mips_instruction insn;
        union mips_instruction prev_insn;
        int ret = 0;
 
-       prev_insn = p->addr[-1];
        insn = p->addr[0];
 
-       if (insn_has_delayslot(insn) || insn_has_delayslot(prev_insn)) {
-               pr_notice("Kprobes for branch and jump instructions are not supported\n");
+       if (insn_has_ll_or_sc(insn)) {
+               pr_notice("Kprobes for ll and sc instructions are not"
+                         "supported\n");
+               ret = -EINVAL;
+               goto out;
+       }
+
+       if ((probe_kernel_read(&prev_insn, p->addr - 1,
+                               sizeof(mips_instruction)) == 0) &&
+                               insn_has_delayslot(prev_insn)) {
+               pr_notice("Kprobes for branch delayslot are not supported\n");
                ret = -EINVAL;
                goto out;
        }
@@ -138,9 +172,20 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
         * In the kprobe->ainsn.insn[] array we store the original
         * instruction at index zero and a break trap instruction at
         * index one.
+        *
+        * On MIPS arch if the instruction at probed address is a
+        * branch instruction, we need to execute the instruction at
+        * Branch Delayslot (BD) at the time of probe hit. As MIPS also
+        * doesn't have single stepping support, the BD instruction can
+        * not be executed in-line and it would be executed on SSOL slot
+        * using a normal breakpoint instruction in the next slot.
+        * So, read the instruction and save it for later execution.
         */
+       if (insn_has_delayslot(insn))
+               memcpy(&p->ainsn.insn[0], p->addr + 1, sizeof(kprobe_opcode_t));
+       else
+               memcpy(&p->ainsn.insn[0], p->addr, sizeof(kprobe_opcode_t));
 
-       memcpy(&p->ainsn.insn[0], p->addr, sizeof(kprobe_opcode_t));
        p->ainsn.insn[1] = breakpoint2_insn;
        p->opcode = *p->addr;
 
@@ -191,16 +236,96 @@ static void set_current_kprobe(struct kprobe *p, struct pt_regs *regs,
        kcb->kprobe_saved_epc = regs->cp0_epc;
 }
 
-static void prepare_singlestep(struct kprobe *p, struct pt_regs *regs)
+/**
+ * evaluate_branch_instrucion -
+ *
+ * Evaluate the branch instruction at probed address during probe hit. The
+ * result of evaluation would be the updated epc. The insturction in delayslot
+ * would actually be single stepped using a normal breakpoint) on SSOL slot.
+ *
+ * The result is also saved in the kprobe control block for later use,
+ * in case we need to execute the delayslot instruction. The latter will be
+ * false for NOP instruction in dealyslot and the branch-likely instructions
+ * when the branch is taken. And for those cases we set a flag as
+ * SKIP_DELAYSLOT in the kprobe control block
+ */
+static int evaluate_branch_instruction(struct kprobe *p, struct pt_regs *regs,
+                                       struct kprobe_ctlblk *kcb)
 {
+       union mips_instruction insn = p->opcode;
+       long epc;
+       int ret = 0;
+
+       epc = regs->cp0_epc;
+       if (epc & 3)
+               goto unaligned;
+
+       if (p->ainsn.insn->word == 0)
+               kcb->flags |= SKIP_DELAYSLOT;
+       else
+               kcb->flags &= ~SKIP_DELAYSLOT;
+
+       ret = __compute_return_epc_for_insn(regs, insn);
+       if (ret < 0)
+               return ret;
+
+       if (ret == BRANCH_LIKELY_TAKEN)
+               kcb->flags |= SKIP_DELAYSLOT;
+
+       kcb->target_epc = regs->cp0_epc;
+
+       return 0;
+
+unaligned:
+       pr_notice("%s: unaligned epc - sending SIGBUS.\n", current->comm);
+       force_sig(SIGBUS, current);
+       return -EFAULT;
+
+}
+
+static void prepare_singlestep(struct kprobe *p, struct pt_regs *regs,
+                                               struct kprobe_ctlblk *kcb)
+{
+       int ret = 0;
+
        regs->cp0_status &= ~ST0_IE;
 
        /* single step inline if the instruction is a break */
        if (p->opcode.word == breakpoint_insn.word ||
            p->opcode.word == breakpoint2_insn.word)
                regs->cp0_epc = (unsigned long)p->addr;
-       else
-               regs->cp0_epc = (unsigned long)&p->ainsn.insn[0];
+       else if (insn_has_delayslot(p->opcode)) {
+               ret = evaluate_branch_instruction(p, regs, kcb);
+               if (ret < 0) {
+                       pr_notice("Kprobes: Error in evaluating branch\n");
+                       return;
+               }
+       }
+       regs->cp0_epc = (unsigned long)&p->ainsn.insn[0];
+}
+
+/*
+ * Called after single-stepping.  p->addr is the address of the
+ * instruction whose first byte has been replaced by the "break 0"
+ * instruction.  To avoid the SMP problems that can occur when we
+ * temporarily put back the original opcode to single-step, we
+ * single-stepped a copy of the instruction.  The address of this
+ * copy is p->ainsn.insn.
+ *
+ * This function prepares to return from the post-single-step
+ * breakpoint trap. In case of branch instructions, the target
+ * epc to be restored.
+ */
+static void __kprobes resume_execution(struct kprobe *p,
+                                      struct pt_regs *regs,
+                                      struct kprobe_ctlblk *kcb)
+{
+       if (insn_has_delayslot(p->opcode))
+               regs->cp0_epc = kcb->target_epc;
+       else {
+               unsigned long orig_epc = kcb->kprobe_saved_epc;
+               regs->cp0_epc = orig_epc + 4;
+       }
 }
 
 static int __kprobes kprobe_handler(struct pt_regs *regs)
@@ -239,8 +364,13 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
                        save_previous_kprobe(kcb);
                        set_current_kprobe(p, regs, kcb);
                        kprobes_inc_nmissed_count(p);
-                       prepare_singlestep(p, regs);
+                       prepare_singlestep(p, regs, kcb);
                        kcb->kprobe_status = KPROBE_REENTER;
+                       if (kcb->flags & SKIP_DELAYSLOT) {
+                               resume_execution(p, regs, kcb);
+                               restore_previous_kprobe(kcb);
+                               preempt_enable_no_resched();
+                       }
                        return 1;
                } else {
                        if (addr->word != breakpoint_insn.word) {
@@ -284,8 +414,16 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
        }
 
 ss_probe:
-       prepare_singlestep(p, regs);
-       kcb->kprobe_status = KPROBE_HIT_SS;
+       prepare_singlestep(p, regs, kcb);
+       if (kcb->flags & SKIP_DELAYSLOT) {
+               kcb->kprobe_status = KPROBE_HIT_SSDONE;
+               if (p->post_handler)
+                       p->post_handler(p, regs, 0);
+               resume_execution(p, regs, kcb);
+               preempt_enable_no_resched();
+       } else
+               kcb->kprobe_status = KPROBE_HIT_SS;
+
        return 1;
 
 no_kprobe:
@@ -294,25 +432,6 @@ no_kprobe:
 
 }
 
-/*
- * Called after single-stepping.  p->addr is the address of the
- * instruction whose first byte has been replaced by the "break 0"
- * instruction.  To avoid the SMP problems that can occur when we
- * temporarily put back the original opcode to single-step, we
- * single-stepped a copy of the instruction.  The address of this
- * copy is p->ainsn.insn.
- *
- * This function prepares to return from the post-single-step
- * breakpoint trap.
- */
-static void __kprobes resume_execution(struct kprobe *p,
-                                      struct pt_regs *regs,
-                                      struct kprobe_ctlblk *kcb)
-{
-       unsigned long orig_epc = kcb->kprobe_saved_epc;
-       regs->cp0_epc = orig_epc + 4;
-}
-
 static inline int post_kprobe_handler(struct pt_regs *regs)
 {
        struct kprobe *cur = kprobe_running();
index 4f2971bcf8e5464577885b5ecc64db11c388d295..bda4bc9e6988bcab40f6b5513748c861d7a0adec 100644 (file)
@@ -621,11 +621,6 @@ static int mipspmu_event_init(struct perf_event *event)
                return -ENODEV;
 
        if (!atomic_inc_not_zero(&active_events)) {
-               if (atomic_read(&active_events) > MIPS_MAX_HWEVENTS) {
-                       atomic_dec(&active_events);
-                       return -ENOSPC;
-               }
-
                mutex_lock(&pmu_reserve_mutex);
                if (atomic_read(&active_events) == 0)
                        err = mipspmu_get_irq();
@@ -638,11 +633,7 @@ static int mipspmu_event_init(struct perf_event *event)
        if (err)
                return err;
 
-       err = __hw_perf_event_init(event);
-       if (err)
-               hw_perf_event_destroy(event);
-
-       return err;
+       return __hw_perf_event_init(event);
 }
 
 static struct pmu pmu = {
@@ -712,18 +703,6 @@ static const struct mips_perf_event *mipspmu_map_cache_event(u64 config)
 
 }
 
-static int validate_event(struct cpu_hw_events *cpuc,
-              struct perf_event *event)
-{
-       struct hw_perf_event fake_hwc = event->hw;
-
-       /* Allow mixed event group. So return 1 to pass validation. */
-       if (event->pmu != &pmu || event->state <= PERF_EVENT_STATE_OFF)
-               return 1;
-
-       return mipsxx_pmu_alloc_counter(cpuc, &fake_hwc) >= 0;
-}
-
 static int validate_group(struct perf_event *event)
 {
        struct perf_event *sibling, *leader = event->group_leader;
@@ -731,15 +710,15 @@ static int validate_group(struct perf_event *event)
 
        memset(&fake_cpuc, 0, sizeof(fake_cpuc));
 
-       if (!validate_event(&fake_cpuc, leader))
+       if (mipsxx_pmu_alloc_counter(&fake_cpuc, &leader->hw) < 0)
                return -ENOSPC;
 
        list_for_each_entry(sibling, &leader->sibling_list, group_entry) {
-               if (!validate_event(&fake_cpuc, sibling))
+               if (mipsxx_pmu_alloc_counter(&fake_cpuc, &sibling->hw) < 0)
                        return -ENOSPC;
        }
 
-       if (!validate_event(&fake_cpuc, event))
+       if (mipsxx_pmu_alloc_counter(&fake_cpuc, &event->hw) < 0)
                return -ENOSPC;
 
        return 0;
@@ -1279,13 +1258,14 @@ static int __hw_perf_event_init(struct perf_event *event)
        }
 
        err = 0;
-       if (event->group_leader != event) {
+       if (event->group_leader != event)
                err = validate_group(event);
-               if (err)
-                       return -EINVAL;
-       }
 
        event->destroy = hw_perf_event_destroy;
+
+       if (err)
+               event->destroy(event);
+
        return err;
 }
 
@@ -1380,20 +1360,10 @@ static irqreturn_t mipsxx_pmu_handle_irq(int irq, void *dev)
 }
 
 /* 24K */
-#define IS_UNSUPPORTED_24K_EVENT(r, b)                                 \
-       ((b) == 12 || (r) == 151 || (r) == 152 || (b) == 26 ||          \
-        (b) == 27 || (r) == 28 || (r) == 158 || (b) == 31 ||           \
-        (b) == 32 || (b) == 34 || (b) == 36 || (r) == 168 ||           \
-        (r) == 172 || (b) == 47 || ((b) >= 56 && (b) <= 63) ||         \
-        ((b) >= 68 && (b) <= 127))
 #define IS_BOTH_COUNTERS_24K_EVENT(b)                                  \
        ((b) == 0 || (b) == 1 || (b) == 11)
 
 /* 34K */
-#define IS_UNSUPPORTED_34K_EVENT(r, b)                                 \
-       ((b) == 12 || (r) == 27 || (r) == 158 || (b) == 36 ||           \
-        (b) == 38 || (r) == 175 || ((b) >= 56 && (b) <= 63) ||         \
-        ((b) >= 68 && (b) <= 127))
 #define IS_BOTH_COUNTERS_34K_EVENT(b)                                  \
        ((b) == 0 || (b) == 1 || (b) == 11)
 #ifdef CONFIG_MIPS_MT_SMP
@@ -1406,20 +1376,10 @@ static irqreturn_t mipsxx_pmu_handle_irq(int irq, void *dev)
 #endif
 
 /* 74K */
-#define IS_UNSUPPORTED_74K_EVENT(r, b)                                 \
-       ((r) == 5 || ((r) >= 135 && (r) <= 137) ||                      \
-        ((b) >= 10 && (b) <= 12) || (b) == 22 || (b) == 27 ||          \
-        (b) == 33 || (b) == 34 || ((b) >= 47 && (b) <= 49) ||          \
-        (r) == 178 || (b) == 55 || (b) == 57 || (b) == 60 ||           \
-        (b) == 61 || (r) == 62 || (r) == 191 ||                        \
-        ((b) >= 64 && (b) <= 127))
 #define IS_BOTH_COUNTERS_74K_EVENT(b)                                  \
        ((b) == 0 || (b) == 1)
 
 /* 1004K */
-#define IS_UNSUPPORTED_1004K_EVENT(r, b)                               \
-       ((b) == 12 || (r) == 27 || (r) == 158 || (b) == 38 ||           \
-        (r) == 175 || (b) == 63 || ((b) >= 68 && (b) <= 127))
 #define IS_BOTH_COUNTERS_1004K_EVENT(b)                                        \
        ((b) == 0 || (b) == 1 || (b) == 11)
 #ifdef CONFIG_MIPS_MT_SMP
@@ -1445,11 +1405,10 @@ static const struct mips_perf_event *mipsxx_pmu_map_raw_event(u64 config)
        unsigned int raw_id = config & 0xff;
        unsigned int base_id = raw_id & 0x7f;
 
+       raw_event.event_id = base_id;
+
        switch (current_cpu_type()) {
        case CPU_24K:
-               if (IS_UNSUPPORTED_24K_EVENT(raw_id, base_id))
-                       return ERR_PTR(-EOPNOTSUPP);
-               raw_event.event_id = base_id;
                if (IS_BOTH_COUNTERS_24K_EVENT(base_id))
                        raw_event.cntr_mask = CNTR_EVEN | CNTR_ODD;
                else
@@ -1464,9 +1423,6 @@ static const struct mips_perf_event *mipsxx_pmu_map_raw_event(u64 config)
 #endif
                break;
        case CPU_34K:
-               if (IS_UNSUPPORTED_34K_EVENT(raw_id, base_id))
-                       return ERR_PTR(-EOPNOTSUPP);
-               raw_event.event_id = base_id;
                if (IS_BOTH_COUNTERS_34K_EVENT(base_id))
                        raw_event.cntr_mask = CNTR_EVEN | CNTR_ODD;
                else
@@ -1482,9 +1438,6 @@ static const struct mips_perf_event *mipsxx_pmu_map_raw_event(u64 config)
 #endif
                break;
        case CPU_74K:
-               if (IS_UNSUPPORTED_74K_EVENT(raw_id, base_id))
-                       return ERR_PTR(-EOPNOTSUPP);
-               raw_event.event_id = base_id;
                if (IS_BOTH_COUNTERS_74K_EVENT(base_id))
                        raw_event.cntr_mask = CNTR_EVEN | CNTR_ODD;
                else
@@ -1495,9 +1448,6 @@ static const struct mips_perf_event *mipsxx_pmu_map_raw_event(u64 config)
 #endif
                break;
        case CPU_1004K:
-               if (IS_UNSUPPORTED_1004K_EVENT(raw_id, base_id))
-                       return ERR_PTR(-EOPNOTSUPP);
-               raw_event.event_id = base_id;
                if (IS_BOTH_COUNTERS_1004K_EVENT(base_id))
                        raw_event.cntr_mask = CNTR_EVEN | CNTR_ODD;
                else
diff --git a/arch/mips/kernel/smp-bmips.c b/arch/mips/kernel/smp-bmips.c
new file mode 100644 (file)
index 0000000..58fe71a
--- /dev/null
@@ -0,0 +1,458 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2011 by Kevin Cernekee (cernekee@gmail.com)
+ *
+ * SMP support for BMIPS
+ */
+
+#include <linux/version.h>
+#include <linux/init.h>
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <linux/delay.h>
+#include <linux/smp.h>
+#include <linux/interrupt.h>
+#include <linux/spinlock.h>
+#include <linux/init.h>
+#include <linux/cpu.h>
+#include <linux/cpumask.h>
+#include <linux/reboot.h>
+#include <linux/io.h>
+#include <linux/compiler.h>
+#include <linux/linkage.h>
+#include <linux/bug.h>
+#include <linux/kernel.h>
+
+#include <asm/time.h>
+#include <asm/pgtable.h>
+#include <asm/processor.h>
+#include <asm/system.h>
+#include <asm/bootinfo.h>
+#include <asm/pmon.h>
+#include <asm/cacheflush.h>
+#include <asm/tlbflush.h>
+#include <asm/mipsregs.h>
+#include <asm/bmips.h>
+#include <asm/traps.h>
+#include <asm/barrier.h>
+
+static int __maybe_unused max_cpus = 1;
+
+/* these may be configured by the platform code */
+int bmips_smp_enabled = 1;
+int bmips_cpu_offset;
+cpumask_t bmips_booted_mask;
+
+#ifdef CONFIG_SMP
+
+/* initial $sp, $gp - used by arch/mips/kernel/bmips_vec.S */
+unsigned long bmips_smp_boot_sp;
+unsigned long bmips_smp_boot_gp;
+
+static void bmips_send_ipi_single(int cpu, unsigned int action);
+static irqreturn_t bmips_ipi_interrupt(int irq, void *dev_id);
+
+/* SW interrupts 0,1 are used for interprocessor signaling */
+#define IPI0_IRQ                       (MIPS_CPU_IRQ_BASE + 0)
+#define IPI1_IRQ                       (MIPS_CPU_IRQ_BASE + 1)
+
+#define CPUNUM(cpu, shift)             (((cpu) + bmips_cpu_offset) << (shift))
+#define ACTION_CLR_IPI(cpu, ipi)       (0x2000 | CPUNUM(cpu, 9) | ((ipi) << 8))
+#define ACTION_SET_IPI(cpu, ipi)       (0x3000 | CPUNUM(cpu, 9) | ((ipi) << 8))
+#define ACTION_BOOT_THREAD(cpu)                (0x08 | CPUNUM(cpu, 0))
+
+static void __init bmips_smp_setup(void)
+{
+       int i;
+
+#if defined(CONFIG_CPU_BMIPS4350) || defined(CONFIG_CPU_BMIPS4380)
+       /* arbitration priority */
+       clear_c0_brcm_cmt_ctrl(0x30);
+
+       /* NBK and weak order flags */
+       set_c0_brcm_config_0(0x30000);
+
+       /*
+        * MIPS interrupts 0,1 (SW INT 0,1) cross over to the other thread
+        * MIPS interrupt 2 (HW INT 0) is the CPU0 L1 controller output
+        * MIPS interrupt 3 (HW INT 1) is the CPU1 L1 controller output
+        */
+       change_c0_brcm_cmt_intr(0xf8018000,
+               (0x02 << 27) | (0x03 << 15));
+
+       /* single core, 2 threads (2 pipelines) */
+       max_cpus = 2;
+#elif defined(CONFIG_CPU_BMIPS5000)
+       /* enable raceless SW interrupts */
+       set_c0_brcm_config(0x03 << 22);
+
+       /* route HW interrupt 0 to CPU0, HW interrupt 1 to CPU1 */
+       change_c0_brcm_mode(0x1f << 27, 0x02 << 27);
+
+       /* N cores, 2 threads per core */
+       max_cpus = (((read_c0_brcm_config() >> 6) & 0x03) + 1) << 1;
+
+       /* clear any pending SW interrupts */
+       for (i = 0; i < max_cpus; i++) {
+               write_c0_brcm_action(ACTION_CLR_IPI(i, 0));
+               write_c0_brcm_action(ACTION_CLR_IPI(i, 1));
+       }
+#endif
+
+       if (!bmips_smp_enabled)
+               max_cpus = 1;
+
+       /* this can be overridden by the BSP */
+       if (!board_ebase_setup)
+               board_ebase_setup = &bmips_ebase_setup;
+
+       for (i = 0; i < max_cpus; i++) {
+               __cpu_number_map[i] = 1;
+               __cpu_logical_map[i] = 1;
+               set_cpu_possible(i, 1);
+               set_cpu_present(i, 1);
+       }
+}
+
+/*
+ * IPI IRQ setup - runs on CPU0
+ */
+static void bmips_prepare_cpus(unsigned int max_cpus)
+{
+       if (request_irq(IPI0_IRQ, bmips_ipi_interrupt, IRQF_PERCPU,
+                       "smp_ipi0", NULL))
+               panic("Can't request IPI0 interrupt\n");
+       if (request_irq(IPI1_IRQ, bmips_ipi_interrupt, IRQF_PERCPU,
+                       "smp_ipi1", NULL))
+               panic("Can't request IPI1 interrupt\n");
+}
+
+/*
+ * Tell the hardware to boot CPUx - runs on CPU0
+ */
+static void bmips_boot_secondary(int cpu, struct task_struct *idle)
+{
+       bmips_smp_boot_sp = __KSTK_TOS(idle);
+       bmips_smp_boot_gp = (unsigned long)task_thread_info(idle);
+       mb();
+
+       /*
+        * Initial boot sequence for secondary CPU:
+        *   bmips_reset_nmi_vec @ a000_0000 ->
+        *   bmips_smp_entry ->
+        *   plat_wired_tlb_setup (cached function call; optional) ->
+        *   start_secondary (cached jump)
+        *
+        * Warm restart sequence:
+        *   play_dead WAIT loop ->
+        *   bmips_smp_int_vec @ BMIPS_WARM_RESTART_VEC ->
+        *   eret to play_dead ->
+        *   bmips_secondary_reentry ->
+        *   start_secondary
+        */
+
+       pr_info("SMP: Booting CPU%d...\n", cpu);
+
+       if (cpumask_test_cpu(cpu, &bmips_booted_mask))
+               bmips_send_ipi_single(cpu, 0);
+       else {
+#if defined(CONFIG_CPU_BMIPS4350) || defined(CONFIG_CPU_BMIPS4380)
+               set_c0_brcm_cmt_ctrl(0x01);
+#elif defined(CONFIG_CPU_BMIPS5000)
+               if (cpu & 0x01)
+                       write_c0_brcm_action(ACTION_BOOT_THREAD(cpu));
+               else {
+                       /*
+                        * core N thread 0 was already booted; just
+                        * pulse the NMI line
+                        */
+                       bmips_write_zscm_reg(0x210, 0xc0000000);
+                       udelay(10);
+                       bmips_write_zscm_reg(0x210, 0x00);
+               }
+#endif
+               cpumask_set_cpu(cpu, &bmips_booted_mask);
+       }
+}
+
+/*
+ * Early setup - runs on secondary CPU after cache probe
+ */
+static void bmips_init_secondary(void)
+{
+       /* move NMI vector to kseg0, in case XKS01 is enabled */
+
+#if defined(CONFIG_CPU_BMIPS4350) || defined(CONFIG_CPU_BMIPS4380)
+       void __iomem *cbr = BMIPS_GET_CBR();
+       unsigned long old_vec;
+
+       old_vec = __raw_readl(cbr + BMIPS_RELO_VECTOR_CONTROL_1);
+       __raw_writel(old_vec & ~0x20000000, cbr + BMIPS_RELO_VECTOR_CONTROL_1);
+
+       clear_c0_cause(smp_processor_id() ? C_SW1 : C_SW0);
+#elif defined(CONFIG_CPU_BMIPS5000)
+       write_c0_brcm_bootvec(read_c0_brcm_bootvec() &
+               (smp_processor_id() & 0x01 ? ~0x20000000 : ~0x2000));
+
+       write_c0_brcm_action(ACTION_CLR_IPI(smp_processor_id(), 0));
+#endif
+
+       /* make sure there won't be a timer interrupt for a little while */
+       write_c0_compare(read_c0_count() + mips_hpt_frequency / HZ);
+
+       irq_enable_hazard();
+       set_c0_status(IE_SW0 | IE_SW1 | IE_IRQ1 | IE_IRQ5 | ST0_IE);
+       irq_enable_hazard();
+}
+
+/*
+ * Late setup - runs on secondary CPU before entering the idle loop
+ */
+static void bmips_smp_finish(void)
+{
+       pr_info("SMP: CPU%d is running\n", smp_processor_id());
+}
+
+/*
+ * Runs on CPU0 after all CPUs have been booted
+ */
+static void bmips_cpus_done(void)
+{
+}
+
+#if defined(CONFIG_CPU_BMIPS5000)
+
+/*
+ * BMIPS5000 raceless IPIs
+ *
+ * Each CPU has two inbound SW IRQs which are independent of all other CPUs.
+ * IPI0 is used for SMP_RESCHEDULE_YOURSELF
+ * IPI1 is used for SMP_CALL_FUNCTION
+ */
+
+static void bmips_send_ipi_single(int cpu, unsigned int action)
+{
+       write_c0_brcm_action(ACTION_SET_IPI(cpu, action == SMP_CALL_FUNCTION));
+}
+
+static irqreturn_t bmips_ipi_interrupt(int irq, void *dev_id)
+{
+       int action = irq - IPI0_IRQ;
+
+       write_c0_brcm_action(ACTION_CLR_IPI(smp_processor_id(), action));
+
+       if (action == 0)
+               scheduler_ipi();
+       else
+               smp_call_function_interrupt();
+
+       return IRQ_HANDLED;
+}
+
+#else
+
+/*
+ * BMIPS43xx racey IPIs
+ *
+ * We use one inbound SW IRQ for each CPU.
+ *
+ * A spinlock must be held in order to keep CPUx from accidentally clearing
+ * an incoming IPI when it writes CP0 CAUSE to raise an IPI on CPUy.  The
+ * same spinlock is used to protect the action masks.
+ */
+
+static DEFINE_SPINLOCK(ipi_lock);
+static DEFINE_PER_CPU(int, ipi_action_mask);
+
+static void bmips_send_ipi_single(int cpu, unsigned int action)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&ipi_lock, flags);
+       set_c0_cause(cpu ? C_SW1 : C_SW0);
+       per_cpu(ipi_action_mask, cpu) |= action;
+       irq_enable_hazard();
+       spin_unlock_irqrestore(&ipi_lock, flags);
+}
+
+static irqreturn_t bmips_ipi_interrupt(int irq, void *dev_id)
+{
+       unsigned long flags;
+       int action, cpu = irq - IPI0_IRQ;
+
+       spin_lock_irqsave(&ipi_lock, flags);
+       action = __get_cpu_var(ipi_action_mask);
+       per_cpu(ipi_action_mask, cpu) = 0;
+       clear_c0_cause(cpu ? C_SW1 : C_SW0);
+       spin_unlock_irqrestore(&ipi_lock, flags);
+
+       if (action & SMP_RESCHEDULE_YOURSELF)
+               scheduler_ipi();
+       if (action & SMP_CALL_FUNCTION)
+               smp_call_function_interrupt();
+
+       return IRQ_HANDLED;
+}
+
+#endif /* BMIPS type */
+
+static void bmips_send_ipi_mask(const struct cpumask *mask,
+       unsigned int action)
+{
+       unsigned int i;
+
+       for_each_cpu(i, mask)
+               bmips_send_ipi_single(i, action);
+}
+
+#ifdef CONFIG_HOTPLUG_CPU
+
+static int bmips_cpu_disable(void)
+{
+       unsigned int cpu = smp_processor_id();
+
+       if (cpu == 0)
+               return -EBUSY;
+
+       pr_info("SMP: CPU%d is offline\n", cpu);
+
+       cpu_clear(cpu, cpu_online_map);
+       cpu_clear(cpu, cpu_callin_map);
+
+       local_flush_tlb_all();
+       local_flush_icache_range(0, ~0);
+
+       return 0;
+}
+
+static void bmips_cpu_die(unsigned int cpu)
+{
+}
+
+void __ref play_dead(void)
+{
+       idle_task_exit();
+
+       /* flush data cache */
+       _dma_cache_wback_inv(0, ~0);
+
+       /*
+        * Wakeup is on SW0 or SW1; disable everything else
+        * Use BEV !IV (BMIPS_WARM_RESTART_VEC) to avoid the regular Linux
+        * IRQ handlers; this clears ST0_IE and returns immediately.
+        */
+       clear_c0_cause(CAUSEF_IV | C_SW0 | C_SW1);
+       change_c0_status(IE_IRQ5 | IE_IRQ1 | IE_SW0 | IE_SW1 | ST0_IE | ST0_BEV,
+               IE_SW0 | IE_SW1 | ST0_IE | ST0_BEV);
+       irq_disable_hazard();
+
+       /*
+        * wait for SW interrupt from bmips_boot_secondary(), then jump
+        * back to start_secondary()
+        */
+       __asm__ __volatile__(
+       "       wait\n"
+       "       j       bmips_secondary_reentry\n"
+       : : : "memory");
+}
+
+#endif /* CONFIG_HOTPLUG_CPU */
+
+struct plat_smp_ops bmips_smp_ops = {
+       .smp_setup              = bmips_smp_setup,
+       .prepare_cpus           = bmips_prepare_cpus,
+       .boot_secondary         = bmips_boot_secondary,
+       .smp_finish             = bmips_smp_finish,
+       .init_secondary         = bmips_init_secondary,
+       .cpus_done              = bmips_cpus_done,
+       .send_ipi_single        = bmips_send_ipi_single,
+       .send_ipi_mask          = bmips_send_ipi_mask,
+#ifdef CONFIG_HOTPLUG_CPU
+       .cpu_disable            = bmips_cpu_disable,
+       .cpu_die                = bmips_cpu_die,
+#endif
+};
+
+#endif /* CONFIG_SMP */
+
+/***********************************************************************
+ * BMIPS vector relocation
+ * This is primarily used for SMP boot, but it is applicable to some
+ * UP BMIPS systems as well.
+ ***********************************************************************/
+
+static void __cpuinit bmips_wr_vec(unsigned long dst, char *start, char *end)
+{
+       memcpy((void *)dst, start, end - start);
+       dma_cache_wback((unsigned long)start, end - start);
+       local_flush_icache_range(dst, dst + (end - start));
+       instruction_hazard();
+}
+
+static inline void __cpuinit bmips_nmi_handler_setup(void)
+{
+       bmips_wr_vec(BMIPS_NMI_RESET_VEC, &bmips_reset_nmi_vec,
+               &bmips_reset_nmi_vec_end);
+       bmips_wr_vec(BMIPS_WARM_RESTART_VEC, &bmips_smp_int_vec,
+               &bmips_smp_int_vec_end);
+}
+
+void __cpuinit bmips_ebase_setup(void)
+{
+       unsigned long new_ebase = ebase;
+       void __iomem __maybe_unused *cbr;
+
+       BUG_ON(ebase != CKSEG0);
+
+#if defined(CONFIG_CPU_BMIPS4350)
+       /*
+        * BMIPS4350 cannot relocate the normal vectors, but it
+        * can relocate the BEV=1 vectors.  So CPU1 starts up at
+        * the relocated BEV=1, IV=0 general exception vector @
+        * 0xa000_0380.
+        *
+        * set_uncached_handler() is used here because:
+        *  - CPU1 will run this from uncached space
+        *  - None of the cacheflush functions are set up yet
+        */
+       set_uncached_handler(BMIPS_WARM_RESTART_VEC - CKSEG0,
+               &bmips_smp_int_vec, 0x80);
+       __sync();
+       return;
+#elif defined(CONFIG_CPU_BMIPS4380)
+       /*
+        * 0x8000_0000: reset/NMI (initially in kseg1)
+        * 0x8000_0400: normal vectors
+        */
+       new_ebase = 0x80000400;
+       cbr = BMIPS_GET_CBR();
+       __raw_writel(0x80080800, cbr + BMIPS_RELO_VECTOR_CONTROL_0);
+       __raw_writel(0xa0080800, cbr + BMIPS_RELO_VECTOR_CONTROL_1);
+#elif defined(CONFIG_CPU_BMIPS5000)
+       /*
+        * 0x8000_0000: reset/NMI (initially in kseg1)
+        * 0x8000_1000: normal vectors
+        */
+       new_ebase = 0x80001000;
+       write_c0_brcm_bootvec(0xa0088008);
+       write_c0_ebase(new_ebase);
+       if (max_cpus > 2)
+               bmips_write_zscm_reg(0xa0, 0xa008a008);
+#else
+       return;
+#endif
+       board_nmi_handler_setup = &bmips_nmi_handler_setup;
+       ebase = new_ebase;
+}
+
+asmlinkage void __weak plat_wired_tlb_setup(void)
+{
+       /*
+        * Called when starting/restarting a secondary CPU.
+        * Kernel stacks and other important data might only be accessible
+        * once the wired entries are present.
+        */
+}
index 17c9412b5f4274e255e3da951b27a95b2db9e9ca..0a42ff3ff6a111992da86c13d726501b68b6d9da 100644 (file)
@@ -559,7 +559,7 @@ void smtc_prepare_cpus(int cpus)
 
        pipi = kmalloc(nipi *sizeof(struct smtc_ipi), GFP_KERNEL);
        if (pipi == NULL)
-               panic("kmalloc of IPI message buffers failed\n");
+               panic("kmalloc of IPI message buffers failed");
        else
                printk("IPI buffer pool of %d buffers\n", nipi);
        for (i = 0; i < nipi; i++) {
@@ -813,7 +813,7 @@ void smtc_send_ipi(int cpu, int type, unsigned int action)
        if (pipi == NULL) {
                bust_spinlocks(1);
                mips_mt_regdump(dvpe());
-               panic("IPI Msg. Buffers Depleted\n");
+               panic("IPI Msg. Buffers Depleted");
        }
        pipi->type = type;
        pipi->arg = (void *)action;
index 5c8a49d55054dffce696066bad88d1863c5e7f35..48240fd8c29716f1ad3581b46788b3ae762dd15d 100644 (file)
@@ -91,6 +91,7 @@ int (*board_be_handler)(struct pt_regs *regs, int is_fixup);
 void (*board_nmi_handler_setup)(void);
 void (*board_ejtag_handler_setup)(void);
 void (*board_bind_eic_interrupt)(int irq, int regset);
+void (*board_ebase_setup)(void);
 
 
 static void show_raw_backtrace(unsigned long reg29)
@@ -400,7 +401,7 @@ void __noreturn die(const char *str, struct pt_regs *regs)
                panic("Fatal exception in interrupt");
 
        if (panic_on_oops) {
-               printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n");
+               printk(KERN_EMERG "Fatal exception: panic in 5 seconds");
                ssleep(5);
                panic("Fatal exception");
        }
@@ -1150,7 +1151,7 @@ asmlinkage void do_mt(struct pt_regs *regs)
 asmlinkage void do_dsp(struct pt_regs *regs)
 {
        if (cpu_has_dsp)
-               panic("Unexpected DSP exception\n");
+               panic("Unexpected DSP exception");
 
        force_sig(SIGILL, current);
 }
@@ -1339,9 +1340,18 @@ void ejtag_exception_handler(struct pt_regs *regs)
 
 /*
  * NMI exception handler.
+ * No lock; only written during early bootup by CPU 0.
  */
+static RAW_NOTIFIER_HEAD(nmi_chain);
+
+int register_nmi_notifier(struct notifier_block *nb)
+{
+       return raw_notifier_chain_register(&nmi_chain, nb);
+}
+
 NORET_TYPE void ATTRIB_NORET nmi_exception_handler(struct pt_regs *regs)
 {
+       raw_notifier_call_chain(&nmi_chain, 0, regs);
        bust_spinlocks(1);
        printk("NMI taken!!!!\n");
        die("NMI", regs);
@@ -1682,6 +1692,8 @@ void __init trap_init(void)
                        ebase += (read_c0_ebase() & 0x3ffff000);
        }
 
+       if (board_ebase_setup)
+               board_ebase_setup();
        per_cpu_trap_init();
 
        /*
index 77ed70fc2fe5953cd9bf31aa2514820b41e2bbd6..412814fdd3ee239ce5f7cfc6e6c7f6ead93ed9fa 100644 (file)
@@ -134,11 +134,11 @@ void __init plat_time_init(void)
        struct clk *clk;
 
        if (insert_resource(&iomem_resource, &ltq_cgu_resource) < 0)
-               panic("Failed to insert cgu memory\n");
+               panic("Failed to insert cgu memory");
 
        if (request_mem_region(ltq_cgu_resource.start,
                        resource_size(&ltq_cgu_resource), "cgu") < 0)
-               panic("Failed to request cgu memory\n");
+               panic("Failed to request cgu memory");
 
        ltq_cgu_membase = ioremap_nocache(ltq_cgu_resource.start,
                                resource_size(&ltq_cgu_resource));
index 3c56179b4ca2211db05b51e0fa43446abac7ef02..d673731c538a4d7c6328d00d8249b1290d51dd91 100644 (file)
@@ -248,28 +248,28 @@ void __init arch_init_irq(void)
        int i;
 
        if (insert_resource(&iomem_resource, &ltq_icu_resource) < 0)
-               panic("Failed to insert icu memory\n");
+               panic("Failed to insert icu memory");
 
        if (request_mem_region(ltq_icu_resource.start,
                        resource_size(&ltq_icu_resource), "icu") < 0)
-               panic("Failed to request icu memory\n");
+               panic("Failed to request icu memory");
 
        ltq_icu_membase = ioremap_nocache(ltq_icu_resource.start,
                                resource_size(&ltq_icu_resource));
        if (!ltq_icu_membase)
-               panic("Failed to remap icu memory\n");
+               panic("Failed to remap icu memory");
 
        if (insert_resource(&iomem_resource, &ltq_eiu_resource) < 0)
-               panic("Failed to insert eiu memory\n");
+               panic("Failed to insert eiu memory");
 
        if (request_mem_region(ltq_eiu_resource.start,
                        resource_size(&ltq_eiu_resource), "eiu") < 0)
-               panic("Failed to request eiu memory\n");
+               panic("Failed to request eiu memory");
 
        ltq_eiu_membase = ioremap_nocache(ltq_eiu_resource.start,
                                resource_size(&ltq_eiu_resource));
        if (!ltq_eiu_membase)
-               panic("Failed to remap eiu memory\n");
+               panic("Failed to remap eiu memory");
 
        /* make sure all irqs are turned off by default */
        for (i = 0; i < 5; i++)
index cbb6ae5747b97f81c67c8d77916bd10bad34e125..b210e936c7c3a84900eeeb0c1ba628b7479ba71a 100644 (file)
@@ -222,17 +222,17 @@ ltq_dma_init(void)
 
        /* insert and request the memory region */
        if (insert_resource(&iomem_resource, &ltq_dma_resource) < 0)
-               panic("Failed to insert dma memory\n");
+               panic("Failed to insert dma memory");
 
        if (request_mem_region(ltq_dma_resource.start,
                        resource_size(&ltq_dma_resource), "dma") < 0)
-               panic("Failed to request dma memory\n");
+               panic("Failed to request dma memory");
 
        /* remap dma register range */
        ltq_dma_membase = ioremap_nocache(ltq_dma_resource.start,
                                resource_size(&ltq_dma_resource));
        if (!ltq_dma_membase)
-               panic("Failed to remap dma memory\n");
+               panic("Failed to remap dma memory");
 
        /* power up and reset the dma engine */
        ltq_pmu_enable(PMU_DMA);
index 033b3184c7a70d180dbed8950c0d7e4e594317dd..862e3e830680be5642dabaf84519801b63c8ae94 100644 (file)
@@ -32,17 +32,17 @@ static int __init lantiq_ebu_init(void)
 {
        /* insert and request the memory region */
        if (insert_resource(&iomem_resource, &ltq_ebu_resource) < 0)
-               panic("Failed to insert ebu memory\n");
+               panic("Failed to insert ebu memory");
 
        if (request_mem_region(ltq_ebu_resource.start,
                        resource_size(&ltq_ebu_resource), "ebu") < 0)
-               panic("Failed to request ebu memory\n");
+               panic("Failed to request ebu memory");
 
        /* remap ebu register range */
        ltq_ebu_membase = ioremap_nocache(ltq_ebu_resource.start,
                                resource_size(&ltq_ebu_resource));
        if (!ltq_ebu_membase)
-               panic("Failed to remap ebu memory\n");
+               panic("Failed to remap ebu memory");
 
        /* make sure to unprotect the memory region where flash is located */
        ltq_ebu_w32(ltq_ebu_r32(LTQ_EBU_BUSCON0) & ~EBU_WRDIS, LTQ_EBU_BUSCON0);
index 39f0d2641cbfece73d507aa01b0d5e888e26b272..fe85361e032e1146887b9d7e183cc02819b3c1eb 100644 (file)
@@ -40,7 +40,7 @@ void ltq_pmu_enable(unsigned int module)
        do {} while (--err && (ltq_pmu_r32(LTQ_PMU_PWDSR) & module));
 
        if (!err)
-               panic("activating PMU module failed!\n");
+               panic("activating PMU module failed!");
 }
 EXPORT_SYMBOL(ltq_pmu_enable);
 
@@ -53,16 +53,16 @@ EXPORT_SYMBOL(ltq_pmu_disable);
 int __init ltq_pmu_init(void)
 {
        if (insert_resource(&iomem_resource, &ltq_pmu_resource) < 0)
-               panic("Failed to insert pmu memory\n");
+               panic("Failed to insert pmu memory");
 
        if (request_mem_region(ltq_pmu_resource.start,
                        resource_size(&ltq_pmu_resource), "pmu") < 0)
-               panic("Failed to request pmu memory\n");
+               panic("Failed to request pmu memory");
 
        ltq_pmu_membase = ioremap_nocache(ltq_pmu_resource.start,
                                resource_size(&ltq_pmu_resource));
        if (!ltq_pmu_membase)
-               panic("Failed to remap pmu memory\n");
+               panic("Failed to remap pmu memory");
        return 0;
 }
 
index 3d41f0bb5bf73f0d84108129a979642770e632f7..8b66bd87f0c1cbf4a698c47cf78721da799aee0f 100644 (file)
@@ -69,17 +69,17 @@ static int __init mips_reboot_setup(void)
 {
        /* insert and request the memory region */
        if (insert_resource(&iomem_resource, &ltq_rcu_resource) < 0)
-               panic("Failed to insert rcu memory\n");
+               panic("Failed to insert rcu memory");
 
        if (request_mem_region(ltq_rcu_resource.start,
                        resource_size(&ltq_rcu_resource), "rcu") < 0)
-               panic("Failed to request rcu memory\n");
+               panic("Failed to request rcu memory");
 
        /* remap rcu register range */
        ltq_rcu_membase = ioremap_nocache(ltq_rcu_resource.start,
                                resource_size(&ltq_rcu_resource));
        if (!ltq_rcu_membase)
-               panic("Failed to remap rcu memory\n");
+               panic("Failed to remap rcu memory");
 
        _machine_restart = ltq_machine_restart;
        _machine_halt = ltq_machine_halt;
index b2cad4fd5fc4a6720c3eae65384f1c94b62f7f8f..2a7c74fc15fcef917d183201d9f6eac9046fcbf7 100644 (file)
@@ -29,6 +29,7 @@ obj-$(CONFIG_CPU_TX49XX)      += dump_tlb.o
 obj-$(CONFIG_CPU_VR41XX)       += dump_tlb.o
 obj-$(CONFIG_CPU_CAVIUM_OCTEON)        += dump_tlb.o
 obj-$(CONFIG_CPU_XLR)          += dump_tlb.o
+obj-$(CONFIG_CPU_XLP)          += dump_tlb.o
 
 # libgcc-style stuff needed in the kernel
 obj-y += ashldi3.o ashrdi3.o cmpdi2.o lshrdi3.o ucmpdi2.o
index dbf2f93a50911b5914a295a82b3179c36562013f..a03bf00a1a9cf096226b0ce09a590450018ba62f 100644 (file)
@@ -245,7 +245,7 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
                 */
                emulpc = xcp->cp0_epc + 4;      /* Snapshot emulation target */
 
-               if (__compute_return_epc(xcp)) {
+               if (__compute_return_epc(xcp) < 0) {
 #ifdef CP1DBG
                        printk("failed to emulate branch at %p\n",
                                (void *) (xcp->cp0_epc));
index 3ca2a065cf76ae42eea447f43118a23cc94f55bf..4aa20280613ea3954db6e7925cc2fead924b0b78 100644 (file)
@@ -31,6 +31,7 @@ obj-$(CONFIG_CPU_TX49XX)      += c-r4k.o cex-gen.o tlb-r4k.o
 obj-$(CONFIG_CPU_VR41XX)       += c-r4k.o cex-gen.o tlb-r4k.o
 obj-$(CONFIG_CPU_CAVIUM_OCTEON)        += c-octeon.o cex-oct.o tlb-r4k.o
 obj-$(CONFIG_CPU_XLR)          += c-r4k.o tlb-r4k.o cex-gen.o
+obj-$(CONFIG_CPU_XLP)          += c-r4k.o tlb-r4k.o cex-gen.o
 
 obj-$(CONFIG_IP22_CPU_SCACHE)  += sc-ip22.o
 obj-$(CONFIG_R5000_CPU_SCACHE)  += sc-r5k.o
index daa81f7284ac89a5411b88d86f77ff6df1585f55..cf7895db0739023629992e82e425fbf74389eb95 100644 (file)
@@ -223,7 +223,7 @@ static void __cpuinit probe_octeon(void)
                break;
 
        default:
-               panic("Unsupported Cavium Networks CPU type\n");
+               panic("Unsupported Cavium Networks CPU type");
                break;
        }
 
index a79fe9aa7721aa56f05d8ab7995b6503cd98f618..4f9eb0b2303621419ee7482e12edbf9beb6059e2 100644 (file)
@@ -1235,6 +1235,9 @@ static void __cpuinit setup_scache(void)
                loongson2_sc_init();
                return;
 #endif
+       case CPU_XLP:
+               /* don't need to worry about L2, fully coherent */
+               return;
 
        default:
                if (c->isa_level == MIPS_CPU_ISA_M32R1 ||
index 87bb85d8d537064d7e3b14b8cc5f342c589a484f..ed1fa460f84ec06b3a0c19e0fd93fd717286f7e0 100644 (file)
@@ -20,6 +20,7 @@
 #include <asm/pgtable.h>
 #include <asm/mmu_context.h>
 #include <asm/system.h>
+#include <asm/tlbmisc.h>
 #include <asm/isadep.h>
 #include <asm/io.h>
 #include <asm/bootinfo.h>
index 74d67c8857433fcd6bf7091574af6ec34360193b..2dc625346c40f3b40f616310479b07c6695edd02 100644 (file)
@@ -19,6 +19,7 @@
 #include <asm/mmu_context.h>
 #include <asm/pgtable.h>
 #include <asm/system.h>
+#include <asm/tlbmisc.h>
 
 extern void build_tlb_refill_handler(void);
 
index a5ca743613f26149167c58a23e286cde17a960ab..75bec44b5856ee916a3c006af7744a0746242983 100644 (file)
@@ -1,5 +1,2 @@
 config NLM_COMMON
        bool
-
-config NLM_XLR
-       bool
diff --git a/arch/mips/netlogic/Makefile b/arch/mips/netlogic/Makefile
new file mode 100644 (file)
index 0000000..36d169b
--- /dev/null
@@ -0,0 +1,3 @@
+obj-$(CONFIG_NLM_COMMON)       +=      common/
+obj-$(CONFIG_CPU_XLR)          +=      xlr/
+obj-$(CONFIG_CPU_XLP)          +=      xlp/
index b648b487fd6674b2cdcedb1420e1d5759decba92..cdfc9abbbb7bc3905fbd0f8211ba74fa5d06f0dc 100644 (file)
@@ -1,16 +1,17 @@
 #
 # NETLOGIC includes
 #
-cflags-$(CONFIG_NLM_COMMON)  += -I$(srctree)/arch/mips/include/asm/mach-netlogic
-cflags-$(CONFIG_NLM_COMMON)  += -I$(srctree)/arch/mips/include/asm/netlogic
+cflags-$(CONFIG_NLM_COMMON)    += -I$(srctree)/arch/mips/include/asm/mach-netlogic
+cflags-$(CONFIG_NLM_COMMON)    += -I$(srctree)/arch/mips/include/asm/netlogic
 
 #
 # use mips64 if xlr is not available
 #
-cflags-$(CONFIG_NLM_XLR)       += $(call cc-option,-march=xlr,-march=mips64)
+cflags-$(CONFIG_CPU_XLR)       += $(call cc-option,-march=xlr,-march=mips64)
+cflags-$(CONFIG_CPU_XLP)       += $(call cc-option,-march=xlp,-march=mips64r2)
 
 #
-# NETLOGIC XLR/XLS SoC, Simulator and boards
+# NETLOGIC processor support
 #
-core-$(CONFIG_NLM_XLR)       += arch/mips/netlogic/xlr/
-load-$(CONFIG_NLM_XLR_BOARD)  += 0xffffffff84000000
+platform-$(CONFIG_NLM_COMMON)          += netlogic/
+load-$(CONFIG_NLM_COMMON)      += 0xffffffff80100000
diff --git a/arch/mips/netlogic/common/Makefile b/arch/mips/netlogic/common/Makefile
new file mode 100644 (file)
index 0000000..291372a
--- /dev/null
@@ -0,0 +1,3 @@
+obj-y                          += irq.o time.o
+obj-$(CONFIG_SMP)              += smp.o smpboot.o
+obj-$(CONFIG_EARLY_PRINTK)     += earlycons.o
diff --git a/arch/mips/netlogic/common/earlycons.c b/arch/mips/netlogic/common/earlycons.c
new file mode 100644 (file)
index 0000000..f193f7b
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
+ * reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the NetLogic
+ * license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <linux/types.h>
+#include <linux/serial_reg.h>
+
+#include <asm/mipsregs.h>
+#include <asm/netlogic/haldefs.h>
+
+#if defined(CONFIG_CPU_XLP)
+#include <asm/netlogic/xlp-hal/iomap.h>
+#include <asm/netlogic/xlp-hal/uart.h>
+#elif defined(CONFIG_CPU_XLR)
+#include <asm/netlogic/xlr/iomap.h>
+#endif
+
+void prom_putchar(char c)
+{
+       uint64_t uartbase;
+
+#if defined(CONFIG_CPU_XLP)
+       uartbase = nlm_get_uart_regbase(0, 0);
+#elif defined(CONFIG_CPU_XLR)
+       uartbase = nlm_mmio_base(NETLOGIC_IO_UART_0_OFFSET);
+#endif
+       while (nlm_read_reg(uartbase, UART_LSR) == 0)
+               ;
+       nlm_write_reg(uartbase, UART_TX, c);
+}
diff --git a/arch/mips/netlogic/common/irq.c b/arch/mips/netlogic/common/irq.c
new file mode 100644 (file)
index 0000000..49a4f6c
--- /dev/null
@@ -0,0 +1,238 @@
+/*
+ * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
+ * reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the NetLogic
+ * license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/linkage.h>
+#include <linux/interrupt.h>
+#include <linux/spinlock.h>
+#include <linux/mm.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+
+#include <asm/errno.h>
+#include <asm/signal.h>
+#include <asm/system.h>
+#include <asm/ptrace.h>
+#include <asm/mipsregs.h>
+#include <asm/thread_info.h>
+
+#include <asm/netlogic/mips-extns.h>
+#include <asm/netlogic/interrupt.h>
+#include <asm/netlogic/haldefs.h>
+#include <asm/netlogic/common.h>
+
+#if defined(CONFIG_CPU_XLP)
+#include <asm/netlogic/xlp-hal/iomap.h>
+#include <asm/netlogic/xlp-hal/xlp.h>
+#include <asm/netlogic/xlp-hal/pic.h>
+#elif defined(CONFIG_CPU_XLR)
+#include <asm/netlogic/xlr/iomap.h>
+#include <asm/netlogic/xlr/pic.h>
+#else
+#error "Unknown CPU"
+#endif
+/*
+ * These are the routines that handle all the low level interrupt stuff.
+ * Actions handled here are: initialization of the interrupt map, requesting of
+ * interrupt lines by handlers, dispatching if interrupts to handlers, probing
+ * for interrupt lines
+ */
+
+/* Globals */
+static uint64_t nlm_irq_mask;
+static DEFINE_SPINLOCK(nlm_pic_lock);
+
+static void xlp_pic_enable(struct irq_data *d)
+{
+       unsigned long flags;
+       int irt;
+
+       irt = nlm_irq_to_irt(d->irq);
+       if (irt == -1)
+               return;
+       spin_lock_irqsave(&nlm_pic_lock, flags);
+       nlm_pic_enable_irt(nlm_pic_base, irt);
+       spin_unlock_irqrestore(&nlm_pic_lock, flags);
+}
+
+static void xlp_pic_disable(struct irq_data *d)
+{
+       unsigned long flags;
+       int irt;
+
+       irt = nlm_irq_to_irt(d->irq);
+       if (irt == -1)
+               return;
+       spin_lock_irqsave(&nlm_pic_lock, flags);
+       nlm_pic_disable_irt(nlm_pic_base, irt);
+       spin_unlock_irqrestore(&nlm_pic_lock, flags);
+}
+
+static void xlp_pic_mask_ack(struct irq_data *d)
+{
+       uint64_t mask = 1ull << d->irq;
+
+       write_c0_eirr(mask);            /* ack by writing EIRR */
+}
+
+static void xlp_pic_unmask(struct irq_data *d)
+{
+       void *hd = irq_data_get_irq_handler_data(d);
+       int irt;
+
+       irt = nlm_irq_to_irt(d->irq);
+       if (irt == -1)
+               return;
+
+       if (hd) {
+               void (*extra_ack)(void *) = hd;
+               extra_ack(d);
+       }
+       /* Ack is a single write, no need to lock */
+       nlm_pic_ack(nlm_pic_base, irt);
+}
+
+static struct irq_chip xlp_pic = {
+       .name           = "XLP-PIC",
+       .irq_enable     = xlp_pic_enable,
+       .irq_disable    = xlp_pic_disable,
+       .irq_mask_ack   = xlp_pic_mask_ack,
+       .irq_unmask     = xlp_pic_unmask,
+};
+
+static void cpuintr_disable(struct irq_data *d)
+{
+       uint64_t eimr;
+       uint64_t mask = 1ull << d->irq;
+
+       eimr = read_c0_eimr();
+       write_c0_eimr(eimr & ~mask);
+}
+
+static void cpuintr_enable(struct irq_data *d)
+{
+       uint64_t eimr;
+       uint64_t mask = 1ull << d->irq;
+
+       eimr = read_c0_eimr();
+       write_c0_eimr(eimr | mask);
+}
+
+static void cpuintr_ack(struct irq_data *d)
+{
+       uint64_t mask = 1ull << d->irq;
+
+       write_c0_eirr(mask);
+}
+
+static void cpuintr_nop(struct irq_data *d)
+{
+       WARN(d->irq >= PIC_IRQ_BASE, "Bad irq %d", d->irq);
+}
+
+/*
+ * Chip definition for CPU originated interrupts(timer, msg) and
+ * IPIs
+ */
+struct irq_chip nlm_cpu_intr = {
+       .name           = "XLP-CPU-INTR",
+       .irq_enable     = cpuintr_enable,
+       .irq_disable    = cpuintr_disable,
+       .irq_mask       = cpuintr_nop,
+       .irq_ack        = cpuintr_nop,
+       .irq_eoi        = cpuintr_ack,
+};
+
+void __init init_nlm_common_irqs(void)
+{
+       int i, irq, irt;
+
+       for (i = 0; i < PIC_IRT_FIRST_IRQ; i++)
+               irq_set_chip_and_handler(i, &nlm_cpu_intr, handle_percpu_irq);
+
+       for (i = PIC_IRT_FIRST_IRQ; i <= PIC_IRT_LAST_IRQ ; i++)
+               irq_set_chip_and_handler(i, &xlp_pic, handle_level_irq);
+
+#ifdef CONFIG_SMP
+       irq_set_chip_and_handler(IRQ_IPI_SMP_FUNCTION, &nlm_cpu_intr,
+                        nlm_smp_function_ipi_handler);
+       irq_set_chip_and_handler(IRQ_IPI_SMP_RESCHEDULE, &nlm_cpu_intr,
+                        nlm_smp_resched_ipi_handler);
+       nlm_irq_mask |=
+           ((1ULL << IRQ_IPI_SMP_FUNCTION) | (1ULL << IRQ_IPI_SMP_RESCHEDULE));
+#endif
+
+       for (irq = PIC_IRT_FIRST_IRQ; irq <= PIC_IRT_LAST_IRQ; irq++) {
+               irt = nlm_irq_to_irt(irq);
+               if (irt == -1)
+                       continue;
+               nlm_irq_mask |= (1ULL << irq);
+               nlm_pic_init_irt(nlm_pic_base, irt, irq, 0);
+       }
+
+       nlm_irq_mask |= (1ULL << IRQ_TIMER);
+}
+
+void __init arch_init_irq(void)
+{
+       /* Initialize the irq descriptors */
+       init_nlm_common_irqs();
+
+       write_c0_eimr(nlm_irq_mask);
+}
+
+void __cpuinit nlm_smp_irq_init(void)
+{
+       /* set interrupt mask for non-zero cpus */
+       write_c0_eimr(nlm_irq_mask);
+}
+
+asmlinkage void plat_irq_dispatch(void)
+{
+       uint64_t eirr;
+       int i;
+
+       eirr = read_c0_eirr() & read_c0_eimr();
+       if (eirr & (1 << IRQ_TIMER)) {
+               do_IRQ(IRQ_TIMER);
+               return;
+       }
+
+       i = __ilog2_u64(eirr);
+       if (i == -1)
+               return;
+
+       do_IRQ(i);
+}
diff --git a/arch/mips/netlogic/common/smp.c b/arch/mips/netlogic/common/smp.c
new file mode 100644 (file)
index 0000000..db17f49
--- /dev/null
@@ -0,0 +1,270 @@
+/*
+ * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
+ * reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the NetLogic
+ * license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/init.h>
+#include <linux/smp.h>
+#include <linux/irq.h>
+
+#include <asm/mmu_context.h>
+
+#include <asm/netlogic/interrupt.h>
+#include <asm/netlogic/mips-extns.h>
+#include <asm/netlogic/haldefs.h>
+#include <asm/netlogic/common.h>
+
+#if defined(CONFIG_CPU_XLP)
+#include <asm/netlogic/xlp-hal/iomap.h>
+#include <asm/netlogic/xlp-hal/xlp.h>
+#include <asm/netlogic/xlp-hal/pic.h>
+#elif defined(CONFIG_CPU_XLR)
+#include <asm/netlogic/xlr/iomap.h>
+#include <asm/netlogic/xlr/pic.h>
+#include <asm/netlogic/xlr/xlr.h>
+#else
+#error "Unknown CPU"
+#endif
+
+void nlm_send_ipi_single(int logical_cpu, unsigned int action)
+{
+       int cpu = cpu_logical_map(logical_cpu);
+
+       if (action & SMP_CALL_FUNCTION)
+               nlm_pic_send_ipi(nlm_pic_base, cpu, IRQ_IPI_SMP_FUNCTION, 0);
+       if (action & SMP_RESCHEDULE_YOURSELF)
+               nlm_pic_send_ipi(nlm_pic_base, cpu, IRQ_IPI_SMP_RESCHEDULE, 0);
+}
+
+void nlm_send_ipi_mask(const struct cpumask *mask, unsigned int action)
+{
+       int cpu;
+
+       for_each_cpu(cpu, mask) {
+               nlm_send_ipi_single(cpu, action);
+       }
+}
+
+/* IRQ_IPI_SMP_FUNCTION Handler */
+void nlm_smp_function_ipi_handler(unsigned int irq, struct irq_desc *desc)
+{
+       write_c0_eirr(1ull << irq);
+       smp_call_function_interrupt();
+}
+
+/* IRQ_IPI_SMP_RESCHEDULE  handler */
+void nlm_smp_resched_ipi_handler(unsigned int irq, struct irq_desc *desc)
+{
+       write_c0_eirr(1ull << irq);
+       scheduler_ipi();
+}
+
+/*
+ * Called before going into mips code, early cpu init
+ */
+void nlm_early_init_secondary(int cpu)
+{
+       change_c0_config(CONF_CM_CMASK, 0x3);
+       write_c0_ebase((uint32_t)nlm_common_ebase);
+#ifdef CONFIG_CPU_XLP
+       if (hard_smp_processor_id() % 4 == 0)
+               xlp_mmu_init();
+#endif
+}
+
+/*
+ * Code to run on secondary just after probing the CPU
+ */
+static void __cpuinit nlm_init_secondary(void)
+{
+       current_cpu_data.core = hard_smp_processor_id() / 4;
+       nlm_smp_irq_init();
+}
+
+void nlm_prepare_cpus(unsigned int max_cpus)
+{
+       /* declare we are SMT capable */
+       smp_num_siblings = nlm_threads_per_core;
+}
+
+void nlm_smp_finish(void)
+{
+#ifdef notyet
+       nlm_common_msgring_cpu_init();
+#endif
+       local_irq_enable();
+}
+
+void nlm_cpus_done(void)
+{
+}
+
+/*
+ * Boot all other cpus in the system, initialize them, and bring them into
+ * the boot function
+ */
+int nlm_cpu_ready[NR_CPUS];
+unsigned long nlm_next_gp;
+unsigned long nlm_next_sp;
+
+cpumask_t phys_cpu_present_map;
+
+void nlm_boot_secondary(int logical_cpu, struct task_struct *idle)
+{
+       unsigned long gp = (unsigned long)task_thread_info(idle);
+       unsigned long sp = (unsigned long)__KSTK_TOS(idle);
+       int cpu = cpu_logical_map(logical_cpu);
+
+       nlm_next_sp = sp;
+       nlm_next_gp = gp;
+
+       /* barrier */
+       __sync();
+       nlm_pic_send_ipi(nlm_pic_base, cpu, 1, 1);
+}
+
+void __init nlm_smp_setup(void)
+{
+       unsigned int boot_cpu;
+       int num_cpus, i;
+
+       boot_cpu = hard_smp_processor_id();
+       cpus_clear(phys_cpu_present_map);
+
+       cpu_set(boot_cpu, phys_cpu_present_map);
+       __cpu_number_map[boot_cpu] = 0;
+       __cpu_logical_map[0] = boot_cpu;
+       cpu_set(0, cpu_possible_map);
+
+       num_cpus = 1;
+       for (i = 0; i < NR_CPUS; i++) {
+               /*
+                * nlm_cpu_ready array is not set for the boot_cpu,
+                * it is only set for ASPs (see smpboot.S)
+                */
+               if (nlm_cpu_ready[i]) {
+                       cpu_set(i, phys_cpu_present_map);
+                       __cpu_number_map[i] = num_cpus;
+                       __cpu_logical_map[num_cpus] = i;
+                       cpu_set(num_cpus, cpu_possible_map);
+                       ++num_cpus;
+               }
+       }
+
+       pr_info("Phys CPU present map: %lx, possible map %lx\n",
+               (unsigned long)phys_cpu_present_map.bits[0],
+               (unsigned long)cpu_possible_map.bits[0]);
+
+       pr_info("Detected %i Slave CPU(s)\n", num_cpus);
+       nlm_set_nmi_handler(nlm_boot_secondary_cpus);
+}
+
+static int nlm_parse_cpumask(u32 cpu_mask)
+{
+       uint32_t core0_thr_mask, core_thr_mask;
+       int threadmode, i;
+
+       core0_thr_mask = cpu_mask & 0xf;
+       switch (core0_thr_mask) {
+       case 1:
+               nlm_threads_per_core = 1;
+               threadmode = 0;
+               break;
+       case 3:
+               nlm_threads_per_core = 2;
+               threadmode = 2;
+               break;
+       case 0xf:
+               nlm_threads_per_core = 4;
+               threadmode = 3;
+               break;
+       default:
+               goto unsupp;
+       }
+
+       /* Verify other cores CPU masks */
+       nlm_coremask = 1;
+       nlm_cpumask = core0_thr_mask;
+       for (i = 1; i < 8; i++) {
+               core_thr_mask = (cpu_mask >> (i * 4)) & 0xf;
+               if (core_thr_mask) {
+                       if (core_thr_mask != core0_thr_mask)
+                               goto unsupp;
+                       nlm_coremask |= 1 << i;
+                       nlm_cpumask |= core0_thr_mask << (4 * i);
+               }
+       }
+       return threadmode;
+
+unsupp:
+       panic("Unsupported CPU mask %x\n", cpu_mask);
+       return 0;
+}
+
+int __cpuinit nlm_wakeup_secondary_cpus(u32 wakeup_mask)
+{
+       unsigned long reset_vec;
+       char *reset_data;
+       int threadmode;
+
+       /* Update reset entry point with CPU init code */
+       reset_vec = CKSEG1ADDR(RESET_VEC_PHYS);
+       memcpy((void *)reset_vec, (void *)nlm_reset_entry,
+                       (nlm_reset_entry_end - nlm_reset_entry));
+
+       /* verify the mask and setup core config variables */
+       threadmode = nlm_parse_cpumask(wakeup_mask);
+
+       /* Setup CPU init parameters */
+       reset_data = (char *)CKSEG1ADDR(RESET_DATA_PHYS);
+       *(int *)(reset_data + BOOT_THREAD_MODE) = threadmode;
+
+#ifdef CONFIG_CPU_XLP
+       xlp_wakeup_secondary_cpus();
+#else
+       xlr_wakeup_secondary_cpus();
+#endif
+       return 0;
+}
+
+struct plat_smp_ops nlm_smp_ops = {
+       .send_ipi_single        = nlm_send_ipi_single,
+       .send_ipi_mask          = nlm_send_ipi_mask,
+       .init_secondary         = nlm_init_secondary,
+       .smp_finish             = nlm_smp_finish,
+       .cpus_done              = nlm_cpus_done,
+       .boot_secondary         = nlm_boot_secondary,
+       .smp_setup              = nlm_smp_setup,
+       .prepare_cpus           = nlm_prepare_cpus,
+};
diff --git a/arch/mips/netlogic/common/smpboot.S b/arch/mips/netlogic/common/smpboot.S
new file mode 100644 (file)
index 0000000..c138b1a
--- /dev/null
@@ -0,0 +1,272 @@
+/*
+ * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
+ * reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the NetLogic
+ * license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <linux/init.h>
+
+#include <asm/asm.h>
+#include <asm/asm-offsets.h>
+#include <asm/regdef.h>
+#include <asm/mipsregs.h>
+#include <asm/stackframe.h>
+#include <asm/asmmacro.h>
+#include <asm/addrspace.h>
+
+#include <asm/netlogic/common.h>
+
+#include <asm/netlogic/xlp-hal/iomap.h>
+#include <asm/netlogic/xlp-hal/xlp.h>
+#include <asm/netlogic/xlp-hal/sys.h>
+#include <asm/netlogic/xlp-hal/cpucontrol.h>
+
+#define        CP0_EBASE       $15
+#define SYS_CPU_COHERENT_BASE(node)    CKSEG1ADDR(XLP_DEFAULT_IO_BASE) + \
+                       XLP_IO_SYS_OFFSET(node) + XLP_IO_PCI_HDRSZ + \
+                       SYS_CPU_NONCOHERENT_MODE * 4
+
+.macro __config_lsu
+       li      t0, LSU_DEFEATURE
+       mfcr    t1, t0
+
+       lui     t2, 0x4080  /* Enable Unaligned Access, L2HPE */
+       or      t1, t1, t2
+       li      t2, ~0xe    /* S1RCM */
+       and     t1, t1, t2
+       mtcr    t1, t0
+
+       li      t0, SCHED_DEFEATURE
+       lui     t1, 0x0100  /* Experimental: Disable BRU accepting ALU ops */
+       mtcr    t1, t0
+.endm
+
+/*
+ * The cores can come start when they are woken up. This is also the NMI
+ * entry, so check that first.
+ *
+ * The data corresponding to reset is stored at RESET_DATA_PHYS location,
+ * this will have the thread mask (used when core is woken up) and the
+ * current NMI handler in case we reached here for an NMI.
+ *
+ * When a core or thread is newly woken up, it loops in a 'wait'. When
+ * the CPU really needs waking up, we send an NMI to it, with the NMI
+ * handler set to prom_boot_secondary_cpus
+ */
+
+       .set    noreorder
+       .set    noat
+       .set    arch=xlr        /* for mfcr/mtcr, XLR is sufficient */
+
+FEXPORT(nlm_reset_entry)
+       dmtc0   k0, $22, 6
+       dmtc0   k1, $22, 7
+       mfc0    k0, CP0_STATUS
+       li      k1, 0x80000
+       and     k1, k0, k1
+       beqz    k1, 1f         /* go to real reset entry */
+       nop
+       li      k1, CKSEG1ADDR(RESET_DATA_PHYS)   /* NMI */
+       ld      k0, BOOT_NMI_HANDLER(k1)
+       jr      k0
+       nop
+
+1:     /* Entry point on core wakeup */
+       mfc0    t0, CP0_EBASE, 1
+       mfc0    t1, CP0_EBASE, 1
+       srl     t1, 5
+       andi    t1, 0x3                 /* t1 <- node */
+       li      t2, 0x40000
+       mul     t3, t2, t1              /* t3 = node * 0x40000 */
+       srl     t0, t0, 2
+       and     t0, t0, 0x7             /* t0 <- core */
+       li      t1, 0x1
+       sll     t0, t1, t0
+       nor     t0, t0, zero            /* t0 <- ~(1 << core) */
+       li      t2, SYS_CPU_COHERENT_BASE(0)
+       add     t2, t2, t3              /* t2 <- SYS offset for node */
+       lw      t1, 0(t2)
+       and     t1, t1, t0
+       sw      t1, 0(t2)
+
+       /* read back to ensure complete */
+       lw      t1, 0(t2)
+       sync
+
+       /* Configure LSU on Non-0 Cores. */
+       __config_lsu
+
+/*
+ * Wake up sibling threads from the initial thread in
+ * a core.
+ */
+EXPORT(nlm_boot_siblings)
+       li      t0, CKSEG1ADDR(RESET_DATA_PHYS)
+       lw      t1, BOOT_THREAD_MODE(t0)        /* t1 <- thread mode */
+       li      t0, ((CPU_BLOCKID_MAP << 8) | MAP_THREADMODE)
+       mfcr    t2, t0
+       or      t2, t2, t1
+       mtcr    t2, t0
+
+       /*
+        * The new hardware thread starts at the next instruction
+        * For all the cases other than core 0 thread 0, we will
+         * jump to the secondary wait function.
+         */
+       mfc0    v0, CP0_EBASE, 1
+       andi    v0, 0x7f                /* v0 <- node/core */
+
+#if 1
+       /* A0 errata - Write MMU_SETUP after changing thread mode register. */
+       andi    v1, v0, 0x3             /* v1 <- thread id */
+       bnez    v1, 2f
+       nop
+
+        li     t0, MMU_SETUP
+        li     t1, 0
+        mtcr   t1, t0
+       ehb
+#endif
+
+2:     beqz    v0, 4f
+       nop
+
+       /* setup status reg */
+       mfc0    t1, CP0_STATUS
+       li      t0, ST0_BEV
+       or      t1, t0
+       xor     t1, t0
+#ifdef CONFIG_64BIT
+       ori     t1, ST0_KX
+#endif
+       mtc0    t1, CP0_STATUS
+       /* mark CPU ready */
+       PTR_LA  t1, nlm_cpu_ready
+       sll     v1, v0, 2
+       PTR_ADDU t1, v1
+       li      t2, 1
+       sw      t2, 0(t1)
+       /* Wait until NMI hits */
+3:     wait
+       j       3b
+       nop
+
+       /*
+        * For the boot CPU, we have to restore registers and
+        * return
+        */
+4:     dmfc0   t0, $4, 2       /* restore SP from UserLocal */
+       li      t1, 0xfadebeef
+       dmtc0   t1, $4, 2       /* restore SP from UserLocal */
+       PTR_SUBU sp, t0, PT_SIZE
+       RESTORE_ALL
+       jr   ra
+       nop
+EXPORT(nlm_reset_entry_end)
+
+FEXPORT(xlp_boot_core0_siblings)       /* "Master" cpu starts from here */
+       __config_lsu
+       dmtc0   sp, $4, 2               /* SP saved in UserLocal */
+       SAVE_ALL
+       sync
+       /* find the location to which nlm_boot_siblings was relocated */
+       li      t0, CKSEG1ADDR(RESET_VEC_PHYS)
+       dla     t1, nlm_reset_entry
+       dla     t2, nlm_boot_siblings
+       dsubu   t2, t1
+       daddu   t2, t0
+       /* call it */
+       jr      t2
+       nop
+       /* not reached */
+
+       __CPUINIT
+NESTED(nlm_boot_secondary_cpus, 16, sp)
+       PTR_LA  t1, nlm_next_sp
+       PTR_L   sp, 0(t1)
+       PTR_LA  t1, nlm_next_gp
+       PTR_L   gp, 0(t1)
+
+       /* a0 has the processor id */
+       PTR_LA  t0, nlm_early_init_secondary
+       jalr    t0
+       nop
+
+       PTR_LA  t0, smp_bootstrap
+       jr      t0
+       nop
+END(nlm_boot_secondary_cpus)
+       __FINIT
+
+/*
+ * In case of RMIboot bootloader which is used on XLR boards, the CPUs
+ * be already woken up and waiting in bootloader code.
+ * This will get them out of the bootloader code and into linux. Needed
+ *  because the bootloader area will be taken and initialized by linux.
+ */
+       __CPUINIT
+NESTED(nlm_rmiboot_preboot, 16, sp)
+       mfc0    t0, $15, 1      # read ebase
+       andi    t0, 0x1f        # t0 has the processor_id()
+       andi    t2, t0, 0x3     # thread no
+       sll     t0, 2           # offset in cpu array
+
+       PTR_LA  t1, nlm_cpu_ready # mark CPU ready
+       PTR_ADDU t1, t0
+       li      t3, 1
+       sw      t3, 0(t1)
+
+       bnez    t2, 1f          # skip thread programming
+       nop                     # for non zero hw threads
+
+       /*
+        * MMU setup only for first thread in core
+        */
+       li      t0, 0x400
+       mfcr    t1, t0
+       li      t2, 6           # XLR thread mode mask
+       nor     t3, t2, zero
+       and     t2, t1, t2      # t2 - current thread mode
+       li      v0, CKSEG1ADDR(RESET_DATA_PHYS)
+       lw      v1, BOOT_THREAD_MODE(v0) # v1 - new thread mode
+       sll     v1, 1
+       beq     v1, t2, 1f      # same as request value
+       nop                     # nothing to do */
+
+       and     t2, t1, t3      # mask out old thread mode
+       or      t1, t2, v1      # put in new value
+       mtcr    t1, t0          # update core control
+
+1:     wait
+       j       1b
+       nop
+END(nlm_rmiboot_preboot)
+       __FINIT
diff --git a/arch/mips/netlogic/common/time.c b/arch/mips/netlogic/common/time.c
new file mode 100644 (file)
index 0000000..bd3e498
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
+ * reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the NetLogic
+ * license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <linux/init.h>
+
+#include <asm/time.h>
+#include <asm/netlogic/interrupt.h>
+#include <asm/netlogic/common.h>
+
+unsigned int __cpuinit get_c0_compare_int(void)
+{
+       return IRQ_TIMER;
+}
+
+void __init plat_time_init(void)
+{
+       mips_hpt_frequency = nlm_get_cpu_frequency();
+       pr_info("MIPS counter frequency [%ld]\n",
+                       (unsigned long)mips_hpt_frequency);
+}
diff --git a/arch/mips/netlogic/xlp/Makefile b/arch/mips/netlogic/xlp/Makefile
new file mode 100644 (file)
index 0000000..b93ed83
--- /dev/null
@@ -0,0 +1,2 @@
+obj-y                          += setup.o platform.o nlm_hal.o
+obj-$(CONFIG_SMP)              += wakeup.o
diff --git a/arch/mips/netlogic/xlp/nlm_hal.c b/arch/mips/netlogic/xlp/nlm_hal.c
new file mode 100644 (file)
index 0000000..9428e71
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
+ * reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the NetLogic
+ * license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/delay.h>
+
+#include <asm/mipsregs.h>
+#include <asm/time.h>
+
+#include <asm/netlogic/haldefs.h>
+#include <asm/netlogic/xlp-hal/iomap.h>
+#include <asm/netlogic/xlp-hal/xlp.h>
+#include <asm/netlogic/xlp-hal/pic.h>
+#include <asm/netlogic/xlp-hal/sys.h>
+
+/* These addresses are computed by the nlm_hal_init() */
+uint64_t nlm_io_base;
+uint64_t nlm_sys_base;
+uint64_t nlm_pic_base;
+
+/* Main initialization */
+void nlm_hal_init(void)
+{
+       nlm_io_base = CKSEG1ADDR(XLP_DEFAULT_IO_BASE);
+       nlm_sys_base = nlm_get_sys_regbase(0);  /* node 0 */
+       nlm_pic_base = nlm_get_pic_regbase(0);  /* node 0 */
+}
+
+int nlm_irq_to_irt(int irq)
+{
+       if (!PIC_IRQ_IS_IRT(irq))
+               return -1;
+
+       switch (irq) {
+       case PIC_UART_0_IRQ:
+               return PIC_IRT_UART_0_INDEX;
+       case PIC_UART_1_IRQ:
+               return PIC_IRT_UART_1_INDEX;
+       default:
+               return -1;
+       }
+}
+
+int nlm_irt_to_irq(int irt)
+{
+       switch (irt) {
+       case PIC_IRT_UART_0_INDEX:
+               return PIC_UART_0_IRQ;
+       case PIC_IRT_UART_1_INDEX:
+               return PIC_UART_1_IRQ;
+       default:
+               return -1;
+       }
+}
+
+unsigned int nlm_get_core_frequency(int core)
+{
+       unsigned int pll_divf, pll_divr, dfs_div, ext_div;
+       unsigned int rstval, dfsval, denom;
+       uint64_t num;
+
+       rstval = nlm_read_sys_reg(nlm_sys_base, SYS_POWER_ON_RESET_CFG);
+       dfsval = nlm_read_sys_reg(nlm_sys_base, SYS_CORE_DFS_DIV_VALUE);
+       pll_divf = ((rstval >> 10) & 0x7f) + 1;
+       pll_divr = ((rstval >> 8)  & 0x3) + 1;
+       ext_div  = ((rstval >> 30) & 0x3) + 1;
+       dfs_div  = ((dfsval >> (core * 4)) & 0xf) + 1;
+
+       num = 800000000ULL * pll_divf;
+       denom = 3 * pll_divr * ext_div * dfs_div;
+       do_div(num, denom);
+       return (unsigned int)num;
+}
+
+unsigned int nlm_get_cpu_frequency(void)
+{
+       return nlm_get_core_frequency(0);
+}
diff --git a/arch/mips/netlogic/xlp/platform.c b/arch/mips/netlogic/xlp/platform.c
new file mode 100644 (file)
index 0000000..1f5e4cb
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
+ * reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the NetLogic
+ * license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <linux/dma-mapping.h>
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/serial.h>
+#include <linux/serial_8250.h>
+#include <linux/pci.h>
+#include <linux/serial_reg.h>
+#include <linux/spinlock.h>
+
+#include <asm/time.h>
+#include <asm/addrspace.h>
+#include <asm/netlogic/haldefs.h>
+#include <asm/netlogic/xlp-hal/iomap.h>
+#include <asm/netlogic/xlp-hal/xlp.h>
+#include <asm/netlogic/xlp-hal/pic.h>
+#include <asm/netlogic/xlp-hal/uart.h>
+
+static unsigned int nlm_xlp_uart_in(struct uart_port *p, int offset)
+{
+        return nlm_read_reg(p->iobase, offset);
+}
+
+static void nlm_xlp_uart_out(struct uart_port *p, int offset, int value)
+{
+       nlm_write_reg(p->iobase, offset, value);
+}
+
+#define PORT(_irq)                                     \
+       {                                               \
+               .irq            = _irq,                 \
+               .regshift       = 2,                    \
+               .iotype         = UPIO_MEM32,           \
+               .flags          = (UPF_SKIP_TEST|UPF_FIXED_TYPE|\
+                                       UPF_BOOT_AUTOCONF),     \
+               .uartclk        = XLP_IO_CLK,           \
+               .type           = PORT_16550A,          \
+               .serial_in      = nlm_xlp_uart_in,      \
+               .serial_out     = nlm_xlp_uart_out,     \
+       }
+
+static struct plat_serial8250_port xlp_uart_data[] = {
+       PORT(PIC_UART_0_IRQ),
+       PORT(PIC_UART_1_IRQ),
+       {},
+};
+
+static struct platform_device uart_device = {
+       .name           = "serial8250",
+       .id             = PLAT8250_DEV_PLATFORM,
+       .dev = {
+               .platform_data = xlp_uart_data,
+       },
+};
+
+static int __init nlm_platform_uart_init(void)
+{
+       unsigned long mmio;
+
+       mmio = (unsigned long)nlm_get_uart_regbase(0, 0);
+       xlp_uart_data[0].iobase = mmio;
+       xlp_uart_data[0].membase = (void __iomem *)mmio;
+       xlp_uart_data[0].mapbase = mmio;
+
+       mmio = (unsigned long)nlm_get_uart_regbase(0, 1);
+       xlp_uart_data[1].iobase = mmio;
+       xlp_uart_data[1].membase = (void __iomem *)mmio;
+       xlp_uart_data[1].mapbase = mmio;
+
+       return platform_device_register(&uart_device);
+}
+
+arch_initcall(nlm_platform_uart_init);
diff --git a/arch/mips/netlogic/xlp/setup.c b/arch/mips/netlogic/xlp/setup.c
new file mode 100644 (file)
index 0000000..acb677a
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
+ * reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the NetLogic
+ * license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <linux/kernel.h>
+#include <linux/serial_8250.h>
+#include <linux/pm.h>
+
+#include <asm/reboot.h>
+#include <asm/time.h>
+#include <asm/bootinfo.h>
+
+#include <linux/of_fdt.h>
+
+#include <asm/netlogic/haldefs.h>
+#include <asm/netlogic/common.h>
+
+#include <asm/netlogic/xlp-hal/iomap.h>
+#include <asm/netlogic/xlp-hal/xlp.h>
+#include <asm/netlogic/xlp-hal/sys.h>
+
+unsigned long nlm_common_ebase = 0x0;
+
+/* default to uniprocessor */
+uint32_t nlm_coremask = 1, nlm_cpumask  = 1;
+int  nlm_threads_per_core = 1;
+
+static void nlm_linux_exit(void)
+{
+       nlm_write_sys_reg(nlm_sys_base, SYS_CHIP_RESET, 1);
+       for ( ; ; )
+               cpu_wait();
+}
+
+void __init plat_mem_setup(void)
+{
+       panic_timeout   = 5;
+       _machine_restart = (void (*)(char *))nlm_linux_exit;
+       _machine_halt   = nlm_linux_exit;
+       pm_power_off    = nlm_linux_exit;
+}
+
+const char *get_system_type(void)
+{
+       return "Netlogic XLP Series";
+}
+
+void __init prom_free_prom_memory(void)
+{
+       /* Nothing yet */
+}
+
+void xlp_mmu_init(void)
+{
+       write_c0_config6(read_c0_config6() | 0x24);
+       current_cpu_data.tlbsize = ((read_c0_config6() >> 16) & 0xffff) + 1;
+       write_c0_config7(PM_DEFAULT_MASK >>
+               (13 + (ffz(PM_DEFAULT_MASK >> 13) / 2)));
+}
+
+void __init prom_init(void)
+{
+       void *fdtp;
+
+       fdtp = (void *)(long)fw_arg0;
+       xlp_mmu_init();
+       nlm_hal_init();
+       early_init_devtree(fdtp);
+
+       nlm_common_ebase = read_c0_ebase() & (~((1 << 12) - 1));
+#ifdef CONFIG_SMP
+       nlm_wakeup_secondary_cpus(0xffffffff);
+       register_smp_ops(&nlm_smp_ops);
+#endif
+}
diff --git a/arch/mips/netlogic/xlp/wakeup.c b/arch/mips/netlogic/xlp/wakeup.c
new file mode 100644 (file)
index 0000000..44d923f
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
+ * reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the NetLogic
+ * license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/threads.h>
+
+#include <asm/asm.h>
+#include <asm/asm-offsets.h>
+#include <asm/mipsregs.h>
+#include <asm/addrspace.h>
+#include <asm/string.h>
+
+#include <asm/netlogic/haldefs.h>
+#include <asm/netlogic/common.h>
+#include <asm/netlogic/mips-extns.h>
+
+#include <asm/netlogic/xlp-hal/iomap.h>
+#include <asm/netlogic/xlp-hal/pic.h>
+#include <asm/netlogic/xlp-hal/xlp.h>
+#include <asm/netlogic/xlp-hal/sys.h>
+
+static void xlp_enable_secondary_cores(void)
+{
+       uint32_t core, value, coremask, syscoremask;
+       int count;
+
+       /* read cores in reset from SYS block */
+       syscoremask = nlm_read_sys_reg(nlm_sys_base, SYS_CPU_RESET);
+
+       /* update user specified */
+       nlm_coremask = nlm_coremask & (syscoremask | 1);
+
+       for (core = 1; core < 8; core++) {
+               coremask = 1 << core;
+               if ((nlm_coremask & coremask) == 0)
+                       continue;
+
+               /* Enable CPU clock */
+               value = nlm_read_sys_reg(nlm_sys_base, SYS_CORE_DFS_DIS_CTRL);
+               value &= ~coremask;
+               nlm_write_sys_reg(nlm_sys_base, SYS_CORE_DFS_DIS_CTRL, value);
+
+               /* Remove CPU Reset */
+               value = nlm_read_sys_reg(nlm_sys_base, SYS_CPU_RESET);
+               value &= ~coremask;
+               nlm_write_sys_reg(nlm_sys_base, SYS_CPU_RESET, value);
+
+               /* Poll for CPU to mark itself coherent */
+               count = 100000;
+               do {
+                       value = nlm_read_sys_reg(nlm_sys_base,
+                           SYS_CPU_NONCOHERENT_MODE);
+               } while ((value & coremask) != 0 && count-- > 0);
+
+               if (count == 0)
+                       pr_err("Failed to enable core %d\n", core);
+       }
+}
+
+void xlp_wakeup_secondary_cpus(void)
+{
+       /*
+        * In case of u-boot, the secondaries are in reset
+        * first wakeup core 0 threads
+        */
+       xlp_boot_core0_siblings();
+
+       /* now get other cores out of reset */
+       xlp_enable_secondary_cores();
+}
index 2dca585dd2f7eb71c002dc0942b1e44cec7af173..f01e4d7a060031e57de49439e3967067c71d4546 100644 (file)
@@ -1,5 +1,2 @@
-obj-y                          += setup.o platform.o irq.o setup.o time.o
-obj-$(CONFIG_SMP)              += smp.o smpboot.o
-obj-$(CONFIG_EARLY_PRINTK)     += xlr_console.o
-
-ccflags-y                      += -Werror
+obj-y                          += setup.o platform.o
+obj-$(CONFIG_SMP)              += wakeup.o
diff --git a/arch/mips/netlogic/xlr/irq.c b/arch/mips/netlogic/xlr/irq.c
deleted file mode 100644 (file)
index 521bb73..0000000
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
- * reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses.  You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the NetLogic
- * license below:
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/linkage.h>
-#include <linux/interrupt.h>
-#include <linux/spinlock.h>
-#include <linux/mm.h>
-
-#include <asm/mipsregs.h>
-
-#include <asm/netlogic/xlr/iomap.h>
-#include <asm/netlogic/xlr/pic.h>
-#include <asm/netlogic/xlr/xlr.h>
-
-#include <asm/netlogic/interrupt.h>
-#include <asm/netlogic/mips-extns.h>
-
-static u64 nlm_irq_mask;
-static DEFINE_SPINLOCK(nlm_pic_lock);
-
-static void xlr_pic_enable(struct irq_data *d)
-{
-       nlm_reg_t *mmio = netlogic_io_mmio(NETLOGIC_IO_PIC_OFFSET);
-       unsigned long flags;
-       nlm_reg_t reg;
-       int irq = d->irq;
-
-       WARN(!PIC_IRQ_IS_IRT(irq), "Bad irq %d", irq);
-
-       spin_lock_irqsave(&nlm_pic_lock, flags);
-       reg = netlogic_read_reg(mmio, PIC_IRT_1_BASE + irq - PIC_IRQ_BASE);
-       netlogic_write_reg(mmio, PIC_IRT_1_BASE + irq - PIC_IRQ_BASE,
-                         reg | (1 << 6) | (1 << 30) | (1 << 31));
-       spin_unlock_irqrestore(&nlm_pic_lock, flags);
-}
-
-static void xlr_pic_mask(struct irq_data *d)
-{
-       nlm_reg_t *mmio = netlogic_io_mmio(NETLOGIC_IO_PIC_OFFSET);
-       unsigned long flags;
-       nlm_reg_t reg;
-       int irq = d->irq;
-
-       WARN(!PIC_IRQ_IS_IRT(irq), "Bad irq %d", irq);
-
-       spin_lock_irqsave(&nlm_pic_lock, flags);
-       reg = netlogic_read_reg(mmio, PIC_IRT_1_BASE + irq - PIC_IRQ_BASE);
-       netlogic_write_reg(mmio, PIC_IRT_1_BASE + irq - PIC_IRQ_BASE,
-                         reg | (1 << 6) | (1 << 30) | (0 << 31));
-       spin_unlock_irqrestore(&nlm_pic_lock, flags);
-}
-
-#ifdef CONFIG_PCI
-/* Extra ACK needed for XLR on chip PCI controller */
-static void xlr_pci_ack(struct irq_data *d)
-{
-       nlm_reg_t *pci_mmio = netlogic_io_mmio(NETLOGIC_IO_PCIX_OFFSET);
-
-       netlogic_read_reg(pci_mmio, (0x140 >> 2));
-}
-
-/* Extra ACK needed for XLS on chip PCIe controller */
-static void xls_pcie_ack(struct irq_data *d)
-{
-       nlm_reg_t *pcie_mmio_le = netlogic_io_mmio(NETLOGIC_IO_PCIE_1_OFFSET);
-
-       switch (d->irq) {
-       case PIC_PCIE_LINK0_IRQ:
-               netlogic_write_reg(pcie_mmio_le, (0x90 >> 2), 0xffffffff);
-               break;
-       case PIC_PCIE_LINK1_IRQ:
-               netlogic_write_reg(pcie_mmio_le, (0x94 >> 2), 0xffffffff);
-               break;
-       case PIC_PCIE_LINK2_IRQ:
-               netlogic_write_reg(pcie_mmio_le, (0x190 >> 2), 0xffffffff);
-               break;
-       case PIC_PCIE_LINK3_IRQ:
-               netlogic_write_reg(pcie_mmio_le, (0x194 >> 2), 0xffffffff);
-               break;
-       }
-}
-
-/* For XLS B silicon, the 3,4 PCI interrupts are different */
-static void xls_pcie_ack_b(struct irq_data *d)
-{
-       nlm_reg_t *pcie_mmio_le = netlogic_io_mmio(NETLOGIC_IO_PCIE_1_OFFSET);
-
-       switch (d->irq) {
-       case PIC_PCIE_LINK0_IRQ:
-               netlogic_write_reg(pcie_mmio_le, (0x90 >> 2), 0xffffffff);
-               break;
-       case PIC_PCIE_LINK1_IRQ:
-               netlogic_write_reg(pcie_mmio_le, (0x94 >> 2), 0xffffffff);
-               break;
-       case PIC_PCIE_XLSB0_LINK2_IRQ:
-               netlogic_write_reg(pcie_mmio_le, (0x190 >> 2), 0xffffffff);
-               break;
-       case PIC_PCIE_XLSB0_LINK3_IRQ:
-               netlogic_write_reg(pcie_mmio_le, (0x194 >> 2), 0xffffffff);
-               break;
-       }
-}
-#endif
-
-static void xlr_pic_ack(struct irq_data *d)
-{
-       unsigned long flags;
-       nlm_reg_t *mmio;
-       int irq = d->irq;
-       void *hd = irq_data_get_irq_handler_data(d);
-
-       WARN(!PIC_IRQ_IS_IRT(irq), "Bad irq %d", irq);
-
-       if (hd) {
-               void (*extra_ack)(void *) = hd;
-               extra_ack(d);
-       }
-       mmio = netlogic_io_mmio(NETLOGIC_IO_PIC_OFFSET);
-       spin_lock_irqsave(&nlm_pic_lock, flags);
-       netlogic_write_reg(mmio, PIC_INT_ACK, (1 << (irq - PIC_IRQ_BASE)));
-       spin_unlock_irqrestore(&nlm_pic_lock, flags);
-}
-
-/*
- * This chip definition handles interrupts routed thru the XLR
- * hardware PIC, currently IRQs 8-39 are mapped to hardware intr
- * 0-31 wired the XLR PIC
- */
-static struct irq_chip xlr_pic = {
-       .name           = "XLR-PIC",
-       .irq_enable     = xlr_pic_enable,
-       .irq_mask       = xlr_pic_mask,
-       .irq_ack        = xlr_pic_ack,
-};
-
-static void rsvd_irq_handler(struct irq_data *d)
-{
-       WARN(d->irq >= PIC_IRQ_BASE, "Bad irq %d", d->irq);
-}
-
-/*
- * Chip definition for CPU originated interrupts(timer, msg) and
- * IPIs
- */
-struct irq_chip nlm_cpu_intr = {
-       .name           = "XLR-CPU-INTR",
-       .irq_enable     = rsvd_irq_handler,
-       .irq_mask       = rsvd_irq_handler,
-       .irq_ack        = rsvd_irq_handler,
-};
-
-void __init init_xlr_irqs(void)
-{
-       nlm_reg_t *mmio = netlogic_io_mmio(NETLOGIC_IO_PIC_OFFSET);
-       uint32_t thread_mask = 1;
-       int level, i;
-
-       pr_info("Interrupt thread mask [%x]\n", thread_mask);
-       for (i = 0; i < PIC_NUM_IRTS; i++) {
-               level = PIC_IRQ_IS_EDGE_TRIGGERED(i);
-
-               /* Bind all PIC irqs to boot cpu */
-               netlogic_write_reg(mmio, PIC_IRT_0_BASE + i, thread_mask);
-
-               /*
-                * Use local scheduling and high polarity for all IRTs
-                * Invalidate all IRTs, by default
-                */
-               netlogic_write_reg(mmio, PIC_IRT_1_BASE + i,
-                               (level << 30) | (1 << 6) | (PIC_IRQ_BASE + i));
-       }
-
-       /* Make all IRQs as level triggered by default */
-       for (i = 0; i < NR_IRQS; i++) {
-               if (PIC_IRQ_IS_IRT(i))
-                       irq_set_chip_and_handler(i, &xlr_pic, handle_level_irq);
-               else
-                       irq_set_chip_and_handler(i, &nlm_cpu_intr,
-                                               handle_percpu_irq);
-       }
-#ifdef CONFIG_SMP
-       irq_set_chip_and_handler(IRQ_IPI_SMP_FUNCTION, &nlm_cpu_intr,
-                        nlm_smp_function_ipi_handler);
-       irq_set_chip_and_handler(IRQ_IPI_SMP_RESCHEDULE, &nlm_cpu_intr,
-                        nlm_smp_resched_ipi_handler);
-       nlm_irq_mask |=
-           ((1ULL << IRQ_IPI_SMP_FUNCTION) | (1ULL << IRQ_IPI_SMP_RESCHEDULE));
-#endif
-
-#ifdef CONFIG_PCI
-       /*
-        * For PCI interrupts, we need to ack the PIC controller too, overload
-        * irq handler data to do this
-        */
-       if (nlm_chip_is_xls()) {
-               if (nlm_chip_is_xls_b()) {
-                       irq_set_handler_data(PIC_PCIE_LINK0_IRQ,
-                                                       xls_pcie_ack_b);
-                       irq_set_handler_data(PIC_PCIE_LINK1_IRQ,
-                                                       xls_pcie_ack_b);
-                       irq_set_handler_data(PIC_PCIE_XLSB0_LINK2_IRQ,
-                                                       xls_pcie_ack_b);
-                       irq_set_handler_data(PIC_PCIE_XLSB0_LINK3_IRQ,
-                                                       xls_pcie_ack_b);
-               } else {
-                       irq_set_handler_data(PIC_PCIE_LINK0_IRQ, xls_pcie_ack);
-                       irq_set_handler_data(PIC_PCIE_LINK1_IRQ, xls_pcie_ack);
-                       irq_set_handler_data(PIC_PCIE_LINK2_IRQ, xls_pcie_ack);
-                       irq_set_handler_data(PIC_PCIE_LINK3_IRQ, xls_pcie_ack);
-               }
-       } else {
-               /* XLR PCI controller ACK */
-               irq_set_handler_data(PIC_PCIE_XLSB0_LINK3_IRQ, xlr_pci_ack);
-       }
-#endif
-       /* unmask all PIC related interrupts. If no handler is installed by the
-        * drivers, it'll just ack the interrupt and return
-        */
-       for (i = PIC_IRT_FIRST_IRQ; i <= PIC_IRT_LAST_IRQ; i++)
-               nlm_irq_mask |= (1ULL << i);
-
-       nlm_irq_mask |= (1ULL << IRQ_TIMER);
-}
-
-void __init arch_init_irq(void)
-{
-       /* Initialize the irq descriptors */
-       init_xlr_irqs();
-       write_c0_eimr(nlm_irq_mask);
-}
-
-void __cpuinit nlm_smp_irq_init(void)
-{
-       /* set interrupt mask for non-zero cpus */
-       write_c0_eimr(nlm_irq_mask);
-}
-
-asmlinkage void plat_irq_dispatch(void)
-{
-       uint64_t eirr;
-       int i;
-
-       eirr = read_c0_eirr() & read_c0_eimr();
-       if (!eirr)
-               return;
-
-       /* no need of EIRR here, writing compare clears interrupt */
-       if (eirr & (1 << IRQ_TIMER)) {
-               do_IRQ(IRQ_TIMER);
-               return;
-       }
-
-       /* use dcltz: optimize below code */
-       for (i = 63; i != -1; i--) {
-               if (eirr & (1ULL << i))
-                       break;
-       }
-       if (i == -1) {
-               pr_err("no interrupt !!\n");
-               return;
-       }
-
-       /* Ack eirr */
-       write_c0_eirr(1ULL << i);
-
-       do_IRQ(i);
-}
index 609ec2534642817ce6d59fae43ae35cc6c381f11..eab64b45dffdb197510ee23683667365cbf81d9c 100644 (file)
 #include <linux/serial_8250.h>
 #include <linux/serial_reg.h>
 
+#include <asm/netlogic/haldefs.h>
 #include <asm/netlogic/xlr/iomap.h>
 #include <asm/netlogic/xlr/pic.h>
 #include <asm/netlogic/xlr/xlr.h>
 
 unsigned int nlm_xlr_uart_in(struct uart_port *p, int offset)
 {
-       nlm_reg_t *mmio;
+       uint64_t uartbase;
        unsigned int value;
 
-       /* XLR uart does not need any mapping of regs */
-       mmio = (nlm_reg_t *)(p->membase + (offset << p->regshift));
-       value = netlogic_read_reg(mmio, 0);
+       /* sign extend to 64 bits, if needed */
+       uartbase = (uint64_t)(long)p->membase;
+       value = nlm_read_reg(uartbase, offset);
 
        /* See XLR/XLS errata */
        if (offset == UART_MSR)
@@ -39,10 +40,10 @@ unsigned int nlm_xlr_uart_in(struct uart_port *p, int offset)
 
 void nlm_xlr_uart_out(struct uart_port *p, int offset, int value)
 {
-       nlm_reg_t *mmio;
+       uint64_t uartbase;
 
-       /* XLR uart does not need any mapping of regs */
-       mmio = (nlm_reg_t *)(p->membase + (offset << p->regshift));
+       /* sign extend to 64 bits, if needed */
+       uartbase = (uint64_t)(long)p->membase;
 
        /* See XLR/XLS errata */
        if (offset == UART_MSR)
@@ -50,7 +51,7 @@ void nlm_xlr_uart_out(struct uart_port *p, int offset, int value)
        else if (offset == UART_MCR)
                value ^= 0x3;
 
-       netlogic_write_reg(mmio, 0, value);
+       nlm_write_reg(uartbase, offset, value);
 }
 
 #define PORT(_irq)                                     \
@@ -82,15 +83,15 @@ static struct platform_device uart_device = {
 
 static int __init nlm_uart_init(void)
 {
-       nlm_reg_t *mmio;
+       unsigned long uartbase;
 
-       mmio = netlogic_io_mmio(NETLOGIC_IO_UART_0_OFFSET);
-       xlr_uart_data[0].membase = (void __iomem *)mmio;
-       xlr_uart_data[0].mapbase = CPHYSADDR((unsigned long)mmio);
+       uartbase = (unsigned long)nlm_mmio_base(NETLOGIC_IO_UART_0_OFFSET);
+       xlr_uart_data[0].membase = (void __iomem *)uartbase;
+       xlr_uart_data[0].mapbase = CPHYSADDR(uartbase);
 
-       mmio = netlogic_io_mmio(NETLOGIC_IO_UART_1_OFFSET);
-       xlr_uart_data[1].membase = (void __iomem *)mmio;
-       xlr_uart_data[1].mapbase = CPHYSADDR((unsigned long)mmio);
+       uartbase = (unsigned long)nlm_mmio_base(NETLOGIC_IO_UART_1_OFFSET);
+       xlr_uart_data[1].membase = (void __iomem *)uartbase;
+       xlr_uart_data[1].mapbase = CPHYSADDR(uartbase);
 
        return platform_device_register(&uart_device);
 }
index cee25ddd0887470ebe167b5e0cb6a91d2e5d3a1e..c9d066dedc4ec4f79601bd3a7cd1a60be4316f5b 100644 (file)
 #include <asm/reboot.h>
 #include <asm/time.h>
 #include <asm/bootinfo.h>
-#include <asm/smp-ops.h>
 
 #include <asm/netlogic/interrupt.h>
 #include <asm/netlogic/psb-bootinfo.h>
+#include <asm/netlogic/haldefs.h>
+#include <asm/netlogic/common.h>
 
 #include <asm/netlogic/xlr/xlr.h>
 #include <asm/netlogic/xlr/iomap.h>
 #include <asm/netlogic/xlr/pic.h>
 #include <asm/netlogic/xlr/gpio.h>
 
-unsigned long netlogic_io_base = (unsigned long)(DEFAULT_NETLOGIC_IO_BASE);
-unsigned long nlm_common_ebase = 0x0;
+uint64_t nlm_io_base = DEFAULT_NETLOGIC_IO_BASE;
+uint64_t nlm_pic_base;
 struct psb_info nlm_prom_info;
 
+unsigned long nlm_common_ebase = 0x0;
+
+/* default to uniprocessor */
+uint32_t nlm_coremask = 1, nlm_cpumask  = 1;
+int  nlm_threads_per_core = 1;
+
 static void __init nlm_early_serial_setup(void)
 {
        struct uart_port s;
-       nlm_reg_t *uart_base;
+       unsigned long uart_base;
 
-       uart_base = netlogic_io_mmio(NETLOGIC_IO_UART_0_OFFSET);
+       uart_base = (unsigned long)nlm_mmio_base(NETLOGIC_IO_UART_0_OFFSET);
        memset(&s, 0, sizeof(s));
        s.flags         = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST;
        s.iotype        = UPIO_MEM32;
@@ -67,18 +74,18 @@ static void __init nlm_early_serial_setup(void)
        s.uartclk       = PIC_CLKS_PER_SEC;
        s.serial_in     = nlm_xlr_uart_in;
        s.serial_out    = nlm_xlr_uart_out;
-       s.mapbase       = (unsigned long)uart_base;
+       s.mapbase       = uart_base;
        s.membase       = (unsigned char __iomem *)uart_base;
        early_serial_setup(&s);
 }
 
 static void nlm_linux_exit(void)
 {
-       nlm_reg_t *mmio;
+       uint64_t gpiobase;
 
-       mmio = netlogic_io_mmio(NETLOGIC_IO_GPIO_OFFSET);
+       gpiobase = nlm_mmio_base(NETLOGIC_IO_GPIO_OFFSET);
        /* trigger a chip reset by writing 1 to GPIO_SWRESET_REG */
-       netlogic_write_reg(mmio, NETLOGIC_GPIO_SWRESET_REG, 1);
+       nlm_write_reg(gpiobase, NETLOGIC_GPIO_SWRESET_REG, 1);
        for ( ; ; )
                cpu_wait();
 }
@@ -96,6 +103,11 @@ const char *get_system_type(void)
        return "Netlogic XLR/XLS Series";
 }
 
+unsigned int nlm_get_cpu_frequency(void)
+{
+       return (unsigned int)nlm_prom_info.cpu_frequency;
+}
+
 void __init prom_free_prom_memory(void)
 {
        /* Nothing yet */
@@ -175,6 +187,7 @@ void __init prom_init(void)
        prom_infop = (struct psb_info *)(long)(int)fw_arg3;
 
        nlm_prom_info = *prom_infop;
+       nlm_pic_base = nlm_mmio_base(NETLOGIC_IO_PIC_OFFSET);
 
        nlm_early_serial_setup();
        build_arcs_cmdline(argv);
diff --git a/arch/mips/netlogic/xlr/smp.c b/arch/mips/netlogic/xlr/smp.c
deleted file mode 100644 (file)
index 080284d..0000000
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
- * reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses.  You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the NetLogic
- * license below:
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <linux/kernel.h>
-#include <linux/delay.h>
-#include <linux/init.h>
-#include <linux/smp.h>
-#include <linux/irq.h>
-
-#include <asm/mmu_context.h>
-
-#include <asm/netlogic/interrupt.h>
-#include <asm/netlogic/mips-extns.h>
-
-#include <asm/netlogic/xlr/iomap.h>
-#include <asm/netlogic/xlr/pic.h>
-#include <asm/netlogic/xlr/xlr.h>
-
-void core_send_ipi(int logical_cpu, unsigned int action)
-{
-       int cpu = cpu_logical_map(logical_cpu);
-       u32 tid = cpu & 0x3;
-       u32 pid = (cpu >> 2) & 0x07;
-       u32 ipi = (tid << 16) | (pid << 20);
-
-       if (action & SMP_CALL_FUNCTION)
-               ipi |= IRQ_IPI_SMP_FUNCTION;
-       else if (action & SMP_RESCHEDULE_YOURSELF)
-               ipi |= IRQ_IPI_SMP_RESCHEDULE;
-       else
-               return;
-
-       pic_send_ipi(ipi);
-}
-
-void nlm_send_ipi_single(int cpu, unsigned int action)
-{
-       core_send_ipi(cpu, action);
-}
-
-void nlm_send_ipi_mask(const struct cpumask *mask, unsigned int action)
-{
-       int cpu;
-
-       for_each_cpu(cpu, mask) {
-               core_send_ipi(cpu, action);
-       }
-}
-
-/* IRQ_IPI_SMP_FUNCTION Handler */
-void nlm_smp_function_ipi_handler(unsigned int irq, struct irq_desc *desc)
-{
-       smp_call_function_interrupt();
-}
-
-/* IRQ_IPI_SMP_RESCHEDULE  handler */
-void nlm_smp_resched_ipi_handler(unsigned int irq, struct irq_desc *desc)
-{
-       scheduler_ipi();
-}
-
-/*
- * Called before going into mips code, early cpu init
- */
-void nlm_early_init_secondary(void)
-{
-       write_c0_ebase((uint32_t)nlm_common_ebase);
-       /* TLB partition here later */
-}
-
-/*
- * Code to run on secondary just after probing the CPU
- */
-static void __cpuinit nlm_init_secondary(void)
-{
-       nlm_smp_irq_init();
-}
-
-void nlm_smp_finish(void)
-{
-#ifdef notyet
-       nlm_common_msgring_cpu_init();
-#endif
-       local_irq_enable();
-}
-
-void nlm_cpus_done(void)
-{
-}
-
-/*
- * Boot all other cpus in the system, initialize them, and bring them into
- * the boot function
- */
-int nlm_cpu_unblock[NR_CPUS];
-int nlm_cpu_ready[NR_CPUS];
-unsigned long nlm_next_gp;
-unsigned long nlm_next_sp;
-cpumask_t phys_cpu_present_map;
-
-void nlm_boot_secondary(int logical_cpu, struct task_struct *idle)
-{
-       unsigned long gp = (unsigned long)task_thread_info(idle);
-       unsigned long sp = (unsigned long)__KSTK_TOS(idle);
-       int cpu = cpu_logical_map(logical_cpu);
-
-       nlm_next_sp = sp;
-       nlm_next_gp = gp;
-
-       /* barrier */
-       __sync();
-       nlm_cpu_unblock[cpu] = 1;
-}
-
-void __init nlm_smp_setup(void)
-{
-       unsigned int boot_cpu;
-       int num_cpus, i;
-
-       boot_cpu = hard_smp_processor_id();
-       cpus_clear(phys_cpu_present_map);
-
-       cpu_set(boot_cpu, phys_cpu_present_map);
-       __cpu_number_map[boot_cpu] = 0;
-       __cpu_logical_map[0] = boot_cpu;
-       cpu_set(0, cpu_possible_map);
-
-       num_cpus = 1;
-       for (i = 0; i < NR_CPUS; i++) {
-               /*
-                * BSP is not set in nlm_cpu_ready array, it is only for
-                * ASPs (goto see smpboot.S)
-                */
-               if (nlm_cpu_ready[i]) {
-                       cpu_set(i, phys_cpu_present_map);
-                       __cpu_number_map[i] = num_cpus;
-                       __cpu_logical_map[num_cpus] = i;
-                       cpu_set(num_cpus, cpu_possible_map);
-                       ++num_cpus;
-               }
-       }
-
-       pr_info("Phys CPU present map: %lx, possible map %lx\n",
-               (unsigned long)phys_cpu_present_map.bits[0],
-               (unsigned long)cpu_possible_map.bits[0]);
-
-       pr_info("Detected %i Slave CPU(s)\n", num_cpus);
-}
-
-void nlm_prepare_cpus(unsigned int max_cpus)
-{
-}
-
-struct plat_smp_ops nlm_smp_ops = {
-       .send_ipi_single        = nlm_send_ipi_single,
-       .send_ipi_mask          = nlm_send_ipi_mask,
-       .init_secondary         = nlm_init_secondary,
-       .smp_finish             = nlm_smp_finish,
-       .cpus_done              = nlm_cpus_done,
-       .boot_secondary         = nlm_boot_secondary,
-       .smp_setup              = nlm_smp_setup,
-       .prepare_cpus           = nlm_prepare_cpus,
-};
-
-unsigned long secondary_entry_point;
-
-int __cpuinit nlm_wakeup_secondary_cpus(u32 wakeup_mask)
-{
-       unsigned int tid, pid, ipi, i, boot_cpu;
-       void *reset_vec;
-
-       secondary_entry_point = (unsigned long)prom_pre_boot_secondary_cpus;
-       reset_vec = (void *)CKSEG1ADDR(0x1fc00000);
-       memcpy(reset_vec, nlm_boot_smp_nmi, 0x80);
-       boot_cpu = hard_smp_processor_id();
-
-       for (i = 0; i < NR_CPUS; i++) {
-               if (i == boot_cpu)
-                       continue;
-               if (wakeup_mask & (1u << i)) {
-                       tid = i & 0x3;
-                       pid = (i >> 2) & 0x7;
-                       ipi = (tid << 16) | (pid << 20) | (1 << 8);
-                       pic_send_ipi(ipi);
-               }
-       }
-
-       return 0;
-}
diff --git a/arch/mips/netlogic/xlr/smpboot.S b/arch/mips/netlogic/xlr/smpboot.S
deleted file mode 100644 (file)
index 8cb7889..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
- * reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses.  You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the NetLogic
- * license below:
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <linux/init.h>
-
-#include <asm/asm.h>
-#include <asm/asm-offsets.h>
-#include <asm/regdef.h>
-#include <asm/mipsregs.h>
-
-/*
- * Early code for secondary CPUs. This will get them out of the bootloader
- * code and into linux. Needed because the bootloader area will be taken
- * and initialized by linux.
- */
-       __CPUINIT
-NESTED(prom_pre_boot_secondary_cpus, 16, sp)
-       .set    mips64
-       mfc0    t0, $15, 1      # read ebase
-       andi    t0, 0x1f        # t0 has the processor_id()
-       sll     t0, 2           # offset in cpu array
-
-       PTR_LA  t1, nlm_cpu_ready # mark CPU ready
-       PTR_ADDU t1, t0
-       li      t2, 1
-       sw      t2, 0(t1)
-
-       PTR_LA  t1, nlm_cpu_unblock
-       PTR_ADDU t1, t0
-1:     lw      t2, 0(t1)       # wait till unblocked
-       beqz    t2, 1b
-       nop
-
-       PTR_LA  t1, nlm_next_sp
-       PTR_L   sp, 0(t1)
-       PTR_LA  t1, nlm_next_gp
-       PTR_L   gp, 0(t1)
-
-       PTR_LA  t0, nlm_early_init_secondary
-       jalr    t0
-       nop
-
-       PTR_LA  t0, smp_bootstrap
-       jr      t0
-       nop
-END(prom_pre_boot_secondary_cpus)
-       __FINIT
-
-/*
- * NMI code, used for CPU wakeup, copied to reset entry
- */
-NESTED(nlm_boot_smp_nmi, 0, sp)
-       .set push
-       .set noat
-       .set mips64
-       .set noreorder
-
-       /* Clear the  NMI and BEV bits */
-       MFC0    k0, CP0_STATUS
-       li      k1, 0xffb7ffff
-       and     k0, k0, k1
-       MTC0    k0, CP0_STATUS
-
-       PTR_LA  k1, secondary_entry_point
-       PTR_L   k0, 0(k1)
-       jr      k0
-       nop
-       .set pop
-END(nlm_boot_smp_nmi)
diff --git a/arch/mips/netlogic/xlr/time.c b/arch/mips/netlogic/xlr/time.c
deleted file mode 100644 (file)
index 0d81b26..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
- * reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses.  You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the NetLogic
- * license below:
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <linux/init.h>
-
-#include <asm/time.h>
-#include <asm/netlogic/interrupt.h>
-#include <asm/netlogic/psb-bootinfo.h>
-
-unsigned int __cpuinit get_c0_compare_int(void)
-{
-       return IRQ_TIMER;
-}
-
-void __init plat_time_init(void)
-{
-       mips_hpt_frequency = nlm_prom_info.cpu_frequency;
-       pr_info("MIPS counter frequency [%ld]\n",
-               (unsigned long)mips_hpt_frequency);
-}
diff --git a/arch/mips/netlogic/xlr/wakeup.c b/arch/mips/netlogic/xlr/wakeup.c
new file mode 100644 (file)
index 0000000..db5d987
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
+ * reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the NetLogic
+ * license below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <linux/init.h>
+#include <linux/threads.h>
+
+#include <asm/asm.h>
+#include <asm/asm-offsets.h>
+#include <asm/mipsregs.h>
+#include <asm/addrspace.h>
+#include <asm/string.h>
+
+#include <asm/netlogic/haldefs.h>
+#include <asm/netlogic/common.h>
+#include <asm/netlogic/mips-extns.h>
+
+#include <asm/netlogic/xlr/iomap.h>
+#include <asm/netlogic/xlr/pic.h>
+
+int __cpuinit xlr_wakeup_secondary_cpus(void)
+{
+       unsigned int i, boot_cpu;
+
+       /*
+        *  In case of RMI boot, hit with NMI to get the cores
+        *  from bootloader to linux code.
+        */
+       boot_cpu = hard_smp_processor_id();
+       nlm_set_nmi_handler(nlm_rmiboot_preboot);
+       for (i = 0; i < NR_CPUS; i++) {
+               if (i == boot_cpu || (nlm_cpumask & (1u << i)) == 0)
+                       continue;
+               nlm_pic_send_ipi(nlm_pic_base, i, 1, 1); /* send NMI */
+       }
+
+       return 0;
+}
diff --git a/arch/mips/netlogic/xlr/xlr_console.c b/arch/mips/netlogic/xlr/xlr_console.c
deleted file mode 100644 (file)
index 759df06..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
- * reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses.  You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the NetLogic
- * license below:
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <linux/types.h>
-#include <asm/netlogic/xlr/iomap.h>
-
-void prom_putchar(char c)
-{
-       nlm_reg_t *mmio;
-
-       mmio = netlogic_io_mmio(NETLOGIC_IO_UART_0_OFFSET);
-       while (netlogic_read_reg(mmio, 0x5) == 0)
-               ;
-       netlogic_write_reg(mmio, 0x0, c);
-}
index bb82cbdbc62a8329a887dd275d56043a2f043b1e..c3ac4b086eb203738d2c2bfdbd32b61171ded9ab 100644 (file)
@@ -19,6 +19,7 @@ obj-$(CONFIG_BCM47XX)         += pci-bcm47xx.o
 obj-$(CONFIG_BCM63XX)          += pci-bcm63xx.o fixup-bcm63xx.o \
                                        ops-bcm63xx.o
 obj-$(CONFIG_MIPS_ALCHEMY)     += pci-alchemy.o
+obj-$(CONFIG_SOC_AR724X)       += pci-ath724x.o
 
 #
 # These are still pretty much in the old state, watch, go blind.
@@ -55,7 +56,7 @@ obj-$(CONFIG_ZAO_CAPCELLA)    += fixup-capcella.o
 obj-$(CONFIG_WR_PPMC)          += fixup-wrppmc.o
 obj-$(CONFIG_MIKROTIK_RB532)   += pci-rc32434.o ops-rc32434.o fixup-rc32434.o
 obj-$(CONFIG_CPU_CAVIUM_OCTEON)        += pci-octeon.o pcie-octeon.o
-obj-$(CONFIG_NLM_XLR)          += pci-xlr.o
+obj-$(CONFIG_CPU_XLR)          += pci-xlr.o
 
 ifdef CONFIG_PCI_MSI
 obj-$(CONFIG_CPU_CAVIUM_OCTEON)        += msi-octeon.o
index 5d530f89d87223e86965eb0b013923a461263d32..d37be36dc659b4df1f3b22787f84c6908bc5eb45 100644 (file)
@@ -162,7 +162,7 @@ msi_irq_allocated:
                msg.address_hi = (0 + CVMX_NPEI_PCIE_MSI_RCV) >> 32;
                break;
        default:
-               panic("arch_setup_msi_irq: Invalid octeon_dma_bar_type\n");
+               panic("arch_setup_msi_irq: Invalid octeon_dma_bar_type");
        }
        msg.data = irq - OCTEON_IRQ_MSI_BIT0;
 
index b5ce041cdafb54667b7c11738892ab7e9020000a..ec125bed721c5f616fb45493cf827d465ca2ced1 100644 (file)
 #include <linux/platform_device.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
+#include <linux/syscore_ops.h>
 #include <linux/vmalloc.h>
 
 #include <asm/mach-au1x00/au1000.h>
+#include <asm/tlbmisc.h>
 
 #ifdef CONFIG_DEBUG_PCI
 #define DBG(x...) printk(KERN_DEBUG x)
@@ -41,6 +43,12 @@ struct alchemy_pci_context {
        int (*board_pci_idsel)(unsigned int devsel, int assert);
 };
 
+/* for syscore_ops. There's only one PCI controller on Alchemy chips, so this
+ * should suffice for now.
+ */
+static struct alchemy_pci_context *__alchemy_pci_ctx;
+
+
 /* IO/MEM resources for PCI. Keep the memres in sync with __fixup_bigphys_addr
  * in arch/mips/alchemy/common/setup.c
  */
@@ -99,18 +107,6 @@ static int config_access(unsigned char access_type, struct pci_bus *bus,
                return -1;
        }
 
-       /* YAMON on all db1xxx boards wipes the TLB and writes zero to C0_wired
-        * on resume, clearing our wired entry.  Unfortunately the ->resume()
-        * callback is called way way way too late (and ->suspend() too early)
-        * to have them destroy and recreate it.  Instead just test if c0_wired
-        * is now lower than the index we retrieved before suspending and then
-        * recreate the entry if necessary.  Of course this is totally bonkers
-        * and breaks as soon as someone else adds another wired entry somewhere
-        * else.  Anyone have any ideas how to handle this better?
-        */
-       if (unlikely(read_c0_wired() < ctx->wired_entry))
-               alchemy_pci_wired_entry(ctx);
-
        local_irq_save(flags);
        r = __raw_readl(ctx->regs + PCI_REG_STATCMD) & 0x0000ffff;
        r |= PCI_STATCMD_STATUS(0x2000);
@@ -304,6 +300,62 @@ static int alchemy_pci_def_idsel(unsigned int devsel, int assert)
        return 1;       /* success */
 }
 
+/* save PCI controller register contents. */
+static int alchemy_pci_suspend(void)
+{
+       struct alchemy_pci_context *ctx = __alchemy_pci_ctx;
+       if (!ctx)
+               return 0;
+
+       ctx->pm[0]  = __raw_readl(ctx->regs + PCI_REG_CMEM);
+       ctx->pm[1]  = __raw_readl(ctx->regs + PCI_REG_CONFIG) & 0x0009ffff;
+       ctx->pm[2]  = __raw_readl(ctx->regs + PCI_REG_B2BMASK_CCH);
+       ctx->pm[3]  = __raw_readl(ctx->regs + PCI_REG_B2BBASE0_VID);
+       ctx->pm[4]  = __raw_readl(ctx->regs + PCI_REG_B2BBASE1_SID);
+       ctx->pm[5]  = __raw_readl(ctx->regs + PCI_REG_MWMASK_DEV);
+       ctx->pm[6]  = __raw_readl(ctx->regs + PCI_REG_MWBASE_REV_CCL);
+       ctx->pm[7]  = __raw_readl(ctx->regs + PCI_REG_ID);
+       ctx->pm[8]  = __raw_readl(ctx->regs + PCI_REG_CLASSREV);
+       ctx->pm[9]  = __raw_readl(ctx->regs + PCI_REG_PARAM);
+       ctx->pm[10] = __raw_readl(ctx->regs + PCI_REG_MBAR);
+       ctx->pm[11] = __raw_readl(ctx->regs + PCI_REG_TIMEOUT);
+
+       return 0;
+}
+
+static void alchemy_pci_resume(void)
+{
+       struct alchemy_pci_context *ctx = __alchemy_pci_ctx;
+       if (!ctx)
+               return;
+
+       __raw_writel(ctx->pm[0],  ctx->regs + PCI_REG_CMEM);
+       __raw_writel(ctx->pm[2],  ctx->regs + PCI_REG_B2BMASK_CCH);
+       __raw_writel(ctx->pm[3],  ctx->regs + PCI_REG_B2BBASE0_VID);
+       __raw_writel(ctx->pm[4],  ctx->regs + PCI_REG_B2BBASE1_SID);
+       __raw_writel(ctx->pm[5],  ctx->regs + PCI_REG_MWMASK_DEV);
+       __raw_writel(ctx->pm[6],  ctx->regs + PCI_REG_MWBASE_REV_CCL);
+       __raw_writel(ctx->pm[7],  ctx->regs + PCI_REG_ID);
+       __raw_writel(ctx->pm[8],  ctx->regs + PCI_REG_CLASSREV);
+       __raw_writel(ctx->pm[9],  ctx->regs + PCI_REG_PARAM);
+       __raw_writel(ctx->pm[10], ctx->regs + PCI_REG_MBAR);
+       __raw_writel(ctx->pm[11], ctx->regs + PCI_REG_TIMEOUT);
+       wmb();
+       __raw_writel(ctx->pm[1],  ctx->regs + PCI_REG_CONFIG);
+       wmb();
+
+       /* YAMON on all db1xxx boards wipes the TLB and writes zero to C0_wired
+        * on resume, making it necessary to recreate it as soon as possible.
+        */
+       ctx->wired_entry = 8191;        /* impossibly high value */
+       alchemy_pci_wired_entry(ctx);   /* install it */
+}
+
+static struct syscore_ops alchemy_pci_pmops = {
+       .suspend        = alchemy_pci_suspend,
+       .resume         = alchemy_pci_resume,
+};
+
 static int __devinit alchemy_pci_probe(struct platform_device *pdev)
 {
        struct alchemy_pci_platdata *pd = pdev->dev.platform_data;
@@ -396,7 +448,8 @@ static int __devinit alchemy_pci_probe(struct platform_device *pdev)
                ret = -ENOMEM;
                goto out4;
        }
-       ctx->wired_entry = 8192;        /* impossibly high value */
+       ctx->wired_entry = 8191;        /* impossibly high value */
+       alchemy_pci_wired_entry(ctx);   /* install it */
 
        set_io_port_base((unsigned long)ctx->alchemy_pci_ctrl.io_map_base);
 
@@ -408,7 +461,9 @@ static int __devinit alchemy_pci_probe(struct platform_device *pdev)
        __raw_writel(val, ctx->regs + PCI_REG_CONFIG);
        wmb();
 
+       __alchemy_pci_ctx = ctx;
        platform_set_drvdata(pdev, ctx);
+       register_syscore_ops(&alchemy_pci_pmops);
        register_pci_controller(&ctx->alchemy_pci_ctrl);
 
        return 0;
@@ -425,68 +480,11 @@ out:
        return ret;
 }
 
-
-#ifdef CONFIG_PM
-/* save PCI controller register contents. */
-static int alchemy_pci_suspend(struct device *dev)
-{
-       struct alchemy_pci_context *ctx = dev_get_drvdata(dev);
-
-       ctx->pm[0]  = __raw_readl(ctx->regs + PCI_REG_CMEM);
-       ctx->pm[1]  = __raw_readl(ctx->regs + PCI_REG_CONFIG) & 0x0009ffff;
-       ctx->pm[2]  = __raw_readl(ctx->regs + PCI_REG_B2BMASK_CCH);
-       ctx->pm[3]  = __raw_readl(ctx->regs + PCI_REG_B2BBASE0_VID);
-       ctx->pm[4]  = __raw_readl(ctx->regs + PCI_REG_B2BBASE1_SID);
-       ctx->pm[5]  = __raw_readl(ctx->regs + PCI_REG_MWMASK_DEV);
-       ctx->pm[6]  = __raw_readl(ctx->regs + PCI_REG_MWBASE_REV_CCL);
-       ctx->pm[7]  = __raw_readl(ctx->regs + PCI_REG_ID);
-       ctx->pm[8]  = __raw_readl(ctx->regs + PCI_REG_CLASSREV);
-       ctx->pm[9]  = __raw_readl(ctx->regs + PCI_REG_PARAM);
-       ctx->pm[10] = __raw_readl(ctx->regs + PCI_REG_MBAR);
-       ctx->pm[11] = __raw_readl(ctx->regs + PCI_REG_TIMEOUT);
-
-       return 0;
-}
-
-static int alchemy_pci_resume(struct device *dev)
-{
-       struct alchemy_pci_context *ctx = dev_get_drvdata(dev);
-
-       __raw_writel(ctx->pm[0],  ctx->regs + PCI_REG_CMEM);
-       __raw_writel(ctx->pm[2],  ctx->regs + PCI_REG_B2BMASK_CCH);
-       __raw_writel(ctx->pm[3],  ctx->regs + PCI_REG_B2BBASE0_VID);
-       __raw_writel(ctx->pm[4],  ctx->regs + PCI_REG_B2BBASE1_SID);
-       __raw_writel(ctx->pm[5],  ctx->regs + PCI_REG_MWMASK_DEV);
-       __raw_writel(ctx->pm[6],  ctx->regs + PCI_REG_MWBASE_REV_CCL);
-       __raw_writel(ctx->pm[7],  ctx->regs + PCI_REG_ID);
-       __raw_writel(ctx->pm[8],  ctx->regs + PCI_REG_CLASSREV);
-       __raw_writel(ctx->pm[9],  ctx->regs + PCI_REG_PARAM);
-       __raw_writel(ctx->pm[10], ctx->regs + PCI_REG_MBAR);
-       __raw_writel(ctx->pm[11], ctx->regs + PCI_REG_TIMEOUT);
-       wmb();
-       __raw_writel(ctx->pm[1],  ctx->regs + PCI_REG_CONFIG);
-       wmb();
-
-       return 0;
-}
-
-static const struct dev_pm_ops alchemy_pci_pmops = {
-       .suspend        = alchemy_pci_suspend,
-       .resume         = alchemy_pci_resume,
-};
-
-#define ALCHEMY_PCICTL_PM      (&alchemy_pci_pmops)
-
-#else
-#define ALCHEMY_PCICTL_PM      NULL
-#endif
-
 static struct platform_driver alchemy_pcictl_driver = {
        .probe          = alchemy_pci_probe,
        .driver = {
                .name   = "alchemy-pci",
                .owner  = THIS_MODULE,
-               .pm     = ALCHEMY_PCICTL_PM,
        },
 };
 
diff --git a/arch/mips/pci/pci-ath724x.c b/arch/mips/pci/pci-ath724x.c
new file mode 100644 (file)
index 0000000..a4dd24a
--- /dev/null
@@ -0,0 +1,174 @@
+/*
+ *  Atheros 724x PCI support
+ *
+ *  Copyright (C) 2011 René Bolldorf <xsecute@googlemail.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License version 2 as published
+ *  by the Free Software Foundation.
+ */
+
+#include <linux/pci.h>
+#include <asm/mach-ath79/pci-ath724x.h>
+
+#define reg_read(_phys)                (*(unsigned int *) KSEG1ADDR(_phys))
+#define reg_write(_phys, _val) ((*(unsigned int *) KSEG1ADDR(_phys)) = (_val))
+
+#define ATH724X_PCI_DEV_BASE   0x14000000
+#define ATH724X_PCI_MEM_BASE   0x10000000
+#define ATH724X_PCI_MEM_SIZE   0x08000000
+
+static DEFINE_SPINLOCK(ath724x_pci_lock);
+static struct ath724x_pci_data *pci_data;
+static int pci_data_size;
+
+static int ath724x_pci_read(struct pci_bus *bus, unsigned int devfn, int where,
+                           int size, uint32_t *value)
+{
+       unsigned long flags, addr, tval, mask;
+
+       if (devfn)
+               return PCIBIOS_DEVICE_NOT_FOUND;
+
+       if (where & (size - 1))
+               return PCIBIOS_BAD_REGISTER_NUMBER;
+
+       spin_lock_irqsave(&ath724x_pci_lock, flags);
+
+       switch (size) {
+       case 1:
+               addr = where & ~3;
+               mask = 0xff000000 >> ((where % 4) * 8);
+               tval = reg_read(ATH724X_PCI_DEV_BASE + addr);
+               tval = tval & ~mask;
+               *value = (tval >> ((4 - (where % 4))*8));
+               break;
+       case 2:
+               addr = where & ~3;
+               mask = 0xffff0000 >> ((where % 4)*8);
+               tval = reg_read(ATH724X_PCI_DEV_BASE + addr);
+               tval = tval & ~mask;
+               *value = (tval >> ((4 - (where % 4))*8));
+               break;
+       case 4:
+               *value = reg_read(ATH724X_PCI_DEV_BASE + where);
+               break;
+       default:
+               spin_unlock_irqrestore(&ath724x_pci_lock, flags);
+
+               return PCIBIOS_BAD_REGISTER_NUMBER;
+       }
+
+       spin_unlock_irqrestore(&ath724x_pci_lock, flags);
+
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static int ath724x_pci_write(struct pci_bus *bus, unsigned int devfn, int where,
+                            int size, uint32_t value)
+{
+       unsigned long flags, tval, addr, mask;
+
+       if (devfn)
+               return PCIBIOS_DEVICE_NOT_FOUND;
+
+       if (where & (size - 1))
+               return PCIBIOS_BAD_REGISTER_NUMBER;
+
+       spin_lock_irqsave(&ath724x_pci_lock, flags);
+
+       switch (size) {
+       case 1:
+               addr = (ATH724X_PCI_DEV_BASE + where) & ~3;
+               mask = 0xff000000 >> ((where % 4)*8);
+               tval = reg_read(addr);
+               tval = tval & ~mask;
+               tval |= (value << ((4 - (where % 4))*8)) & mask;
+               reg_write(addr, tval);
+               break;
+       case 2:
+               addr = (ATH724X_PCI_DEV_BASE + where) & ~3;
+               mask = 0xffff0000 >> ((where % 4)*8);
+               tval = reg_read(addr);
+               tval = tval & ~mask;
+               tval |= (value << ((4 - (where % 4))*8)) & mask;
+               reg_write(addr, tval);
+               break;
+       case 4:
+               reg_write((ATH724X_PCI_DEV_BASE + where), value);
+               break;
+       default:
+               spin_unlock_irqrestore(&ath724x_pci_lock, flags);
+
+               return PCIBIOS_BAD_REGISTER_NUMBER;
+       }
+
+       spin_unlock_irqrestore(&ath724x_pci_lock, flags);
+
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static struct pci_ops ath724x_pci_ops = {
+       .read   = ath724x_pci_read,
+       .write  = ath724x_pci_write,
+};
+
+static struct resource ath724x_io_resource = {
+       .name   = "PCI IO space",
+       .start  = 0,
+       .end    = 0,
+       .flags  = IORESOURCE_IO,
+};
+
+static struct resource ath724x_mem_resource = {
+       .name   = "PCI memory space",
+       .start  = ATH724X_PCI_MEM_BASE,
+       .end    = ATH724X_PCI_MEM_BASE + ATH724X_PCI_MEM_SIZE - 1,
+       .flags  = IORESOURCE_MEM,
+};
+
+static struct pci_controller ath724x_pci_controller = {
+       .pci_ops        = &ath724x_pci_ops,
+       .io_resource    = &ath724x_io_resource,
+       .mem_resource   = &ath724x_mem_resource,
+};
+
+void ath724x_pci_add_data(struct ath724x_pci_data *data, int size)
+{
+       pci_data        = data;
+       pci_data_size   = size;
+}
+
+int __init pcibios_map_irq(const struct pci_dev *dev, uint8_t slot, uint8_t pin)
+{
+       unsigned int devfn = dev->devfn;
+       int irq = -1;
+
+       if (devfn > pci_data_size - 1)
+               return irq;
+
+       irq = pci_data[devfn].irq;
+
+       return irq;
+}
+
+int pcibios_plat_dev_init(struct pci_dev *dev)
+{
+       unsigned int devfn = dev->devfn;
+
+       if (devfn > pci_data_size - 1)
+               return PCIBIOS_DEVICE_NOT_FOUND;
+
+       dev->dev.platform_data = pci_data[devfn].pdata;
+
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static int __init ath724x_pcibios_init(void)
+{
+       register_pci_controller(&ath724x_pci_controller);
+
+       return PCIBIOS_SUCCESSFUL;
+}
+
+arch_initcall(ath724x_pcibios_init);
index 82e0fde1dba045865351bfca891248f57ecb9106..39eb7c417e2fadf4b1d3999f9b2af9c91934de84 100644 (file)
@@ -99,7 +99,7 @@ static int __init bcm63xx_pci_init(void)
        unsigned int mem_size;
        u32 val;
 
-       if (!BCMCPU_IS_6348() && !BCMCPU_IS_6358())
+       if (!BCMCPU_IS_6348() && !BCMCPU_IS_6358() && !BCMCPU_IS_6368())
                return -ENODEV;
 
        if (!bcm63xx_pci_enabled)
@@ -159,7 +159,7 @@ static int __init bcm63xx_pci_init(void)
        /* setup PCI to local bus access, used by PCI device to target
         * local RAM while bus mastering */
        bcm63xx_int_cfg_writel(0, PCI_BASE_ADDRESS_3);
-       if (BCMCPU_IS_6358())
+       if (BCMCPU_IS_6358() || BCMCPU_IS_6368())
                val = MPI_SP0_REMAP_ENABLE_MASK;
        else
                val = 0;
index ed1c54284b8f27feb9966c7fea4b55c77d5997de..52a1ba70b3b600a11572ccb62783a89cde78e0ae 100644 (file)
@@ -99,7 +99,7 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
         */
        pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, 64 / 4);
        /* Set latency timers for all devices */
-       pci_write_config_byte(dev, PCI_LATENCY_TIMER, 48);
+       pci_write_config_byte(dev, PCI_LATENCY_TIMER, 64);
 
        /* Enable reporting System errors and parity errors on all devices */
        /* Enable parity checking and error reporting */
@@ -109,7 +109,7 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
 
        if (dev->subordinate) {
                /* Set latency timers on sub bridges */
-               pci_write_config_byte(dev, PCI_SEC_LATENCY_TIMER, 48);
+               pci_write_config_byte(dev, PCI_SEC_LATENCY_TIMER, 64);
                /* More bridge error detection */
                pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &config);
                config |= PCI_BRIDGE_CTL_PARITY | PCI_BRIDGE_CTL_SERR;
@@ -121,14 +121,10 @@ int pcibios_plat_dev_init(struct pci_dev *dev)
        if (pos) {
                /* Update Device Control */
                pci_read_config_word(dev, pos + PCI_EXP_DEVCTL, &config);
-               /* Correctable Error Reporting */
-               config |= PCI_EXP_DEVCTL_CERE;
-               /* Non-Fatal Error Reporting */
-               config |= PCI_EXP_DEVCTL_NFERE;
-               /* Fatal Error Reporting */
-               config |= PCI_EXP_DEVCTL_FERE;
-               /* Unsupported Request */
-               config |= PCI_EXP_DEVCTL_URRE;
+               config |= PCI_EXP_DEVCTL_CERE; /* Correctable Error Reporting */
+               config |= PCI_EXP_DEVCTL_NFERE; /* Non-Fatal Error Reporting */
+               config |= PCI_EXP_DEVCTL_FERE;  /* Fatal Error Reporting */
+               config |= PCI_EXP_DEVCTL_URRE;  /* Unsupported Request */
                pci_write_config_word(dev, pos + PCI_EXP_DEVCTL, config);
        }
 
index 38fece16c4357921ce42db7b49a4aea35841fdea..3d701a962ef409928e3c149f00e6b4ad7b6739e2 100644 (file)
 #include <linux/pci.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
+#include <linux/msi.h>
 #include <linux/mm.h>
+#include <linux/irq.h>
+#include <linux/irqdesc.h>
 #include <linux/console.h>
 
 #include <asm/io.h>
 
 #include <asm/netlogic/interrupt.h>
+#include <asm/netlogic/haldefs.h>
+
+#include <asm/netlogic/xlr/msidef.h>
 #include <asm/netlogic/xlr/iomap.h>
 #include <asm/netlogic/xlr/pic.h>
 #include <asm/netlogic/xlr/xlr.h>
@@ -150,7 +156,7 @@ struct pci_controller nlm_pci_controller = {
        .io_offset      = 0x00000000UL,
 };
 
-int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+static int get_irq_vector(const struct pci_dev *dev)
 {
        if (!nlm_chip_is_xls())
                return  PIC_PCIX_IRQ;   /* for XLR just one IRQ*/
@@ -182,6 +188,101 @@ int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
        return 0;
 }
 
+#ifdef CONFIG_PCI_MSI
+void destroy_irq(unsigned int irq)
+{
+           /* nothing to do yet */
+}
+
+void arch_teardown_msi_irq(unsigned int irq)
+{
+       destroy_irq(irq);
+}
+
+int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
+{
+       struct msi_msg msg;
+       int irq, ret;
+
+       irq = get_irq_vector(dev);
+       if (irq <= 0)
+               return 1;
+
+       msg.address_hi = MSI_ADDR_BASE_HI;
+       msg.address_lo = MSI_ADDR_BASE_LO   |
+               MSI_ADDR_DEST_MODE_PHYSICAL |
+               MSI_ADDR_REDIRECTION_CPU;
+
+       msg.data = MSI_DATA_TRIGGER_EDGE |
+               MSI_DATA_LEVEL_ASSERT    |
+               MSI_DATA_DELIVERY_FIXED;
+
+       ret = irq_set_msi_desc(irq, desc);
+       if (ret < 0) {
+               destroy_irq(irq);
+               return ret;
+       }
+
+       write_msi_msg(irq, &msg);
+       return 0;
+}
+#endif
+
+/* Extra ACK needed for XLR on chip PCI controller */
+static void xlr_pci_ack(struct irq_data *d)
+{
+       uint64_t pcibase = nlm_mmio_base(NETLOGIC_IO_PCIX_OFFSET);
+
+       nlm_read_reg(pcibase, (0x140 >> 2));
+}
+
+/* Extra ACK needed for XLS on chip PCIe controller */
+static void xls_pcie_ack(struct irq_data *d)
+{
+       uint64_t pciebase_le = nlm_mmio_base(NETLOGIC_IO_PCIE_1_OFFSET);
+
+       switch (d->irq) {
+       case PIC_PCIE_LINK0_IRQ:
+               nlm_write_reg(pciebase_le, (0x90 >> 2), 0xffffffff);
+               break;
+       case PIC_PCIE_LINK1_IRQ:
+               nlm_write_reg(pciebase_le, (0x94 >> 2), 0xffffffff);
+               break;
+       case PIC_PCIE_LINK2_IRQ:
+               nlm_write_reg(pciebase_le, (0x190 >> 2), 0xffffffff);
+               break;
+       case PIC_PCIE_LINK3_IRQ:
+               nlm_write_reg(pciebase_le, (0x194 >> 2), 0xffffffff);
+               break;
+       }
+}
+
+/* For XLS B silicon, the 3,4 PCI interrupts are different */
+static void xls_pcie_ack_b(struct irq_data *d)
+{
+       uint64_t pciebase_le = nlm_mmio_base(NETLOGIC_IO_PCIE_1_OFFSET);
+
+       switch (d->irq) {
+       case PIC_PCIE_LINK0_IRQ:
+               nlm_write_reg(pciebase_le, (0x90 >> 2), 0xffffffff);
+               break;
+       case PIC_PCIE_LINK1_IRQ:
+               nlm_write_reg(pciebase_le, (0x94 >> 2), 0xffffffff);
+               break;
+       case PIC_PCIE_XLSB0_LINK2_IRQ:
+               nlm_write_reg(pciebase_le, (0x190 >> 2), 0xffffffff);
+               break;
+       case PIC_PCIE_XLSB0_LINK3_IRQ:
+               nlm_write_reg(pciebase_le, (0x194 >> 2), 0xffffffff);
+               break;
+       }
+}
+
+int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+{
+       return get_irq_vector(dev);
+}
+
 /* Do platform specific device initialization at pci_enable_device() time */
 int pcibios_plat_dev_init(struct pci_dev *dev)
 {
@@ -204,6 +305,31 @@ static int __init pcibios_init(void)
        pr_info("Registering XLR/XLS PCIX/PCIE Controller.\n");
        register_pci_controller(&nlm_pci_controller);
 
+       /*
+        * For PCI interrupts, we need to ack the PCI controller too, overload
+        * irq handler data to do this
+        */
+       if (nlm_chip_is_xls()) {
+               if (nlm_chip_is_xls_b()) {
+                       irq_set_handler_data(PIC_PCIE_LINK0_IRQ,
+                                                       xls_pcie_ack_b);
+                       irq_set_handler_data(PIC_PCIE_LINK1_IRQ,
+                                                       xls_pcie_ack_b);
+                       irq_set_handler_data(PIC_PCIE_XLSB0_LINK2_IRQ,
+                                                       xls_pcie_ack_b);
+                       irq_set_handler_data(PIC_PCIE_XLSB0_LINK3_IRQ,
+                                                       xls_pcie_ack_b);
+               } else {
+                       irq_set_handler_data(PIC_PCIE_LINK0_IRQ, xls_pcie_ack);
+                       irq_set_handler_data(PIC_PCIE_LINK1_IRQ, xls_pcie_ack);
+                       irq_set_handler_data(PIC_PCIE_LINK2_IRQ, xls_pcie_ack);
+                       irq_set_handler_data(PIC_PCIE_LINK3_IRQ, xls_pcie_ack);
+               }
+       } else {
+               /* XLR PCI controller ACK */
+               irq_set_handler_data(PIC_PCIE_XLSB0_LINK3_IRQ, xlr_pci_ack);
+       }
+
        return 0;
 }
 
index 0583c463e5f19137b794b2772910ad5b904e98d8..fdb4d558c0cc0d0b40332d6e38b37c33bc8a3169 100644 (file)
@@ -3,7 +3,7 @@
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  *
- * Copyright (C) 2007, 2008 Cavium Networks
+ * Copyright (C) 2007, 2008, 2009, 2010, 2011 Cavium Networks
  */
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/time.h>
 #include <linux/delay.h>
+#include <linux/module.h>
 
 #include <asm/octeon/octeon.h>
 #include <asm/octeon/cvmx-npei-defs.h>
 #include <asm/octeon/cvmx-pciercx-defs.h>
 #include <asm/octeon/cvmx-pescx-defs.h>
 #include <asm/octeon/cvmx-pexp-defs.h>
+#include <asm/octeon/cvmx-pemx-defs.h>
+#include <asm/octeon/cvmx-dpi-defs.h>
+#include <asm/octeon/cvmx-sli-defs.h>
+#include <asm/octeon/cvmx-sriox-defs.h>
 #include <asm/octeon/cvmx-helper-errata.h>
 #include <asm/octeon/pci-octeon.h>
 
+#define MRRS_CN5XXX 0 /* 128 byte Max Read Request Size */
+#define MPS_CN5XXX  0 /* 128 byte Max Packet Size (Limit of most PCs) */
+#define MRRS_CN6XXX 3 /* 1024 byte Max Read Request Size */
+#define MPS_CN6XXX  0 /* 128 byte Max Packet Size (Limit of most PCs) */
+
+/* Module parameter to disable PCI probing */
+static int pcie_disable;
+module_param(pcie_disable, int, S_IRUGO);
+
+static int enable_pcie_14459_war;
+static int enable_pcie_bus_num_war[2];
+
 union cvmx_pcie_address {
        uint64_t u64;
        struct {
@@ -75,6 +92,8 @@ union cvmx_pcie_address {
        } mem;
 };
 
+static int cvmx_pcie_rc_initialize(int pcie_port);
+
 #include <dma-coherence.h>
 
 /**
@@ -154,12 +173,21 @@ static inline uint64_t cvmx_pcie_get_mem_size(int pcie_port)
  */
 static uint32_t cvmx_pcie_cfgx_read(int pcie_port, uint32_t cfg_offset)
 {
-       union cvmx_pescx_cfg_rd pescx_cfg_rd;
-       pescx_cfg_rd.u64 = 0;
-       pescx_cfg_rd.s.addr = cfg_offset;
-       cvmx_write_csr(CVMX_PESCX_CFG_RD(pcie_port), pescx_cfg_rd.u64);
-       pescx_cfg_rd.u64 = cvmx_read_csr(CVMX_PESCX_CFG_RD(pcie_port));
-       return pescx_cfg_rd.s.data;
+       if (octeon_has_feature(OCTEON_FEATURE_NPEI)) {
+               union cvmx_pescx_cfg_rd pescx_cfg_rd;
+               pescx_cfg_rd.u64 = 0;
+               pescx_cfg_rd.s.addr = cfg_offset;
+               cvmx_write_csr(CVMX_PESCX_CFG_RD(pcie_port), pescx_cfg_rd.u64);
+               pescx_cfg_rd.u64 = cvmx_read_csr(CVMX_PESCX_CFG_RD(pcie_port));
+               return pescx_cfg_rd.s.data;
+       } else {
+               union cvmx_pemx_cfg_rd 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;
+       }
 }
 
 /**
@@ -173,11 +201,19 @@ static uint32_t cvmx_pcie_cfgx_read(int pcie_port, uint32_t cfg_offset)
 static void cvmx_pcie_cfgx_write(int pcie_port, uint32_t cfg_offset,
                                 uint32_t val)
 {
-       union cvmx_pescx_cfg_wr pescx_cfg_wr;
-       pescx_cfg_wr.u64 = 0;
-       pescx_cfg_wr.s.addr = cfg_offset;
-       pescx_cfg_wr.s.data = val;
-       cvmx_write_csr(CVMX_PESCX_CFG_WR(pcie_port), pescx_cfg_wr.u64);
+       if (octeon_has_feature(OCTEON_FEATURE_NPEI)) {
+               union cvmx_pescx_cfg_wr pescx_cfg_wr;
+               pescx_cfg_wr.u64 = 0;
+               pescx_cfg_wr.s.addr = cfg_offset;
+               pescx_cfg_wr.s.data = val;
+               cvmx_write_csr(CVMX_PESCX_CFG_WR(pcie_port), pescx_cfg_wr.u64);
+       } else {
+               union cvmx_pemx_cfg_wr 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);
+       }
 }
 
 /**
@@ -348,7 +384,6 @@ static void cvmx_pcie_config_write32(int pcie_port, int bus, int dev, int fn,
 static void __cvmx_pcie_rc_initialize_config_space(int pcie_port)
 {
        union cvmx_pciercx_cfg030 pciercx_cfg030;
-       union cvmx_npei_ctl_status2 npei_ctl_status2;
        union cvmx_pciercx_cfg070 pciercx_cfg070;
        union cvmx_pciercx_cfg001 pciercx_cfg001;
        union cvmx_pciercx_cfg032 pciercx_cfg032;
@@ -365,21 +400,21 @@ static void __cvmx_pcie_rc_initialize_config_space(int pcie_port)
        /* 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]) */
-       pciercx_cfg030.u32 =
-               cvmx_pcie_cfgx_read(pcie_port, CVMX_PCIERCX_CFG030(pcie_port));
-       /*
-        * Max payload size = 128 bytes for best Octeon DMA
-        * performance.
-        */
-       pciercx_cfg030.s.mps = 0;
+
+       pciercx_cfg030.u32 = cvmx_pcie_cfgx_read(pcie_port, CVMX_PCIERCX_CFG030(pcie_port));
+       if (OCTEON_IS_MODEL(OCTEON_CN5XXX)) {
+               pciercx_cfg030.s.mps = MPS_CN5XXX;
+               pciercx_cfg030.s.mrrs = MRRS_CN5XXX;
+       } else {
+               pciercx_cfg030.s.mps = MPS_CN6XXX;
+               pciercx_cfg030.s.mrrs = MRRS_CN6XXX;
+       }
        /*
-        * Max read request size = 128 bytes for best Octeon DMA
-        * performance.
+        * Enable relaxed order processing. This will allow devices to
+        * affect read response ordering.
         */
-       pciercx_cfg030.s.mrrs = 0;
-       /* Enable relaxed ordering. */
        pciercx_cfg030.s.ro_en = 1;
-       /* Enable no snoop. */
+       /* Enable no snoop processing. Not used by Octeon */
        pciercx_cfg030.s.ns_en = 1;
        /* Correctable error reporting enable. */
        pciercx_cfg030.s.ce_en = 1;
@@ -389,50 +424,67 @@ static void __cvmx_pcie_rc_initialize_config_space(int pcie_port)
        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);
+       cvmx_pcie_cfgx_write(pcie_port, CVMX_PCIERCX_CFG030(pcie_port), pciercx_cfg030.u32);
 
-       /*
-        * Max Payload Size (NPEI_CTL_STATUS2[MPS]) must match
-        * PCIE*_CFG030[MPS]
-        *
-        * Max Read Request Size (NPEI_CTL_STATUS2[MRRS]) must not
-        * exceed PCIE*_CFG030[MRRS].
-        */
-       npei_ctl_status2.u64 = cvmx_read_csr(CVMX_PEXP_NPEI_CTL_STATUS2);
-       /* Max payload size = 128 bytes for best Octeon DMA performance */
-       npei_ctl_status2.s.mps = 0;
-       /* Max read request size = 128 bytes for best Octeon DMA performance */
-       npei_ctl_status2.s.mrrs = 0;
-       if (pcie_port)
-               npei_ctl_status2.s.c1_b1_s = 3; /* Port1 BAR1 Size 256MB */
-       else
-               npei_ctl_status2.s.c0_b1_s = 3; /* Port0 BAR1 Size 256MB */
-       cvmx_write_csr(CVMX_PEXP_NPEI_CTL_STATUS2, npei_ctl_status2.u64);
+
+       if (octeon_has_feature(OCTEON_FEATURE_NPEI)) {
+               union cvmx_npei_ctl_status2 npei_ctl_status2;
+               /*
+                * Max Payload Size (NPEI_CTL_STATUS2[MPS]) must match
+                * PCIE*_CFG030[MPS].  Max Read Request Size
+                * (NPEI_CTL_STATUS2[MRRS]) must not exceed
+                * PCIE*_CFG030[MRRS]
+                */
+               npei_ctl_status2.u64 = cvmx_read_csr(CVMX_PEXP_NPEI_CTL_STATUS2);
+               /* Max payload size = 128 bytes for best Octeon DMA performance */
+               npei_ctl_status2.s.mps = MPS_CN5XXX;
+               /* Max read request size = 128 bytes for best Octeon DMA performance */
+               npei_ctl_status2.s.mrrs = MRRS_CN5XXX;
+               if (pcie_port)
+                       npei_ctl_status2.s.c1_b1_s = 3; /* Port1 BAR1 Size 256MB */
+               else
+                       npei_ctl_status2.s.c0_b1_s = 3; /* Port0 BAR1 Size 256MB */
+
+               cvmx_write_csr(CVMX_PEXP_NPEI_CTL_STATUS2, npei_ctl_status2.u64);
+       } else {
+               /*
+                * 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].
+                */
+               union cvmx_dpi_sli_prtx_cfg prt_cfg;
+               union cvmx_sli_s2m_portx_ctl 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));
+               sli_s2m_portx_ctl.s.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]) */
-       pciercx_cfg070.u32 =
-               cvmx_pcie_cfgx_read(pcie_port, CVMX_PCIERCX_CFG070(pcie_port));
+       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);
+       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])
+        * 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])
         */
-       pciercx_cfg001.u32 =
-               cvmx_pcie_cfgx_read(pcie_port, CVMX_PCIERCX_CFG001(pcie_port));
+       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);
+       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) */
@@ -440,14 +492,11 @@ static void __cvmx_pcie_rc_initialize_config_space(int pcie_port)
        /* 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]) */
-       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);
 
-       /* Entrance Latencies (PCIE*_CFG451[L0EL,L1EL]) */
+       /* Active State Power Management (PCIE*_CFG032[ASLPC]) */
+       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
@@ -462,8 +511,8 @@ static void __cvmx_pcie_rc_initialize_config_space(int pcie_port)
        pciercx_cfg006.s.pbnum = 1;
        pciercx_cfg006.s.sbnum = 1;
        pciercx_cfg006.s.subbnum = 1;
-       cvmx_pcie_cfgx_write(pcie_port, CVMX_PCIERCX_CFG006(pcie_port),
-                            pciercx_cfg006.u32);
+       cvmx_pcie_cfgx_write(pcie_port, CVMX_PCIERCX_CFG006(pcie_port), pciercx_cfg006.u32);
+
 
        /*
         * Memory-mapped I/O BAR (PCIERCn_CFG008)
@@ -473,8 +522,8 @@ static void __cvmx_pcie_rc_initialize_config_space(int pcie_port)
        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);
+       cvmx_pcie_cfgx_write(pcie_port, CVMX_PCIERCX_CFG008(pcie_port), pciercx_cfg008.u32);
+
 
        /*
         * Prefetchable BAR (PCIERCn_CFG009,PCIERCn_CFG010,PCIERCn_CFG011)
@@ -482,72 +531,51 @@ static void __cvmx_pcie_rc_initialize_config_space(int pcie_port)
         * PCIERCn_CFG011[UMEM_LIMIT],PCIERCn_CFG009[LMEM_LIMIT] <
         * PCIERCn_CFG010[UMEM_BASE],PCIERCn_CFG009[LMEM_BASE]
         */
-       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.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);
+       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])
-        */
-       pciercx_cfg035.u32 =
-               cvmx_pcie_cfgx_read(pcie_port, CVMX_PCIERCX_CFG035(pcie_port));
-       /* System error on correctable error enable. */
-       pciercx_cfg035.s.secee = 1;
-       /* System error on fatal error enable. */
-       pciercx_cfg035.s.sefee = 1;
-       /* System error on non-fatal error enable. */
-       pciercx_cfg035.s.senfee = 1;
-       /* PME interrupt enable. */
-       pciercx_cfg035.s.pmeie = 1;
-       cvmx_pcie_cfgx_write(pcie_port, CVMX_PCIERCX_CFG035(pcie_port),
-                            pciercx_cfg035.u32);
+       */
+       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])
         */
-       pciercx_cfg075.u32 =
-               cvmx_pcie_cfgx_read(pcie_port, CVMX_PCIERCX_CFG075(pcie_port));
-       /* Correctable error reporting enable. */
-       pciercx_cfg075.s.cere = 1;
-       /* Non-fatal error reporting enable. */
-       pciercx_cfg075.s.nfere = 1;
-       /* Fatal error reporting enable. */
-       pciercx_cfg075.s.fere = 1;
-       cvmx_pcie_cfgx_write(pcie_port, CVMX_PCIERCX_CFG075(pcie_port),
-                            pciercx_cfg075.u32);
+       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],
+       /*
+        * HP Interrupt Enables (PCIERCn_CFG034[HPINT_EN],
         * PCIERCn_CFG034[DLLS_EN,CCINT_EN])
         */
-       pciercx_cfg034.u32 =
-               cvmx_pcie_cfgx_read(pcie_port, CVMX_PCIERCX_CFG034(pcie_port));
-       /* Hot-plug interrupt enable. */
-       pciercx_cfg034.s.hpint_en = 1;
-       /* Data Link Layer state changed enable */
-       pciercx_cfg034.s.dlls_en = 1;
-       /* Command completed interrupt enable. */
-       pciercx_cfg034.s.ccint_en = 1;
-       cvmx_pcie_cfgx_write(pcie_port, CVMX_PCIERCX_CFG034(pcie_port),
-                            pciercx_cfg034.u32);
+       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);
 }
 
 /**
- * Initialize a host mode PCIe link. This function takes a PCIe
+ * Initialize a host mode PCIe gen 1 link. This function takes a PCIe
  * port from reset to a link up state. Software can then begin
  * configuring the rest of the link.
  *
@@ -555,7 +583,7 @@ static void __cvmx_pcie_rc_initialize_config_space(int pcie_port)
  *
  * Returns Zero on success
  */
-static int __cvmx_pcie_rc_initialize_link(int pcie_port)
+static int __cvmx_pcie_rc_initialize_link_gen1(int pcie_port)
 {
        uint64_t start_cycle;
        union cvmx_pescx_ctl_status pescx_ctl_status;
@@ -564,18 +592,15 @@ static int __cvmx_pcie_rc_initialize_link(int pcie_port)
        union cvmx_pciercx_cfg448 pciercx_cfg448;
 
        /* Set the lane width */
-       pciercx_cfg452.u32 =
-           cvmx_pcie_cfgx_read(pcie_port, CVMX_PCIERCX_CFG452(pcie_port));
+       pciercx_cfg452.u32 = cvmx_pcie_cfgx_read(pcie_port, CVMX_PCIERCX_CFG452(pcie_port));
        pescx_ctl_status.u64 = cvmx_read_csr(CVMX_PESCX_CTL_STATUS(pcie_port));
-       if (pescx_ctl_status.s.qlm_cfg == 0) {
+       if (pescx_ctl_status.s.qlm_cfg == 0)
                /* We're in 8 lane (56XX) or 4 lane (54XX) mode */
                pciercx_cfg452.s.lme = 0xf;
-       } else {
+       else
                /* We're in 4 lane (56XX) or 2 lane (52XX) mode */
                pciercx_cfg452.s.lme = 0x7;
-       }
-       cvmx_pcie_cfgx_write(pcie_port, CVMX_PCIERCX_CFG452(pcie_port),
-                            pciercx_cfg452.u32);
+       cvmx_pcie_cfgx_write(pcie_port, CVMX_PCIERCX_CFG452(pcie_port), pciercx_cfg452.u32);
 
        /*
         * CN52XX pass 1.x has an errata where length mismatches on UR
@@ -584,19 +609,15 @@ static int __cvmx_pcie_rc_initialize_link(int pcie_port)
         */
        if (OCTEON_IS_MODEL(OCTEON_CN52XX_PASS1_X)) {
                union cvmx_pciercx_cfg455 pciercx_cfg455;
-               pciercx_cfg455.u32 =
-                   cvmx_pcie_cfgx_read(pcie_port,
-                                       CVMX_PCIERCX_CFG455(pcie_port));
+               pciercx_cfg455.u32 = cvmx_pcie_cfgx_read(pcie_port, CVMX_PCIERCX_CFG455(pcie_port));
                pciercx_cfg455.s.m_cpl_len_err = 1;
-               cvmx_pcie_cfgx_write(pcie_port, CVMX_PCIERCX_CFG455(pcie_port),
-                                    pciercx_cfg455.u32);
+               cvmx_pcie_cfgx_write(pcie_port, CVMX_PCIERCX_CFG455(pcie_port), pciercx_cfg455.u32);
        }
 
        /* Lane swap needs to be manually enabled for CN52XX */
        if (OCTEON_IS_MODEL(OCTEON_CN52XX) && (pcie_port == 1)) {
                pescx_ctl_status.s.lane_swp = 1;
-               cvmx_write_csr(CVMX_PESCX_CTL_STATUS(pcie_port),
-                              pescx_ctl_status.u64);
+               cvmx_write_csr(CVMX_PESCX_CTL_STATUS(pcie_port), pescx_ctl_status.u64);
        }
 
        /* Bring up the link */
@@ -612,24 +633,18 @@ static int __cvmx_pcie_rc_initialize_link(int pcie_port)
                __cvmx_helper_errata_qlm_disable_2nd_order_cdr(0);
 
        /* Wait for the link to come up */
-       cvmx_dprintf("PCIe: Waiting for port %d link\n", pcie_port);
        start_cycle = cvmx_get_cycle();
        do {
-               if (cvmx_get_cycle() - start_cycle >
-                   2 * cvmx_sysinfo_get()->cpu_clock_hz) {
-                       cvmx_dprintf("PCIe: Port %d link timeout\n",
-                                    pcie_port);
+               if (cvmx_get_cycle() - start_cycle > 2 * octeon_get_clock_rate()) {
+                       cvmx_dprintf("PCIe: Port %d link timeout\n", pcie_port);
                        return -1;
                }
                cvmx_wait(10000);
-               pciercx_cfg032.u32 =
-                   cvmx_pcie_cfgx_read(pcie_port,
-                                       CVMX_PCIERCX_CFG032(pcie_port));
+               pciercx_cfg032.u32 = cvmx_pcie_cfgx_read(pcie_port, CVMX_PCIERCX_CFG032(pcie_port));
        } while (pciercx_cfg032.s.dlla == 0);
 
-       /* Display the link status */
-       cvmx_dprintf("PCIe: Port %d link active, %d lanes\n", pcie_port,
-                    pciercx_cfg032.s.nlw);
+       /* Clear all pending errors */
+       cvmx_write_csr(CVMX_PEXP_NPEI_INT_SUM, cvmx_read_csr(CVMX_PEXP_NPEI_INT_SUM));
 
        /*
         * Update the Replay Time Limit. Empirically, some PCIe
@@ -639,8 +654,7 @@ static int __cvmx_pcie_rc_initialize_link(int pcie_port)
         * 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));
+       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;
@@ -655,21 +669,28 @@ static int __cvmx_pcie_rc_initialize_link(int pcie_port)
                pciercx_cfg448.s.rtl = 258;
                break;
        }
-       cvmx_pcie_cfgx_write(pcie_port, CVMX_PCIERCX_CFG448(pcie_port),
-                            pciercx_cfg448.u32);
+       cvmx_pcie_cfgx_write(pcie_port, CVMX_PCIERCX_CFG448(pcie_port), pciercx_cfg448.u32);
 
        return 0;
 }
 
+static void __cvmx_increment_ba(union cvmx_sli_mem_access_subidx *pmas)
+{
+       if (OCTEON_IS_MODEL(OCTEON_CN68XX))
+               pmas->cn68xx.ba++;
+       else
+               pmas->cn63xx.ba++;
+}
+
 /**
- * Initialize a PCIe port for use in host(RC) mode. It doesn't
+ * Initialize a PCIe gen 1 port for use in host(RC) mode. It doesn't
  * enumerate the bus.
  *
  * @pcie_port: PCIe port to initialize
  *
  * Returns Zero on success
  */
-static int cvmx_pcie_rc_initialize(int pcie_port)
+static int __cvmx_pcie_rc_initialize_gen1(int pcie_port)
 {
        int i;
        int base;
@@ -682,16 +703,17 @@ static int cvmx_pcie_rc_initialize(int pcie_port)
        union cvmx_npei_mem_access_subidx mem_access_subid;
        union cvmx_npei_dbg_data npei_dbg_data;
        union cvmx_pescx_ctl_status2 pescx_ctl_status2;
+       union cvmx_pciercx_cfg032 pciercx_cfg032;
        union cvmx_npei_bar1_indexx bar1_index;
 
+retry:
        /*
         * Make sure we aren't trying to setup a target mode interface
         * in host mode.
         */
        npei_ctl_status.u64 = cvmx_read_csr(CVMX_PEXP_NPEI_CTL_STATUS);
        if ((pcie_port == 0) && !npei_ctl_status.s.host_mode) {
-               cvmx_dprintf("PCIe: ERROR: cvmx_pcie_rc_initialize() called "
-                            "on port0, but port0 is not in host mode\n");
+               cvmx_dprintf("PCIe: Port %d in endpoint mode\n", pcie_port);
                return -1;
        }
 
@@ -702,9 +724,7 @@ static int cvmx_pcie_rc_initialize(int pcie_port)
        if (OCTEON_IS_MODEL(OCTEON_CN52XX)) {
                npei_dbg_data.u64 = cvmx_read_csr(CVMX_PEXP_NPEI_DBG_DATA);
                if ((pcie_port == 1) && npei_dbg_data.cn52xx.qlm0_link_width) {
-                       cvmx_dprintf("PCIe: ERROR: cvmx_pcie_rc_initialize() "
-                                    "called on port1, but port1 is "
-                                    "disabled\n");
+                       cvmx_dprintf("PCIe: ERROR: cvmx_pcie_rc_initialize() called on port1, but port1 is disabled\n");
                        return -1;
                }
        }
@@ -733,7 +753,7 @@ static int cvmx_pcie_rc_initialize(int pcie_port)
                 * the board. As a workaround for this bug, we bring
                 * both PCIe ports out of reset at the same time
                 * instead of on separate calls. So for port 0, we
-                * bring both out of reset and do nothing on port 1.
+                * bring both out of reset and do nothing on port 1
                 */
                if (pcie_port == 0) {
                        ciu_soft_prst.u64 = cvmx_read_csr(CVMX_CIU_SOFT_PRST);
@@ -746,13 +766,10 @@ static int cvmx_pcie_rc_initialize(int pcie_port)
                        if (ciu_soft_prst.s.soft_prst == 0) {
                                /* Reset the ports */
                                ciu_soft_prst.s.soft_prst = 1;
-                               cvmx_write_csr(CVMX_CIU_SOFT_PRST,
-                                              ciu_soft_prst.u64);
-                               ciu_soft_prst.u64 =
-                                   cvmx_read_csr(CVMX_CIU_SOFT_PRST1);
+                               cvmx_write_csr(CVMX_CIU_SOFT_PRST, ciu_soft_prst.u64);
+                               ciu_soft_prst.u64 = cvmx_read_csr(CVMX_CIU_SOFT_PRST1);
                                ciu_soft_prst.s.soft_prst = 1;
-                               cvmx_write_csr(CVMX_CIU_SOFT_PRST1,
-                                              ciu_soft_prst.u64);
+                               cvmx_write_csr(CVMX_CIU_SOFT_PRST1, ciu_soft_prst.u64);
                                /* Wait until pcie resets the ports. */
                                udelay(2000);
                        }
@@ -782,11 +799,9 @@ static int cvmx_pcie_rc_initialize(int pcie_port)
                        /* Reset the port */
                        ciu_soft_prst.s.soft_prst = 1;
                        if (pcie_port)
-                               cvmx_write_csr(CVMX_CIU_SOFT_PRST1,
-                                              ciu_soft_prst.u64);
+                               cvmx_write_csr(CVMX_CIU_SOFT_PRST1, ciu_soft_prst.u64);
                        else
-                               cvmx_write_csr(CVMX_CIU_SOFT_PRST,
-                                              ciu_soft_prst.u64);
+                               cvmx_write_csr(CVMX_CIU_SOFT_PRST, ciu_soft_prst.u64);
                        /* Wait until pcie resets the ports. */
                        udelay(2000);
                }
@@ -808,25 +823,21 @@ static int cvmx_pcie_rc_initialize(int pcie_port)
         */
        cvmx_wait(400000);
 
-       /* PESCX_BIST_STATUS2[PCLK_RUN] was missing on pass 1 of CN56XX and
-          CN52XX, so we only probe it on newer chips */
-       if (!OCTEON_IS_MODEL(OCTEON_CN56XX_PASS1_X)
-           && !OCTEON_IS_MODEL(OCTEON_CN52XX_PASS1_X)) {
+       /*
+        * PESCX_BIST_STATUS2[PCLK_RUN] was missing on pass 1 of
+        * CN56XX and CN52XX, so we only probe it on newer chips
+        */
+       if (!OCTEON_IS_MODEL(OCTEON_CN56XX_PASS1_X) && !OCTEON_IS_MODEL(OCTEON_CN52XX_PASS1_X)) {
                /* Clear PCLK_RUN so we can check if the clock is running */
-               pescx_ctl_status2.u64 =
-                   cvmx_read_csr(CVMX_PESCX_CTL_STATUS2(pcie_port));
+               pescx_ctl_status2.u64 = cvmx_read_csr(CVMX_PESCX_CTL_STATUS2(pcie_port));
                pescx_ctl_status2.s.pclk_run = 1;
-               cvmx_write_csr(CVMX_PESCX_CTL_STATUS2(pcie_port),
-                              pescx_ctl_status2.u64);
-               /*
-                * Now that we cleared PCLK_RUN, wait for it to be set
-                * again telling us the clock is running.
+               cvmx_write_csr(CVMX_PESCX_CTL_STATUS2(pcie_port), pescx_ctl_status2.u64);
+               /* Now that we cleared PCLK_RUN, wait for it to be set
+                * again telling us the clock is running
                 */
                if (CVMX_WAIT_FOR_FIELD64(CVMX_PESCX_CTL_STATUS2(pcie_port),
-                                         union cvmx_pescx_ctl_status2,
-                                         pclk_run, ==, 1, 10000)) {
-                       cvmx_dprintf("PCIe: Port %d isn't clocked, skipping.\n",
-                                    pcie_port);
+                                         union cvmx_pescx_ctl_status2, pclk_run, ==, 1, 10000)) {
+                       cvmx_dprintf("PCIe: Port %d isn't clocked, skipping.\n", pcie_port);
                        return -1;
                }
        }
@@ -836,30 +847,26 @@ static int cvmx_pcie_rc_initialize(int pcie_port)
         * the board probably hasn't wired the clocks up and the
         * interface should be skipped.
         */
-       pescx_ctl_status2.u64 =
-           cvmx_read_csr(CVMX_PESCX_CTL_STATUS2(pcie_port));
+       pescx_ctl_status2.u64 = cvmx_read_csr(CVMX_PESCX_CTL_STATUS2(pcie_port));
        if (pescx_ctl_status2.s.pcierst) {
-               cvmx_dprintf("PCIe: Port %d stuck in reset, skipping.\n",
-                            pcie_port);
+               cvmx_dprintf("PCIe: Port %d stuck in reset, skipping.\n", pcie_port);
                return -1;
        }
 
        /*
-        * Check BIST2 status. If any bits are set skip this interface. This
-        * is an attempt to catch PCIE-813 on pass 1 parts.
+        * Check BIST2 status. If any bits are set skip this
+        * interface. This is an attempt to catch PCIE-813 on pass 1
+        * parts.
         */
-       pescx_bist_status2.u64 =
-           cvmx_read_csr(CVMX_PESCX_BIST_STATUS2(pcie_port));
+       pescx_bist_status2.u64 = cvmx_read_csr(CVMX_PESCX_BIST_STATUS2(pcie_port));
        if (pescx_bist_status2.u64) {
-               cvmx_dprintf("PCIe: Port %d BIST2 failed. Most likely this "
-                            "port isn't hooked up, skipping.\n",
+               cvmx_dprintf("PCIe: Port %d BIST2 failed. Most likely this port isn't hooked up, skipping.\n",
                             pcie_port);
                return -1;
        }
 
        /* Check BIST status */
-       pescx_bist_status.u64 =
-           cvmx_read_csr(CVMX_PESCX_BIST_STATUS(pcie_port));
+       pescx_bist_status.u64 = cvmx_read_csr(CVMX_PESCX_BIST_STATUS(pcie_port));
        if (pescx_bist_status.u64)
                cvmx_dprintf("PCIe: BIST FAILED for port %d (0x%016llx)\n",
                             pcie_port, CAST64(pescx_bist_status.u64));
@@ -868,50 +875,37 @@ static int cvmx_pcie_rc_initialize(int pcie_port)
        __cvmx_pcie_rc_initialize_config_space(pcie_port);
 
        /* Bring the link up */
-       if (__cvmx_pcie_rc_initialize_link(pcie_port)) {
-               cvmx_dprintf
-                   ("PCIe: ERROR: cvmx_pcie_rc_initialize_link() failed\n");
+       if (__cvmx_pcie_rc_initialize_link_gen1(pcie_port)) {
+               cvmx_dprintf("PCIe: Failed to initialize port %d, probably the slot is empty\n",
+                            pcie_port);
                return -1;
        }
 
        /* Store merge control (NPEI_MEM_ACCESS_CTL[TIMER,MAX_WORD]) */
        npei_mem_access_ctl.u64 = cvmx_read_csr(CVMX_PEXP_NPEI_MEM_ACCESS_CTL);
-       /* Allow 16 words to combine */
-       npei_mem_access_ctl.s.max_word = 0;
-       /* Wait up to 127 cycles for more data */
-       npei_mem_access_ctl.s.timer = 127;
+       npei_mem_access_ctl.s.max_word = 0;     /* Allow 16 words to combine */
+       npei_mem_access_ctl.s.timer = 127;      /* Wait up to 127 cycles for more data */
        cvmx_write_csr(CVMX_PEXP_NPEI_MEM_ACCESS_CTL, npei_mem_access_ctl.u64);
 
        /* Setup Mem access SubDIDs */
        mem_access_subid.u64 = 0;
-       /* Port the request is sent to. */
-       mem_access_subid.s.port = pcie_port;
-       /* Due to an errata on pass 1 chips, no merging is allowed. */
-       mem_access_subid.s.nmerge = 1;
-       /* Endian-swap for Reads. */
-       mem_access_subid.s.esr = 1;
-       /* Endian-swap for Writes. */
-       mem_access_subid.s.esw = 1;
-       /* No Snoop for Reads. */
-       mem_access_subid.s.nsr = 1;
-       /* No Snoop for Writes. */
-       mem_access_subid.s.nsw = 1;
-       /* Disable Relaxed Ordering for Reads. */
-       mem_access_subid.s.ror = 0;
-       /* Disable Relaxed Ordering for Writes. */
-       mem_access_subid.s.row = 0;
-       /* PCIe Address Bits <63:34>. */
-       mem_access_subid.s.ba = 0;
+       mem_access_subid.s.port = pcie_port; /* Port the request is sent to. */
+       mem_access_subid.s.nmerge = 1;  /* Due to an errata on pass 1 chips, no merging is allowed. */
+       mem_access_subid.s.esr = 1;     /* Endian-swap for Reads. */
+       mem_access_subid.s.esw = 1;     /* Endian-swap for Writes. */
+       mem_access_subid.s.nsr = 0;     /* Enable Snooping for Reads. Octeon doesn't care, but devices might want this more conservative setting */
+       mem_access_subid.s.nsw = 0;     /* Enable Snoop for Writes. */
+       mem_access_subid.s.ror = 0;     /* Disable Relaxed Ordering for Reads. */
+       mem_access_subid.s.row = 0;     /* Disable Relaxed Ordering for Writes. */
+       mem_access_subid.s.ba = 0;      /* PCIe Adddress Bits <63:34>. */
 
        /*
         * 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_NPEI_MEM_ACCESS_SUBIDX(i),
-                              mem_access_subid.u64);
-               /* Set each SUBID to extend the addressable range */
-               mem_access_subid.s.ba += 1;
+               cvmx_write_csr(CVMX_PEXP_NPEI_MEM_ACCESS_SUBIDX(i), mem_access_subid.u64);
+               mem_access_subid.s.ba += 1; /* Set each SUBID to extend the addressable range */
        }
 
        /*
@@ -927,7 +921,7 @@ static int cvmx_pcie_rc_initialize(int pcie_port)
        /* Set Octeon's BAR0 to decode 0-16KB. It overlaps with Bar2 */
        cvmx_write_csr(CVMX_PESCX_P2N_BAR0_START(pcie_port), 0);
 
-       /* BAR1 follows BAR2 with a gap. */
+       /* BAR1 follows BAR2 with a gap so it has the same address as for gen2. */
        cvmx_write_csr(CVMX_PESCX_P2N_BAR1_START(pcie_port), CVMX_PCIE_BAR1_RC_BASE);
 
        bar1_index.u32 = 0;
@@ -992,13 +986,473 @@ static int cvmx_pcie_rc_initialize(int pcie_port)
                npei_ctl_port.s.waitl_com = 0;
                cvmx_write_csr(CVMX_PEXP_NPEI_CTL_PORT0, npei_ctl_port.u64);
        }
+
+       /*
+        * Both pass 1 and pass 2 of CN52XX and CN56XX have an errata
+        * that causes TLP ordering to not be preserved after multiple
+        * PCIe port resets. This code detects this fault and corrects
+        * it by aligning the TLP counters properly. Another link
+        * reset is then performed. See PCIE-13340
+        */
+       if (OCTEON_IS_MODEL(OCTEON_CN56XX_PASS2_X) ||
+           OCTEON_IS_MODEL(OCTEON_CN52XX_PASS2_X) ||
+           OCTEON_IS_MODEL(OCTEON_CN56XX_PASS1_X) ||
+           OCTEON_IS_MODEL(OCTEON_CN52XX_PASS1_X)) {
+               union cvmx_npei_dbg_data dbg_data;
+               int old_in_fif_p_count;
+               int in_fif_p_count;
+               int out_p_count;
+               int in_p_offset = (OCTEON_IS_MODEL(OCTEON_CN52XX_PASS1_X) || OCTEON_IS_MODEL(OCTEON_CN56XX_PASS1_X)) ? 4 : 1;
+               int i;
+
+               /*
+                * Choose a write address of 1MB. It should be
+                * harmless as all bars haven't been setup.
+                */
+               uint64_t write_address = (cvmx_pcie_get_mem_base_address(pcie_port) + 0x100000) | (1ull<<63);
+
+               /*
+                * Make sure at least in_p_offset have been executed before we try and
+                * read in_fif_p_count
+                */
+               i = in_p_offset;
+               while (i--) {
+                       cvmx_write64_uint32(write_address, 0);
+                       cvmx_wait(10000);
+               }
+
+               /*
+                * Read the IN_FIF_P_COUNT from the debug
+                * select. IN_FIF_P_COUNT can be unstable sometimes so
+                * read it twice with a write between the reads.  This
+                * way we can tell the value is good as it will
+                * increment by one due to the write
+                */
+               cvmx_write_csr(CVMX_PEXP_NPEI_DBG_SELECT, (pcie_port) ? 0xd7fc : 0xcffc);
+               cvmx_read_csr(CVMX_PEXP_NPEI_DBG_SELECT);
+               do {
+                       dbg_data.u64 = cvmx_read_csr(CVMX_PEXP_NPEI_DBG_DATA);
+                       old_in_fif_p_count = dbg_data.s.data & 0xff;
+                       cvmx_write64_uint32(write_address, 0);
+                       cvmx_wait(10000);
+                       dbg_data.u64 = cvmx_read_csr(CVMX_PEXP_NPEI_DBG_DATA);
+                       in_fif_p_count = dbg_data.s.data & 0xff;
+               } while (in_fif_p_count != ((old_in_fif_p_count+1) & 0xff));
+
+               /* Update in_fif_p_count for it's offset with respect to out_p_count */
+               in_fif_p_count = (in_fif_p_count + in_p_offset) & 0xff;
+
+               /* Read the OUT_P_COUNT from the debug select */
+               cvmx_write_csr(CVMX_PEXP_NPEI_DBG_SELECT, (pcie_port) ? 0xd00f : 0xc80f);
+               cvmx_read_csr(CVMX_PEXP_NPEI_DBG_SELECT);
+               dbg_data.u64 = cvmx_read_csr(CVMX_PEXP_NPEI_DBG_DATA);
+               out_p_count = (dbg_data.s.data>>1) & 0xff;
+
+               /* Check that the two counters are aligned */
+               if (out_p_count != in_fif_p_count) {
+                       cvmx_dprintf("PCIe: Port %d aligning TLP counters as workaround to maintain ordering\n", pcie_port);
+                       while (in_fif_p_count != 0) {
+                               cvmx_write64_uint32(write_address, 0);
+                               cvmx_wait(10000);
+                               in_fif_p_count = (in_fif_p_count + 1) & 0xff;
+                       }
+                       /*
+                        * The EBH5200 board swapped the PCIe reset
+                        * lines on the board. This means we must
+                        * bring both links down and up, which will
+                        * cause the PCIe0 to need alignment
+                        * again. Lots of messages will be displayed,
+                        * but everything should work
+                        */
+                       if ((cvmx_sysinfo_get()->board_type == CVMX_BOARD_TYPE_EBH5200) &&
+                               (pcie_port == 1))
+                               cvmx_pcie_rc_initialize(0);
+                       /* Rety bringing this port up */
+                       goto retry;
+               }
+       }
+
+       /* Display the link status */
+       pciercx_cfg032.u32 = cvmx_pcie_cfgx_read(pcie_port, CVMX_PCIERCX_CFG032(pcie_port));
+       cvmx_dprintf("PCIe: Port %d link active, %d lanes\n", pcie_port, pciercx_cfg032.s.nlw);
+
        return 0;
 }
 
+/**
+  * 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.
+ *
+ * @pcie_port: PCIe port to initialize
+ *
+ * Return Zero on success.
+ */
+static int __cvmx_pcie_rc_initialize_link_gen2(int pcie_port)
+{
+       uint64_t start_cycle;
+       union cvmx_pemx_ctl_status pem_ctl_status;
+       union cvmx_pciercx_cfg032 pciercx_cfg032;
+       union cvmx_pciercx_cfg448 pciercx_cfg448;
 
-/* Above was cvmx-pcie.c, below original pcie.c */
+       /* 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 = cvmx_get_cycle();
+       do {
+               if (cvmx_get_cycle() - start_cycle >  octeon_get_clock_rate())
+                       return -1;
+               cvmx_wait(10000);
+               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;
+}
 
 
+/**
+ * Initialize a PCIe gen 2 port for use in host(RC) mode. It doesn't enumerate
+ * the bus.
+ *
+ * @pcie_port: PCIe port to initialize
+ *
+ * Returns Zero on success.
+ */
+static int __cvmx_pcie_rc_initialize_gen2(int pcie_port)
+{
+       int i;
+       union cvmx_ciu_soft_prst ciu_soft_prst;
+       union cvmx_mio_rst_ctlx mio_rst_ctl;
+       union cvmx_pemx_bar_ctl pemx_bar_ctl;
+       union cvmx_pemx_ctl_status pemx_ctl_status;
+       union cvmx_pemx_bist_status pemx_bist_status;
+       union cvmx_pemx_bist_status2 pemx_bist_status2;
+       union cvmx_pciercx_cfg032 pciercx_cfg032;
+       union cvmx_pciercx_cfg515 pciercx_cfg515;
+       union cvmx_sli_ctl_portx sli_ctl_portx;
+       union cvmx_sli_mem_access_ctl sli_mem_access_ctl;
+       union cvmx_sli_mem_access_subidx mem_access_subid;
+       union cvmx_sriox_status_reg sriox_status_reg;
+       union cvmx_pemx_bar1_indexx bar1_index;
+
+       if (octeon_has_feature(OCTEON_FEATURE_SRIO)) {
+               /* Make sure this interface isn't SRIO */
+               if (OCTEON_IS_MODEL(OCTEON_CN66XX)) {
+                       /*
+                        * The CN66XX requires reading the
+                        * MIO_QLMX_CFG register to figure out the
+                        * port type.
+                        */
+                       union cvmx_mio_qlmx_cfg qlmx_cfg;
+                       qlmx_cfg.u64 = cvmx_read_csr(CVMX_MIO_QLMX_CFG(pcie_port));
+
+                       if (qlmx_cfg.s.qlm_spd == 15) {
+                               pr_notice("PCIe: Port %d is disabled, skipping.\n", pcie_port);
+                               return -1;
+                       }
+
+                       switch (qlmx_cfg.s.qlm_spd) {
+                       case 0x1: /* SRIO 1x4 short */
+                       case 0x3: /* SRIO 1x4 long */
+                       case 0x4: /* SRIO 2x2 short */
+                       case 0x6: /* SRIO 2x2 long */
+                               pr_notice("PCIe: Port %d is SRIO, skipping.\n", pcie_port);
+                               return -1;
+                       case 0x9: /* SGMII */
+                               pr_notice("PCIe: Port %d is SGMII, skipping.\n", pcie_port);
+                               return -1;
+                       case 0xb: /* XAUI */
+                               pr_notice("PCIe: Port %d is XAUI, skipping.\n", pcie_port);
+                               return -1;
+                       case 0x0: /* PCIE gen2 */
+                       case 0x8: /* PCIE gen2 (alias) */
+                       case 0x2: /* PCIE gen1 */
+                       case 0xa: /* PCIE gen1 (alias) */
+                               break;
+                       default:
+                               pr_notice("PCIe: Port %d is unknown, skipping.\n", pcie_port);
+                               return -1;
+                       }
+               } else {
+                       sriox_status_reg.u64 = cvmx_read_csr(CVMX_SRIOX_STATUS_REG(pcie_port));
+                       if (sriox_status_reg.s.srio) {
+                               pr_notice("PCIe: Port %d is SRIO, skipping.\n", pcie_port);
+                               return -1;
+                       }
+               }
+       }
+
+#if 0
+    /* This code is so that the PCIe analyzer is able to see 63XX traffic */
+       pr_notice("PCIE : init for pcie analyzer.\n");
+       cvmx_helper_qlm_jtag_init();
+       cvmx_helper_qlm_jtag_shift_zeros(pcie_port, 85);
+       cvmx_helper_qlm_jtag_shift(pcie_port, 1, 1);
+       cvmx_helper_qlm_jtag_shift_zeros(pcie_port, 300-86);
+       cvmx_helper_qlm_jtag_shift_zeros(pcie_port, 85);
+       cvmx_helper_qlm_jtag_shift(pcie_port, 1, 1);
+       cvmx_helper_qlm_jtag_shift_zeros(pcie_port, 300-86);
+       cvmx_helper_qlm_jtag_shift_zeros(pcie_port, 85);
+       cvmx_helper_qlm_jtag_shift(pcie_port, 1, 1);
+       cvmx_helper_qlm_jtag_shift_zeros(pcie_port, 300-86);
+       cvmx_helper_qlm_jtag_shift_zeros(pcie_port, 85);
+       cvmx_helper_qlm_jtag_shift(pcie_port, 1, 1);
+       cvmx_helper_qlm_jtag_shift_zeros(pcie_port, 300-86);
+       cvmx_helper_qlm_jtag_update(pcie_port);
+#endif
+
+       /* Make sure we aren't trying to setup a target mode interface in host mode */
+       mio_rst_ctl.u64 = cvmx_read_csr(CVMX_MIO_RST_CTLX(pcie_port));
+       if (!mio_rst_ctl.s.host_mode) {
+               pr_notice("PCIe: Port %d in endpoint mode.\n", 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) {
+                       union cvmx_ciu_qlm1 ciu_qlm;
+                       ciu_qlm.u64 = cvmx_read_csr(CVMX_CIU_QLM1);
+                       ciu_qlm.s.txbypass = 1;
+                       ciu_qlm.s.txdeemph = 5;
+                       ciu_qlm.s.txmargin = 0x17;
+                       cvmx_write_csr(CVMX_CIU_QLM1, ciu_qlm.u64);
+               } else {
+                       union cvmx_ciu_qlm0 ciu_qlm;
+                       ciu_qlm.u64 = cvmx_read_csr(CVMX_CIU_QLM0);
+                       ciu_qlm.s.txbypass = 1;
+                       ciu_qlm.s.txdeemph = 5;
+                       ciu_qlm.s.txmargin = 0x17;
+                       cvmx_write_csr(CVMX_CIU_QLM0, ciu_qlm.u64);
+               }
+       }
+       /* Bring the PCIe out of reset */
+       if (pcie_port)
+               ciu_soft_prst.u64 = cvmx_read_csr(CVMX_CIU_SOFT_PRST1);
+       else
+               ciu_soft_prst.u64 = cvmx_read_csr(CVMX_CIU_SOFT_PRST);
+       /*
+        * 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;
+               if (pcie_port)
+                       cvmx_write_csr(CVMX_CIU_SOFT_PRST1, ciu_soft_prst.u64);
+               else
+                       cvmx_write_csr(CVMX_CIU_SOFT_PRST, ciu_soft_prst.u64);
+               /* Wait until pcie resets the ports. */
+               udelay(2000);
+       }
+       if (pcie_port) {
+               ciu_soft_prst.u64 = cvmx_read_csr(CVMX_CIU_SOFT_PRST1);
+               ciu_soft_prst.s.soft_prst = 0;
+               cvmx_write_csr(CVMX_CIU_SOFT_PRST1, ciu_soft_prst.u64);
+       } else {
+               ciu_soft_prst.u64 = cvmx_read_csr(CVMX_CIU_SOFT_PRST);
+               ciu_soft_prst.s.soft_prst = 0;
+               cvmx_write_csr(CVMX_CIU_SOFT_PRST, ciu_soft_prst.u64);
+       }
+
+       /* Wait 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(CVMX_MIO_RST_CTLX(pcie_port), union cvmx_mio_rst_ctlx, rst_done, ==, 1, 10000)) {
+               pr_notice("PCIe: Port %d stuck in reset, skipping.\n", 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)
+               pr_notice("PCIe: BIST FAILED for port %d (0x%016llx)\n", 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)
+               pr_notice("PCIe: BIST2 FAILED for port %d (0x%016llx)\n", pcie_port, CAST64(pemx_bist_status2.u64));
+
+       /* Initialize the config space CSRs */
+       __cvmx_pcie_rc_initialize_config_space(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(pcie_port)) {
+               /*
+                * Some gen1 devices don't handle the gen 2 training
+                * correctly. Disable gen2 and try again with only
+                * gen1
+                */
+               union cvmx_pciercx_cfg031 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(pcie_port)) {
+                       pr_notice("PCIe: Link timeout on port %d, probably the slot is empty\n", pcie_port);
+                       return -1;
+               }
+       }
+
+       /* 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 = 1;     /* Endian-swap for Reads. */
+       mem_access_subid.s.esw = 1;     /* 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 Adddress 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);
+       }
+
+       /*
+        * 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 = 1;
+       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 = 1;  /* 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);
+       }
+
+       /*
+        * Allow config retries for 250ms. Count is based off the 5Ghz
+        * SERDES clock.
+        */
+       pemx_ctl_status.u64 = cvmx_read_csr(CVMX_PEMX_CTL_STATUS(pcie_port));
+       pemx_ctl_status.s.cfg_rtry = 250 * 5000000 / 0x10000;
+       cvmx_write_csr(CVMX_PEMX_CTL_STATUS(pcie_port), pemx_ctl_status.u64);
+
+       /* Display the link status */
+       pciercx_cfg032.u32 = cvmx_pcie_cfgx_read(pcie_port, CVMX_PCIERCX_CFG032(pcie_port));
+       pr_notice("PCIe: Port %d link active, %d lanes, speed gen%d\n", pcie_port, pciercx_cfg032.s.nlw, pciercx_cfg032.s.ls);
+
+       return 0;
+}
+
+/**
+ * Initialize a PCIe port for use in host(RC) mode. It doesn't enumerate the bus.
+ *
+ * @pcie_port: PCIe port to initialize
+ *
+ * Returns Zero on success
+ */
+static int cvmx_pcie_rc_initialize(int pcie_port)
+{
+       int result;
+       if (octeon_has_feature(OCTEON_FEATURE_NPEI))
+               result = __cvmx_pcie_rc_initialize_gen1(pcie_port);
+       else
+               result = __cvmx_pcie_rc_initialize_gen2(pcie_port);
+       return result;
+}
+
+/* Above was cvmx-pcie.c, below original pcie.c */
+
 /**
  * Map a PCI device to the appropriate interrupt line
  *
@@ -1027,11 +1481,12 @@ int __init octeon_pcie_pcibios_map_irq(const struct pci_dev *dev,
                 */
                while (dev->bus && dev->bus->parent)
                        dev = to_pci_dev(dev->bus->bridge);
-               /* If the root bus is number 0 and the PEX 8114 is the
+               /*
+                * If the root bus is number 0 and the PEX 8114 is the
                 * root, assume we are behind the miswired bus. We
                 * need to correct the swizzle level by two. Yuck.
                 */
-               if ((dev->bus->number == 0) &&
+               if ((dev->bus->number == 1) &&
                    (dev->vendor == 0x10b5) && (dev->device == 0x8114)) {
                        /*
                         * The pin field is one based, not zero. We
@@ -1048,39 +1503,73 @@ int __init octeon_pcie_pcibios_map_irq(const struct pci_dev *dev,
        return pin - 1 + OCTEON_IRQ_PCI_INT0;
 }
 
-/**
+static  void set_cfg_read_retry(u32 retry_cnt)
+{
+       union cvmx_pemx_ctl_status pemx_ctl;
+       pemx_ctl.u64 = cvmx_read_csr(CVMX_PEMX_CTL_STATUS(1));
+       pemx_ctl.s.cfg_rtry = retry_cnt;
+       cvmx_write_csr(CVMX_PEMX_CTL_STATUS(1), pemx_ctl.u64);
+}
+
+
+static u32 disable_cfg_read_retry(void)
+{
+       u32 retry_cnt;
+
+       union cvmx_pemx_ctl_status pemx_ctl;
+       pemx_ctl.u64 = cvmx_read_csr(CVMX_PEMX_CTL_STATUS(1));
+       retry_cnt =  pemx_ctl.s.cfg_rtry;
+       pemx_ctl.s.cfg_rtry = 0;
+       cvmx_write_csr(CVMX_PEMX_CTL_STATUS(1), pemx_ctl.u64);
+       return retry_cnt;
+}
+
+static int is_cfg_retry(void)
+{
+       union cvmx_pemx_int_sum pemx_int_sum;
+       pemx_int_sum.u64 = cvmx_read_csr(CVMX_PEMX_INT_SUM(1));
+       if (pemx_int_sum.s.crs_dr)
+               return 1;
+       return 0;
+}
+
+/*
  * Read a value from configuration space
  *
- * @bus:
- * @devfn:
- * @reg:
- * @size:
- * @val:
- * Returns
  */
-static inline int octeon_pcie_read_config(int pcie_port, struct pci_bus *bus,
-                                         unsigned int devfn, int reg, int size,
-                                         u32 *val)
+static int octeon_pcie_read_config(unsigned int pcie_port, struct pci_bus *bus,
+                                  unsigned int devfn, int reg, int size,
+                                  u32 *val)
 {
        union octeon_cvmemctl cvmmemctl;
        union octeon_cvmemctl cvmmemctl_save;
        int bus_number = bus->number;
+       int cfg_retry = 0;
+       int retry_cnt = 0;
+       int max_retry_cnt = 10;
+       u32 cfg_retry_cnt = 0;
 
+       cvmmemctl_save.u64 = 0;
+       BUG_ON(pcie_port >= ARRAY_SIZE(enable_pcie_bus_num_war));
        /*
         * For the top level bus make sure our hardware bus number
-        * matches the software one.
+        * matches the software one
         */
        if (bus->parent == NULL) {
-               union cvmx_pciercx_cfg006 pciercx_cfg006;
-               pciercx_cfg006.u32 = cvmx_pcie_cfgx_read(pcie_port,
-                       CVMX_PCIERCX_CFG006(pcie_port));
-               if (pciercx_cfg006.s.pbnum != bus_number) {
-                       pciercx_cfg006.s.pbnum = bus_number;
-                       pciercx_cfg006.s.sbnum = bus_number;
-                       pciercx_cfg006.s.subbnum = bus_number;
-                       cvmx_pcie_cfgx_write(pcie_port,
-                               CVMX_PCIERCX_CFG006(pcie_port),
-                               pciercx_cfg006.u32);
+               if (enable_pcie_bus_num_war[pcie_port])
+                       bus_number = 0;
+               else {
+                       union cvmx_pciercx_cfg006 pciercx_cfg006;
+                       pciercx_cfg006.u32 = cvmx_pcie_cfgx_read(pcie_port,
+                                            CVMX_PCIERCX_CFG006(pcie_port));
+                       if (pciercx_cfg006.s.pbnum != bus_number) {
+                               pciercx_cfg006.s.pbnum = bus_number;
+                               pciercx_cfg006.s.sbnum = bus_number;
+                               pciercx_cfg006.s.subbnum = bus_number;
+                               cvmx_pcie_cfgx_write(pcie_port,
+                                           CVMX_PCIERCX_CFG006(pcie_port),
+                                           pciercx_cfg006.u32);
+                       }
                }
        }
 
@@ -1116,29 +1605,52 @@ static inline int octeon_pcie_read_config(int pcie_port, struct pci_bus *bus,
                 */
 #if 1
                /* Use this option if you aren't using either slot */
-               if (bus_number == 1)
+               if (bus_number == 2)
                        return PCIBIOS_FUNC_NOT_SUPPORTED;
 #elif 0
                /*
                 * Use this option if you are using the first slot but
                 * not the second.
                 */
-               if ((bus_number == 1) && (devfn >> 3 != 2))
+               if ((bus_number == 2) && (devfn >> 3 != 2))
                        return PCIBIOS_FUNC_NOT_SUPPORTED;
 #elif 0
                /*
                 * Use this option if you are using the second slot
                 * but not the first.
                 */
-               if ((bus_number == 1) && (devfn >> 3 != 3))
+               if ((bus_number == 2) && (devfn >> 3 != 3))
                        return PCIBIOS_FUNC_NOT_SUPPORTED;
 #elif 0
                /* Use this opion if you are using both slots */
-               if ((bus_number == 1) &&
+               if ((bus_number == 2) &&
                    !((devfn == (2 << 3)) || (devfn == (3 << 3))))
                        return PCIBIOS_FUNC_NOT_SUPPORTED;
 #endif
 
+               /* The following #if gives a more complicated example. This is
+                  the required checks for running a Nitrox CN16XX-NHBX in the
+                  slot of the EBH5600. This card has a PLX PCIe bridge with
+                  four Nitrox PLX parts behind it */
+#if 0
+               /* PLX bridge with 4 ports */
+               if ((bus_number == 4) &&
+                   !((devfn >> 3 >= 1) && (devfn >> 3 <= 4)))
+                       return PCIBIOS_FUNC_NOT_SUPPORTED;
+               /* Nitrox behind PLX 1 */
+               if ((bus_number == 5) && (devfn >> 3 != 0))
+                       return PCIBIOS_FUNC_NOT_SUPPORTED;
+               /* Nitrox behind PLX 2 */
+               if ((bus_number == 6) && (devfn >> 3 != 0))
+                       return PCIBIOS_FUNC_NOT_SUPPORTED;
+               /* Nitrox behind PLX 3 */
+               if ((bus_number == 7) && (devfn >> 3 != 0))
+                       return PCIBIOS_FUNC_NOT_SUPPORTED;
+               /* Nitrox behind PLX 4 */
+               if ((bus_number == 8) && (devfn >> 3 != 0))
+                       return PCIBIOS_FUNC_NOT_SUPPORTED;
+#endif
+
                /*
                 * Shorten the DID timeout so bus errors for PCIe
                 * config reads from non existent devices happen
@@ -1152,26 +1664,48 @@ static inline int octeon_pcie_read_config(int pcie_port, struct pci_bus *bus,
                __write_64bit_c0_register($11, 7, cvmmemctl.u64);
        }
 
-       switch (size) {
-       case 4:
-               *val = cvmx_pcie_config_read32(pcie_port, bus_number,
-                                              devfn >> 3, devfn & 0x7, reg);
+       if ((OCTEON_IS_MODEL(OCTEON_CN63XX)) && (enable_pcie_14459_war))
+               cfg_retry_cnt = disable_cfg_read_retry();
+
+       pr_debug("pcie_cfg_rd port=%d b=%d devfn=0x%03x reg=0x%03x"
+                " size=%d ", pcie_port, bus_number, devfn, reg, size);
+       do {
+               switch (size) {
+               case 4:
+                       *val = cvmx_pcie_config_read32(pcie_port, bus_number,
+                               devfn >> 3, devfn & 0x7, reg);
                break;
-       case 2:
-               *val = cvmx_pcie_config_read16(pcie_port, bus_number,
-                                              devfn >> 3, devfn & 0x7, reg);
+               case 2:
+                       *val = cvmx_pcie_config_read16(pcie_port, bus_number,
+                               devfn >> 3, devfn & 0x7, reg);
                break;
-       case 1:
-               *val = cvmx_pcie_config_read8(pcie_port, bus_number, devfn >> 3,
-                                             devfn & 0x7, reg);
+               case 1:
+                       *val = cvmx_pcie_config_read8(pcie_port, bus_number,
+                               devfn >> 3, devfn & 0x7, reg);
                break;
-       default:
-               return PCIBIOS_FUNC_NOT_SUPPORTED;
-       }
+               default:
+                       if (OCTEON_IS_MODEL(OCTEON_CN63XX))
+                               set_cfg_read_retry(cfg_retry_cnt);
+                       return PCIBIOS_FUNC_NOT_SUPPORTED;
+               }
+               if ((OCTEON_IS_MODEL(OCTEON_CN63XX)) &&
+                       (enable_pcie_14459_war)) {
+                       cfg_retry = is_cfg_retry();
+                       retry_cnt++;
+                       if (retry_cnt > max_retry_cnt) {
+                               pr_err(" pcie cfg_read retries failed. retry_cnt=%d\n",
+                                      retry_cnt);
+                               cfg_retry = 0;
+                       }
+               }
+       } while (cfg_retry);
 
+       if ((OCTEON_IS_MODEL(OCTEON_CN63XX)) && (enable_pcie_14459_war))
+               set_cfg_read_retry(cfg_retry_cnt);
+       pr_debug("val=%08x  : tries=%02d\n", *val, retry_cnt);
        if (OCTEON_IS_MODEL(OCTEON_CN56XX_PASS1) ||
            OCTEON_IS_MODEL(OCTEON_CN56XX_PASS1_1))
-               __write_64bit_c0_register($11, 7, cvmmemctl_save.u64);
+               write_c0_cvmmemctl(cvmmemctl_save.u64);
        return PCIBIOS_SUCCESSFUL;
 }
 
@@ -1187,42 +1721,56 @@ static int octeon_pcie1_read_config(struct pci_bus *bus, unsigned int devfn,
        return octeon_pcie_read_config(1, bus, devfn, reg, size, val);
 }
 
+static int octeon_dummy_read_config(struct pci_bus *bus, unsigned int devfn,
+                                   int reg, int size, u32 *val)
+{
+       return PCIBIOS_FUNC_NOT_SUPPORTED;
+}
 
-
-/**
+/*
  * Write a value to PCI configuration space
- *
- * @bus:
- * @devfn:
- * @reg:
- * @size:
- * @val:
- * Returns
  */
-static inline int octeon_pcie_write_config(int pcie_port, struct pci_bus *bus,
-                                          unsigned int devfn, int reg,
-                                          int size, u32 val)
+static int octeon_pcie_write_config(unsigned int pcie_port, struct pci_bus *bus,
+                                   unsigned int devfn, int reg,
+                                   int size, u32 val)
 {
        int bus_number = bus->number;
 
+       BUG_ON(pcie_port >= ARRAY_SIZE(enable_pcie_bus_num_war));
+
+       if ((bus->parent == NULL) && (enable_pcie_bus_num_war[pcie_port]))
+               bus_number = 0;
+
+       pr_debug("pcie_cfg_wr port=%d b=%d devfn=0x%03x"
+                " reg=0x%03x size=%d val=%08x\n", pcie_port, bus_number, devfn,
+                reg, size, val);
+
+
        switch (size) {
        case 4:
                cvmx_pcie_config_write32(pcie_port, bus_number, devfn >> 3,
                                         devfn & 0x7, reg, val);
-               return PCIBIOS_SUCCESSFUL;
+               break;
        case 2:
                cvmx_pcie_config_write16(pcie_port, bus_number, devfn >> 3,
                                         devfn & 0x7, reg, val);
-               return PCIBIOS_SUCCESSFUL;
+               break;
        case 1:
                cvmx_pcie_config_write8(pcie_port, bus_number, devfn >> 3,
                                        devfn & 0x7, reg, val);
-               return PCIBIOS_SUCCESSFUL;
+               break;
+       default:
+               return PCIBIOS_FUNC_NOT_SUPPORTED;
        }
 #if PCI_CONFIG_SPACE_DELAY
+       /*
+        * Delay on writes so that devices have time to come up. Some
+        * bridges need this to allow time for the secondary busses to
+        * work
+        */
        udelay(PCI_CONFIG_SPACE_DELAY);
 #endif
-       return PCIBIOS_FUNC_NOT_SUPPORTED;
+       return PCIBIOS_SUCCESSFUL;
 }
 
 static int octeon_pcie0_write_config(struct pci_bus *bus, unsigned int devfn,
@@ -1237,6 +1785,12 @@ static int octeon_pcie1_write_config(struct pci_bus *bus, unsigned int devfn,
        return octeon_pcie_write_config(1, bus, devfn, reg, size, val);
 }
 
+static int octeon_dummy_write_config(struct pci_bus *bus, unsigned int devfn,
+                                    int reg, int size, u32 val)
+{
+       return PCIBIOS_FUNC_NOT_SUPPORTED;
+}
+
 static struct pci_ops octeon_pcie0_ops = {
        octeon_pcie0_read_config,
        octeon_pcie0_write_config,
@@ -1279,6 +1833,35 @@ static struct pci_controller octeon_pcie1_controller = {
        .io_resource = &octeon_pcie1_io_resource,
 };
 
+static struct pci_ops octeon_dummy_ops = {
+       octeon_dummy_read_config,
+       octeon_dummy_write_config,
+};
+
+static struct resource octeon_dummy_mem_resource = {
+       .name = "Virtual PCIe MEM",
+       .flags = IORESOURCE_MEM,
+};
+
+static struct resource octeon_dummy_io_resource = {
+       .name = "Virtual PCIe IO",
+       .flags = IORESOURCE_IO,
+};
+
+static struct pci_controller octeon_dummy_controller = {
+       .pci_ops = &octeon_dummy_ops,
+       .mem_resource = &octeon_dummy_mem_resource,
+       .io_resource = &octeon_dummy_io_resource,
+};
+
+static int device_needs_bus_num_war(uint32_t deviceid)
+{
+#define IDT_VENDOR_ID 0x111d
+
+       if ((deviceid  & 0xffff) == IDT_VENDOR_ID)
+               return 1;
+       return 0;
+}
 
 /**
  * Initialize the Octeon PCIe controllers
@@ -1287,19 +1870,27 @@ static struct pci_controller octeon_pcie1_controller = {
  */
 static int __init octeon_pcie_setup(void)
 {
-       union cvmx_npei_ctl_status npei_ctl_status;
        int result;
+       int host_mode;
+       int srio_war15205 = 0, port;
+       union cvmx_sli_ctl_portx sli_ctl_portx;
+       union cvmx_sriox_status_reg sriox_status_reg;
 
        /* These chips don't have PCIe */
        if (!octeon_has_feature(OCTEON_FEATURE_PCIE))
                return 0;
 
+       /* No PCIe simulation */
+       if (octeon_is_simulation())
+               return 0;
+
+       /* Disable PCI if instructed on the command line */
+       if (pcie_disable)
+               return 0;
+
        /* Point pcibios_map_irq() to the PCIe version of it */
        octeon_pcibios_map_irq = octeon_pcie_pcibios_map_irq;
 
-       /* Use the PCIe based DMA mappings */
-       octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_PCIE;
-
        /*
         * PCIe I/O range. It is based on port 0 but includes up until
         * port 1's end.
@@ -1310,11 +1901,43 @@ static int __init octeon_pcie_setup(void)
                cvmx_pcie_get_io_base_address(1) -
                cvmx_pcie_get_io_base_address(0) + cvmx_pcie_get_io_size(1) - 1;
 
-       npei_ctl_status.u64 = cvmx_read_csr(CVMX_PEXP_NPEI_CTL_STATUS);
-       if (npei_ctl_status.s.host_mode) {
+       /*
+        * Create a dummy PCIe controller to swallow up bus 0. IDT bridges
+        * don't work if the primary bus number is zero. Here we add a fake
+        * PCIe controller that the kernel will give bus 0. This allows
+        * us to not change the normal kernel bus enumeration
+        */
+       octeon_dummy_controller.io_map_base = -1;
+       octeon_dummy_controller.mem_resource->start = (1ull<<48);
+       octeon_dummy_controller.mem_resource->end = (1ull<<48);
+       register_pci_controller(&octeon_dummy_controller);
+
+       if (octeon_has_feature(OCTEON_FEATURE_NPEI)) {
+               union cvmx_npei_ctl_status npei_ctl_status;
+               npei_ctl_status.u64 = cvmx_read_csr(CVMX_PEXP_NPEI_CTL_STATUS);
+               host_mode = npei_ctl_status.s.host_mode;
+               octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_PCIE;
+       } else {
+               union cvmx_mio_rst_ctlx mio_rst_ctl;
+               mio_rst_ctl.u64 = cvmx_read_csr(CVMX_MIO_RST_CTLX(0));
+               host_mode = mio_rst_ctl.s.host_mode;
+               octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_PCIE2;
+       }
+
+       if (host_mode) {
                pr_notice("PCIe: Initializing port 0\n");
+               /* CN63XX pass 1_x/2.0 errata PCIe-15205 */
+               if (OCTEON_IS_MODEL(OCTEON_CN63XX_PASS1_X) ||
+                       OCTEON_IS_MODEL(OCTEON_CN63XX_PASS2_0)) {
+                       sriox_status_reg.u64 = cvmx_read_csr(CVMX_SRIOX_STATUS_REG(0));
+                       if (sriox_status_reg.s.srio) {
+                               srio_war15205 += 1;      /* Port is SRIO */
+                               port = 0;
+                       }
+               }
                result = cvmx_pcie_rc_initialize(0);
                if (result == 0) {
+                       uint32_t device0;
                        /* Memory offsets are physical addresses */
                        octeon_pcie0_controller.mem_offset =
                                cvmx_pcie_get_mem_base_address(0);
@@ -1343,60 +1966,134 @@ static int __init octeon_pcie_setup(void)
                        octeon_pcie0_controller.io_resource->start = 4 << 10;
                        octeon_pcie0_controller.io_resource->end =
                                cvmx_pcie_get_io_size(0) - 1;
+                       msleep(100); /* Some devices need extra time */
                        register_pci_controller(&octeon_pcie0_controller);
+                       device0 = cvmx_pcie_config_read32(0, 0, 0, 0, 0);
+                       enable_pcie_bus_num_war[0] =
+                               device_needs_bus_num_war(device0);
                }
        } else {
                pr_notice("PCIe: Port 0 in endpoint mode, skipping.\n");
+               /* CN63XX pass 1_x/2.0 errata PCIe-15205 */
+               if (OCTEON_IS_MODEL(OCTEON_CN63XX_PASS1_X) ||
+                       OCTEON_IS_MODEL(OCTEON_CN63XX_PASS2_0)) {
+                       srio_war15205 += 1;
+                       port = 0;
+               }
        }
 
-       /* Skip the 2nd port on CN52XX if port 0 is in 4 lane mode */
-       if (OCTEON_IS_MODEL(OCTEON_CN52XX)) {
-               union cvmx_npei_dbg_data npei_dbg_data;
-               npei_dbg_data.u64 = cvmx_read_csr(CVMX_PEXP_NPEI_DBG_DATA);
-               if (npei_dbg_data.cn52xx.qlm0_link_width)
-                       return 0;
+       if (octeon_has_feature(OCTEON_FEATURE_NPEI)) {
+               host_mode = 1;
+               /* Skip the 2nd port on CN52XX if port 0 is in 4 lane mode */
+               if (OCTEON_IS_MODEL(OCTEON_CN52XX)) {
+                       union cvmx_npei_dbg_data dbg_data;
+                       dbg_data.u64 = cvmx_read_csr(CVMX_PEXP_NPEI_DBG_DATA);
+                       if (dbg_data.cn52xx.qlm0_link_width)
+                               host_mode = 0;
+               }
+       } else {
+               union cvmx_mio_rst_ctlx mio_rst_ctl;
+               mio_rst_ctl.u64 = cvmx_read_csr(CVMX_MIO_RST_CTLX(1));
+               host_mode = mio_rst_ctl.s.host_mode;
        }
 
-       pr_notice("PCIe: Initializing port 1\n");
-       result = cvmx_pcie_rc_initialize(1);
-       if (result == 0) {
-               /* Memory offsets are physical addresses */
-               octeon_pcie1_controller.mem_offset =
-                       cvmx_pcie_get_mem_base_address(1);
-               /* IO offsets are Mips virtual addresses */
-               octeon_pcie1_controller.io_map_base =
-                       CVMX_ADD_IO_SEG(cvmx_pcie_get_io_base_address(1));
-               octeon_pcie1_controller.io_offset =
-                       cvmx_pcie_get_io_base_address(1) -
-                       cvmx_pcie_get_io_base_address(0);
-               /*
-                * To keep things similar to PCI, we start device
-                * addresses at the same place as PCI uisng big bar
-                * support. This normally translates to 4GB-256MB,
-                * which is the same as most x86 PCs.
-                */
-               octeon_pcie1_controller.mem_resource->start =
-                       cvmx_pcie_get_mem_base_address(1) + (4ul << 30) -
-                       (OCTEON_PCI_BAR1_HOLE_SIZE << 20);
-               octeon_pcie1_controller.mem_resource->end =
-                       cvmx_pcie_get_mem_base_address(1) +
-                       cvmx_pcie_get_mem_size(1) - 1;
-               /*
-                * Ports must be above 16KB for the ISA bus filtering
-                * in the PCI-X to PCI bridge.
-                */
-               octeon_pcie1_controller.io_resource->start =
-                       cvmx_pcie_get_io_base_address(1) -
-                       cvmx_pcie_get_io_base_address(0);
-               octeon_pcie1_controller.io_resource->end =
-                       octeon_pcie1_controller.io_resource->start +
-                       cvmx_pcie_get_io_size(1) - 1;
-               register_pci_controller(&octeon_pcie1_controller);
+       if (host_mode) {
+               pr_notice("PCIe: Initializing port 1\n");
+               /* CN63XX pass 1_x/2.0 errata PCIe-15205 */
+               if (OCTEON_IS_MODEL(OCTEON_CN63XX_PASS1_X) ||
+                       OCTEON_IS_MODEL(OCTEON_CN63XX_PASS2_0)) {
+                       sriox_status_reg.u64 = cvmx_read_csr(CVMX_SRIOX_STATUS_REG(1));
+                       if (sriox_status_reg.s.srio) {
+                               srio_war15205 += 1;      /* Port is SRIO */
+                               port = 1;
+                       }
+               }
+               result = cvmx_pcie_rc_initialize(1);
+               if (result == 0) {
+                       uint32_t device0;
+                       /* Memory offsets are physical addresses */
+                       octeon_pcie1_controller.mem_offset =
+                               cvmx_pcie_get_mem_base_address(1);
+                       /*
+                        * To calculate the address for accessing the 2nd PCIe device,
+                        * either 'io_map_base' (pci_iomap()), or 'mips_io_port_base'
+                        * (ioport_map()) value is added to
+                        * pci_resource_start(dev,bar)). The 'mips_io_port_base' is set
+                        * only once based on first PCIe. Also changing 'io_map_base'
+                        * based on first slot's value so that both the routines will
+                        * work properly.
+                        */
+                       octeon_pcie1_controller.io_map_base =
+                               CVMX_ADD_IO_SEG(cvmx_pcie_get_io_base_address(0));
+                       /* IO offsets are Mips virtual addresses */
+                       octeon_pcie1_controller.io_offset =
+                               cvmx_pcie_get_io_base_address(1) -
+                               cvmx_pcie_get_io_base_address(0);
+                       /*
+                        * To keep things similar to PCI, we start device
+                        * addresses at the same place as PCI uisng big bar
+                        * support. This normally translates to 4GB-256MB,
+                        * which is the same as most x86 PCs.
+                        */
+                       octeon_pcie1_controller.mem_resource->start =
+                               cvmx_pcie_get_mem_base_address(1) + (4ul << 30) -
+                               (OCTEON_PCI_BAR1_HOLE_SIZE << 20);
+                       octeon_pcie1_controller.mem_resource->end =
+                               cvmx_pcie_get_mem_base_address(1) +
+                               cvmx_pcie_get_mem_size(1) - 1;
+                       /*
+                        * Ports must be above 16KB for the ISA bus filtering
+                        * in the PCI-X to PCI bridge.
+                        */
+                       octeon_pcie1_controller.io_resource->start =
+                               cvmx_pcie_get_io_base_address(1) -
+                               cvmx_pcie_get_io_base_address(0);
+                       octeon_pcie1_controller.io_resource->end =
+                               octeon_pcie1_controller.io_resource->start +
+                               cvmx_pcie_get_io_size(1) - 1;
+                       msleep(100); /* Some devices need extra time */
+                       register_pci_controller(&octeon_pcie1_controller);
+                       device0 = cvmx_pcie_config_read32(1, 0, 0, 0, 0);
+                       enable_pcie_bus_num_war[1] =
+                               device_needs_bus_num_war(device0);
+               }
+       } else {
+               pr_notice("PCIe: Port 1 not in root complex mode, skipping.\n");
+               /* CN63XX pass 1_x/2.0 errata PCIe-15205  */
+               if (OCTEON_IS_MODEL(OCTEON_CN63XX_PASS1_X) ||
+                       OCTEON_IS_MODEL(OCTEON_CN63XX_PASS2_0)) {
+                       srio_war15205 += 1;
+                       port = 1;
+               }
+       }
+
+       /*
+        * CN63XX pass 1_x/2.0 errata PCIe-15205 requires setting all
+        * of SRIO MACs SLI_CTL_PORT*[INT*_MAP] to similar value and
+        * all of PCIe Macs SLI_CTL_PORT*[INT*_MAP] to different value
+        * from the previous set values
+        */
+       if (OCTEON_IS_MODEL(OCTEON_CN63XX_PASS1_X) ||
+               OCTEON_IS_MODEL(OCTEON_CN63XX_PASS2_0)) {
+               if (srio_war15205 == 1) {
+                       sli_ctl_portx.u64 = cvmx_read_csr(CVMX_PEXP_SLI_CTL_PORTX(port));
+                       sli_ctl_portx.s.inta_map = 1;
+                       sli_ctl_portx.s.intb_map = 1;
+                       sli_ctl_portx.s.intc_map = 1;
+                       sli_ctl_portx.s.intd_map = 1;
+                       cvmx_write_csr(CVMX_PEXP_SLI_CTL_PORTX(port), sli_ctl_portx.u64);
+
+                       sli_ctl_portx.u64 = cvmx_read_csr(CVMX_PEXP_SLI_CTL_PORTX(!port));
+                       sli_ctl_portx.s.inta_map = 0;
+                       sli_ctl_portx.s.intb_map = 0;
+                       sli_ctl_portx.s.intc_map = 0;
+                       sli_ctl_portx.s.intd_map = 0;
+                       cvmx_write_csr(CVMX_PEXP_SLI_CTL_PORTX(!port), sli_ctl_portx.u64);
+               }
        }
 
        octeon_pci_dma_init();
 
        return 0;
 }
-
 arch_initcall(octeon_pcie_setup);
index 655308a4e1cda2c02c6d63f9202531cc7ffaabd8..7a834b2f8a5f0b9dcaaad87672eff98d42d906b3 100644 (file)
@@ -209,7 +209,7 @@ void __init prom_init(void)
        default:
                /* we don't recognize the machine */
                mips_machtype  = MACH_UNKNOWN;
-               panic("***Bogosity factor five***, exiting\n");
+               panic("***Bogosity factor five***, exiting");
                break;
        }
 
index 888eac1b8311f8d9b140443513af06f226724472..23642238c6895296dc6a311ea52ba546c2eed460 100644 (file)
@@ -73,7 +73,7 @@ static inline int alloc_level(int cpu, int irq)
 
        level = find_first_zero_bit(hub->irq_alloc_mask, LEVELS_PER_SLICE);
        if (level >= LEVELS_PER_SLICE)
-               panic("Cpu %d flooded with devices\n", cpu);
+               panic("Cpu %d flooded with devices", cpu);
 
        __set_bit(level, hub->irq_alloc_mask);
        si->level_to_irq[level] = irq;
@@ -96,7 +96,7 @@ static inline int find_level(cpuid_t *cpunum, int irq)
                        }
        }
 
-       panic("Could not identify cpu/level for irq %d\n", irq);
+       panic("Could not identify cpu/level for irq %d", irq);
 }
 
 /*
index a3afac4be73463190c0d687efe480caa27db8d90..cbe7a2fb779f4036798c0231ef2dddb349f6fc41 100644 (file)
@@ -299,11 +299,11 @@ config I2C_AT91
          unless your system can cope with those limitations.
 
 config I2C_AU1550
-       tristate "Au1550/Au1200 SMBus interface"
+       tristate "Au1550/Au1200/Au1300 SMBus interface"
        depends on MIPS_ALCHEMY
        help
          If you say yes to this option, support will be included for the
-         Au1550 and Au1200 SMBus interface.
+         Au1550/Au1200/Au1300 SMBus interface.
 
          This driver can also be built as a module.  If so, the module
          will be called i2c-au1550.
index 5d3b9ae645236dd8b7857a383825694286705b8a..dbd0c8a4e98a8d5c5aaa07957f7658c45aa6b881 100644 (file)
@@ -153,6 +153,7 @@ static inline int has_dbdma(void)
 {
        switch (alchemy_get_cputype()) {
        case ALCHEMY_CPU_AU1200:
+       case ALCHEMY_CPU_AU1300:
                return 1;
        default:
                return 0;
@@ -768,11 +769,15 @@ static void au1xmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 
        config2 = au_readl(HOST_CONFIG2(host));
        switch (ios->bus_width) {
+       case MMC_BUS_WIDTH_8:
+               config2 |= SD_CONFIG2_BB;
+               break;
        case MMC_BUS_WIDTH_4:
+               config2 &= ~SD_CONFIG2_BB;
                config2 |= SD_CONFIG2_WB;
                break;
        case MMC_BUS_WIDTH_1:
-               config2 &= ~SD_CONFIG2_WB;
+               config2 &= ~(SD_CONFIG2_WB | SD_CONFIG2_BB);
                break;
        }
        au_writel(config2, HOST_CONFIG2(host));
@@ -943,7 +948,7 @@ static int __devinit au1xmmc_probe(struct platform_device *pdev)
        struct mmc_host *mmc;
        struct au1xmmc_host *host;
        struct resource *r;
-       int ret;
+       int ret, iflag;
 
        mmc = mmc_alloc_host(sizeof(struct au1xmmc_host), &pdev->dev);
        if (!mmc) {
@@ -982,37 +987,43 @@ static int __devinit au1xmmc_probe(struct platform_device *pdev)
                dev_err(&pdev->dev, "no IRQ defined\n");
                goto out3;
        }
-
        host->irq = r->start;
-       /* IRQ is shared among both SD controllers */
-       ret = request_irq(host->irq, au1xmmc_irq, IRQF_SHARED,
-                         DRIVER_NAME, host);
-       if (ret) {
-               dev_err(&pdev->dev, "cannot grab IRQ\n");
-               goto out3;
-       }
 
        mmc->ops = &au1xmmc_ops;
 
        mmc->f_min =   450000;
        mmc->f_max = 24000000;
 
+       mmc->max_blk_size = 2048;
+       mmc->max_blk_count = 512;
+
+       mmc->ocr_avail = AU1XMMC_OCR;
+       mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SDIO_IRQ;
+       mmc->max_segs = AU1XMMC_DESCRIPTOR_COUNT;
+
+       iflag = IRQF_SHARED;    /* Au1100/Au1200: one int for both ctrls */
+
        switch (alchemy_get_cputype()) {
        case ALCHEMY_CPU_AU1100:
                mmc->max_seg_size = AU1100_MMC_DESCRIPTOR_SIZE;
-               mmc->max_segs = AU1XMMC_DESCRIPTOR_COUNT;
                break;
        case ALCHEMY_CPU_AU1200:
                mmc->max_seg_size = AU1200_MMC_DESCRIPTOR_SIZE;
-               mmc->max_segs = AU1XMMC_DESCRIPTOR_COUNT;
+               break;
+       case ALCHEMY_CPU_AU1300:
+               iflag = 0;      /* nothing is shared */
+               mmc->max_seg_size = AU1200_MMC_DESCRIPTOR_SIZE;
+               mmc->f_max = 52000000;
+               if (host->ioarea->start == AU1100_SD0_PHYS_ADDR)
+                       mmc->caps |= MMC_CAP_8_BIT_DATA;
                break;
        }
 
-       mmc->max_blk_size = 2048;
-       mmc->max_blk_count = 512;
-
-       mmc->ocr_avail = AU1XMMC_OCR;
-       mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SDIO_IRQ;
+       ret = request_irq(host->irq, au1xmmc_irq, iflag, DRIVER_NAME, host);
+       if (ret) {
+               dev_err(&pdev->dev, "cannot grab IRQ\n");
+               goto out3;
+       }
 
        host->status = HOST_S_IDLE;
 
index 7dd3700f2303097f14747098031a41d66acc130a..73abbc3e093eced219347f93f9fefc5b31c2bd15 100644 (file)
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/nand.h>
 #include <linux/mtd/partitions.h>
+#include <linux/platform_device.h>
 #include <asm/io.h>
+#include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-au1x00/au1550nd.h>
 
-#ifdef CONFIG_MIPS_PB1550
-#include <asm/mach-pb1x00/pb1550.h>
-#elif defined(CONFIG_MIPS_DB1550)
-#include <asm/mach-db1x00/db1x00.h>
-#endif
-#include <asm/mach-db1x00/bcsr.h>
 
-/*
- * MTD structure for NAND controller
- */
-static struct mtd_info *au1550_mtd = NULL;
-static void __iomem *p_nand;
-static int nand_width = 1;     /* default x8 */
-static void (*au1550_write_byte)(struct mtd_info *, u_char);
+struct au1550nd_ctx {
+       struct mtd_info info;
+       struct nand_chip chip;
 
-/*
- * Define partitions for flash device
- */
-static const struct mtd_partition partition_info[] = {
-       {
-        .name = "NAND FS 0",
-        .offset = 0,
-        .size = 8 * 1024 * 1024},
-       {
-        .name = "NAND FS 1",
-        .offset = MTDPART_OFS_APPEND,
-        .size = MTDPART_SIZ_FULL}
+       int cs;
+       void __iomem *base;
+       void (*write_byte)(struct mtd_info *, u_char);
 };
 
 /**
@@ -259,24 +243,25 @@ static int au_verify_buf16(struct mtd_info *mtd, const u_char *buf, int len)
 
 static void au1550_hwcontrol(struct mtd_info *mtd, int cmd)
 {
-       register struct nand_chip *this = mtd->priv;
+       struct au1550nd_ctx *ctx = container_of(mtd, struct au1550nd_ctx, info);
+       struct nand_chip *this = mtd->priv;
 
        switch (cmd) {
 
        case NAND_CTL_SETCLE:
-               this->IO_ADDR_W = p_nand + MEM_STNAND_CMD;
+               this->IO_ADDR_W = ctx->base + MEM_STNAND_CMD;
                break;
 
        case NAND_CTL_CLRCLE:
-               this->IO_ADDR_W = p_nand + MEM_STNAND_DATA;
+               this->IO_ADDR_W = ctx->base + MEM_STNAND_DATA;
                break;
 
        case NAND_CTL_SETALE:
-               this->IO_ADDR_W = p_nand + MEM_STNAND_ADDR;
+               this->IO_ADDR_W = ctx->base + MEM_STNAND_ADDR;
                break;
 
        case NAND_CTL_CLRALE:
-               this->IO_ADDR_W = p_nand + MEM_STNAND_DATA;
+               this->IO_ADDR_W = ctx->base + MEM_STNAND_DATA;
                /* FIXME: Nobody knows why this is necessary,
                 * but it works only that way */
                udelay(1);
@@ -284,7 +269,7 @@ static void au1550_hwcontrol(struct mtd_info *mtd, int cmd)
 
        case NAND_CTL_SETNCE:
                /* assert (force assert) chip enable */
-               au_writel((1 << (4 + NAND_CS)), MEM_STNDCTL);
+               au_writel((1 << (4 + ctx->cs)), MEM_STNDCTL);
                break;
 
        case NAND_CTL_CLRNCE:
@@ -331,9 +316,10 @@ static void au1550_select_chip(struct mtd_info *mtd, int chip)
  */
 static void au1550_command(struct mtd_info *mtd, unsigned command, int column, int page_addr)
 {
-       register struct nand_chip *this = mtd->priv;
+       struct au1550nd_ctx *ctx = container_of(mtd, struct au1550nd_ctx, info);
+       struct nand_chip *this = mtd->priv;
        int ce_override = 0, i;
-       ulong flags;
+       unsigned long flags = 0;
 
        /* Begin command latch cycle */
        au1550_hwcontrol(mtd, NAND_CTL_SETCLE);
@@ -354,9 +340,9 @@ static void au1550_command(struct mtd_info *mtd, unsigned command, int column, i
                        column -= 256;
                        readcmd = NAND_CMD_READ1;
                }
-               au1550_write_byte(mtd, readcmd);
+               ctx->write_byte(mtd, readcmd);
        }
-       au1550_write_byte(mtd, command);
+       ctx->write_byte(mtd, command);
 
        /* Set ALE and clear CLE to start address cycle */
        au1550_hwcontrol(mtd, NAND_CTL_CLRCLE);
@@ -369,10 +355,10 @@ static void au1550_command(struct mtd_info *mtd, unsigned command, int column, i
                        /* Adjust columns for 16 bit buswidth */
                        if (this->options & NAND_BUSWIDTH_16)
                                column >>= 1;
-                       au1550_write_byte(mtd, column);
+                       ctx->write_byte(mtd, column);
                }
                if (page_addr != -1) {
-                       au1550_write_byte(mtd, (u8)(page_addr & 0xff));
+                       ctx->write_byte(mtd, (u8)(page_addr & 0xff));
 
                        if (command == NAND_CMD_READ0 ||
                            command == NAND_CMD_READ1 ||
@@ -390,11 +376,12 @@ static void au1550_command(struct mtd_info *mtd, unsigned command, int column, i
                                au1550_hwcontrol(mtd, NAND_CTL_SETNCE);
                        }
 
-                       au1550_write_byte(mtd, (u8)(page_addr >> 8));
+                       ctx->write_byte(mtd, (u8)(page_addr >> 8));
 
                        /* One more address cycle for devices > 32MiB */
                        if (this->chipsize > (32 << 20))
-                               au1550_write_byte(mtd, (u8)((page_addr >> 16) & 0x0f));
+                               ctx->write_byte(mtd,
+                                               ((page_addr >> 16) & 0x0f));
                }
                /* Latch in address */
                au1550_hwcontrol(mtd, NAND_CTL_CLRALE);
@@ -440,121 +427,79 @@ static void au1550_command(struct mtd_info *mtd, unsigned command, int column, i
        while(!this->dev_ready(mtd));
 }
 
-
-/*
- * Main initialization routine
- */
-static int __init au1xxx_nand_init(void)
+static int __devinit find_nand_cs(unsigned long nand_base)
 {
-       struct nand_chip *this;
-       u16 boot_swapboot = 0;  /* default value */
-       int retval;
-       u32 mem_staddr;
-       u32 nand_phys;
-
-       /* Allocate memory for MTD device structure and private data */
-       au1550_mtd = kzalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip), GFP_KERNEL);
-       if (!au1550_mtd) {
-               printk("Unable to allocate NAND MTD dev structure.\n");
-               return -ENOMEM;
-       }
-
-       /* Get pointer to private data */
-       this = (struct nand_chip *)(&au1550_mtd[1]);
-
-       /* Link the private data with the MTD structure */
-       au1550_mtd->priv = this;
-       au1550_mtd->owner = THIS_MODULE;
-
+       void __iomem *base =
+                       (void __iomem *)KSEG1ADDR(AU1000_STATIC_MEM_PHYS_ADDR);
+       unsigned long addr, staddr, start, mask, end;
+       int i;
 
-       /* MEM_STNDCTL: disable ints, disable nand boot */
-       au_writel(0, MEM_STNDCTL);
+       for (i = 0; i < 4; i++) {
+               addr = 0x1000 + (i * 0x10);                     /* CSx */
+               staddr = __raw_readl(base + addr + 0x08);       /* STADDRx */
+               /* figure out the decoded range of this CS */
+               start = (staddr << 4) & 0xfffc0000;
+               mask = (staddr << 18) & 0xfffc0000;
+               end = (start | (start - 1)) & ~(start ^ mask);
+               if ((nand_base >= start) && (nand_base < end))
+                       return i;
+       }
 
-#ifdef CONFIG_MIPS_PB1550
-       /* set gpio206 high */
-       gpio_direction_input(206);
+       return -ENODEV;
+}
 
-       boot_swapboot = (au_readl(MEM_STSTAT) & (0x7 << 1)) | ((bcsr_read(BCSR_STATUS) >> 6) & 0x1);
+static int __devinit au1550nd_probe(struct platform_device *pdev)
+{
+       struct au1550nd_platdata *pd;
+       struct au1550nd_ctx *ctx;
+       struct nand_chip *this;
+       struct resource *r;
+       int ret, cs;
 
-       switch (boot_swapboot) {
-       case 0:
-       case 2:
-       case 8:
-       case 0xC:
-       case 0xD:
-               /* x16 NAND Flash */
-               nand_width = 0;
-               break;
-       case 1:
-       case 9:
-       case 3:
-       case 0xE:
-       case 0xF:
-               /* x8 NAND Flash */
-               nand_width = 1;
-               break;
-       default:
-               printk("Pb1550 NAND: bad boot:swap\n");
-               retval = -EINVAL;
-               goto outmem;
+       pd = pdev->dev.platform_data;
+       if (!pd) {
+               dev_err(&pdev->dev, "missing platform data\n");
+               return -ENODEV;
        }
-#endif
-
-       /* Configure chip-select; normally done by boot code, e.g. YAMON */
-#ifdef NAND_STCFG
-       if (NAND_CS == 0) {
-               au_writel(NAND_STCFG,  MEM_STCFG0);
-               au_writel(NAND_STTIME, MEM_STTIME0);
-               au_writel(NAND_STADDR, MEM_STADDR0);
-       }
-       if (NAND_CS == 1) {
-               au_writel(NAND_STCFG,  MEM_STCFG1);
-               au_writel(NAND_STTIME, MEM_STTIME1);
-               au_writel(NAND_STADDR, MEM_STADDR1);
+
+       ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
+       if (!ctx) {
+               dev_err(&pdev->dev, "no memory for NAND context\n");
+               return -ENOMEM;
        }
-       if (NAND_CS == 2) {
-               au_writel(NAND_STCFG,  MEM_STCFG2);
-               au_writel(NAND_STTIME, MEM_STTIME2);
-               au_writel(NAND_STADDR, MEM_STADDR2);
+
+       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!r) {
+               dev_err(&pdev->dev, "no NAND memory resource\n");
+               ret = -ENODEV;
+               goto out1;
        }
-       if (NAND_CS == 3) {
-               au_writel(NAND_STCFG,  MEM_STCFG3);
-               au_writel(NAND_STTIME, MEM_STTIME3);
-               au_writel(NAND_STADDR, MEM_STADDR3);
+       if (request_mem_region(r->start, resource_size(r), "au1550-nand")) {
+               dev_err(&pdev->dev, "cannot claim NAND memory area\n");
+               ret = -ENOMEM;
+               goto out1;
        }
-#endif
-
-       /* Locate NAND chip-select in order to determine NAND phys address */
-       mem_staddr = 0x00000000;
-       if (((au_readl(MEM_STCFG0) & 0x7) == 0x5) && (NAND_CS == 0))
-               mem_staddr = au_readl(MEM_STADDR0);
-       else if (((au_readl(MEM_STCFG1) & 0x7) == 0x5) && (NAND_CS == 1))
-               mem_staddr = au_readl(MEM_STADDR1);
-       else if (((au_readl(MEM_STCFG2) & 0x7) == 0x5) && (NAND_CS == 2))
-               mem_staddr = au_readl(MEM_STADDR2);
-       else if (((au_readl(MEM_STCFG3) & 0x7) == 0x5) && (NAND_CS == 3))
-               mem_staddr = au_readl(MEM_STADDR3);
-
-       if (mem_staddr == 0x00000000) {
-               printk("Au1xxx NAND: ERROR WITH NAND CHIP-SELECT\n");
-               kfree(au1550_mtd);
-               return 1;
+
+       ctx->base = ioremap_nocache(r->start, 0x1000);
+       if (!ctx->base) {
+               dev_err(&pdev->dev, "cannot remap NAND memory area\n");
+               ret = -ENODEV;
+               goto out2;
        }
-       nand_phys = (mem_staddr << 4) & 0xFFFC0000;
 
-       p_nand = ioremap(nand_phys, 0x1000);
+       this = &ctx->chip;
+       ctx->info.priv = this;
+       ctx->info.owner = THIS_MODULE;
 
-       /* make controller and MTD agree */
-       if (NAND_CS == 0)
-               nand_width = au_readl(MEM_STCFG0) & (1 << 22);
-       if (NAND_CS == 1)
-               nand_width = au_readl(MEM_STCFG1) & (1 << 22);
-       if (NAND_CS == 2)
-               nand_width = au_readl(MEM_STCFG2) & (1 << 22);
-       if (NAND_CS == 3)
-               nand_width = au_readl(MEM_STCFG3) & (1 << 22);
+       /* figure out which CS# r->start belongs to */
+       cs = find_nand_cs(r->start);
+       if (cs < 0) {
+               dev_err(&pdev->dev, "cannot detect NAND chipselect\n");
+               ret = -ENODEV;
+               goto out3;
+       }
+       ctx->cs = cs;
 
-       /* Set address of hardware control function */
        this->dev_ready = au1550_device_ready;
        this->select_chip = au1550_select_chip;
        this->cmdfunc = au1550_command;
@@ -565,54 +510,57 @@ static int __init au1xxx_nand_init(void)
 
        this->options = NAND_NO_AUTOINCR;
 
-       if (!nand_width)
+       if (pd->devwidth)
                this->options |= NAND_BUSWIDTH_16;
 
-       this->read_byte = (!nand_width) ? au_read_byte16 : au_read_byte;
-       au1550_write_byte = (!nand_width) ? au_write_byte16 : au_write_byte;
+       this->read_byte = (pd->devwidth) ? au_read_byte16 : au_read_byte;
+       ctx->write_byte = (pd->devwidth) ? au_write_byte16 : au_write_byte;
        this->read_word = au_read_word;
-       this->write_buf = (!nand_width) ? au_write_buf16 : au_write_buf;
-       this->read_buf = (!nand_width) ? au_read_buf16 : au_read_buf;
-       this->verify_buf = (!nand_width) ? au_verify_buf16 : au_verify_buf;
-
-       /* Scan to find existence of the device */
-       if (nand_scan(au1550_mtd, 1)) {
-               retval = -ENXIO;
-               goto outio;
+       this->write_buf = (pd->devwidth) ? au_write_buf16 : au_write_buf;
+       this->read_buf = (pd->devwidth) ? au_read_buf16 : au_read_buf;
+       this->verify_buf = (pd->devwidth) ? au_verify_buf16 : au_verify_buf;
+
+       ret = nand_scan(&ctx->info, 1);
+       if (ret) {
+               dev_err(&pdev->dev, "NAND scan failed with %d\n", ret);
+               goto out3;
        }
 
-       /* Register the partitions */
-       mtd_device_register(au1550_mtd, partition_info,
-                           ARRAY_SIZE(partition_info));
+       mtd_device_register(&ctx->info, pd->parts, pd->num_parts);
 
        return 0;
 
- outio:
-       iounmap(p_nand);
-
- outmem:
-       kfree(au1550_mtd);
-       return retval;
+out3:
+       iounmap(ctx->base);
+out2:
+       release_mem_region(r->start, resource_size(r));
+out1:
+       kfree(ctx);
+       return ret;
 }
 
-module_init(au1xxx_nand_init);
-
-/*
- * Clean up routine
- */
-static void __exit au1550_cleanup(void)
+static int __devexit au1550nd_remove(struct platform_device *pdev)
 {
-       /* Release resources, unregister device */
-       nand_release(au1550_mtd);
+       struct au1550nd_ctx *ctx = platform_get_drvdata(pdev);
+       struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
-       /* Free the MTD device structure */
-       kfree(au1550_mtd);
-
-       /* Unmap */
-       iounmap(p_nand);
+       nand_release(&ctx->info);
+       iounmap(ctx->base);
+       release_mem_region(r->start, 0x1000);
+       kfree(ctx);
+       return 0;
 }
 
-module_exit(au1550_cleanup);
+static struct platform_driver au1550nd_driver = {
+       .driver = {
+               .name   = "au1550-nand",
+               .owner  = THIS_MODULE,
+       },
+       .probe          = au1550nd_probe,
+       .remove         = __devexit_p(au1550nd_remove),
+};
+
+module_platform_driver(au1550nd_driver);
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Embedded Edge, LLC");
index d423d18b4ad6a96574a39595632d4ea5b69179fb..e535137eb2d0fff40f1877bbcbcef94730e4dd12 100644 (file)
@@ -313,8 +313,12 @@ config TOSHIBA_FIR
          donauboe.
 
 config AU1000_FIR
-       tristate "Alchemy Au1000 SIR/FIR"
+       tristate "Alchemy IrDA SIR/FIR"
        depends on IRDA && MIPS_ALCHEMY
+       help
+         Say Y/M here to build suppor the the IrDA peripheral on the
+         Alchemy Au1000 and Au1100 SoCs.
+         Say M to build a module; it will be called au1k_ir.ko
 
 config SMC_IRCC_FIR
        tristate "SMSC IrCC (EXPERIMENTAL)"
diff --git a/drivers/net/irda/au1000_ircc.h b/drivers/net/irda/au1000_ircc.h
deleted file mode 100644 (file)
index c072c09..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     Au1000 IrDA driver.
- *
- * Copyright 2001 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@mvista.com or source@mvista.com
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef AU1000_IRCC_H
-#define AU1000_IRCC_H
-
-#include <linux/time.h>
-
-#include <linux/spinlock.h>
-#include <linux/pm.h>
-#include <asm/io.h>
-
-#define NUM_IR_IFF          1
-#define NUM_IR_DESC        64
-#define RING_SIZE_4       0x0
-#define RING_SIZE_16      0x3
-#define RING_SIZE_64      0xF
-#define MAX_NUM_IR_DESC    64
-#define MAX_BUF_SIZE     2048
-
-#define BPS_115200          0
-#define BPS_57600           1
-#define BPS_38400           2
-#define BPS_19200           5
-#define BPS_9600           11
-#define BPS_2400           47
-
-/* Ring descriptor flags */
-#define AU_OWN           (1<<7) /* tx,rx */
-
-#define IR_DIS_CRC       (1<<6) /* tx */
-#define IR_BAD_CRC       (1<<5) /* tx */
-#define IR_NEED_PULSE    (1<<4) /* tx */
-#define IR_FORCE_UNDER   (1<<3) /* tx */
-#define IR_DISABLE_TX    (1<<2) /* tx */
-#define IR_HW_UNDER      (1<<0) /* tx */
-#define IR_TX_ERROR      (IR_DIS_CRC|IR_BAD_CRC|IR_HW_UNDER)
-
-#define IR_PHY_ERROR     (1<<6) /* rx */
-#define IR_CRC_ERROR     (1<<5) /* rx */
-#define IR_MAX_LEN       (1<<4) /* rx */
-#define IR_FIFO_OVER     (1<<3) /* rx */
-#define IR_SIR_ERROR     (1<<2) /* rx */
-#define IR_RX_ERROR      (IR_PHY_ERROR|IR_CRC_ERROR| \
-               IR_MAX_LEN|IR_FIFO_OVER|IR_SIR_ERROR)
-
-typedef struct db_dest {
-       struct db_dest *pnext;
-       volatile u32 *vaddr;
-       dma_addr_t dma_addr;
-} db_dest_t;
-
-
-typedef struct ring_desc {
-       u8 count_0;               /* 7:0  */
-       u8 count_1;               /* 12:8 */
-       u8 reserved;
-       u8 flags;
-       u8 addr_0;                /* 7:0   */
-       u8 addr_1;                /* 15:8  */
-       u8 addr_2;                /* 23:16 */
-       u8 addr_3;                /* 31:24 */
-} ring_dest_t;
-
-
-/* Private data for each instance */
-struct au1k_private {
-
-       db_dest_t *pDBfree;
-       db_dest_t db[2*NUM_IR_DESC];
-       volatile ring_dest_t *rx_ring[NUM_IR_DESC];
-       volatile ring_dest_t *tx_ring[NUM_IR_DESC];
-       db_dest_t *rx_db_inuse[NUM_IR_DESC];
-       db_dest_t *tx_db_inuse[NUM_IR_DESC];
-       u32 rx_head;
-       u32 tx_head;
-       u32 tx_tail;
-       u32 tx_full;
-
-       iobuff_t rx_buff;
-
-       struct net_device *netdev;
-       
-       struct timeval stamp;
-       struct timeval now;
-       struct qos_info         qos;
-       struct irlap_cb         *irlap;
-       
-       u8 open;
-       u32 speed;
-       u32 newspeed;
-       
-       u32 intr_work_done; /* number of Rx and Tx pkts processed in the isr */
-       struct timer_list timer;
-
-       spinlock_t lock;           /* For serializing operations */
-};
-#endif /* AU1000_IRCC_H */
index a3d696a9456a10a9d4f659cc70ad1982f2a7e58d..fc503aa5288e3f164843f754c6977abf4345705c 100644 (file)
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
  */
-#include <linux/module.h>
-#include <linux/types.h>
+
 #include <linux/init.h>
-#include <linux/errno.h>
+#include <linux/module.h>
 #include <linux/netdevice.h>
-#include <linux/slab.h>
-#include <linux/rtnetlink.h>
 #include <linux/interrupt.h>
-#include <linux/pm.h>
-#include <linux/bitops.h>
-
-#include <asm/irq.h>
-#include <asm/io.h>
-#include <asm/au1000.h>
-#if defined(CONFIG_MIPS_PB1000) || defined(CONFIG_MIPS_PB1100)
-#include <asm/pb1000.h>
-#elif defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1100)
-#include <asm/db1x00.h>
-#include <asm/mach-db1x00/bcsr.h>
-#else 
-#error au1k_ir: unsupported board
-#endif
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/time.h>
+#include <linux/types.h>
 
 #include <net/irda/irda.h>
 #include <net/irda/irmod.h>
 #include <net/irda/wrapper.h>
 #include <net/irda/irda_device.h>
-#include "au1000_ircc.h"
+#include <asm/mach-au1x00/au1000.h>
+
+/* registers */
+#define IR_RING_PTR_STATUS     0x00
+#define IR_RING_BASE_ADDR_H    0x04
+#define IR_RING_BASE_ADDR_L    0x08
+#define IR_RING_SIZE           0x0C
+#define IR_RING_PROMPT         0x10
+#define IR_RING_ADDR_CMPR      0x14
+#define IR_INT_CLEAR           0x18
+#define IR_CONFIG_1            0x20
+#define IR_SIR_FLAGS           0x24
+#define IR_STATUS              0x28
+#define IR_READ_PHY_CONFIG     0x2C
+#define IR_WRITE_PHY_CONFIG    0x30
+#define IR_MAX_PKT_LEN         0x34
+#define IR_RX_BYTE_CNT         0x38
+#define IR_CONFIG_2            0x3C
+#define IR_ENABLE              0x40
+
+/* Config1 */
+#define IR_RX_INVERT_LED       (1 << 0)
+#define IR_TX_INVERT_LED       (1 << 1)
+#define IR_ST                  (1 << 2)
+#define IR_SF                  (1 << 3)
+#define IR_SIR                 (1 << 4)
+#define IR_MIR                 (1 << 5)
+#define IR_FIR                 (1 << 6)
+#define IR_16CRC               (1 << 7)
+#define IR_TD                  (1 << 8)
+#define IR_RX_ALL              (1 << 9)
+#define IR_DMA_ENABLE          (1 << 10)
+#define IR_RX_ENABLE           (1 << 11)
+#define IR_TX_ENABLE           (1 << 12)
+#define IR_LOOPBACK            (1 << 14)
+#define IR_SIR_MODE            (IR_SIR | IR_DMA_ENABLE | \
+                                IR_RX_ALL | IR_RX_ENABLE | IR_SF | \
+                                IR_16CRC)
+
+/* ir_status */
+#define IR_RX_STATUS           (1 << 9)
+#define IR_TX_STATUS           (1 << 10)
+#define IR_PHYEN               (1 << 15)
+
+/* ir_write_phy_config */
+#define IR_BR(x)               (((x) & 0x3f) << 10)    /* baud rate */
+#define IR_PW(x)               (((x) & 0x1f) << 5)     /* pulse width */
+#define IR_P(x)                        ((x) & 0x1f)            /* preamble bits */
+
+/* Config2 */
+#define IR_MODE_INV            (1 << 0)
+#define IR_ONE_PIN             (1 << 1)
+#define IR_PHYCLK_40MHZ                (0 << 2)
+#define IR_PHYCLK_48MHZ                (1 << 2)
+#define IR_PHYCLK_56MHZ                (2 << 2)
+#define IR_PHYCLK_64MHZ                (3 << 2)
+#define IR_DP                  (1 << 4)
+#define IR_DA                  (1 << 5)
+#define IR_FLT_HIGH            (0 << 6)
+#define IR_FLT_MEDHI           (1 << 6)
+#define IR_FLT_MEDLO           (2 << 6)
+#define IR_FLT_LO              (3 << 6)
+#define IR_IEN                 (1 << 8)
+
+/* ir_enable */
+#define IR_HC                  (1 << 3)        /* divide SBUS clock by 2 */
+#define IR_CE                  (1 << 2)        /* clock enable */
+#define IR_C                   (1 << 1)        /* coherency bit */
+#define IR_BE                  (1 << 0)        /* set in big endian mode */
+
+#define NUM_IR_DESC    64
+#define RING_SIZE_4    0x0
+#define RING_SIZE_16   0x3
+#define RING_SIZE_64   0xF
+#define MAX_NUM_IR_DESC        64
+#define MAX_BUF_SIZE   2048
+
+/* Ring descriptor flags */
+#define AU_OWN         (1 << 7) /* tx,rx */
+#define IR_DIS_CRC     (1 << 6) /* tx */
+#define IR_BAD_CRC     (1 << 5) /* tx */
+#define IR_NEED_PULSE  (1 << 4) /* tx */
+#define IR_FORCE_UNDER (1 << 3) /* tx */
+#define IR_DISABLE_TX  (1 << 2) /* tx */
+#define IR_HW_UNDER    (1 << 0) /* tx */
+#define IR_TX_ERROR    (IR_DIS_CRC | IR_BAD_CRC | IR_HW_UNDER)
+
+#define IR_PHY_ERROR   (1 << 6) /* rx */
+#define IR_CRC_ERROR   (1 << 5) /* rx */
+#define IR_MAX_LEN     (1 << 4) /* rx */
+#define IR_FIFO_OVER   (1 << 3) /* rx */
+#define IR_SIR_ERROR   (1 << 2) /* rx */
+#define IR_RX_ERROR    (IR_PHY_ERROR | IR_CRC_ERROR | \
+                        IR_MAX_LEN | IR_FIFO_OVER | IR_SIR_ERROR)
+
+struct db_dest {
+       struct db_dest *pnext;
+       volatile u32 *vaddr;
+       dma_addr_t dma_addr;
+};
+
+struct ring_dest {
+       u8 count_0;     /* 7:0  */
+       u8 count_1;     /* 12:8 */
+       u8 reserved;
+       u8 flags;
+       u8 addr_0;      /* 7:0   */
+       u8 addr_1;      /* 15:8  */
+       u8 addr_2;      /* 23:16 */
+       u8 addr_3;      /* 31:24 */
+};
+
+/* Private data for each instance */
+struct au1k_private {
+       void __iomem *iobase;
+       int irq_rx, irq_tx;
+
+       struct db_dest *pDBfree;
+       struct db_dest db[2 * NUM_IR_DESC];
+       volatile struct ring_dest *rx_ring[NUM_IR_DESC];
+       volatile struct ring_dest *tx_ring[NUM_IR_DESC];
+       struct db_dest *rx_db_inuse[NUM_IR_DESC];
+       struct db_dest *tx_db_inuse[NUM_IR_DESC];
+       u32 rx_head;
+       u32 tx_head;
+       u32 tx_tail;
+       u32 tx_full;
+
+       iobuff_t rx_buff;
+
+       struct net_device *netdev;
+       struct timeval stamp;
+       struct timeval now;
+       struct qos_info qos;
+       struct irlap_cb *irlap;
+
+       u8 open;
+       u32 speed;
+       u32 newspeed;
 
-static int au1k_irda_net_init(struct net_device *);
-static int au1k_irda_start(struct net_device *);
-static int au1k_irda_stop(struct net_device *dev);
-static int au1k_irda_hard_xmit(struct sk_buff *, struct net_device *);
-static int au1k_irda_rx(struct net_device *);
-static void au1k_irda_interrupt(int, void *);
-static void au1k_tx_timeout(struct net_device *);
-static int au1k_irda_ioctl(struct net_device *, struct ifreq *, int);
-static int au1k_irda_set_speed(struct net_device *dev, int speed);
+       struct timer_list timer;
 
-static void *dma_alloc(size_t, dma_addr_t *);
-static void dma_free(void *, size_t);
+       struct resource *ioarea;
+       struct au1k_irda_platform_data *platdata;
+};
 
 static int qos_mtt_bits = 0x07;  /* 1 ms or more */
-static struct net_device *ir_devs[NUM_IR_IFF];
-static char version[] __devinitdata =
-    "au1k_ircc:1.2 ppopov@mvista.com\n";
 
 #define RUN_AT(x) (jiffies + (x))
 
-static DEFINE_SPINLOCK(ir_lock);
+static void au1k_irda_plat_set_phy_mode(struct au1k_private *p, int mode)
+{
+       if (p->platdata && p->platdata->set_phy_mode)
+               p->platdata->set_phy_mode(mode);
+}
 
-/*
- * IrDA peripheral bug. You have to read the register
- * twice to get the right value.
- */
-u32 read_ir_reg(u32 addr) 
-{ 
-       readl(addr);
-       return readl(addr);
+static inline unsigned long irda_read(struct au1k_private *p,
+                                     unsigned long ofs)
+{
+       /*
+       * IrDA peripheral bug. You have to read the register
+       * twice to get the right value.
+       */
+       (void)__raw_readl(p->iobase + ofs);
+       return __raw_readl(p->iobase + ofs);
 }
 
+static inline void irda_write(struct au1k_private *p, unsigned long ofs,
+                             unsigned long val)
+{
+       __raw_writel(val, p->iobase + ofs);
+       wmb();
+}
 
 /*
  * Buffer allocation/deallocation routines. The buffer descriptor returned
- * has the virtual and dma address of a buffer suitable for 
+ * has the virtual and dma address of a buffer suitable for
  * both, receive and transmit operations.
  */
-static db_dest_t *GetFreeDB(struct au1k_private *aup)
+static struct db_dest *GetFreeDB(struct au1k_private *aup)
 {
-       db_dest_t *pDB;
-       pDB = aup->pDBfree;
-
-       if (pDB) {
-               aup->pDBfree = pDB->pnext;
-       }
-       return pDB;
-}
+       struct db_dest *db;
+       db = aup->pDBfree;
 
-static void ReleaseDB(struct au1k_private *aup, db_dest_t *pDB)
-{
-       db_dest_t *pDBfree = aup->pDBfree;
-       if (pDBfree)
-               pDBfree->pnext = pDB;
-       aup->pDBfree = pDB;
+       if (db)
+               aup->pDBfree = db->pnext;
+       return db;
 }
 
-
 /*
   DMA memory allocation, derived from pci_alloc_consistent.
   However, the Au1000 data cache is coherent (when programmed
   so), therefore we return KSEG0 address, not KSEG1.
 */
-static void *dma_alloc(size_t size, dma_addr_t * dma_handle)
+static void *dma_alloc(size_t size, dma_addr_t *dma_handle)
 {
        void *ret;
        int gfp = GFP_ATOMIC | GFP_DMA;
 
-       ret = (void *) __get_free_pages(gfp, get_order(size));
+       ret = (void *)__get_free_pages(gfp, get_order(size));
 
        if (ret != NULL) {
                memset(ret, 0, size);
@@ -125,7 +241,6 @@ static void *dma_alloc(size_t size, dma_addr_t * dma_handle)
        return ret;
 }
 
-
 static void dma_free(void *vaddr, size_t size)
 {
        vaddr = (void *)KSEG0ADDR(vaddr);
@@ -133,206 +248,306 @@ static void dma_free(void *vaddr, size_t size)
 }
 
 
-static void 
-setup_hw_rings(struct au1k_private *aup, u32 rx_base, u32 tx_base)
+static void setup_hw_rings(struct au1k_private *aup, u32 rx_base, u32 tx_base)
 {
        int i;
-       for (i=0; i<NUM_IR_DESC; i++) {
-               aup->rx_ring[i] = (volatile ring_dest_t *) 
-                       (rx_base + sizeof(ring_dest_t)*i);
+       for (i = 0; i < NUM_IR_DESC; i++) {
+               aup->rx_ring[i] = (volatile struct ring_dest *)
+                       (rx_base + sizeof(struct ring_dest) * i);
        }
-       for (i=0; i<NUM_IR_DESC; i++) {
-               aup->tx_ring[i] = (volatile ring_dest_t *) 
-                       (tx_base + sizeof(ring_dest_t)*i);
+       for (i = 0; i < NUM_IR_DESC; i++) {
+               aup->tx_ring[i] = (volatile struct ring_dest *)
+                       (tx_base + sizeof(struct ring_dest) * i);
        }
 }
 
-static int au1k_irda_init(void)
-{
-       static unsigned version_printed = 0;
-       struct au1k_private *aup;
-       struct net_device *dev;
-       int err;
-
-       if (version_printed++ == 0) printk(version);
-
-       dev = alloc_irdadev(sizeof(struct au1k_private));
-       if (!dev)
-               return -ENOMEM;
-
-       dev->irq = AU1000_IRDA_RX_INT; /* TX has its own interrupt */
-       err = au1k_irda_net_init(dev);
-       if (err)
-               goto out;
-       err = register_netdev(dev);
-       if (err)
-               goto out1;
-       ir_devs[0] = dev;
-       printk(KERN_INFO "IrDA: Registered device %s\n", dev->name);
-       return 0;
-
-out1:
-       aup = netdev_priv(dev);
-       dma_free((void *)aup->db[0].vaddr,
-               MAX_BUF_SIZE * 2*NUM_IR_DESC);
-       dma_free((void *)aup->rx_ring[0],
-               2 * MAX_NUM_IR_DESC*(sizeof(ring_dest_t)));
-       kfree(aup->rx_buff.head);
-out:
-       free_netdev(dev);
-       return err;
-}
-
 static int au1k_irda_init_iobuf(iobuff_t *io, int size)
 {
        io->head = kmalloc(size, GFP_KERNEL);
        if (io->head != NULL) {
-               io->truesize = size;
-               io->in_frame = FALSE;
-               io->state    = OUTSIDE_FRAME;
-               io->data     = io->head;
+               io->truesize    = size;
+               io->in_frame    = FALSE;
+               io->state       = OUTSIDE_FRAME;
+               io->data        = io->head;
        }
        return io->head ? 0 : -ENOMEM;
 }
 
-static const struct net_device_ops au1k_irda_netdev_ops = {
-       .ndo_open               = au1k_irda_start,
-       .ndo_stop               = au1k_irda_stop,
-       .ndo_start_xmit         = au1k_irda_hard_xmit,
-       .ndo_tx_timeout         = au1k_tx_timeout,
-       .ndo_do_ioctl           = au1k_irda_ioctl,
-};
-
-static int au1k_irda_net_init(struct net_device *dev)
+/*
+ * Set the IrDA communications speed.
+ */
+static int au1k_irda_set_speed(struct net_device *dev, int speed)
 {
        struct au1k_private *aup = netdev_priv(dev);
-       int i, retval = 0, err;
-       db_dest_t *pDB, *pDBfree;
-       dma_addr_t temp;
+       volatile struct ring_dest *ptxd;
+       unsigned long control;
+       int ret = 0, timeout = 10, i;
 
-       err = au1k_irda_init_iobuf(&aup->rx_buff, 14384);
-       if (err)
-               goto out1;
+       if (speed == aup->speed)
+               return ret;
 
-       dev->netdev_ops = &au1k_irda_netdev_ops;
+       /* disable PHY first */
+       au1k_irda_plat_set_phy_mode(aup, AU1000_IRDA_PHY_MODE_OFF);
+       irda_write(aup, IR_STATUS, irda_read(aup, IR_STATUS) & ~IR_PHYEN);
 
-       irda_init_max_qos_capabilies(&aup->qos);
+       /* disable RX/TX */
+       irda_write(aup, IR_CONFIG_1,
+           irda_read(aup, IR_CONFIG_1) & ~(IR_RX_ENABLE | IR_TX_ENABLE));
+       msleep(20);
+       while (irda_read(aup, IR_STATUS) & (IR_RX_STATUS | IR_TX_STATUS)) {
+               msleep(20);
+               if (!timeout--) {
+                       printk(KERN_ERR "%s: rx/tx disable timeout\n",
+                                       dev->name);
+                       break;
+               }
+       }
 
-       /* The only value we must override it the baudrate */
-       aup->qos.baud_rate.bits = IR_9600|IR_19200|IR_38400|IR_57600|
-               IR_115200|IR_576000 |(IR_4000000 << 8);
-       
-       aup->qos.min_turn_time.bits = qos_mtt_bits;
-       irda_qos_bits_to_value(&aup->qos);
+       /* disable DMA */
+       irda_write(aup, IR_CONFIG_1,
+                  irda_read(aup, IR_CONFIG_1) & ~IR_DMA_ENABLE);
+       msleep(20);
 
-       retval = -ENOMEM;
+       /* After we disable tx/rx. the index pointers go back to zero. */
+       aup->tx_head = aup->tx_tail = aup->rx_head = 0;
+       for (i = 0; i < NUM_IR_DESC; i++) {
+               ptxd = aup->tx_ring[i];
+               ptxd->flags = 0;
+               ptxd->count_0 = 0;
+               ptxd->count_1 = 0;
+       }
 
-       /* Tx ring follows rx ring + 512 bytes */
-       /* we need a 1k aligned buffer */
-       aup->rx_ring[0] = (ring_dest_t *)
-               dma_alloc(2*MAX_NUM_IR_DESC*(sizeof(ring_dest_t)), &temp);
-       if (!aup->rx_ring[0])
-               goto out2;
+       for (i = 0; i < NUM_IR_DESC; i++) {
+               ptxd = aup->rx_ring[i];
+               ptxd->count_0 = 0;
+               ptxd->count_1 = 0;
+               ptxd->flags = AU_OWN;
+       }
 
-       /* allocate the data buffers */
-       aup->db[0].vaddr = 
-               (void *)dma_alloc(MAX_BUF_SIZE * 2*NUM_IR_DESC, &temp);
-       if (!aup->db[0].vaddr)
-               goto out3;
+       if (speed == 4000000)
+               au1k_irda_plat_set_phy_mode(aup, AU1000_IRDA_PHY_MODE_FIR);
+       else
+               au1k_irda_plat_set_phy_mode(aup, AU1000_IRDA_PHY_MODE_SIR);
 
-       setup_hw_rings(aup, (u32)aup->rx_ring[0], (u32)aup->rx_ring[0] + 512);
+       switch (speed) {
+       case 9600:
+               irda_write(aup, IR_WRITE_PHY_CONFIG, IR_BR(11) | IR_PW(12));
+               irda_write(aup, IR_CONFIG_1, IR_SIR_MODE);
+               break;
+       case 19200:
+               irda_write(aup, IR_WRITE_PHY_CONFIG, IR_BR(5) | IR_PW(12));
+               irda_write(aup, IR_CONFIG_1, IR_SIR_MODE);
+               break;
+       case 38400:
+               irda_write(aup, IR_WRITE_PHY_CONFIG, IR_BR(2) | IR_PW(12));
+               irda_write(aup, IR_CONFIG_1, IR_SIR_MODE);
+               break;
+       case 57600:
+               irda_write(aup, IR_WRITE_PHY_CONFIG, IR_BR(1) | IR_PW(12));
+               irda_write(aup, IR_CONFIG_1, IR_SIR_MODE);
+               break;
+       case 115200:
+               irda_write(aup, IR_WRITE_PHY_CONFIG, IR_PW(12));
+               irda_write(aup, IR_CONFIG_1, IR_SIR_MODE);
+               break;
+       case 4000000:
+               irda_write(aup, IR_WRITE_PHY_CONFIG, IR_P(15));
+               irda_write(aup, IR_CONFIG_1, IR_FIR | IR_DMA_ENABLE |
+                               IR_RX_ENABLE);
+               break;
+       default:
+               printk(KERN_ERR "%s unsupported speed %x\n", dev->name, speed);
+               ret = -EINVAL;
+               break;
+       }
 
-       pDBfree = NULL;
-       pDB = aup->db;
-       for (i=0; i<(2*NUM_IR_DESC); i++) {
-               pDB->pnext = pDBfree;
-               pDBfree = pDB;
-               pDB->vaddr = 
-                       (u32 *)((unsigned)aup->db[0].vaddr + MAX_BUF_SIZE*i);
-               pDB->dma_addr = (dma_addr_t)virt_to_bus(pDB->vaddr);
-               pDB++;
+       aup->speed = speed;
+       irda_write(aup, IR_STATUS, irda_read(aup, IR_STATUS) | IR_PHYEN);
+
+       control = irda_read(aup, IR_STATUS);
+       irda_write(aup, IR_RING_PROMPT, 0);
+
+       if (control & (1 << 14)) {
+               printk(KERN_ERR "%s: configuration error\n", dev->name);
+       } else {
+               if (control & (1 << 11))
+                       printk(KERN_DEBUG "%s Valid SIR config\n", dev->name);
+               if (control & (1 << 12))
+                       printk(KERN_DEBUG "%s Valid MIR config\n", dev->name);
+               if (control & (1 << 13))
+                       printk(KERN_DEBUG "%s Valid FIR config\n", dev->name);
+               if (control & (1 << 10))
+                       printk(KERN_DEBUG "%s TX enabled\n", dev->name);
+               if (control & (1 << 9))
+                       printk(KERN_DEBUG "%s RX enabled\n", dev->name);
        }
-       aup->pDBfree = pDBfree;
 
-       /* attach a data buffer to each descriptor */
-       for (i=0; i<NUM_IR_DESC; i++) {
-               pDB = GetFreeDB(aup);
-               if (!pDB) goto out;
-               aup->rx_ring[i]->addr_0 = (u8)(pDB->dma_addr & 0xff);
-               aup->rx_ring[i]->addr_1 = (u8)((pDB->dma_addr>>8) & 0xff);
-               aup->rx_ring[i]->addr_2 = (u8)((pDB->dma_addr>>16) & 0xff);
-               aup->rx_ring[i]->addr_3 = (u8)((pDB->dma_addr>>24) & 0xff);
-               aup->rx_db_inuse[i] = pDB;
+       return ret;
+}
+
+static void update_rx_stats(struct net_device *dev, u32 status, u32 count)
+{
+       struct net_device_stats *ps = &dev->stats;
+
+       ps->rx_packets++;
+
+       if (status & IR_RX_ERROR) {
+               ps->rx_errors++;
+               if (status & (IR_PHY_ERROR | IR_FIFO_OVER))
+                       ps->rx_missed_errors++;
+               if (status & IR_MAX_LEN)
+                       ps->rx_length_errors++;
+               if (status & IR_CRC_ERROR)
+                       ps->rx_crc_errors++;
+       } else
+               ps->rx_bytes += count;
+}
+
+static void update_tx_stats(struct net_device *dev, u32 status, u32 pkt_len)
+{
+       struct net_device_stats *ps = &dev->stats;
+
+       ps->tx_packets++;
+       ps->tx_bytes += pkt_len;
+
+       if (status & IR_TX_ERROR) {
+               ps->tx_errors++;
+               ps->tx_aborted_errors++;
        }
-       for (i=0; i<NUM_IR_DESC; i++) {
-               pDB = GetFreeDB(aup);
-               if (!pDB) goto out;
-               aup->tx_ring[i]->addr_0 = (u8)(pDB->dma_addr & 0xff);
-               aup->tx_ring[i]->addr_1 = (u8)((pDB->dma_addr>>8) & 0xff);
-               aup->tx_ring[i]->addr_2 = (u8)((pDB->dma_addr>>16) & 0xff);
-               aup->tx_ring[i]->addr_3 = (u8)((pDB->dma_addr>>24) & 0xff);
-               aup->tx_ring[i]->count_0 = 0;
-               aup->tx_ring[i]->count_1 = 0;
-               aup->tx_ring[i]->flags = 0;
-               aup->tx_db_inuse[i] = pDB;
+}
+
+static void au1k_tx_ack(struct net_device *dev)
+{
+       struct au1k_private *aup = netdev_priv(dev);
+       volatile struct ring_dest *ptxd;
+
+       ptxd = aup->tx_ring[aup->tx_tail];
+       while (!(ptxd->flags & AU_OWN) && (aup->tx_tail != aup->tx_head)) {
+               update_tx_stats(dev, ptxd->flags,
+                               (ptxd->count_1 << 8) | ptxd->count_0);
+               ptxd->count_0 = 0;
+               ptxd->count_1 = 0;
+               wmb();
+               aup->tx_tail = (aup->tx_tail + 1) & (NUM_IR_DESC - 1);
+               ptxd = aup->tx_ring[aup->tx_tail];
+
+               if (aup->tx_full) {
+                       aup->tx_full = 0;
+                       netif_wake_queue(dev);
+               }
        }
 
-#if defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1100)
-       /* power on */
-       bcsr_mod(BCSR_RESETS, BCSR_RESETS_IRDA_MODE_MASK,
-                             BCSR_RESETS_IRDA_MODE_FULL);
-#endif
+       if (aup->tx_tail == aup->tx_head) {
+               if (aup->newspeed) {
+                       au1k_irda_set_speed(dev, aup->newspeed);
+                       aup->newspeed = 0;
+               } else {
+                       irda_write(aup, IR_CONFIG_1,
+                           irda_read(aup, IR_CONFIG_1) & ~IR_TX_ENABLE);
+                       irda_write(aup, IR_CONFIG_1,
+                           irda_read(aup, IR_CONFIG_1) | IR_RX_ENABLE);
+                       irda_write(aup, IR_RING_PROMPT, 0);
+               }
+       }
+}
 
-       return 0;
+static int au1k_irda_rx(struct net_device *dev)
+{
+       struct au1k_private *aup = netdev_priv(dev);
+       volatile struct ring_dest *prxd;
+       struct sk_buff *skb;
+       struct db_dest *pDB;
+       u32 flags, count;
 
-out3:
-       dma_free((void *)aup->rx_ring[0],
-               2 * MAX_NUM_IR_DESC*(sizeof(ring_dest_t)));
-out2:
-       kfree(aup->rx_buff.head);
-out1:
-       printk(KERN_ERR "au1k_init_module failed.  Returns %d\n", retval);
-       return retval;
+       prxd = aup->rx_ring[aup->rx_head];
+       flags = prxd->flags;
+
+       while (!(flags & AU_OWN))  {
+               pDB = aup->rx_db_inuse[aup->rx_head];
+               count = (prxd->count_1 << 8) | prxd->count_0;
+               if (!(flags & IR_RX_ERROR)) {
+                       /* good frame */
+                       update_rx_stats(dev, flags, count);
+                       skb = alloc_skb(count + 1, GFP_ATOMIC);
+                       if (skb == NULL) {
+                               dev->stats.rx_dropped++;
+                               continue;
+                       }
+                       skb_reserve(skb, 1);
+                       if (aup->speed == 4000000)
+                               skb_put(skb, count);
+                       else
+                               skb_put(skb, count - 2);
+                       skb_copy_to_linear_data(skb, (void *)pDB->vaddr,
+                                               count - 2);
+                       skb->dev = dev;
+                       skb_reset_mac_header(skb);
+                       skb->protocol = htons(ETH_P_IRDA);
+                       netif_rx(skb);
+                       prxd->count_0 = 0;
+                       prxd->count_1 = 0;
+               }
+               prxd->flags |= AU_OWN;
+               aup->rx_head = (aup->rx_head + 1) & (NUM_IR_DESC - 1);
+               irda_write(aup, IR_RING_PROMPT, 0);
+
+               /* next descriptor */
+               prxd = aup->rx_ring[aup->rx_head];
+               flags = prxd->flags;
+
+       }
+       return 0;
 }
 
+static irqreturn_t au1k_irda_interrupt(int dummy, void *dev_id)
+{
+       struct net_device *dev = dev_id;
+       struct au1k_private *aup = netdev_priv(dev);
+
+       irda_write(aup, IR_INT_CLEAR, 0); /* ack irda interrupts */
+
+       au1k_irda_rx(dev);
+       au1k_tx_ack(dev);
+
+       return IRQ_HANDLED;
+}
 
 static int au1k_init(struct net_device *dev)
 {
        struct au1k_private *aup = netdev_priv(dev);
+       u32 enable, ring_address;
        int i;
-       u32 control;
-       u32 ring_address;
 
-       /* bring the device out of reset */
-       control = 0xe; /* coherent, clock enable, one half system clock */
-                         
+       enable = IR_HC | IR_CE | IR_C;
 #ifndef CONFIG_CPU_LITTLE_ENDIAN
-       control |= 1;
+       enable |= IR_BE;
 #endif
        aup->tx_head = 0;
        aup->tx_tail = 0;
        aup->rx_head = 0;
 
-       for (i=0; i<NUM_IR_DESC; i++) {
+       for (i = 0; i < NUM_IR_DESC; i++)
                aup->rx_ring[i]->flags = AU_OWN;
-       }
 
-       writel(control, IR_INTERFACE_CONFIG);
-       au_sync_delay(10);
+       irda_write(aup, IR_ENABLE, enable);
+       msleep(20);
 
-       writel(read_ir_reg(IR_ENABLE) & ~0x8000, IR_ENABLE); /* disable PHY */
-       au_sync_delay(1);
+       /* disable PHY */
+       au1k_irda_plat_set_phy_mode(aup, AU1000_IRDA_PHY_MODE_OFF);
+       irda_write(aup, IR_STATUS, irda_read(aup, IR_STATUS) & ~IR_PHYEN);
+       msleep(20);
 
-       writel(MAX_BUF_SIZE, IR_MAX_PKT_LEN);
+       irda_write(aup, IR_MAX_PKT_LEN, MAX_BUF_SIZE);
 
        ring_address = (u32)virt_to_phys((void *)aup->rx_ring[0]);
-       writel(ring_address >> 26, IR_RING_BASE_ADDR_H);
-       writel((ring_address >> 10) & 0xffff, IR_RING_BASE_ADDR_L);
+       irda_write(aup, IR_RING_BASE_ADDR_H, ring_address >> 26);
+       irda_write(aup, IR_RING_BASE_ADDR_L, (ring_address >> 10) & 0xffff);
 
-       writel(RING_SIZE_64<<8 | RING_SIZE_64<<12, IR_RING_SIZE);
+       irda_write(aup, IR_RING_SIZE,
+                               (RING_SIZE_64 << 8) | (RING_SIZE_64 << 12));
 
-       writel(1<<2 | IR_ONE_PIN, IR_CONFIG_2); /* 48MHz */
-       writel(0, IR_RING_ADDR_CMPR);
+       irda_write(aup, IR_CONFIG_2, IR_PHYCLK_48MHZ | IR_ONE_PIN);
+       irda_write(aup, IR_RING_ADDR_CMPR, 0);
 
        au1k_irda_set_speed(dev, 9600);
        return 0;
@@ -340,25 +555,28 @@ static int au1k_init(struct net_device *dev)
 
 static int au1k_irda_start(struct net_device *dev)
 {
-       int retval;
-       char hwname[32];
        struct au1k_private *aup = netdev_priv(dev);
+       char hwname[32];
+       int retval;
 
-       if ((retval = au1k_init(dev))) {
+       retval = au1k_init(dev);
+       if (retval) {
                printk(KERN_ERR "%s: error in au1k_init\n", dev->name);
                return retval;
        }
 
-       if ((retval = request_irq(AU1000_IRDA_TX_INT, au1k_irda_interrupt, 
-                                       0, dev->name, dev))) {
-               printk(KERN_ERR "%s: unable to get IRQ %d\n", 
+       retval = request_irq(aup->irq_tx, &au1k_irda_interrupt, 0,
+                            dev->name, dev);
+       if (retval) {
+               printk(KERN_ERR "%s: unable to get IRQ %d\n",
                                dev->name, dev->irq);
                return retval;
        }
-       if ((retval = request_irq(AU1000_IRDA_RX_INT, au1k_irda_interrupt, 
-                                       0, dev->name, dev))) {
-               free_irq(AU1000_IRDA_TX_INT, dev);
-               printk(KERN_ERR "%s: unable to get IRQ %d\n", 
+       retval = request_irq(aup->irq_rx, &au1k_irda_interrupt, 0,
+                            dev->name, dev);
+       if (retval) {
+               free_irq(aup->irq_tx, dev);
+               printk(KERN_ERR "%s: unable to get IRQ %d\n",
                                dev->name, dev->irq);
                return retval;
        }
@@ -368,9 +586,13 @@ static int au1k_irda_start(struct net_device *dev)
        aup->irlap = irlap_open(dev, &aup->qos, hwname);
        netif_start_queue(dev);
 
-       writel(read_ir_reg(IR_CONFIG_2) | 1<<8, IR_CONFIG_2); /* int enable */
+       /* int enable */
+       irda_write(aup, IR_CONFIG_2, irda_read(aup, IR_CONFIG_2) | IR_IEN);
 
-       aup->timer.expires = RUN_AT((3*HZ)); 
+       /* power up */
+       au1k_irda_plat_set_phy_mode(aup, AU1000_IRDA_PHY_MODE_SIR);
+
+       aup->timer.expires = RUN_AT((3 * HZ));
        aup->timer.data = (unsigned long)dev;
        return 0;
 }
@@ -379,11 +601,12 @@ static int au1k_irda_stop(struct net_device *dev)
 {
        struct au1k_private *aup = netdev_priv(dev);
 
+       au1k_irda_plat_set_phy_mode(aup, AU1000_IRDA_PHY_MODE_OFF);
+
        /* disable interrupts */
-       writel(read_ir_reg(IR_CONFIG_2) & ~(1<<8), IR_CONFIG_2);
-       writel(0, IR_CONFIG_1); 
-       writel(0, IR_INTERFACE_CONFIG); /* disable clock */
-       au_sync();
+       irda_write(aup, IR_CONFIG_2, irda_read(aup, IR_CONFIG_2) & ~IR_IEN);
+       irda_write(aup, IR_CONFIG_1, 0);
+       irda_write(aup, IR_ENABLE, 0); /* disable clock */
 
        if (aup->irlap) {
                irlap_close(aup->irlap);
@@ -394,83 +617,12 @@ static int au1k_irda_stop(struct net_device *dev)
        del_timer(&aup->timer);
 
        /* disable the interrupt */
-       free_irq(AU1000_IRDA_TX_INT, dev);
-       free_irq(AU1000_IRDA_RX_INT, dev);
-       return 0;
-}
-
-static void __exit au1k_irda_exit(void)
-{
-       struct net_device *dev = ir_devs[0];
-       struct au1k_private *aup = netdev_priv(dev);
-
-       unregister_netdev(dev);
-
-       dma_free((void *)aup->db[0].vaddr,
-               MAX_BUF_SIZE * 2*NUM_IR_DESC);
-       dma_free((void *)aup->rx_ring[0],
-               2 * MAX_NUM_IR_DESC*(sizeof(ring_dest_t)));
-       kfree(aup->rx_buff.head);
-       free_netdev(dev);
-}
-
-
-static inline void 
-update_tx_stats(struct net_device *dev, u32 status, u32 pkt_len)
-{
-       struct au1k_private *aup = netdev_priv(dev);
-       struct net_device_stats *ps = &aup->stats;
-
-       ps->tx_packets++;
-       ps->tx_bytes += pkt_len;
-
-       if (status & IR_TX_ERROR) {
-               ps->tx_errors++;
-               ps->tx_aborted_errors++;
-       }
-}
-
-
-static void au1k_tx_ack(struct net_device *dev)
-{
-       struct au1k_private *aup = netdev_priv(dev);
-       volatile ring_dest_t *ptxd;
-
-       ptxd = aup->tx_ring[aup->tx_tail];
-       while (!(ptxd->flags & AU_OWN) && (aup->tx_tail != aup->tx_head)) {
-               update_tx_stats(dev, ptxd->flags, 
-                               ptxd->count_1<<8 | ptxd->count_0);
-               ptxd->count_0 = 0;
-               ptxd->count_1 = 0;
-               au_sync();
-
-               aup->tx_tail = (aup->tx_tail + 1) & (NUM_IR_DESC - 1);
-               ptxd = aup->tx_ring[aup->tx_tail];
-
-               if (aup->tx_full) {
-                       aup->tx_full = 0;
-                       netif_wake_queue(dev);
-               }
-       }
+       free_irq(aup->irq_tx, dev);
+       free_irq(aup->irq_rx, dev);
 
-       if (aup->tx_tail == aup->tx_head) {
-               if (aup->newspeed) {
-                       au1k_irda_set_speed(dev, aup->newspeed);
-                       aup->newspeed = 0;
-               }
-               else {
-                       writel(read_ir_reg(IR_CONFIG_1) & ~IR_TX_ENABLE, 
-                                       IR_CONFIG_1); 
-                       au_sync();
-                       writel(read_ir_reg(IR_CONFIG_1) | IR_RX_ENABLE, 
-                                       IR_CONFIG_1); 
-                       writel(0, IR_RING_PROMPT);
-                       au_sync();
-               }
-       }
+       return 0;
 }
 
-
 /*
  * Au1000 transmit routine.
  */
@@ -478,15 +630,12 @@ static int au1k_irda_hard_xmit(struct sk_buff *skb, struct net_device *dev)
 {
        struct au1k_private *aup = netdev_priv(dev);
        int speed = irda_get_next_speed(skb);
-       volatile ring_dest_t *ptxd;
-       u32 len;
-
-       u32 flags;
-       db_dest_t *pDB;
+       volatile struct ring_dest *ptxd;
+       struct db_dest *pDB;
+       u32 len, flags;
 
-       if (speed != aup->speed && speed != -1) {
+       if (speed != aup->speed && speed != -1)
                aup->newspeed = speed;
-       }
 
        if ((skb->len == 0) && (aup->newspeed)) {
                if (aup->tx_tail == aup->tx_head) {
@@ -504,138 +653,47 @@ static int au1k_irda_hard_xmit(struct sk_buff *skb, struct net_device *dev)
                printk(KERN_DEBUG "%s: tx_full\n", dev->name);
                netif_stop_queue(dev);
                aup->tx_full = 1;
-               return NETDEV_TX_BUSY;
-       }
-       else if (((aup->tx_head + 1) & (NUM_IR_DESC - 1)) == aup->tx_tail) {
+               return 1;
+       } else if (((aup->tx_head + 1) & (NUM_IR_DESC - 1)) == aup->tx_tail) {
                printk(KERN_DEBUG "%s: tx_full\n", dev->name);
                netif_stop_queue(dev);
                aup->tx_full = 1;
-               return NETDEV_TX_BUSY;
+               return 1;
        }
 
        pDB = aup->tx_db_inuse[aup->tx_head];
 
 #if 0
-       if (read_ir_reg(IR_RX_BYTE_CNT) != 0) {
-               printk("tx warning: rx byte cnt %x\n", 
-                               read_ir_reg(IR_RX_BYTE_CNT));
+       if (irda_read(aup, IR_RX_BYTE_CNT) != 0) {
+               printk(KERN_DEBUG "tx warning: rx byte cnt %x\n",
+                               irda_read(aup, IR_RX_BYTE_CNT));
        }
 #endif
-       
+
        if (aup->speed == 4000000) {
                /* FIR */
-               skb_copy_from_linear_data(skb, pDB->vaddr, skb->len);
+               skb_copy_from_linear_data(skb, (void *)pDB->vaddr, skb->len);
                ptxd->count_0 = skb->len & 0xff;
                ptxd->count_1 = (skb->len >> 8) & 0xff;
-
-       }
-       else {
+       } else {
                /* SIR */
                len = async_wrap_skb(skb, (u8 *)pDB->vaddr, MAX_BUF_SIZE);
                ptxd->count_0 = len & 0xff;
                ptxd->count_1 = (len >> 8) & 0xff;
                ptxd->flags |= IR_DIS_CRC;
-               au_writel(au_readl(0xae00000c) & ~(1<<13), 0xae00000c);
        }
        ptxd->flags |= AU_OWN;
-       au_sync();
+       wmb();
 
-       writel(read_ir_reg(IR_CONFIG_1) | IR_TX_ENABLE, IR_CONFIG_1); 
-       writel(0, IR_RING_PROMPT);
-       au_sync();
+       irda_write(aup, IR_CONFIG_1,
+                  irda_read(aup, IR_CONFIG_1) | IR_TX_ENABLE);
+       irda_write(aup, IR_RING_PROMPT, 0);
 
        dev_kfree_skb(skb);
        aup->tx_head = (aup->tx_head + 1) & (NUM_IR_DESC - 1);
        return NETDEV_TX_OK;
 }
 
-
-static inline void 
-update_rx_stats(struct net_device *dev, u32 status, u32 count)
-{
-       struct au1k_private *aup = netdev_priv(dev);
-       struct net_device_stats *ps = &aup->stats;
-
-       ps->rx_packets++;
-
-       if (status & IR_RX_ERROR) {
-               ps->rx_errors++;
-               if (status & (IR_PHY_ERROR|IR_FIFO_OVER))
-                       ps->rx_missed_errors++;
-               if (status & IR_MAX_LEN)
-                       ps->rx_length_errors++;
-               if (status & IR_CRC_ERROR)
-                       ps->rx_crc_errors++;
-       }
-       else 
-               ps->rx_bytes += count;
-}
-
-/*
- * Au1000 receive routine.
- */
-static int au1k_irda_rx(struct net_device *dev)
-{
-       struct au1k_private *aup = netdev_priv(dev);
-       struct sk_buff *skb;
-       volatile ring_dest_t *prxd;
-       u32 flags, count;
-       db_dest_t *pDB;
-
-       prxd = aup->rx_ring[aup->rx_head];
-       flags = prxd->flags;
-
-       while (!(flags & AU_OWN))  {
-               pDB = aup->rx_db_inuse[aup->rx_head];
-               count = prxd->count_1<<8 | prxd->count_0;
-               if (!(flags & IR_RX_ERROR))  {
-                       /* good frame */
-                       update_rx_stats(dev, flags, count);
-                       skb=alloc_skb(count+1,GFP_ATOMIC);
-                       if (skb == NULL) {
-                               aup->netdev->stats.rx_dropped++;
-                               continue;
-                       }
-                       skb_reserve(skb, 1);
-                       if (aup->speed == 4000000)
-                               skb_put(skb, count);
-                       else
-                               skb_put(skb, count-2);
-                       skb_copy_to_linear_data(skb, pDB->vaddr, count - 2);
-                       skb->dev = dev;
-                       skb_reset_mac_header(skb);
-                       skb->protocol = htons(ETH_P_IRDA);
-                       netif_rx(skb);
-                       prxd->count_0 = 0;
-                       prxd->count_1 = 0;
-               }
-               prxd->flags |= AU_OWN;
-               aup->rx_head = (aup->rx_head + 1) & (NUM_IR_DESC - 1);
-               writel(0, IR_RING_PROMPT);
-               au_sync();
-
-               /* next descriptor */
-               prxd = aup->rx_ring[aup->rx_head];
-               flags = prxd->flags;
-
-       }
-       return 0;
-}
-
-
-static irqreturn_t au1k_irda_interrupt(int dummy, void *dev_id)
-{
-       struct net_device *dev = dev_id;
-
-       writel(0, IR_INT_CLEAR); /* ack irda interrupts */
-
-       au1k_irda_rx(dev);
-       au1k_tx_ack(dev);
-
-       return IRQ_HANDLED;
-}
-
-
 /*
  * The Tx ring has been full longer than the watchdog timeout
  * value. The transmitter must be hung?
@@ -653,142 +711,7 @@ static void au1k_tx_timeout(struct net_device *dev)
        netif_wake_queue(dev);
 }
 
-
-/*
- * Set the IrDA communications speed.
- */
-static int 
-au1k_irda_set_speed(struct net_device *dev, int speed)
-{
-       unsigned long flags;
-       struct au1k_private *aup = netdev_priv(dev);
-       u32 control;
-       int ret = 0, timeout = 10, i;
-       volatile ring_dest_t *ptxd;
-#if defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1100)
-       unsigned long irda_resets;
-#endif
-
-       if (speed == aup->speed)
-               return ret;
-
-       spin_lock_irqsave(&ir_lock, flags);
-
-       /* disable PHY first */
-       writel(read_ir_reg(IR_ENABLE) & ~0x8000, IR_ENABLE);
-
-       /* disable RX/TX */
-       writel(read_ir_reg(IR_CONFIG_1) & ~(IR_RX_ENABLE|IR_TX_ENABLE), 
-                       IR_CONFIG_1);
-       au_sync_delay(1);
-       while (read_ir_reg(IR_ENABLE) & (IR_RX_STATUS | IR_TX_STATUS)) {
-               mdelay(1);
-               if (!timeout--) {
-                       printk(KERN_ERR "%s: rx/tx disable timeout\n",
-                                       dev->name);
-                       break;
-               }
-       }
-
-       /* disable DMA */
-       writel(read_ir_reg(IR_CONFIG_1) & ~IR_DMA_ENABLE, IR_CONFIG_1);
-       au_sync_delay(1);
-
-       /* 
-        *  After we disable tx/rx. the index pointers
-        * go back to zero.
-        */
-       aup->tx_head = aup->tx_tail = aup->rx_head = 0;
-       for (i=0; i<NUM_IR_DESC; i++) {
-               ptxd = aup->tx_ring[i];
-               ptxd->flags = 0;
-               ptxd->count_0 = 0;
-               ptxd->count_1 = 0;
-       }
-
-       for (i=0; i<NUM_IR_DESC; i++) {
-               ptxd = aup->rx_ring[i];
-               ptxd->count_0 = 0;
-               ptxd->count_1 = 0;
-               ptxd->flags = AU_OWN;
-       }
-
-       if (speed == 4000000) {
-#if defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1100)
-               bcsr_mod(BCSR_RESETS, 0, BCSR_RESETS_FIR_SEL);
-#else /* Pb1000 and Pb1100 */
-               writel(1<<13, CPLD_AUX1);
-#endif
-       }
-       else {
-#if defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1100)
-               bcsr_mod(BCSR_RESETS, BCSR_RESETS_FIR_SEL, 0);
-#else /* Pb1000 and Pb1100 */
-               writel(readl(CPLD_AUX1) & ~(1<<13), CPLD_AUX1);
-#endif
-       }
-
-       switch (speed) {
-       case 9600:      
-               writel(11<<10 | 12<<5, IR_WRITE_PHY_CONFIG); 
-               writel(IR_SIR_MODE, IR_CONFIG_1); 
-               break;
-       case 19200:     
-               writel(5<<10 | 12<<5, IR_WRITE_PHY_CONFIG); 
-               writel(IR_SIR_MODE, IR_CONFIG_1); 
-               break;
-       case 38400:
-               writel(2<<10 | 12<<5, IR_WRITE_PHY_CONFIG); 
-               writel(IR_SIR_MODE, IR_CONFIG_1); 
-               break;
-       case 57600:     
-               writel(1<<10 | 12<<5, IR_WRITE_PHY_CONFIG); 
-               writel(IR_SIR_MODE, IR_CONFIG_1); 
-               break;
-       case 115200: 
-               writel(12<<5, IR_WRITE_PHY_CONFIG); 
-               writel(IR_SIR_MODE, IR_CONFIG_1); 
-               break;
-       case 4000000:
-               writel(0xF, IR_WRITE_PHY_CONFIG);
-               writel(IR_FIR|IR_DMA_ENABLE|IR_RX_ENABLE, IR_CONFIG_1); 
-               break;
-       default:
-               printk(KERN_ERR "%s unsupported speed %x\n", dev->name, speed);
-               ret = -EINVAL;
-               break;
-       }
-
-       aup->speed = speed;
-       writel(read_ir_reg(IR_ENABLE) | 0x8000, IR_ENABLE);
-       au_sync();
-
-       control = read_ir_reg(IR_ENABLE);
-       writel(0, IR_RING_PROMPT);
-       au_sync();
-
-       if (control & (1<<14)) {
-               printk(KERN_ERR "%s: configuration error\n", dev->name);
-       }
-       else {
-               if (control & (1<<11))
-                       printk(KERN_DEBUG "%s Valid SIR config\n", dev->name);
-               if (control & (1<<12))
-                       printk(KERN_DEBUG "%s Valid MIR config\n", dev->name);
-               if (control & (1<<13))
-                       printk(KERN_DEBUG "%s Valid FIR config\n", dev->name);
-               if (control & (1<<10))
-                       printk(KERN_DEBUG "%s TX enabled\n", dev->name);
-               if (control & (1<<9))
-                       printk(KERN_DEBUG "%s RX enabled\n", dev->name);
-       }
-
-       spin_unlock_irqrestore(&ir_lock, flags);
-       return ret;
-}
-
-static int 
-au1k_irda_ioctl(struct net_device *dev, struct ifreq *ifreq, int cmd)
+static int au1k_irda_ioctl(struct net_device *dev, struct ifreq *ifreq, int cmd)
 {
        struct if_irda_req *rq = (struct if_irda_req *)ifreq;
        struct au1k_private *aup = netdev_priv(dev);
@@ -829,8 +752,218 @@ au1k_irda_ioctl(struct net_device *dev, struct ifreq *ifreq, int cmd)
        return ret;
 }
 
+static const struct net_device_ops au1k_irda_netdev_ops = {
+       .ndo_open               = au1k_irda_start,
+       .ndo_stop               = au1k_irda_stop,
+       .ndo_start_xmit         = au1k_irda_hard_xmit,
+       .ndo_tx_timeout         = au1k_tx_timeout,
+       .ndo_do_ioctl           = au1k_irda_ioctl,
+};
+
+static int __devinit au1k_irda_net_init(struct net_device *dev)
+{
+       struct au1k_private *aup = netdev_priv(dev);
+       struct db_dest *pDB, *pDBfree;
+       int i, err, retval = 0;
+       dma_addr_t temp;
+
+       err = au1k_irda_init_iobuf(&aup->rx_buff, 14384);
+       if (err)
+               goto out1;
+
+       dev->netdev_ops = &au1k_irda_netdev_ops;
+
+       irda_init_max_qos_capabilies(&aup->qos);
+
+       /* The only value we must override it the baudrate */
+       aup->qos.baud_rate.bits = IR_9600 | IR_19200 | IR_38400 |
+               IR_57600 | IR_115200 | IR_576000 | (IR_4000000 << 8);
+
+       aup->qos.min_turn_time.bits = qos_mtt_bits;
+       irda_qos_bits_to_value(&aup->qos);
+
+       retval = -ENOMEM;
+
+       /* Tx ring follows rx ring + 512 bytes */
+       /* we need a 1k aligned buffer */
+       aup->rx_ring[0] = (struct ring_dest *)
+               dma_alloc(2 * MAX_NUM_IR_DESC * (sizeof(struct ring_dest)),
+                         &temp);
+       if (!aup->rx_ring[0])
+               goto out2;
+
+       /* allocate the data buffers */
+       aup->db[0].vaddr =
+               (void *)dma_alloc(MAX_BUF_SIZE * 2 * NUM_IR_DESC, &temp);
+       if (!aup->db[0].vaddr)
+               goto out3;
+
+       setup_hw_rings(aup, (u32)aup->rx_ring[0], (u32)aup->rx_ring[0] + 512);
+
+       pDBfree = NULL;
+       pDB = aup->db;
+       for (i = 0; i < (2 * NUM_IR_DESC); i++) {
+               pDB->pnext = pDBfree;
+               pDBfree = pDB;
+               pDB->vaddr =
+                      (u32 *)((unsigned)aup->db[0].vaddr + (MAX_BUF_SIZE * i));
+               pDB->dma_addr = (dma_addr_t)virt_to_bus(pDB->vaddr);
+               pDB++;
+       }
+       aup->pDBfree = pDBfree;
+
+       /* attach a data buffer to each descriptor */
+       for (i = 0; i < NUM_IR_DESC; i++) {
+               pDB = GetFreeDB(aup);
+               if (!pDB)
+                       goto out3;
+               aup->rx_ring[i]->addr_0 = (u8)(pDB->dma_addr & 0xff);
+               aup->rx_ring[i]->addr_1 = (u8)((pDB->dma_addr >>  8) & 0xff);
+               aup->rx_ring[i]->addr_2 = (u8)((pDB->dma_addr >> 16) & 0xff);
+               aup->rx_ring[i]->addr_3 = (u8)((pDB->dma_addr >> 24) & 0xff);
+               aup->rx_db_inuse[i] = pDB;
+       }
+       for (i = 0; i < NUM_IR_DESC; i++) {
+               pDB = GetFreeDB(aup);
+               if (!pDB)
+                       goto out3;
+               aup->tx_ring[i]->addr_0 = (u8)(pDB->dma_addr & 0xff);
+               aup->tx_ring[i]->addr_1 = (u8)((pDB->dma_addr >>  8) & 0xff);
+               aup->tx_ring[i]->addr_2 = (u8)((pDB->dma_addr >> 16) & 0xff);
+               aup->tx_ring[i]->addr_3 = (u8)((pDB->dma_addr >> 24) & 0xff);
+               aup->tx_ring[i]->count_0 = 0;
+               aup->tx_ring[i]->count_1 = 0;
+               aup->tx_ring[i]->flags = 0;
+               aup->tx_db_inuse[i] = pDB;
+       }
+
+       return 0;
+
+out3:
+       dma_free((void *)aup->rx_ring[0],
+               2 * MAX_NUM_IR_DESC * (sizeof(struct ring_dest)));
+out2:
+       kfree(aup->rx_buff.head);
+out1:
+       printk(KERN_ERR "au1k_irda_net_init() failed.  Returns %d\n", retval);
+       return retval;
+}
+
+static int __devinit au1k_irda_probe(struct platform_device *pdev)
+{
+       struct au1k_private *aup;
+       struct net_device *dev;
+       struct resource *r;
+       int err;
+
+       dev = alloc_irdadev(sizeof(struct au1k_private));
+       if (!dev)
+               return -ENOMEM;
+
+       aup = netdev_priv(dev);
+
+       aup->platdata = pdev->dev.platform_data;
+
+       err = -EINVAL;
+       r = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+       if (!r)
+               goto out;
+
+       aup->irq_tx = r->start;
+
+       r = platform_get_resource(pdev, IORESOURCE_IRQ, 1);
+       if (!r)
+               goto out;
+
+       aup->irq_rx = r->start;
+
+       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!r)
+               goto out;
+
+       err = -EBUSY;
+       aup->ioarea = request_mem_region(r->start, r->end - r->start + 1,
+                                        pdev->name);
+       if (!aup->ioarea)
+               goto out;
+
+       aup->iobase = ioremap_nocache(r->start, r->end - r->start + 1);
+       if (!aup->iobase)
+               goto out2;
+
+       dev->irq = aup->irq_rx;
+
+       err = au1k_irda_net_init(dev);
+       if (err)
+               goto out3;
+       err = register_netdev(dev);
+       if (err)
+               goto out4;
+
+       platform_set_drvdata(pdev, dev);
+
+       printk(KERN_INFO "IrDA: Registered device %s\n", dev->name);
+       return 0;
+
+out4:
+       dma_free((void *)aup->db[0].vaddr,
+               MAX_BUF_SIZE * 2 * NUM_IR_DESC);
+       dma_free((void *)aup->rx_ring[0],
+               2 * MAX_NUM_IR_DESC * (sizeof(struct ring_dest)));
+       kfree(aup->rx_buff.head);
+out3:
+       iounmap(aup->iobase);
+out2:
+       release_resource(aup->ioarea);
+       kfree(aup->ioarea);
+out:
+       free_netdev(dev);
+       return err;
+}
+
+static int __devexit au1k_irda_remove(struct platform_device *pdev)
+{
+       struct net_device *dev = platform_get_drvdata(pdev);
+       struct au1k_private *aup = netdev_priv(dev);
+
+       unregister_netdev(dev);
+
+       dma_free((void *)aup->db[0].vaddr,
+               MAX_BUF_SIZE * 2 * NUM_IR_DESC);
+       dma_free((void *)aup->rx_ring[0],
+               2 * MAX_NUM_IR_DESC * (sizeof(struct ring_dest)));
+       kfree(aup->rx_buff.head);
+
+       iounmap(aup->iobase);
+       release_resource(aup->ioarea);
+       kfree(aup->ioarea);
+
+       free_netdev(dev);
+
+       return 0;
+}
+
+static struct platform_driver au1k_irda_driver = {
+       .driver = {
+               .name   = "au1000-irda",
+               .owner  = THIS_MODULE,
+       },
+       .probe          = au1k_irda_probe,
+       .remove         = __devexit_p(au1k_irda_remove),
+};
+
+static int __init au1k_irda_load(void)
+{
+       return platform_driver_register(&au1k_irda_driver);
+}
+
+static void __exit au1k_irda_unload(void)
+{
+       return platform_driver_unregister(&au1k_irda_driver);
+}
+
 MODULE_AUTHOR("Pete Popov <ppopov@mvista.com>");
 MODULE_DESCRIPTION("Au1000 IrDA Device Driver");
 
-module_init(au1k_irda_init);
-module_exit(au1k_irda_exit);
+module_init(au1k_irda_load);
+module_exit(au1k_irda_unload);
index 6e318ce411369176b7d43148656438806f2d316c..f9e3fb3a285b2ab06460542b0d5753e27d2a5dfa 100644 (file)
@@ -155,18 +155,14 @@ config PCMCIA_M8XX
 
          This driver is also available as a module called m8xx_pcmcia.
 
-config PCMCIA_AU1X00
-       tristate "Au1x00 pcmcia support"
-       depends on MIPS_ALCHEMY && PCMCIA
-
 config PCMCIA_ALCHEMY_DEVBOARD
        tristate "Alchemy Db/Pb1xxx PCMCIA socket services"
        depends on MIPS_ALCHEMY && PCMCIA
        select 64BIT_PHYS_ADDR
        help
          Enable this driver of you want PCMCIA support on your Alchemy
-         Db1000, Db/Pb1100, Db/Pb1500, Db/Pb1550, Db/Pb1200 board.
-         NOT suitable for the PB1000!
+         Db1000, Db/Pb1100, Db/Pb1500, Db/Pb1550, Db/Pb1200, DB1300
+         board.  NOT suitable for the PB1000!
 
          This driver is also available as a module called db1xxx_ss.ko
 
index 29935ea921df289e7eae7e5fb0a2e3fe88d261f0..ec543a4ff2e4a5db60113814d4c1fe0d111919d2 100644 (file)
@@ -29,7 +29,6 @@ obj-$(CONFIG_PCMCIA_SA1100)                   += sa11xx_base.o sa1100_cs.o
 obj-$(CONFIG_PCMCIA_SA1111)                    += sa11xx_base.o sa1111_cs.o
 obj-$(CONFIG_M32R_PCC)                         += m32r_pcc.o
 obj-$(CONFIG_M32R_CFC)                         += m32r_cfc.o
-obj-$(CONFIG_PCMCIA_AU1X00)                    += au1x00_ss.o
 obj-$(CONFIG_PCMCIA_BCM63XX)                   += bcm63xx_pcmcia.o
 obj-$(CONFIG_PCMCIA_VRC4171)                   += vrc4171_card.o
 obj-$(CONFIG_PCMCIA_VRC4173)                   += vrc4173_cardu.o
@@ -39,9 +38,6 @@ obj-$(CONFIG_AT91_CF)                         += at91_cf.o
 obj-$(CONFIG_ELECTRA_CF)                       += electra_cf.o
 obj-$(CONFIG_PCMCIA_ALCHEMY_DEVBOARD)          += db1xxx_ss.o
 
-au1x00_ss-y                                    += au1000_generic.o
-au1x00_ss-$(CONFIG_MIPS_PB1000)                        += au1000_pb1x00.o
-
 sa1111_cs-y                                    += sa1111_generic.o
 sa1111_cs-$(CONFIG_ASSABET_NEPONSET)           += sa1100_neponset.o
 sa1111_cs-$(CONFIG_SA1100_BADGE4)              += sa1100_badge4.o
diff --git a/drivers/pcmcia/au1000_generic.c b/drivers/pcmcia/au1000_generic.c
deleted file mode 100644 (file)
index 95dd7c6..0000000
+++ /dev/null
@@ -1,545 +0,0 @@
-/*
- *
- * Alchemy Semi Au1000 pcmcia driver
- *
- * Copyright 2001-2003 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@embeddedalley.com or source@mvista.com
- *
- * Copyright 2004 Pete Popov, Embedded Alley Solutions, Inc.
- * Updated the driver to 2.6. Followed the sa11xx API and largely
- * copied many of the hardware independent functions.
- *
- * ########################################################################
- *
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * ########################################################################
- *
- * 
- */
-
-#include <linux/module.h>
-#include <linux/moduleparam.h>
-#include <linux/init.h>
-#include <linux/cpufreq.h>
-#include <linux/ioport.h>
-#include <linux/kernel.h>
-#include <linux/timer.h>
-#include <linux/mm.h>
-#include <linux/notifier.h>
-#include <linux/interrupt.h>
-#include <linux/spinlock.h>
-#include <linux/mutex.h>
-#include <linux/platform_device.h>
-#include <linux/slab.h>
-
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/system.h>
-
-#include <asm/mach-au1x00/au1000.h>
-#include "au1000_generic.h"
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Pete Popov <ppopov@embeddedalley.com>");
-MODULE_DESCRIPTION("Linux PCMCIA Card Services: Au1x00 Socket Controller");
-
-#if 0
-#define debug(x,args...) printk(KERN_DEBUG "%s: " x, __func__ , ##args)
-#else
-#define debug(x,args...)
-#endif
-
-#define MAP_SIZE 0x100000
-extern struct au1000_pcmcia_socket au1000_pcmcia_socket[];
-#define PCMCIA_SOCKET(x)       (au1000_pcmcia_socket + (x))
-#define to_au1000_socket(x)    container_of(x, struct au1000_pcmcia_socket, socket)
-
-/* Some boards like to support CF cards as IDE root devices, so they
- * grab pcmcia sockets directly.
- */
-u32 *pcmcia_base_vaddrs[2];
-extern const unsigned long mips_io_port_base;
-
-static DEFINE_MUTEX(pcmcia_sockets_lock);
-
-static int (*au1x00_pcmcia_hw_init[])(struct device *dev) = {
-       au1x_board_init,
-};
-
-static int
-au1x00_pcmcia_skt_state(struct au1000_pcmcia_socket *skt)
-{
-       struct pcmcia_state state;
-       unsigned int stat;
-
-       memset(&state, 0, sizeof(struct pcmcia_state));
-
-       skt->ops->socket_state(skt, &state);
-
-       stat = state.detect  ? SS_DETECT : 0;
-       stat |= state.ready  ? SS_READY  : 0;
-       stat |= state.wrprot ? SS_WRPROT : 0;
-       stat |= state.vs_3v  ? SS_3VCARD : 0;
-       stat |= state.vs_Xv  ? SS_XVCARD : 0;
-       stat |= skt->cs_state.Vcc ? SS_POWERON : 0;
-
-       if (skt->cs_state.flags & SS_IOCARD)
-               stat |= state.bvd1 ? SS_STSCHG : 0;
-       else {
-               if (state.bvd1 == 0)
-                       stat |= SS_BATDEAD;
-               else if (state.bvd2 == 0)
-                       stat |= SS_BATWARN;
-       }
-       return stat;
-}
-
-/*
- * au100_pcmcia_config_skt
- *
- * Convert PCMCIA socket state to our socket configure structure.
- */
-static int
-au1x00_pcmcia_config_skt(struct au1000_pcmcia_socket *skt, socket_state_t *state)
-{
-       int ret;
-
-       ret = skt->ops->configure_socket(skt, state);
-       if (ret == 0) {
-               skt->cs_state = *state;
-       }
-
-       if (ret < 0)
-               debug("unable to configure socket %d\n", skt->nr);
-
-       return ret;
-}
-
-/* au1x00_pcmcia_sock_init()
- *
- * (Re-)Initialise the socket, turning on status interrupts
- * and PCMCIA bus.  This must wait for power to stabilise
- * so that the card status signals report correctly.
- *
- * Returns: 0
- */
-static int au1x00_pcmcia_sock_init(struct pcmcia_socket *sock)
-{
-       struct au1000_pcmcia_socket *skt = to_au1000_socket(sock);
-
-       debug("initializing socket %u\n", skt->nr);
-
-       skt->ops->socket_init(skt);
-       return 0;
-}
-
-/*
- * au1x00_pcmcia_suspend()
- *
- * Remove power on the socket, disable IRQs from the card.
- * Turn off status interrupts, and disable the PCMCIA bus.
- *
- * Returns: 0
- */
-static int au1x00_pcmcia_suspend(struct pcmcia_socket *sock)
-{
-       struct au1000_pcmcia_socket *skt = to_au1000_socket(sock);
-
-       debug("suspending socket %u\n", skt->nr);
-
-       skt->ops->socket_suspend(skt);
-
-       return 0;
-}
-
-static DEFINE_SPINLOCK(status_lock);
-
-/*
- * au1x00_check_status()
- */
-static void au1x00_check_status(struct au1000_pcmcia_socket *skt)
-{
-       unsigned int events;
-
-       debug("entering PCMCIA monitoring thread\n");
-
-       do {
-               unsigned int status;
-               unsigned long flags;
-
-               status = au1x00_pcmcia_skt_state(skt);
-
-               spin_lock_irqsave(&status_lock, flags);
-               events = (status ^ skt->status) & skt->cs_state.csc_mask;
-               skt->status = status;
-               spin_unlock_irqrestore(&status_lock, flags);
-
-               debug("events: %s%s%s%s%s%s\n",
-                       events == 0         ? "<NONE>"   : "",
-                       events & SS_DETECT  ? "DETECT "  : "",
-                       events & SS_READY   ? "READY "   : "",
-                       events & SS_BATDEAD ? "BATDEAD " : "",
-                       events & SS_BATWARN ? "BATWARN " : "",
-                       events & SS_STSCHG  ? "STSCHG "  : "");
-
-               if (events)
-                       pcmcia_parse_events(&skt->socket, events);
-       } while (events);
-}
-
-/* 
- * au1x00_pcmcia_poll_event()
- * Let's poll for events in addition to IRQs since IRQ only is unreliable...
- */
-static void au1x00_pcmcia_poll_event(unsigned long dummy)
-{
-       struct au1000_pcmcia_socket *skt = (struct au1000_pcmcia_socket *)dummy;
-       debug("polling for events\n");
-
-       mod_timer(&skt->poll_timer, jiffies + AU1000_PCMCIA_POLL_PERIOD);
-
-       au1x00_check_status(skt);
-}
-
-/* au1x00_pcmcia_get_status()
- *
- * From the sa11xx_core.c:
- * Implements the get_status() operation for the in-kernel PCMCIA
- * service (formerly SS_GetStatus in Card Services). Essentially just
- * fills in bits in `status' according to internal driver state or
- * the value of the voltage detect chipselect register.
- *
- * As a debugging note, during card startup, the PCMCIA core issues
- * three set_socket() commands in a row the first with RESET deasserted,
- * the second with RESET asserted, and the last with RESET deasserted
- * again. Following the third set_socket(), a get_status() command will
- * be issued. The kernel is looking for the SS_READY flag (see
- * setup_socket(), reset_socket(), and unreset_socket() in cs.c).
- *
- * Returns: 0
- */
-static int
-au1x00_pcmcia_get_status(struct pcmcia_socket *sock, unsigned int *status)
-{
-       struct au1000_pcmcia_socket *skt = to_au1000_socket(sock);
-
-       skt->status = au1x00_pcmcia_skt_state(skt);
-       *status = skt->status;
-
-       return 0;
-}
-
-/* au1x00_pcmcia_set_socket()
- * Implements the set_socket() operation for the in-kernel PCMCIA
- * service (formerly SS_SetSocket in Card Services). We more or
- * less punt all of this work and let the kernel handle the details
- * of power configuration, reset, &c. We also record the value of
- * `state' in order to regurgitate it to the PCMCIA core later.
- *
- * Returns: 0
- */
-static int
-au1x00_pcmcia_set_socket(struct pcmcia_socket *sock, socket_state_t *state)
-{
-  struct au1000_pcmcia_socket *skt = to_au1000_socket(sock);
-
-  debug("for sock %u\n", skt->nr);
-
-  debug("\tmask:  %s%s%s%s%s%s\n\tflags: %s%s%s%s%s%s\n",
-       (state->csc_mask==0)?"<NONE>":"",
-       (state->csc_mask&SS_DETECT)?"DETECT ":"",
-       (state->csc_mask&SS_READY)?"READY ":"",
-       (state->csc_mask&SS_BATDEAD)?"BATDEAD ":"",
-       (state->csc_mask&SS_BATWARN)?"BATWARN ":"",
-       (state->csc_mask&SS_STSCHG)?"STSCHG ":"",
-       (state->flags==0)?"<NONE>":"",
-       (state->flags&SS_PWR_AUTO)?"PWR_AUTO ":"",
-       (state->flags&SS_IOCARD)?"IOCARD ":"",
-       (state->flags&SS_RESET)?"RESET ":"",
-       (state->flags&SS_SPKR_ENA)?"SPKR_ENA ":"",
-       (state->flags&SS_OUTPUT_ENA)?"OUTPUT_ENA ":"");
-  debug("\tVcc %d  Vpp %d  irq %d\n",
-       state->Vcc, state->Vpp, state->io_irq);
-
-  return au1x00_pcmcia_config_skt(skt, state);
-}
-
-int 
-au1x00_pcmcia_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *map)
-{
-       struct au1000_pcmcia_socket *skt = to_au1000_socket(sock);
-       unsigned int speed;
-
-       if(map->map>=MAX_IO_WIN){
-               debug("map (%d) out of range\n", map->map);
-               return -1;
-       }
-
-       if(map->flags&MAP_ACTIVE){
-               speed=(map->speed>0)?map->speed:AU1000_PCMCIA_IO_SPEED;
-               skt->spd_io[map->map] = speed;
-       }
-
-       map->start=(unsigned int)(u32)skt->virt_io;
-       map->stop=map->start+MAP_SIZE;
-       return 0;
-
-}  /* au1x00_pcmcia_set_io_map() */
-
-
-static int 
-au1x00_pcmcia_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map *map)
-{
-       struct au1000_pcmcia_socket *skt = to_au1000_socket(sock);
-       unsigned short speed = map->speed;
-
-       if(map->map>=MAX_WIN){
-               debug("map (%d) out of range\n", map->map);
-               return -1;
-       }
-
-       if (map->flags & MAP_ATTRIB) {
-               skt->spd_attr[map->map] = speed;
-               skt->spd_mem[map->map] = 0;
-       } else {
-               skt->spd_attr[map->map] = 0;
-               skt->spd_mem[map->map] = speed;
-       }
-
-       if (map->flags & MAP_ATTRIB) {
-               map->static_start = skt->phys_attr + map->card_start;
-       }
-       else {
-               map->static_start = skt->phys_mem + map->card_start;
-       }
-
-       debug("set_mem_map %d start %08lx card_start %08x\n",
-                       map->map, map->static_start, map->card_start);
-       return 0;
-
-}  /* au1x00_pcmcia_set_mem_map() */
-
-static struct pccard_operations au1x00_pcmcia_operations = {
-       .init                   = au1x00_pcmcia_sock_init,
-       .suspend                = au1x00_pcmcia_suspend,
-       .get_status             = au1x00_pcmcia_get_status,
-       .set_socket             = au1x00_pcmcia_set_socket,
-       .set_io_map             = au1x00_pcmcia_set_io_map,
-       .set_mem_map            = au1x00_pcmcia_set_mem_map,
-};
-
-static const char *skt_names[] = {
-       "PCMCIA socket 0",
-       "PCMCIA socket 1",
-};
-
-struct skt_dev_info {
-       int nskt;
-};
-
-int au1x00_pcmcia_socket_probe(struct device *dev, struct pcmcia_low_level *ops, int first, int nr)
-{
-       struct skt_dev_info *sinfo;
-       struct au1000_pcmcia_socket *skt;
-       int ret, i;
-
-       sinfo = kzalloc(sizeof(struct skt_dev_info), GFP_KERNEL);
-       if (!sinfo) {
-               ret = -ENOMEM;
-               goto out;
-       }
-
-       sinfo->nskt = nr;
-
-       /*
-        * Initialise the per-socket structure.
-        */
-       for (i = 0; i < nr; i++) {
-               skt = PCMCIA_SOCKET(i);
-               memset(skt, 0, sizeof(*skt));
-
-               skt->socket.resource_ops = &pccard_static_ops;
-               skt->socket.ops = &au1x00_pcmcia_operations;
-               skt->socket.owner = ops->owner;
-               skt->socket.dev.parent = dev;
-
-               init_timer(&skt->poll_timer);
-               skt->poll_timer.function = au1x00_pcmcia_poll_event;
-               skt->poll_timer.data = (unsigned long)skt;
-               skt->poll_timer.expires = jiffies + AU1000_PCMCIA_POLL_PERIOD;
-
-               skt->nr         = first + i;
-               skt->irq        = 255;
-               skt->dev        = dev;
-               skt->ops        = ops;
-
-               skt->res_skt.name       = skt_names[skt->nr];
-               skt->res_io.name        = "io";
-               skt->res_io.flags       = IORESOURCE_MEM | IORESOURCE_BUSY;
-               skt->res_mem.name       = "memory";
-               skt->res_mem.flags      = IORESOURCE_MEM;
-               skt->res_attr.name      = "attribute";
-               skt->res_attr.flags     = IORESOURCE_MEM;
-
-               /*
-                * PCMCIA client drivers use the inb/outb macros to access the
-                * IO registers. Since mips_io_port_base is added to the
-                * access address of the mips implementation of inb/outb,
-                * we need to subtract it here because we want to access the
-                * I/O or MEM address directly, without going through this
-                * "mips_io_port_base" mechanism.
-                */
-               if (i == 0) {
-                       skt->virt_io = (void *)
-                               (ioremap((phys_t)AU1X_SOCK0_IO, 0x1000) -
-                               (u32)mips_io_port_base);
-                       skt->phys_attr = AU1X_SOCK0_PHYS_ATTR;
-                       skt->phys_mem = AU1X_SOCK0_PHYS_MEM;
-               }
-               else  {
-                       skt->virt_io = (void *)
-                               (ioremap((phys_t)AU1X_SOCK1_IO, 0x1000) -
-                               (u32)mips_io_port_base);
-                       skt->phys_attr = AU1X_SOCK1_PHYS_ATTR;
-                       skt->phys_mem = AU1X_SOCK1_PHYS_MEM;
-               }
-               pcmcia_base_vaddrs[i] = (u32 *)skt->virt_io;
-               ret = ops->hw_init(skt);
-
-               skt->socket.features = SS_CAP_STATIC_MAP|SS_CAP_PCCARD;
-               skt->socket.irq_mask = 0;
-               skt->socket.map_size = MAP_SIZE;
-               skt->socket.pci_irq = skt->irq;
-               skt->socket.io_offset = (unsigned long)skt->virt_io;
-
-               skt->status = au1x00_pcmcia_skt_state(skt);
-
-               ret = pcmcia_register_socket(&skt->socket);
-               if (ret)
-                       goto out_err;
-
-               WARN_ON(skt->socket.sock != i);
-
-               add_timer(&skt->poll_timer);
-       }
-
-       dev_set_drvdata(dev, sinfo);
-       return 0;
-
-
-out_err:
-       ops->hw_shutdown(skt);
-       while (i-- > 0) {
-               skt = PCMCIA_SOCKET(i);
-
-               del_timer_sync(&skt->poll_timer);
-               pcmcia_unregister_socket(&skt->socket);
-               if (i == 0) {
-                       iounmap(skt->virt_io + (u32)mips_io_port_base);
-                       skt->virt_io = NULL;
-               }
-#ifndef CONFIG_MIPS_XXS1500
-               else {
-                       iounmap(skt->virt_io + (u32)mips_io_port_base);
-                       skt->virt_io = NULL;
-               }
-#endif
-               ops->hw_shutdown(skt);
-
-       }
-       kfree(sinfo);
-out:
-       return ret;
-}
-
-int au1x00_drv_pcmcia_remove(struct platform_device *dev)
-{
-       struct skt_dev_info *sinfo = platform_get_drvdata(dev);
-       int i;
-
-       mutex_lock(&pcmcia_sockets_lock);
-       platform_set_drvdata(dev, NULL);
-
-       for (i = 0; i < sinfo->nskt; i++) {
-               struct au1000_pcmcia_socket *skt = PCMCIA_SOCKET(i);
-
-               del_timer_sync(&skt->poll_timer);
-               pcmcia_unregister_socket(&skt->socket);
-               skt->ops->hw_shutdown(skt);
-               au1x00_pcmcia_config_skt(skt, &dead_socket);
-               iounmap(skt->virt_io + (u32)mips_io_port_base);
-               skt->virt_io = NULL;
-       }
-
-       kfree(sinfo);
-       mutex_unlock(&pcmcia_sockets_lock);
-       return 0;
-}
-
-
-/*
- * PCMCIA "Driver" API
- */
-
-static int au1x00_drv_pcmcia_probe(struct platform_device *dev)
-{
-       int i, ret = -ENODEV;
-
-       mutex_lock(&pcmcia_sockets_lock);
-       for (i=0; i < ARRAY_SIZE(au1x00_pcmcia_hw_init); i++) {
-               ret = au1x00_pcmcia_hw_init[i](&dev->dev);
-               if (ret == 0)
-                       break;
-       }
-       mutex_unlock(&pcmcia_sockets_lock);
-       return ret;
-}
-
-static struct platform_driver au1x00_pcmcia_driver = {
-       .driver = {
-               .name           = "au1x00-pcmcia",
-               .owner          = THIS_MODULE,
-       },
-       .probe          = au1x00_drv_pcmcia_probe,
-       .remove         = au1x00_drv_pcmcia_remove,
-};
-
-
-/* au1x00_pcmcia_init()
- *
- * This routine performs low-level PCMCIA initialization and then
- * registers this socket driver with Card Services.
- *
- * Returns: 0 on success, -ve error code on failure
- */
-static int __init au1x00_pcmcia_init(void)
-{
-       int error = 0;
-       error = platform_driver_register(&au1x00_pcmcia_driver);
-       return error;
-}
-
-/* au1x00_pcmcia_exit()
- * Invokes the low-level kernel service to free IRQs associated with this
- * socket controller and reset GPIO edge detection.
- */
-static void __exit au1x00_pcmcia_exit(void)
-{
-       platform_driver_unregister(&au1x00_pcmcia_driver);
-}
-
-module_init(au1x00_pcmcia_init);
-module_exit(au1x00_pcmcia_exit);
diff --git a/drivers/pcmcia/au1000_generic.h b/drivers/pcmcia/au1000_generic.h
deleted file mode 100644 (file)
index 5c36bda..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Alchemy Semi Au1000 pcmcia driver include file
- *
- * Copyright 2001 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@mvista.com or source@mvista.com
- *
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- */
-#ifndef __ASM_AU1000_PCMCIA_H
-#define __ASM_AU1000_PCMCIA_H
-
-/* include the world */
-
-#include <pcmcia/ss.h>
-#include <pcmcia/cistpl.h>
-#include "cs_internal.h"
-
-#define AU1000_PCMCIA_POLL_PERIOD    (2*HZ)
-#define AU1000_PCMCIA_IO_SPEED       (255)
-#define AU1000_PCMCIA_MEM_SPEED      (300)
-
-#define AU1X_SOCK0_IO        0xF00000000ULL
-#define AU1X_SOCK0_PHYS_ATTR 0xF40000000ULL
-#define AU1X_SOCK0_PHYS_MEM  0xF80000000ULL
-
-/* pcmcia socket 1 needs external glue logic so the memory map
- * differs from board to board.
- */
-#if defined(CONFIG_MIPS_PB1000)
-#define AU1X_SOCK1_IO        0xF08000000ULL
-#define AU1X_SOCK1_PHYS_ATTR 0xF48000000ULL
-#define AU1X_SOCK1_PHYS_MEM  0xF88000000ULL
-#endif
-
-struct pcmcia_state {
-  unsigned detect: 1,
-            ready: 1,
-           wrprot: 1,
-            bvd1: 1,
-            bvd2: 1,
-            vs_3v: 1,
-            vs_Xv: 1;
-};
-
-struct pcmcia_configure {
-  unsigned sock: 8,
-            vcc: 8,
-            vpp: 8,
-         output: 1,
-        speaker: 1,
-          reset: 1;
-};
-
-struct pcmcia_irqs {
-       int sock;
-       int irq;
-       const char *str;
-};
-
-
-struct au1000_pcmcia_socket {
-       struct pcmcia_socket socket;
-
-       /*
-        * Info from low level handler
-        */
-       struct device           *dev;
-       unsigned int            nr;
-       unsigned int            irq;
-
-       /*
-        * Core PCMCIA state
-        */
-       struct pcmcia_low_level *ops;
-
-       unsigned int            status;
-       socket_state_t          cs_state;
-
-       unsigned short          spd_io[MAX_IO_WIN];
-       unsigned short          spd_mem[MAX_WIN];
-       unsigned short          spd_attr[MAX_WIN];
-
-       struct resource         res_skt;
-       struct resource         res_io;
-       struct resource         res_mem;
-       struct resource         res_attr;
-
-       void *                  virt_io;
-       unsigned int            phys_io;
-       unsigned int            phys_attr;
-       unsigned int            phys_mem;
-       unsigned short          speed_io, speed_attr, speed_mem;
-
-       unsigned int            irq_state;
-
-       struct timer_list       poll_timer;
-};
-
-struct pcmcia_low_level {
-       struct module *owner;
-
-       int (*hw_init)(struct au1000_pcmcia_socket *);
-       void (*hw_shutdown)(struct au1000_pcmcia_socket *);
-
-       void (*socket_state)(struct au1000_pcmcia_socket *, struct pcmcia_state *);
-       int (*configure_socket)(struct au1000_pcmcia_socket *, struct socket_state_t *);
-
-       /*
-        * Enable card status IRQs on (re-)initialisation.  This can
-        * be called at initialisation, power management event, or
-        * pcmcia event.
-        */
-       void (*socket_init)(struct au1000_pcmcia_socket *);
-
-       /*
-        * Disable card status IRQs and PCMCIA bus on suspend.
-        */
-       void (*socket_suspend)(struct au1000_pcmcia_socket *);
-};
-
-extern int au1x_board_init(struct device *dev);
-
-#endif /* __ASM_AU1000_PCMCIA_H */
diff --git a/drivers/pcmcia/au1000_pb1x00.c b/drivers/pcmcia/au1000_pb1x00.c
deleted file mode 100644 (file)
index b239664..0000000
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- *
- * Alchemy Semi Pb1000 boards specific pcmcia routines.
- *
- * Copyright 2002 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *             ppopov@mvista.com or source@mvista.com
- *
- * ########################################################################
- *
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- */
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/ioport.h>
-#include <linux/kernel.h>
-#include <linux/timer.h>
-#include <linux/mm.h>
-#include <linux/proc_fs.h>
-#include <linux/types.h>
-
-#include <pcmcia/ss.h>
-#include <pcmcia/cistpl.h>
-
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/system.h>
-
-#include <asm/au1000.h>
-#include <asm/au1000_pcmcia.h>
-
-#define debug(fmt, arg...) do { } while (0)
-
-#include <asm/pb1000.h>
-#define PCMCIA_IRQ AU1000_GPIO_15
-
-static int pb1x00_pcmcia_init(struct pcmcia_init *init)
-{
-       u16 pcr;
-       pcr = PCR_SLOT_0_RST | PCR_SLOT_1_RST;
-
-       au_writel(0x8000, PB1000_MDR); /* clear pcmcia interrupt */
-       au_sync_delay(100);
-       au_writel(0x4000, PB1000_MDR); /* enable pcmcia interrupt */
-       au_sync();
-
-       pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ,0);
-       pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ,1);
-       au_writel(pcr, PB1000_PCR);
-       au_sync_delay(20);
-         
-       return PCMCIA_NUM_SOCKS;
-}
-
-static int pb1x00_pcmcia_shutdown(void)
-{
-       u16 pcr;
-       pcr = PCR_SLOT_0_RST | PCR_SLOT_1_RST;
-       pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ,0);
-       pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ,1);
-       au_writel(pcr, PB1000_PCR);
-       au_sync_delay(20);
-       return 0;
-}
-
-static int 
-pb1x00_pcmcia_socket_state(unsigned sock, struct pcmcia_state *state)
-{
-       u32 inserted0, inserted1;
-       u16 vs0, vs1;
-
-       vs0 = vs1 = (u16)au_readl(PB1000_ACR1);
-       inserted0 = !(vs0 & (ACR1_SLOT_0_CD1 | ACR1_SLOT_0_CD2));
-       inserted1 = !(vs1 & (ACR1_SLOT_1_CD1 | ACR1_SLOT_1_CD2));
-       vs0 = (vs0 >> 4) & 0x3;
-       vs1 = (vs1 >> 12) & 0x3;
-
-       state->ready = 0;
-       state->vs_Xv = 0;
-       state->vs_3v = 0;
-       state->detect = 0;
-
-       if (sock == 0) {
-               if (inserted0) {
-                       switch (vs0) {
-                               case 0:
-                               case 2:
-                                       state->vs_3v=1;
-                                       break;
-                               case 3: /* 5V */
-                                       break;
-                               default:
-                                       /* return without setting 'detect' */
-                                       printk(KERN_ERR "pb1x00 bad VS (%d)\n",
-                                                       vs0);
-                                       return 0;
-                       }
-                       state->detect = 1;
-               }
-       }
-       else  {
-               if (inserted1) {
-                       switch (vs1) {
-                               case 0:
-                               case 2:
-                                       state->vs_3v=1;
-                                       break;
-                               case 3: /* 5V */
-                                       break;
-                               default:
-                                       /* return without setting 'detect' */
-                                       printk(KERN_ERR "pb1x00 bad VS (%d)\n",
-                                                       vs1);
-                                       return 0;
-                       }
-                       state->detect = 1;
-               }
-       }
-
-       if (state->detect) {
-               state->ready = 1;
-       }
-
-       state->bvd1=1;
-       state->bvd2=1;
-       state->wrprot=0; 
-       return 1;
-}
-
-
-static int pb1x00_pcmcia_get_irq_info(struct pcmcia_irq_info *info)
-{
-
-       if(info->sock > PCMCIA_MAX_SOCK) return -1;
-
-       /*
-        * Even in the case of the Pb1000, both sockets are connected
-        * to the same irq line.
-        */
-       info->irq = PCMCIA_IRQ;
-
-       return 0;
-}
-
-
-static int 
-pb1x00_pcmcia_configure_socket(const struct pcmcia_configure *configure)
-{
-       u16 pcr;
-
-       if(configure->sock > PCMCIA_MAX_SOCK) return -1;
-
-       pcr = au_readl(PB1000_PCR);
-
-       if (configure->sock == 0) {
-               pcr &= ~(PCR_SLOT_0_VCC0 | PCR_SLOT_0_VCC1 | 
-                               PCR_SLOT_0_VPP0 | PCR_SLOT_0_VPP1);
-       }
-       else  {
-               pcr &= ~(PCR_SLOT_1_VCC0 | PCR_SLOT_1_VCC1 | 
-                               PCR_SLOT_1_VPP0 | PCR_SLOT_1_VPP1);
-       }
-
-       pcr &= ~PCR_SLOT_0_RST;
-       debug("Vcc %dV Vpp %dV, pcr %x\n", 
-                       configure->vcc, configure->vpp, pcr);
-       switch(configure->vcc){
-               case 0:  /* Vcc 0 */
-                       switch(configure->vpp) {
-                               case 0:
-                                       pcr |= SET_VCC_VPP(VCC_HIZ,VPP_GND,
-                                                       configure->sock);
-                                       break;
-                               case 12:
-                                       pcr |= SET_VCC_VPP(VCC_HIZ,VPP_12V,
-                                                       configure->sock);
-                                       break;
-                               case 50:
-                                       pcr |= SET_VCC_VPP(VCC_HIZ,VPP_5V,
-                                                       configure->sock);
-                                       break;
-                               case 33:
-                                       pcr |= SET_VCC_VPP(VCC_HIZ,VPP_3V,
-                                                       configure->sock);
-                                       break;
-                               default:
-                                       pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ,
-                                                       configure->sock);
-                                       printk("%s: bad Vcc/Vpp (%d:%d)\n", 
-                                                       __func__,
-                                                       configure->vcc, 
-                                                       configure->vpp);
-                                       break;
-                       }
-                       break;
-               case 50: /* Vcc 5V */
-                       switch(configure->vpp) {
-                               case 0:
-                                       pcr |= SET_VCC_VPP(VCC_5V,VPP_GND,
-                                                       configure->sock);
-                                       break;
-                               case 50:
-                                       pcr |= SET_VCC_VPP(VCC_5V,VPP_5V,
-                                                       configure->sock);
-                                       break;
-                               case 12:
-                                       pcr |= SET_VCC_VPP(VCC_5V,VPP_12V,
-                                                       configure->sock);
-                                       break;
-                               case 33:
-                                       pcr |= SET_VCC_VPP(VCC_5V,VPP_3V,
-                                                       configure->sock);
-                                       break;
-                               default:
-                                       pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ,
-                                                       configure->sock);
-                                       printk("%s: bad Vcc/Vpp (%d:%d)\n", 
-                                                       __func__,
-                                                       configure->vcc, 
-                                                       configure->vpp);
-                                       break;
-                       }
-                       break;
-               case 33: /* Vcc 3.3V */
-                       switch(configure->vpp) {
-                               case 0:
-                                       pcr |= SET_VCC_VPP(VCC_3V,VPP_GND,
-                                                       configure->sock);
-                                       break;
-                               case 50:
-                                       pcr |= SET_VCC_VPP(VCC_3V,VPP_5V,
-                                                       configure->sock);
-                                       break;
-                               case 12:
-                                       pcr |= SET_VCC_VPP(VCC_3V,VPP_12V,
-                                                       configure->sock);
-                                       break;
-                               case 33:
-                                       pcr |= SET_VCC_VPP(VCC_3V,VPP_3V,
-                                                       configure->sock);
-                                       break;
-                               default:
-                                       pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ,
-                                                       configure->sock);
-                                       printk("%s: bad Vcc/Vpp (%d:%d)\n", 
-                                                       __func__,
-                                                       configure->vcc, 
-                                                       configure->vpp);
-                                       break;
-                       }
-                       break;
-               default: /* what's this ? */
-                       pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ,configure->sock);
-                       printk(KERN_ERR "%s: bad Vcc %d\n", 
-                                       __func__, configure->vcc);
-                       break;
-       }
-
-       if (configure->sock == 0) {
-       pcr &= ~(PCR_SLOT_0_RST);
-               if (configure->reset)
-               pcr |= PCR_SLOT_0_RST;
-       }
-       else {
-               pcr &= ~(PCR_SLOT_1_RST);
-               if (configure->reset)
-                       pcr |= PCR_SLOT_1_RST;
-       }
-       au_writel(pcr, PB1000_PCR);
-       au_sync_delay(300);
-
-       return 0;
-}
-
-
-struct pcmcia_low_level pb1x00_pcmcia_ops = { 
-       pb1x00_pcmcia_init,
-       pb1x00_pcmcia_shutdown,
-       pb1x00_pcmcia_socket_state,
-       pb1x00_pcmcia_get_irq_info,
-       pb1x00_pcmcia_configure_socket
-};
index 3e49df6d5e3b0dec58ef7fab3ce0a74d0e37e965..5b7c22784aff9713054b5b3f34d3ff9bed9ad91d 100644 (file)
@@ -7,7 +7,7 @@
 
 /* This is a fairly generic PCMCIA socket driver suitable for the
  * following Alchemy Development boards:
- *  Db1000, Db/Pb1500, Db/Pb1100, Db/Pb1550, Db/Pb1200.
+ *  Db1000, Db/Pb1500, Db/Pb1100, Db/Pb1550, Db/Pb1200, Db1300
  *
  * The Db1000 is used as a reference:  Per-socket card-, carddetect- and
  *  statuschange IRQs connected to SoC GPIOs, control and status register
@@ -18,6 +18,7 @@
  *     - Pb1100/Pb1500:  single socket only; voltage key bits VS are
  *                       at STATUS[5:4] (instead of STATUS[1:0]).
  *     - Au1200-based:   additional card-eject irqs, irqs not gpios!
+ *     - Db1300:         Db1200-like, no pwr ctrl, single socket (#1).
  */
 
 #include <linux/delay.h>
@@ -59,11 +60,17 @@ struct db1x_pcmcia_sock {
 #define BOARD_TYPE_DEFAULT     0       /* most boards */
 #define BOARD_TYPE_DB1200      1       /* IRQs aren't gpios */
 #define BOARD_TYPE_PB1100      2       /* VS bits slightly different */
+#define BOARD_TYPE_DB1300      3       /* no power control */
        int     board_type;
 };
 
 #define to_db1x_socket(x) container_of(x, struct db1x_pcmcia_sock, socket)
 
+static int db1300_card_inserted(struct db1x_pcmcia_sock *sock)
+{
+       return bcsr_read(BCSR_SIGSTAT) & (1 << 8);
+}
+
 /* DB/PB1200: check CPLD SIGSTATUS register bit 10/12 */
 static int db1200_card_inserted(struct db1x_pcmcia_sock *sock)
 {
@@ -84,6 +91,8 @@ static int db1x_card_inserted(struct db1x_pcmcia_sock *sock)
        switch (sock->board_type) {
        case BOARD_TYPE_DB1200:
                return db1200_card_inserted(sock);
+       case BOARD_TYPE_DB1300:
+               return db1300_card_inserted(sock);
        default:
                return db1000_card_inserted(sock);
        }
@@ -160,7 +169,8 @@ static int db1x_pcmcia_setup_irqs(struct db1x_pcmcia_sock *sock)
         * ejection handler have been registered and the currently
         * active one disabled.
         */
-       if (sock->board_type == BOARD_TYPE_DB1200) {
+       if ((sock->board_type == BOARD_TYPE_DB1200) ||
+           (sock->board_type == BOARD_TYPE_DB1300)) {
                ret = request_irq(sock->insert_irq, db1200_pcmcia_cdirq,
                                  IRQF_DISABLED, "pcmcia_insert", sock);
                if (ret)
@@ -174,7 +184,7 @@ static int db1x_pcmcia_setup_irqs(struct db1x_pcmcia_sock *sock)
                }
 
                /* enable the currently silent one */
-               if (db1200_card_inserted(sock))
+               if (db1x_card_inserted(sock))
                        enable_irq(sock->eject_irq);
                else
                        enable_irq(sock->insert_irq);
@@ -270,7 +280,8 @@ static int db1x_pcmcia_configure(struct pcmcia_socket *skt,
        }
 
        /* create new voltage code */
-       cr_set |= ((v << 2) | p) << (sock->nr * 8);
+       if (sock->board_type != BOARD_TYPE_DB1300)
+               cr_set |= ((v << 2) | p) << (sock->nr * 8);
 
        changed = state->flags ^ sock->old_flags;
 
@@ -343,6 +354,10 @@ static int db1x_pcmcia_get_status(struct pcmcia_socket *skt,
        /* if Vcc is not zero, we have applied power to a card */
        status |= GET_VCC(cr, sock->nr) ? SS_POWERON : 0;
 
+       /* DB1300: power always on, but don't tell when no card present */
+       if ((sock->board_type == BOARD_TYPE_DB1300) && (status & SS_DETECT))
+               status = SS_POWERON | SS_3VCARD | SS_DETECT;
+
        /* reset de-asserted? then we're ready */
        status |= (GET_RESET(cr, sock->nr)) ? SS_READY : SS_RESET;
 
@@ -419,6 +434,9 @@ static int __devinit db1x_pcmcia_socket_probe(struct platform_device *pdev)
        case BCSR_WHOAMI_PB1200 ... BCSR_WHOAMI_DB1200:
                sock->board_type = BOARD_TYPE_DB1200;
                break;
+       case BCSR_WHOAMI_DB1300:
+               sock->board_type = BOARD_TYPE_DB1300;
+               break;
        default:
                printk(KERN_INFO "db1xxx-ss: unknown board %d!\n", bid);
                ret = -ENODEV;
index a1fd73df5416129c62d8889f87c1d003b0b6b47c..369e092bf3d5484054057562b624b35346e61c2f 100644 (file)
@@ -87,12 +87,12 @@ config SPI_BFIN_SPORT
          Enable support for a SPI bus via the Blackfin SPORT peripheral.
 
 config SPI_AU1550
-       tristate "Au1550/Au12x0 SPI Controller"
+       tristate "Au1550/Au1200/Au1300 SPI Controller"
        depends on MIPS_ALCHEMY && EXPERIMENTAL
        select SPI_BITBANG
        help
          If you say yes to this option, support will be included for the
-         Au1550 SPI controller (may also work with Au1200,Au1210,Au1250).
+         PSC SPI controller found on Au1550, Au1200 and Au1300 series.
 
 config SPI_BITBANG
        tristate "Utilities for Bitbanging SPI masters"
index fc850bac88c152f37ce4d05682d7c3e77f71d851..9012dee0c348325a4d25668ff54610d6c1aac52d 100644 (file)
@@ -20,9 +20,4 @@ octeon-ethernet-y += ethernet-sgmii.o
 octeon-ethernet-y += ethernet-spi.o
 octeon-ethernet-y += ethernet-tx.o
 octeon-ethernet-y += ethernet-xaui.o
-octeon-ethernet-y += cvmx-pko.o cvmx-spi.o cvmx-cmd-queue.o \
-       cvmx-helper-board.o cvmx-helper.o cvmx-helper-xaui.o \
-       cvmx-helper-rgmii.o cvmx-helper-sgmii.o cvmx-helper-npi.o \
-       cvmx-helper-loop.o cvmx-helper-spi.o cvmx-helper-util.o \
-       cvmx-interrupt-decodes.o cvmx-interrupt-rsl.o
 
diff --git a/drivers/staging/octeon/cvmx-address.h b/drivers/staging/octeon/cvmx-address.h
deleted file mode 100644 (file)
index 3c74d82..0000000
+++ /dev/null
@@ -1,274 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2009 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/**
- * Typedefs and defines for working with Octeon physical addresses.
- *
- */
-#ifndef __CVMX_ADDRESS_H__
-#define __CVMX_ADDRESS_H__
-
-#if 0
-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;
-#endif
-
-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,
-       /* see cvmx_add_win_dma_dec_t for further decode */
-       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 {
-       /*
-        * Add store data to the write buffer entry, allocating it if
-        * necessary.
-        */
-       CVMX_ADD_WIN_DMA_ADD = 0L,
-       /* send out the write buffer entry to DRAM */
-       CVMX_ADD_WIN_DMA_SENDMEM = 1L,
-       /* store data must be normal DRAM memory space address in this case */
-       /* send out the write buffer entry as an IOBDMA command */
-       CVMX_ADD_WIN_DMA_SENDDMA = 2L,
-       /* see CVMX_ADD_WIN_DMA_SEND_DEC for data contents */
-       /* send out the write buffer entry as an IO write */
-       CVMX_ADD_WIN_DMA_SENDIO = 3L,
-       /* store data must be normal IO space address in this case */
-       /* send out a single-tick command on the NCB bus */
-       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 {
-
-       uint64_t u64;
-       /* mapped or unmapped virtual address */
-       struct {
-               uint64_t R:2;
-               uint64_t offset:62;
-       } sva;
-
-       /* mapped USEG virtual addresses (typically) */
-       struct {
-               uint64_t zeroes:33;
-               uint64_t offset:31;
-       } suseg;
-
-       /* mapped or unmapped virtual address */
-       struct {
-               uint64_t ones:33;
-               uint64_t sp:2;
-               uint64_t offset:29;
-       } sxkseg;
-
-       /*
-        * physical address accessed through xkphys unmapped virtual
-        * address.
-        */
-       struct {
-               uint64_t R:2;   /* CVMX_MIPS_SPACE_XKPHYS in this case */
-               uint64_t cca:3; /* ignored by octeon */
-               uint64_t mbz:10;
-               uint64_t pa:49; /* physical address */
-       } sxkphys;
-
-       /* physical address */
-       struct {
-               uint64_t mbz:15;
-               /* if set, the address is uncached and resides on MCB bus */
-               uint64_t is_io:1;
-               /*
-                * the hardware ignores this field when is_io==0, else
-                * device ID.
-                */
-               uint64_t did:8;
-               /* the hardware ignores <39:36> in Octeon I */
-               uint64_t unaddr:4;
-               uint64_t offset:36;
-       } sphys;
-
-       /* physical mem address */
-       struct {
-               /* techically, <47:40> are dont-cares */
-               uint64_t zeroes:24;
-               /* the hardware ignores <39:36> in Octeon I */
-               uint64_t unaddr:4;
-               uint64_t offset:36;
-       } smem;
-
-       /* physical IO address */
-       struct {
-               uint64_t mem_region:2;
-               uint64_t mbz:13;
-               /* 1 in this case */
-               uint64_t is_io:1;
-               /*
-                * The hardware ignores this field when is_io==0, else
-                * device ID.
-                */
-               uint64_t did:8;
-               /* the hardware ignores <39:36> in Octeon I */
-               uint64_t unaddr:4;
-               uint64_t offset:36;
-       } sio;
-
-       /*
-        * Scratchpad virtual address - accessed through a window at
-        * the end of kseg3
-        */
-       struct {
-               uint64_t ones:49;
-               /* CVMX_ADD_WIN_SCR (0) in this case */
-               cvmx_add_win_dec_t csrdec:2;
-               uint64_t addr:13;
-       } sscr;
-
-       /* there should only be stores to IOBDMA space, no loads */
-       /*
-        * IOBDMA virtual address - accessed through a window at the
-        * end of kseg3
-        */
-       struct {
-               uint64_t ones:49;
-               uint64_t csrdec:2;      /* CVMX_ADD_WIN_DMA (1) in this case */
-               uint64_t unused2:3;
-               uint64_t type:3;
-               uint64_t addr:7;
-       } sdma;
-
-       struct {
-               uint64_t didspace:24;
-               uint64_t 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) \
-       (((int32_t)segment << 31) | (int32_t)(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) ((((uint64_t)segment) << 62) | (add))
-#ifndef CVMX_ADD_IO_SEG
-#define CVMX_ADD_IO_SEG(add) CVMX_ADD_SEG(CVMX_IO_SEG, (add))
-#endif
-#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_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)
-
-#endif /* __CVMX_ADDRESS_H__ */
diff --git a/drivers/staging/octeon/cvmx-asxx-defs.h b/drivers/staging/octeon/cvmx-asxx-defs.h
deleted file mode 100644 (file)
index 91415a8..0000000
+++ /dev/null
@@ -1,475 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-#ifndef __CVMX_ASXX_DEFS_H__
-#define __CVMX_ASXX_DEFS_H__
-
-#define CVMX_ASXX_GMII_RX_CLK_SET(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000180ull + (((block_id) & 0) * 0x8000000ull))
-#define CVMX_ASXX_GMII_RX_DAT_SET(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000188ull + (((block_id) & 0) * 0x8000000ull))
-#define CVMX_ASXX_INT_EN(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000018ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_INT_REG(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000010ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_MII_RX_DAT_SET(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000190ull + (((block_id) & 0) * 0x8000000ull))
-#define CVMX_ASXX_PRT_LOOP(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000040ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_RLD_BYPASS(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000248ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_RLD_BYPASS_SETTING(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000250ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_RLD_COMP(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000220ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_RLD_DATA_DRV(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000218ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_RLD_FCRAM_MODE(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000210ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_RLD_NCTL_STRONG(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000230ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_RLD_NCTL_WEAK(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000240ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_RLD_PCTL_STRONG(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000228ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_RLD_PCTL_WEAK(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000238ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_RLD_SETTING(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000258ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_RX_CLK_SETX(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000020ull + (((offset) & 3) * 8) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_RX_PRT_EN(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000000ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_RX_WOL(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000100ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_RX_WOL_MSK(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000108ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_RX_WOL_POWOK(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000118ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_RX_WOL_SIG(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000110ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_TX_CLK_SETX(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000048ull + (((offset) & 3) * 8) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_TX_COMP_BYP(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000068ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_TX_HI_WATERX(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000080ull + (((offset) & 3) * 8) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_ASXX_TX_PRT_EN(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000008ull + (((block_id) & 1) * 0x8000000ull))
-
-union cvmx_asxx_gmii_rx_clk_set {
-       uint64_t u64;
-       struct cvmx_asxx_gmii_rx_clk_set_s {
-               uint64_t reserved_5_63:59;
-               uint64_t 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;
-};
-
-union cvmx_asxx_gmii_rx_dat_set {
-       uint64_t u64;
-       struct cvmx_asxx_gmii_rx_dat_set_s {
-               uint64_t reserved_5_63:59;
-               uint64_t 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;
-};
-
-union cvmx_asxx_int_en {
-       uint64_t u64;
-       struct cvmx_asxx_int_en_s {
-               uint64_t reserved_12_63:52;
-               uint64_t txpsh:4;
-               uint64_t txpop:4;
-               uint64_t ovrflw:4;
-       } s;
-       struct cvmx_asxx_int_en_cn30xx {
-               uint64_t reserved_11_63:53;
-               uint64_t txpsh:3;
-               uint64_t reserved_7_7:1;
-               uint64_t txpop:3;
-               uint64_t reserved_3_3:1;
-               uint64_t 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;
-};
-
-union cvmx_asxx_int_reg {
-       uint64_t u64;
-       struct cvmx_asxx_int_reg_s {
-               uint64_t reserved_12_63:52;
-               uint64_t txpsh:4;
-               uint64_t txpop:4;
-               uint64_t ovrflw:4;
-       } s;
-       struct cvmx_asxx_int_reg_cn30xx {
-               uint64_t reserved_11_63:53;
-               uint64_t txpsh:3;
-               uint64_t reserved_7_7:1;
-               uint64_t txpop:3;
-               uint64_t reserved_3_3:1;
-               uint64_t 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;
-};
-
-union cvmx_asxx_mii_rx_dat_set {
-       uint64_t u64;
-       struct cvmx_asxx_mii_rx_dat_set_s {
-               uint64_t reserved_5_63:59;
-               uint64_t setting:5;
-       } s;
-       struct cvmx_asxx_mii_rx_dat_set_s cn30xx;
-       struct cvmx_asxx_mii_rx_dat_set_s cn50xx;
-};
-
-union cvmx_asxx_prt_loop {
-       uint64_t u64;
-       struct cvmx_asxx_prt_loop_s {
-               uint64_t reserved_8_63:56;
-               uint64_t ext_loop:4;
-               uint64_t int_loop:4;
-       } s;
-       struct cvmx_asxx_prt_loop_cn30xx {
-               uint64_t reserved_7_63:57;
-               uint64_t ext_loop:3;
-               uint64_t reserved_3_3:1;
-               uint64_t 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;
-};
-
-union cvmx_asxx_rld_bypass {
-       uint64_t u64;
-       struct cvmx_asxx_rld_bypass_s {
-               uint64_t reserved_1_63:63;
-               uint64_t 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;
-};
-
-union cvmx_asxx_rld_bypass_setting {
-       uint64_t u64;
-       struct cvmx_asxx_rld_bypass_setting_s {
-               uint64_t reserved_5_63:59;
-               uint64_t 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;
-};
-
-union cvmx_asxx_rld_comp {
-       uint64_t u64;
-       struct cvmx_asxx_rld_comp_s {
-               uint64_t reserved_9_63:55;
-               uint64_t pctl:5;
-               uint64_t nctl:4;
-       } s;
-       struct cvmx_asxx_rld_comp_cn38xx {
-               uint64_t reserved_8_63:56;
-               uint64_t pctl:4;
-               uint64_t nctl:4;
-       } cn38xx;
-       struct cvmx_asxx_rld_comp_cn38xx cn38xxp2;
-       struct cvmx_asxx_rld_comp_s cn58xx;
-       struct cvmx_asxx_rld_comp_s cn58xxp1;
-};
-
-union cvmx_asxx_rld_data_drv {
-       uint64_t u64;
-       struct cvmx_asxx_rld_data_drv_s {
-               uint64_t reserved_8_63:56;
-               uint64_t pctl:4;
-               uint64_t 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;
-};
-
-union cvmx_asxx_rld_fcram_mode {
-       uint64_t u64;
-       struct cvmx_asxx_rld_fcram_mode_s {
-               uint64_t reserved_1_63:63;
-               uint64_t mode:1;
-       } s;
-       struct cvmx_asxx_rld_fcram_mode_s cn38xx;
-       struct cvmx_asxx_rld_fcram_mode_s cn38xxp2;
-};
-
-union cvmx_asxx_rld_nctl_strong {
-       uint64_t u64;
-       struct cvmx_asxx_rld_nctl_strong_s {
-               uint64_t reserved_5_63:59;
-               uint64_t 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;
-};
-
-union cvmx_asxx_rld_nctl_weak {
-       uint64_t u64;
-       struct cvmx_asxx_rld_nctl_weak_s {
-               uint64_t reserved_5_63:59;
-               uint64_t 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;
-};
-
-union cvmx_asxx_rld_pctl_strong {
-       uint64_t u64;
-       struct cvmx_asxx_rld_pctl_strong_s {
-               uint64_t reserved_5_63:59;
-               uint64_t 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;
-};
-
-union cvmx_asxx_rld_pctl_weak {
-       uint64_t u64;
-       struct cvmx_asxx_rld_pctl_weak_s {
-               uint64_t reserved_5_63:59;
-               uint64_t 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;
-};
-
-union cvmx_asxx_rld_setting {
-       uint64_t u64;
-       struct cvmx_asxx_rld_setting_s {
-               uint64_t reserved_13_63:51;
-               uint64_t dfaset:5;
-               uint64_t dfalag:1;
-               uint64_t dfalead:1;
-               uint64_t dfalock:1;
-               uint64_t setting:5;
-       } s;
-       struct cvmx_asxx_rld_setting_cn38xx {
-               uint64_t reserved_5_63:59;
-               uint64_t setting:5;
-       } cn38xx;
-       struct cvmx_asxx_rld_setting_cn38xx cn38xxp2;
-       struct cvmx_asxx_rld_setting_s cn58xx;
-       struct cvmx_asxx_rld_setting_s cn58xxp1;
-};
-
-union cvmx_asxx_rx_clk_setx {
-       uint64_t u64;
-       struct cvmx_asxx_rx_clk_setx_s {
-               uint64_t reserved_5_63:59;
-               uint64_t 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;
-};
-
-union cvmx_asxx_rx_prt_en {
-       uint64_t u64;
-       struct cvmx_asxx_rx_prt_en_s {
-               uint64_t reserved_4_63:60;
-               uint64_t prt_en:4;
-       } s;
-       struct cvmx_asxx_rx_prt_en_cn30xx {
-               uint64_t reserved_3_63:61;
-               uint64_t 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;
-};
-
-union cvmx_asxx_rx_wol {
-       uint64_t u64;
-       struct cvmx_asxx_rx_wol_s {
-               uint64_t reserved_2_63:62;
-               uint64_t status:1;
-               uint64_t enable:1;
-       } s;
-       struct cvmx_asxx_rx_wol_s cn38xx;
-       struct cvmx_asxx_rx_wol_s cn38xxp2;
-};
-
-union cvmx_asxx_rx_wol_msk {
-       uint64_t u64;
-       struct cvmx_asxx_rx_wol_msk_s {
-               uint64_t msk:64;
-       } s;
-       struct cvmx_asxx_rx_wol_msk_s cn38xx;
-       struct cvmx_asxx_rx_wol_msk_s cn38xxp2;
-};
-
-union cvmx_asxx_rx_wol_powok {
-       uint64_t u64;
-       struct cvmx_asxx_rx_wol_powok_s {
-               uint64_t reserved_1_63:63;
-               uint64_t powerok:1;
-       } s;
-       struct cvmx_asxx_rx_wol_powok_s cn38xx;
-       struct cvmx_asxx_rx_wol_powok_s cn38xxp2;
-};
-
-union cvmx_asxx_rx_wol_sig {
-       uint64_t u64;
-       struct cvmx_asxx_rx_wol_sig_s {
-               uint64_t reserved_32_63:32;
-               uint64_t sig:32;
-       } s;
-       struct cvmx_asxx_rx_wol_sig_s cn38xx;
-       struct cvmx_asxx_rx_wol_sig_s cn38xxp2;
-};
-
-union cvmx_asxx_tx_clk_setx {
-       uint64_t u64;
-       struct cvmx_asxx_tx_clk_setx_s {
-               uint64_t reserved_5_63:59;
-               uint64_t 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;
-};
-
-union cvmx_asxx_tx_comp_byp {
-       uint64_t u64;
-       struct cvmx_asxx_tx_comp_byp_s {
-               uint64_t reserved_0_63:64;
-       } s;
-       struct cvmx_asxx_tx_comp_byp_cn30xx {
-               uint64_t reserved_9_63:55;
-               uint64_t bypass:1;
-               uint64_t pctl:4;
-               uint64_t nctl:4;
-       } cn30xx;
-       struct cvmx_asxx_tx_comp_byp_cn30xx cn31xx;
-       struct cvmx_asxx_tx_comp_byp_cn38xx {
-               uint64_t reserved_8_63:56;
-               uint64_t pctl:4;
-               uint64_t nctl:4;
-       } cn38xx;
-       struct cvmx_asxx_tx_comp_byp_cn38xx cn38xxp2;
-       struct cvmx_asxx_tx_comp_byp_cn50xx {
-               uint64_t reserved_17_63:47;
-               uint64_t bypass:1;
-               uint64_t reserved_13_15:3;
-               uint64_t pctl:5;
-               uint64_t reserved_5_7:3;
-               uint64_t nctl:5;
-       } cn50xx;
-       struct cvmx_asxx_tx_comp_byp_cn58xx {
-               uint64_t reserved_13_63:51;
-               uint64_t pctl:5;
-               uint64_t reserved_5_7:3;
-               uint64_t nctl:5;
-       } cn58xx;
-       struct cvmx_asxx_tx_comp_byp_cn58xx cn58xxp1;
-};
-
-union cvmx_asxx_tx_hi_waterx {
-       uint64_t u64;
-       struct cvmx_asxx_tx_hi_waterx_s {
-               uint64_t reserved_4_63:60;
-               uint64_t mark:4;
-       } s;
-       struct cvmx_asxx_tx_hi_waterx_cn30xx {
-               uint64_t reserved_3_63:61;
-               uint64_t 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;
-};
-
-union cvmx_asxx_tx_prt_en {
-       uint64_t u64;
-       struct cvmx_asxx_tx_prt_en_s {
-               uint64_t reserved_4_63:60;
-               uint64_t prt_en:4;
-       } s;
-       struct cvmx_asxx_tx_prt_en_cn30xx {
-               uint64_t reserved_3_63:61;
-               uint64_t 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;
-};
-
-#endif
diff --git a/drivers/staging/octeon/cvmx-cmd-queue.c b/drivers/staging/octeon/cvmx-cmd-queue.c
deleted file mode 100644 (file)
index e9809d3..0000000
+++ /dev/null
@@ -1,306 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- * Support functions for managing command queues used for
- * various hardware blocks.
- */
-
-#include <linux/kernel.h>
-
-#include <asm/octeon/octeon.h>
-
-#include "cvmx-config.h"
-#include "cvmx-fpa.h"
-#include "cvmx-cmd-queue.h"
-
-#include <asm/octeon/cvmx-npei-defs.h>
-#include <asm/octeon/cvmx-pexp-defs.h>
-#include "cvmx-pko-defs.h"
-
-/**
- * This application uses this pointer to access the global queue
- * state. It points to a bootmem named block.
- */
-__cvmx_cmd_queue_all_state_t *__cvmx_cmd_queue_state_ptr;
-
-/**
- * Initialize the Global queue state pointer.
- *
- * Returns CVMX_CMD_QUEUE_SUCCESS or a failure code
- */
-static cvmx_cmd_queue_result_t __cvmx_cmd_queue_init_state_ptr(void)
-{
-       char *alloc_name = "cvmx_cmd_queues";
-#if defined(CONFIG_CAVIUM_RESERVE32) && CONFIG_CAVIUM_RESERVE32
-       extern uint64_t octeon_reserve32_memory;
-#endif
-
-       if (likely(__cvmx_cmd_queue_state_ptr))
-               return CVMX_CMD_QUEUE_SUCCESS;
-
-#if defined(CONFIG_CAVIUM_RESERVE32) && CONFIG_CAVIUM_RESERVE32
-       if (octeon_reserve32_memory)
-               __cvmx_cmd_queue_state_ptr =
-                   cvmx_bootmem_alloc_named_range(sizeof(*__cvmx_cmd_queue_state_ptr),
-                                                  octeon_reserve32_memory,
-                                                  octeon_reserve32_memory +
-                                                  (CONFIG_CAVIUM_RESERVE32 <<
-                                                   20) - 1, 128, alloc_name);
-       else
-#endif
-               __cvmx_cmd_queue_state_ptr =
-                   cvmx_bootmem_alloc_named(sizeof(*__cvmx_cmd_queue_state_ptr),
-                                           128,
-                                           alloc_name);
-       if (__cvmx_cmd_queue_state_ptr)
-               memset(__cvmx_cmd_queue_state_ptr, 0,
-                      sizeof(*__cvmx_cmd_queue_state_ptr));
-       else {
-               struct cvmx_bootmem_named_block_desc *block_desc =
-                   cvmx_bootmem_find_named_block(alloc_name);
-               if (block_desc)
-                       __cvmx_cmd_queue_state_ptr =
-                           cvmx_phys_to_ptr(block_desc->base_addr);
-               else {
-                       cvmx_dprintf
-                           ("ERROR: cvmx_cmd_queue_initialize: Unable to get named block %s.\n",
-                            alloc_name);
-                       return CVMX_CMD_QUEUE_NO_MEMORY;
-               }
-       }
-       return CVMX_CMD_QUEUE_SUCCESS;
-}
-
-/**
- * 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.
- *
- * @queue_id:  Hardware command queue to initialize.
- * @max_depth: Maximum outstanding commands that can be queued.
- * @fpa_pool:  FPA pool the command queues should come from.
- * @pool_size: Size of each buffer in the FPA pool (bytes)
- *
- * Returns 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)
-{
-       __cvmx_cmd_queue_state_t *qstate;
-       cvmx_cmd_queue_result_t result = __cvmx_cmd_queue_init_state_ptr();
-       if (result != CVMX_CMD_QUEUE_SUCCESS)
-               return result;
-
-       qstate = __cvmx_cmd_queue_get_state(queue_id);
-       if (qstate == NULL)
-               return CVMX_CMD_QUEUE_INVALID_PARAM;
-
-       /*
-        * We artificially limit max_depth to 1<<20 words. It is an
-        * arbitrary limit.
-        */
-       if (CVMX_CMD_QUEUE_ENABLE_MAX_DEPTH) {
-               if ((max_depth < 0) || (max_depth > 1 << 20))
-                       return CVMX_CMD_QUEUE_INVALID_PARAM;
-       } else if (max_depth != 0)
-               return CVMX_CMD_QUEUE_INVALID_PARAM;
-
-       if ((fpa_pool < 0) || (fpa_pool > 7))
-               return CVMX_CMD_QUEUE_INVALID_PARAM;
-       if ((pool_size < 128) || (pool_size > 65536))
-               return CVMX_CMD_QUEUE_INVALID_PARAM;
-
-       /* See if someone else has already initialized the queue */
-       if (qstate->base_ptr_div128) {
-               if (max_depth != (int)qstate->max_depth) {
-                       cvmx_dprintf("ERROR: cvmx_cmd_queue_initialize: "
-                               "Queue already initialized with different "
-                               "max_depth (%d).\n",
-                            (int)qstate->max_depth);
-                       return CVMX_CMD_QUEUE_INVALID_PARAM;
-               }
-               if (fpa_pool != qstate->fpa_pool) {
-                       cvmx_dprintf("ERROR: cvmx_cmd_queue_initialize: "
-                               "Queue already initialized with different "
-                               "FPA pool (%u).\n",
-                            qstate->fpa_pool);
-                       return CVMX_CMD_QUEUE_INVALID_PARAM;
-               }
-               if ((pool_size >> 3) - 1 != qstate->pool_size_m1) {
-                       cvmx_dprintf("ERROR: cvmx_cmd_queue_initialize: "
-                               "Queue already initialized with different "
-                               "FPA pool size (%u).\n",
-                            (qstate->pool_size_m1 + 1) << 3);
-                       return CVMX_CMD_QUEUE_INVALID_PARAM;
-               }
-               CVMX_SYNCWS;
-               return CVMX_CMD_QUEUE_ALREADY_SETUP;
-       } else {
-               union cvmx_fpa_ctl_status status;
-               void *buffer;
-
-               status.u64 = cvmx_read_csr(CVMX_FPA_CTL_STATUS);
-               if (!status.s.enb) {
-                       cvmx_dprintf("ERROR: cvmx_cmd_queue_initialize: "
-                                    "FPA is not enabled.\n");
-                       return CVMX_CMD_QUEUE_NO_MEMORY;
-               }
-               buffer = cvmx_fpa_alloc(fpa_pool);
-               if (buffer == NULL) {
-                       cvmx_dprintf("ERROR: cvmx_cmd_queue_initialize: "
-                                    "Unable to allocate initial buffer.\n");
-                       return CVMX_CMD_QUEUE_NO_MEMORY;
-               }
-
-               memset(qstate, 0, sizeof(*qstate));
-               qstate->max_depth = max_depth;
-               qstate->fpa_pool = fpa_pool;
-               qstate->pool_size_m1 = (pool_size >> 3) - 1;
-               qstate->base_ptr_div128 = cvmx_ptr_to_phys(buffer) / 128;
-               /*
-                * We zeroed the now serving field so we need to also
-                * zero the ticket.
-                */
-               __cvmx_cmd_queue_state_ptr->
-                   ticket[__cvmx_cmd_queue_get_index(queue_id)] = 0;
-               CVMX_SYNCWS;
-               return CVMX_CMD_QUEUE_SUCCESS;
-       }
-}
-
-/**
- * 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.
- *
- * @queue_id: Queue to shutdown
- *
- * Returns CVMX_CMD_QUEUE_SUCCESS or a failure code
- */
-cvmx_cmd_queue_result_t cvmx_cmd_queue_shutdown(cvmx_cmd_queue_id_t queue_id)
-{
-       __cvmx_cmd_queue_state_t *qptr = __cvmx_cmd_queue_get_state(queue_id);
-       if (qptr == NULL) {
-               cvmx_dprintf("ERROR: cvmx_cmd_queue_shutdown: Unable to "
-                            "get queue information.\n");
-               return CVMX_CMD_QUEUE_INVALID_PARAM;
-       }
-
-       if (cvmx_cmd_queue_length(queue_id) > 0) {
-               cvmx_dprintf("ERROR: cvmx_cmd_queue_shutdown: Queue still "
-                            "has data in it.\n");
-               return CVMX_CMD_QUEUE_FULL;
-       }
-
-       __cvmx_cmd_queue_lock(queue_id, qptr);
-       if (qptr->base_ptr_div128) {
-               cvmx_fpa_free(cvmx_phys_to_ptr
-                             ((uint64_t) qptr->base_ptr_div128 << 7),
-                             qptr->fpa_pool, 0);
-               qptr->base_ptr_div128 = 0;
-       }
-       __cvmx_cmd_queue_unlock(qptr);
-
-       return CVMX_CMD_QUEUE_SUCCESS;
-}
-
-/**
- * Return the number of command words pending in the queue. This
- * function may be relatively slow for some hardware units.
- *
- * @queue_id: Hardware command queue to query
- *
- * Returns Number of outstanding commands
- */
-int cvmx_cmd_queue_length(cvmx_cmd_queue_id_t queue_id)
-{
-       if (CVMX_ENABLE_PARAMETER_CHECKING) {
-               if (__cvmx_cmd_queue_get_state(queue_id) == NULL)
-                       return CVMX_CMD_QUEUE_INVALID_PARAM;
-       }
-
-       /*
-        * The cast is here so gcc with check that all values in the
-        * cvmx_cmd_queue_id_t enumeration are here.
-        */
-       switch ((cvmx_cmd_queue_id_t) (queue_id & 0xff0000)) {
-       case CVMX_CMD_QUEUE_PKO_BASE:
-               /*
-                * FIXME: Need atomic lock on
-                * CVMX_PKO_REG_READ_IDX. Right now we are normally
-                * called with the queue lock, so that is a SLIGHT
-                * amount of protection.
-                */
-               cvmx_write_csr(CVMX_PKO_REG_READ_IDX, queue_id & 0xffff);
-               if (OCTEON_IS_MODEL(OCTEON_CN3XXX)) {
-                       union cvmx_pko_mem_debug9 debug9;
-                       debug9.u64 = cvmx_read_csr(CVMX_PKO_MEM_DEBUG9);
-                       return debug9.cn38xx.doorbell;
-               } else {
-                       union cvmx_pko_mem_debug8 debug8;
-                       debug8.u64 = cvmx_read_csr(CVMX_PKO_MEM_DEBUG8);
-                       return debug8.cn58xx.doorbell;
-               }
-       case CVMX_CMD_QUEUE_ZIP:
-       case CVMX_CMD_QUEUE_DFA:
-       case CVMX_CMD_QUEUE_RAID:
-               /* FIXME: Implement other lengths */
-               return 0;
-       case CVMX_CMD_QUEUE_DMA_BASE:
-               {
-                       union cvmx_npei_dmax_counts dmax_counts;
-                       dmax_counts.u64 =
-                           cvmx_read_csr(CVMX_PEXP_NPEI_DMAX_COUNTS
-                                         (queue_id & 0x7));
-                       return dmax_counts.s.dbell;
-               }
-       case CVMX_CMD_QUEUE_END:
-               return CVMX_CMD_QUEUE_INVALID_PARAM;
-       }
-       return CVMX_CMD_QUEUE_INVALID_PARAM;
-}
-
-/**
- * Return the command buffer to be written to. The purpose of this
- * function is to allow CVMX routine access t othe low level buffer
- * for initial hardware setup. User applications should not call this
- * function directly.
- *
- * @queue_id: Command queue to query
- *
- * Returns Command buffer or NULL on failure
- */
-void *cvmx_cmd_queue_buffer(cvmx_cmd_queue_id_t queue_id)
-{
-       __cvmx_cmd_queue_state_t *qptr = __cvmx_cmd_queue_get_state(queue_id);
-       if (qptr && qptr->base_ptr_div128)
-               return cvmx_phys_to_ptr((uint64_t) qptr->base_ptr_div128 << 7);
-       else
-               return NULL;
-}
diff --git a/drivers/staging/octeon/cvmx-cmd-queue.h b/drivers/staging/octeon/cvmx-cmd-queue.h
deleted file mode 100644 (file)
index 614653b..0000000
+++ /dev/null
@@ -1,617 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- *
- * 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, 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 working 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__
-
-#include <linux/prefetch.h>
-
-#include "cvmx-fpa.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,
-       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_END = 0x50000,
-} cvmx_cmd_queue_id_t;
-
-/**
- * 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 {
-       /* You have lock when this is your ticket */
-       uint8_t now_serving;
-       uint64_t unused1:24;
-       /* Maximum outstanding command words */
-       uint32_t max_depth;
-       /* FPA pool buffers come from */
-       uint64_t fpa_pool:3;
-       /* Top of command buffer pointer shifted 7 */
-       uint64_t base_ptr_div128:29;
-       uint64_t unused2:6;
-       /* FPA buffer size in 64bit words minus 1 */
-       uint64_t pool_size_m1:13;
-       /* Number of commands already used in buffer */
-       uint64_t index:13;
-} __cvmx_cmd_queue_state_t;
-
-/**
- * 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 differnet
- * cahce 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 {
-       uint64_t ticket[(CVMX_CMD_QUEUE_END >> 16) * 256];
-       __cvmx_cmd_queue_state_t state[(CVMX_CMD_QUEUE_END >> 16) * 256];
-} __cvmx_cmd_queue_all_state_t;
-
-/**
- * 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.
- *
- * @queue_id:  Hardware command queue to initialize.
- * @max_depth: Maximum outstanding commands that can be queued.
- * @fpa_pool:  FPA pool the command queues should come from.
- * @pool_size: Size of each buffer in the FPA pool (bytes)
- *
- * Returns 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.
- *
- * @queue_id: Queue to shutdown
- *
- * Returns 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.
- *
- * @queue_id: Hardware command queue to query
- *
- * Returns 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 t othe low level buffer
- * for initial hardware setup. User applications should not call this
- * function directly.
- *
- * @queue_id: Command queue to query
- *
- * Returns Command buffer or NULL on failure
- */
-void *cvmx_cmd_queue_buffer(cvmx_cmd_queue_id_t queue_id);
-
-/**
- * Get the index into the state arrays for the supplied queue id.
- *
- * @queue_id: Queue ID to get an index for
- *
- * Returns Index into the state arrays
- */
-static inline 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.
-        */
-       int unit = queue_id >> 16;
-       int q = (queue_id >> 4) & 0xf;
-       int core = queue_id & 0xf;
-       return unit * 256 + core * 16 + q;
-}
-
-/**
- * Lock the supplied queue so nobody else is updating it at the same
- * time as us.
- *
- * @queue_id: Queue ID to lock
- * @qptr:     Pointer to the queue's global state
- */
-static inline void __cvmx_cmd_queue_lock(cvmx_cmd_queue_id_t queue_id,
-                                        __cvmx_cmd_queue_state_t *qptr)
-{
-       extern __cvmx_cmd_queue_all_state_t
-           *__cvmx_cmd_queue_state_ptr;
-       int tmp;
-       int my_ticket;
-       prefetch(qptr);
-       asm volatile (
-               ".set push\n"
-               ".set noreorder\n"
-               "1:\n"
-               /* Atomic add one to ticket_ptr */
-               "ll     %[my_ticket], %[ticket_ptr]\n"
-               /* and store the original value */
-               "li     %[ticket], 1\n"
-               /* in my_ticket */
-               "baddu  %[ticket], %[my_ticket]\n"
-               "sc     %[ticket], %[ticket_ptr]\n"
-               "beqz   %[ticket], 1b\n"
-               " nop\n"
-               /* Load the current now_serving ticket */
-               "lbu    %[ticket], %[now_serving]\n"
-               "2:\n"
-               /* Jump out if now_serving == my_ticket */
-               "beq    %[ticket], %[my_ticket], 4f\n"
-               /* Find out how many tickets are in front of me */
-               " subu   %[ticket], %[my_ticket], %[ticket]\n"
-               /* Use tickets in front of me minus one to delay */
-               "subu  %[ticket], 1\n"
-               /* Delay will be ((tickets in front)-1)*32 loops */
-               "cins   %[ticket], %[ticket], 5, 7\n"
-               "3:\n"
-               /* Loop here until our ticket might be up */
-               "bnez   %[ticket], 3b\n"
-               " subu  %[ticket], 1\n"
-               /* Jump back up to check out ticket again */
-               "b      2b\n"
-               /* Load the current now_serving ticket */
-               " lbu   %[ticket], %[now_serving]\n"
-               "4:\n"
-               ".set pop\n" :
-               [ticket_ptr] "=m"(__cvmx_cmd_queue_state_ptr->ticket[__cvmx_cmd_queue_get_index(queue_id)]),
-               [now_serving] "=m"(qptr->now_serving), [ticket] "=r"(tmp),
-               [my_ticket] "=r"(my_ticket)
-           );
-}
-
-/**
- * Unlock the queue, flushing all writes.
- *
- * @qptr:   Queue to unlock
- */
-static inline void __cvmx_cmd_queue_unlock(__cvmx_cmd_queue_state_t *qptr)
-{
-       qptr->now_serving++;
-       CVMX_SYNCWS;
-}
-
-/**
- * Get the queue state structure for the given queue id
- *
- * @queue_id: Queue id to get
- *
- * Returns 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)
-{
-       extern __cvmx_cmd_queue_all_state_t
-           *__cvmx_cmd_queue_state_ptr;
-       return &__cvmx_cmd_queue_state_ptr->
-           state[__cvmx_cmd_queue_get_index(queue_id)];
-}
-
-/**
- * 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.
- *
- * @queue_id:  Hardware command queue to write to
- * @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.
- * @cmd_count: Number of command words to write
- * @cmds:      Array of commands to write
- *
- * Returns 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,
-                                                          int use_locking,
-                                                          int cmd_count,
-                                                          uint64_t *cmds)
-{
-       __cvmx_cmd_queue_state_t *qptr = __cvmx_cmd_queue_get_state(queue_id);
-
-       /* Make sure nobody else is updating the same queue */
-       if (likely(use_locking))
-               __cvmx_cmd_queue_lock(queue_id, qptr);
-
-       /*
-        * If a max queue length was specified then make sure we don't
-        * exceed it. If any part of the command would be below the
-        * limit we allow it.
-        */
-       if (CVMX_CMD_QUEUE_ENABLE_MAX_DEPTH && unlikely(qptr->max_depth)) {
-               if (unlikely
-                   (cvmx_cmd_queue_length(queue_id) > (int)qptr->max_depth)) {
-                       if (likely(use_locking))
-                               __cvmx_cmd_queue_unlock(qptr);
-                       return CVMX_CMD_QUEUE_FULL;
-               }
-       }
-
-       /*
-        * Normally there is plenty of room in the current buffer for
-        * the command.
-        */
-       if (likely(qptr->index + cmd_count < qptr->pool_size_m1)) {
-               uint64_t *ptr =
-                   (uint64_t *) cvmx_phys_to_ptr((uint64_t) qptr->
-                                                 base_ptr_div128 << 7);
-               ptr += qptr->index;
-               qptr->index += cmd_count;
-               while (cmd_count--)
-                       *ptr++ = *cmds++;
-       } else {
-               uint64_t *ptr;
-               int count;
-               /*
-                * We need a new command buffer. Fail if there isn't
-                * one available.
-                */
-               uint64_t *new_buffer =
-                   (uint64_t *) cvmx_fpa_alloc(qptr->fpa_pool);
-               if (unlikely(new_buffer == NULL)) {
-                       if (likely(use_locking))
-                               __cvmx_cmd_queue_unlock(qptr);
-                       return CVMX_CMD_QUEUE_NO_MEMORY;
-               }
-               ptr =
-                   (uint64_t *) cvmx_phys_to_ptr((uint64_t) qptr->
-                                                 base_ptr_div128 << 7);
-               /*
-                * Figure out how many command words will fit in this
-                * buffer. One location will be needed for the next
-                * buffer pointer.
-                */
-               count = qptr->pool_size_m1 - qptr->index;
-               ptr += qptr->index;
-               cmd_count -= count;
-               while (count--)
-                       *ptr++ = *cmds++;
-               *ptr = cvmx_ptr_to_phys(new_buffer);
-               /*
-                * The current buffer is full and has a link to the
-                * next buffer. Time to write the rest of the commands
-                * into the new buffer.
-                */
-               qptr->base_ptr_div128 = *ptr >> 7;
-               qptr->index = cmd_count;
-               ptr = new_buffer;
-               while (cmd_count--)
-                       *ptr++ = *cmds++;
-       }
-
-       /* All updates are complete. Release the lock and return */
-       if (likely(use_locking))
-               __cvmx_cmd_queue_unlock(qptr);
-       return CVMX_CMD_QUEUE_SUCCESS;
-}
-
-/**
- * Simple function to write two command words to a command
- * queue.
- *
- * @queue_id: Hardware command queue to write to
- * @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.
- * @cmd1:     Command
- * @cmd2:     Command
- *
- * Returns 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,
-                                                           int use_locking,
-                                                           uint64_t cmd1,
-                                                           uint64_t cmd2)
-{
-       __cvmx_cmd_queue_state_t *qptr = __cvmx_cmd_queue_get_state(queue_id);
-
-       /* Make sure nobody else is updating the same queue */
-       if (likely(use_locking))
-               __cvmx_cmd_queue_lock(queue_id, qptr);
-
-       /*
-        * If a max queue length was specified then make sure we don't
-        * exceed it. If any part of the command would be below the
-        * limit we allow it.
-        */
-       if (CVMX_CMD_QUEUE_ENABLE_MAX_DEPTH && unlikely(qptr->max_depth)) {
-               if (unlikely
-                   (cvmx_cmd_queue_length(queue_id) > (int)qptr->max_depth)) {
-                       if (likely(use_locking))
-                               __cvmx_cmd_queue_unlock(qptr);
-                       return CVMX_CMD_QUEUE_FULL;
-               }
-       }
-
-       /*
-        * Normally there is plenty of room in the current buffer for
-        * the command.
-        */
-       if (likely(qptr->index + 2 < qptr->pool_size_m1)) {
-               uint64_t *ptr =
-                   (uint64_t *) cvmx_phys_to_ptr((uint64_t) qptr->
-                                                 base_ptr_div128 << 7);
-               ptr += qptr->index;
-               qptr->index += 2;
-               ptr[0] = cmd1;
-               ptr[1] = cmd2;
-       } else {
-               uint64_t *ptr;
-               /*
-                * Figure out how many command words will fit in this
-                * buffer. One location will be needed for the next
-                * buffer pointer.
-                */
-               int count = qptr->pool_size_m1 - qptr->index;
-               /*
-                * We need a new command buffer. Fail if there isn't
-                * one available.
-                */
-               uint64_t *new_buffer =
-                   (uint64_t *) cvmx_fpa_alloc(qptr->fpa_pool);
-               if (unlikely(new_buffer == NULL)) {
-                       if (likely(use_locking))
-                               __cvmx_cmd_queue_unlock(qptr);
-                       return CVMX_CMD_QUEUE_NO_MEMORY;
-               }
-               count--;
-               ptr =
-                   (uint64_t *) cvmx_phys_to_ptr((uint64_t) qptr->
-                                                 base_ptr_div128 << 7);
-               ptr += qptr->index;
-               *ptr++ = cmd1;
-               if (likely(count))
-                       *ptr++ = cmd2;
-               *ptr = cvmx_ptr_to_phys(new_buffer);
-               /*
-                * The current buffer is full and has a link to the
-                * next buffer. Time to write the rest of the commands
-                * into the new buffer.
-                */
-               qptr->base_ptr_div128 = *ptr >> 7;
-               qptr->index = 0;
-               if (unlikely(count == 0)) {
-                       qptr->index = 1;
-                       new_buffer[0] = cmd2;
-               }
-       }
-
-       /* All updates are complete. Release the lock and return */
-       if (likely(use_locking))
-               __cvmx_cmd_queue_unlock(qptr);
-       return CVMX_CMD_QUEUE_SUCCESS;
-}
-
-/**
- * Simple function to write three command words to a command
- * queue.
- *
- * @queue_id: Hardware command queue to write to
- * @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.
- * @cmd1:     Command
- * @cmd2:     Command
- * @cmd3:     Command
- *
- * Returns 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,
-                                                           int use_locking,
-                                                           uint64_t cmd1,
-                                                           uint64_t cmd2,
-                                                           uint64_t cmd3)
-{
-       __cvmx_cmd_queue_state_t *qptr = __cvmx_cmd_queue_get_state(queue_id);
-
-       /* Make sure nobody else is updating the same queue */
-       if (likely(use_locking))
-               __cvmx_cmd_queue_lock(queue_id, qptr);
-
-       /*
-        * If a max queue length was specified then make sure we don't
-        * exceed it. If any part of the command would be below the
-        * limit we allow it.
-        */
-       if (CVMX_CMD_QUEUE_ENABLE_MAX_DEPTH && unlikely(qptr->max_depth)) {
-               if (unlikely
-                   (cvmx_cmd_queue_length(queue_id) > (int)qptr->max_depth)) {
-                       if (likely(use_locking))
-                               __cvmx_cmd_queue_unlock(qptr);
-                       return CVMX_CMD_QUEUE_FULL;
-               }
-       }
-
-       /*
-        * Normally there is plenty of room in the current buffer for
-        * the command.
-        */
-       if (likely(qptr->index + 3 < qptr->pool_size_m1)) {
-               uint64_t *ptr =
-                   (uint64_t *) cvmx_phys_to_ptr((uint64_t) qptr->
-                                                 base_ptr_div128 << 7);
-               ptr += qptr->index;
-               qptr->index += 3;
-               ptr[0] = cmd1;
-               ptr[1] = cmd2;
-               ptr[2] = cmd3;
-       } else {
-               uint64_t *ptr;
-               /*
-                * Figure out how many command words will fit in this
-                * buffer. One location will be needed for the next
-                * buffer pointer
-                */
-               int count = qptr->pool_size_m1 - qptr->index;
-               /*
-                * We need a new command buffer. Fail if there isn't
-                * one available
-                */
-               uint64_t *new_buffer =
-                   (uint64_t *) cvmx_fpa_alloc(qptr->fpa_pool);
-               if (unlikely(new_buffer == NULL)) {
-                       if (likely(use_locking))
-                               __cvmx_cmd_queue_unlock(qptr);
-                       return CVMX_CMD_QUEUE_NO_MEMORY;
-               }
-               count--;
-               ptr =
-                   (uint64_t *) cvmx_phys_to_ptr((uint64_t) qptr->
-                                                 base_ptr_div128 << 7);
-               ptr += qptr->index;
-               *ptr++ = cmd1;
-               if (count) {
-                       *ptr++ = cmd2;
-                       if (count > 1)
-                               *ptr++ = cmd3;
-               }
-               *ptr = cvmx_ptr_to_phys(new_buffer);
-               /*
-                * The current buffer is full and has a link to the
-                * next buffer. Time to write the rest of the commands
-                * into the new buffer.
-                */
-               qptr->base_ptr_div128 = *ptr >> 7;
-               qptr->index = 0;
-               ptr = new_buffer;
-               if (count == 0) {
-                       *ptr++ = cmd2;
-                       qptr->index++;
-               }
-               if (count < 2) {
-                       *ptr++ = cmd3;
-                       qptr->index++;
-               }
-       }
-
-       /* All updates are complete. Release the lock and return */
-       if (likely(use_locking))
-               __cvmx_cmd_queue_unlock(qptr);
-       return CVMX_CMD_QUEUE_SUCCESS;
-}
-
-#endif /* __CVMX_CMD_QUEUE_H__ */
diff --git a/drivers/staging/octeon/cvmx-config.h b/drivers/staging/octeon/cvmx-config.h
deleted file mode 100644 (file)
index 078a520..0000000
+++ /dev/null
@@ -1,169 +0,0 @@
-#ifndef __CVMX_CONFIG_H__
-#define __CVMX_CONFIG_H__
-
-/************************* Config Specific Defines ************************/
-#define CVMX_LLM_NUM_PORTS 1
-#define CVMX_NULL_POINTER_PROTECT 1
-#define CVMX_ENABLE_DEBUG_PRINTS 1
-/* PKO queues per port for interface 0 (ports 0-15) */
-#define CVMX_PKO_QUEUES_PER_PORT_INTERFACE0 1
-/* PKO queues per port for interface 1 (ports 16-31) */
-#define CVMX_PKO_QUEUES_PER_PORT_INTERFACE1 1
-/* Limit on the number of PKO ports enabled for interface 0 */
-#define CVMX_PKO_MAX_PORTS_INTERFACE0 CVMX_HELPER_PKO_MAX_PORTS_INTERFACE0
-/* Limit on the number of PKO ports enabled for interface 1 */
-#define CVMX_PKO_MAX_PORTS_INTERFACE1 CVMX_HELPER_PKO_MAX_PORTS_INTERFACE1
-/* PKO queues per port for PCI (ports 32-35) */
-#define CVMX_PKO_QUEUES_PER_PORT_PCI 1
-/* PKO queues per port for Loop devices (ports 36-39) */
-#define CVMX_PKO_QUEUES_PER_PORT_LOOP 1
-
-/************************* FPA allocation *********************************/
-/* Pool sizes in bytes, must be multiple of a cache line */
-#define CVMX_FPA_POOL_0_SIZE (16 * CVMX_CACHE_LINE_SIZE)
-#define CVMX_FPA_POOL_1_SIZE (1 * CVMX_CACHE_LINE_SIZE)
-#define CVMX_FPA_POOL_2_SIZE (8 * CVMX_CACHE_LINE_SIZE)
-#define CVMX_FPA_POOL_3_SIZE (0 * CVMX_CACHE_LINE_SIZE)
-#define CVMX_FPA_POOL_4_SIZE (0 * CVMX_CACHE_LINE_SIZE)
-#define CVMX_FPA_POOL_5_SIZE (0 * CVMX_CACHE_LINE_SIZE)
-#define CVMX_FPA_POOL_6_SIZE (0 * CVMX_CACHE_LINE_SIZE)
-#define CVMX_FPA_POOL_7_SIZE (0 * CVMX_CACHE_LINE_SIZE)
-
-/* Pools in use */
-/* Packet buffers */
-#define CVMX_FPA_PACKET_POOL                (0)
-#define CVMX_FPA_PACKET_POOL_SIZE           CVMX_FPA_POOL_0_SIZE
-/* Work queue entrys */
-#define CVMX_FPA_WQE_POOL                   (1)
-#define CVMX_FPA_WQE_POOL_SIZE              CVMX_FPA_POOL_1_SIZE
-/* PKO queue command buffers */
-#define CVMX_FPA_OUTPUT_BUFFER_POOL         (2)
-#define CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE    CVMX_FPA_POOL_2_SIZE
-
-/*************************  FAU allocation ********************************/
-/* The fetch and add registers are allocated here.  They are arranged
- * in order of descending size so that all alignment constraints are
- * automatically met.  The enums are linked so that the following enum
- * continues allocating where the previous one left off, so the
- * numbering within each enum always starts with zero.  The macros
- * take care of the address increment size, so the values entered
- * always increase by 1.  FAU registers are accessed with byte
- * addresses.
- */
-
-#define CVMX_FAU_REG_64_ADDR(x) ((x << 3) + CVMX_FAU_REG_64_START)
-typedef enum {
-       CVMX_FAU_REG_64_START   = 0,
-       CVMX_FAU_REG_64_END     = CVMX_FAU_REG_64_ADDR(0),
-} cvmx_fau_reg_64_t;
-
-#define CVMX_FAU_REG_32_ADDR(x) ((x << 2) + CVMX_FAU_REG_32_START)
-typedef enum {
-       CVMX_FAU_REG_32_START   = CVMX_FAU_REG_64_END,
-       CVMX_FAU_REG_32_END     = CVMX_FAU_REG_32_ADDR(0),
-} cvmx_fau_reg_32_t;
-
-#define CVMX_FAU_REG_16_ADDR(x) ((x << 1) + CVMX_FAU_REG_16_START)
-typedef enum {
-       CVMX_FAU_REG_16_START   = CVMX_FAU_REG_32_END,
-       CVMX_FAU_REG_16_END     = CVMX_FAU_REG_16_ADDR(0),
-} cvmx_fau_reg_16_t;
-
-#define CVMX_FAU_REG_8_ADDR(x) ((x) + CVMX_FAU_REG_8_START)
-typedef enum {
-       CVMX_FAU_REG_8_START    = CVMX_FAU_REG_16_END,
-       CVMX_FAU_REG_8_END      = CVMX_FAU_REG_8_ADDR(0),
-} cvmx_fau_reg_8_t;
-
-/*
- * The name CVMX_FAU_REG_AVAIL_BASE is provided to indicate the first
- * available FAU address that is not allocated in cvmx-config.h. This
- * is 64 bit aligned.
- */
-#define CVMX_FAU_REG_AVAIL_BASE ((CVMX_FAU_REG_8_END + 0x7) & (~0x7ULL))
-#define CVMX_FAU_REG_END (2048)
-
-/********************** scratch memory allocation *************************/
-/* Scratchpad memory allocation.  Note that these are byte memory
- * addresses.  Some uses of scratchpad (IOBDMA for example) require
- * the use of 8-byte aligned addresses, so proper alignment needs to
- * be taken into account.
- */
-/* Generic scratch iobdma area */
-#define CVMX_SCR_SCRATCH               (0)
-/* First location available after cvmx-config.h allocated region. */
-#define CVMX_SCR_REG_AVAIL_BASE        (8)
-
-/*
- * CVMX_HELPER_FIRST_MBUFF_SKIP is the number of bytes to reserve
- * before the beginning of the packet. If necessary, override the
- * default here.  See the IPD section of the hardware manual for MBUFF
- * SKIP details.
- */
-#define CVMX_HELPER_FIRST_MBUFF_SKIP 184
-
-/*
- * CVMX_HELPER_NOT_FIRST_MBUFF_SKIP is the number of bytes to reserve
- * in each chained packet element. If necessary, override the default
- * here.
- */
-#define CVMX_HELPER_NOT_FIRST_MBUFF_SKIP 0
-
-/*
- * CVMX_HELPER_ENABLE_BACK_PRESSURE controls whether back pressure is
- * enabled for all input ports. This controls if IPD sends
- * backpressure to all ports if Octeon's FPA pools don't have enough
- * packet or work queue entries. Even when this is off, it is still
- * possible to get backpressure from individual hardware ports. When
- * configuring backpressure, also check
- * CVMX_HELPER_DISABLE_*_BACKPRESSURE below. If necessary, override
- * the default here.
- */
-#define CVMX_HELPER_ENABLE_BACK_PRESSURE 1
-
-/*
- * CVMX_HELPER_ENABLE_IPD controls if the IPD is enabled in the helper
- * function. Once it is enabled the hardware starts accepting
- * packets. You might want to skip the IPD enable if configuration
- * changes are need from the default helper setup. If necessary,
- * override the default here.
- */
-#define CVMX_HELPER_ENABLE_IPD 0
-
-/*
- * CVMX_HELPER_INPUT_TAG_TYPE selects the type of tag that the IPD assigns
- * to incoming packets.
- */
-#define CVMX_HELPER_INPUT_TAG_TYPE CVMX_POW_TAG_TYPE_ORDERED
-
-#define CVMX_ENABLE_PARAMETER_CHECKING 0
-
-/*
- * The following select which fields are used by the PIP to generate
- * the tag on INPUT
- * 0: don't include
- * 1: include
- */
-#define CVMX_HELPER_INPUT_TAG_IPV6_SRC_IP      0
-#define CVMX_HELPER_INPUT_TAG_IPV6_DST_IP      0
-#define CVMX_HELPER_INPUT_TAG_IPV6_SRC_PORT    0
-#define CVMX_HELPER_INPUT_TAG_IPV6_DST_PORT    0
-#define CVMX_HELPER_INPUT_TAG_IPV6_NEXT_HEADER         0
-#define CVMX_HELPER_INPUT_TAG_IPV4_SRC_IP      0
-#define CVMX_HELPER_INPUT_TAG_IPV4_DST_IP      0
-#define CVMX_HELPER_INPUT_TAG_IPV4_SRC_PORT    0
-#define CVMX_HELPER_INPUT_TAG_IPV4_DST_PORT    0
-#define CVMX_HELPER_INPUT_TAG_IPV4_PROTOCOL    0
-#define CVMX_HELPER_INPUT_TAG_INPUT_PORT       1
-
-/* Select skip mode for input ports */
-#define CVMX_HELPER_INPUT_PORT_SKIP_MODE       CVMX_PIP_PORT_CFG_MODE_SKIPL2
-
-/*
- * Force backpressure to be disabled.  This overrides all other
- * backpressure configuration.
- */
-#define CVMX_HELPER_DISABLE_RGMII_BACKPRESSURE 0
-
-#endif /* __CVMX_CONFIG_H__ */
-
diff --git a/drivers/staging/octeon/cvmx-dbg-defs.h b/drivers/staging/octeon/cvmx-dbg-defs.h
deleted file mode 100644 (file)
index abbf42d..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-#ifndef __CVMX_DBG_DEFS_H__
-#define __CVMX_DBG_DEFS_H__
-
-#define CVMX_DBG_DATA \
-        CVMX_ADD_IO_SEG(0x00011F00000001E8ull)
-
-union cvmx_dbg_data {
-       uint64_t u64;
-       struct cvmx_dbg_data_s {
-               uint64_t reserved_23_63:41;
-               uint64_t c_mul:5;
-               uint64_t dsel_ext:1;
-               uint64_t data:17;
-       } s;
-       struct cvmx_dbg_data_cn30xx {
-               uint64_t reserved_31_63:33;
-               uint64_t pll_mul:3;
-               uint64_t reserved_23_27:5;
-               uint64_t c_mul:5;
-               uint64_t dsel_ext:1;
-               uint64_t data:17;
-       } cn30xx;
-       struct cvmx_dbg_data_cn30xx cn31xx;
-       struct cvmx_dbg_data_cn38xx {
-               uint64_t reserved_29_63:35;
-               uint64_t d_mul:4;
-               uint64_t dclk_mul2:1;
-               uint64_t cclk_div2:1;
-               uint64_t c_mul:5;
-               uint64_t dsel_ext:1;
-               uint64_t data:17;
-       } cn38xx;
-       struct cvmx_dbg_data_cn38xx cn38xxp2;
-       struct cvmx_dbg_data_cn30xx cn50xx;
-       struct cvmx_dbg_data_cn58xx {
-               uint64_t reserved_29_63:35;
-               uint64_t rem:6;
-               uint64_t c_mul:5;
-               uint64_t dsel_ext:1;
-               uint64_t data:17;
-       } cn58xx;
-       struct cvmx_dbg_data_cn58xx cn58xxp1;
-};
-
-#endif
diff --git a/drivers/staging/octeon/cvmx-fau.h b/drivers/staging/octeon/cvmx-fau.h
deleted file mode 100644 (file)
index a6939fc..0000000
+++ /dev/null
@@ -1,597 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- * Interface to the hardware Fetch and Add Unit.
- */
-
-#ifndef __CVMX_FAU_H__
-#define __CVMX_FAU_H__
-
-/*
- * 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
-
-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 {
-       uint64_t error:1;
-       int64_t 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 {
-       uint64_t error:1;
-       int32_t 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 {
-       uint64_t error:1;
-       int16_t 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 {
-       uint64_t 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 {
-       uint64_t u64;
-       struct {
-               uint64_t invalid:1;
-               uint64_t data:63;       /* unpredictable if invalid is set */
-       } s;
-} cvmx_fau_async_tagwait_result_t;
-
-/**
- * Builds a store I/O address for writing to the FAU
- *
- * @noadd:  0 = Store value is atomically added to the current value
- *               1 = Store value is atomically written over the current value
- * @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.
- * Returns Address to store for atomic update
- */
-static inline uint64_t __cvmx_fau_store_address(uint64_t noadd, uint64_t 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);
-}
-
-/**
- * Builds a I/O address for accessing the FAU
- *
- * @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
- * @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.
- * @value:   Signed value to add.
- *                Note: When performing 32 and 64 bit access, only the low
- *                22 bits are available.
- * Returns Address to read from for atomic update
- */
-static inline uint64_t __cvmx_fau_atomic_address(uint64_t tagwait, uint64_t reg,
-                                                int64_t 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
- *
- * @reg:     FAU atomic register to access. 0 <= reg < 2048.
- *                - Step by 8 for 64 bit access.
- * @value:   Signed value to add.
- *                Note: Only the low 22 bits are available.
- * Returns Value of the register before the update
- */
-static inline int64_t cvmx_fau_fetch_and_add64(cvmx_fau_reg_64_t reg,
-                                              int64_t value)
-{
-       return cvmx_read64_int64(__cvmx_fau_atomic_address(0, reg, value));
-}
-
-/**
- * Perform an atomic 32 bit add
- *
- * @reg:     FAU atomic register to access. 0 <= reg < 2048.
- *                - Step by 4 for 32 bit access.
- * @value:   Signed value to add.
- *                Note: Only the low 22 bits are available.
- * Returns Value of the register before the update
- */
-static inline int32_t cvmx_fau_fetch_and_add32(cvmx_fau_reg_32_t reg,
-                                              int32_t value)
-{
-       return cvmx_read64_int32(__cvmx_fau_atomic_address(0, reg, value));
-}
-
-/**
- * Perform an atomic 16 bit add
- *
- * @reg:     FAU atomic register to access. 0 <= reg < 2048.
- *                - Step by 2 for 16 bit access.
- * @value:   Signed value to add.
- * Returns Value of the register before the update
- */
-static inline int16_t cvmx_fau_fetch_and_add16(cvmx_fau_reg_16_t reg,
-                                              int16_t value)
-{
-       return cvmx_read64_int16(__cvmx_fau_atomic_address(0, reg, value));
-}
-
-/**
- * Perform an atomic 8 bit add
- *
- * @reg:     FAU atomic register to access. 0 <= reg < 2048.
- * @value:   Signed value to add.
- * Returns Value of the register before the update
- */
-static inline int8_t cvmx_fau_fetch_and_add8(cvmx_fau_reg_8_t reg, int8_t value)
-{
-       return cvmx_read64_int8(__cvmx_fau_atomic_address(0, reg, value));
-}
-
-/**
- * Perform an atomic 64 bit add after the current tag switch
- * completes
- *
- * @reg:    FAU atomic register to access. 0 <= reg < 2048.
- *               - Step by 8 for 64 bit access.
- * @value:  Signed value to add.
- *               Note: Only the low 22 bits are available.
- * Returns 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_fau_tagwait_fetch_and_add64(cvmx_fau_reg_64_t reg, int64_t value)
-{
-       union {
-               uint64_t i64;
-               cvmx_fau_tagwait64_t t;
-       } result;
-       result.i64 =
-           cvmx_read64_int64(__cvmx_fau_atomic_address(1, reg, value));
-       return result.t;
-}
-
-/**
- * Perform an atomic 32 bit add after the current tag switch
- * completes
- *
- * @reg:    FAU atomic register to access. 0 <= reg < 2048.
- *               - Step by 4 for 32 bit access.
- * @value:  Signed value to add.
- *               Note: Only the low 22 bits are available.
- * Returns 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_fau_tagwait_fetch_and_add32(cvmx_fau_reg_32_t reg, int32_t value)
-{
-       union {
-               uint64_t i32;
-               cvmx_fau_tagwait32_t t;
-       } result;
-       result.i32 =
-           cvmx_read64_int32(__cvmx_fau_atomic_address(1, reg, value));
-       return result.t;
-}
-
-/**
- * Perform an atomic 16 bit add after the current tag switch
- * completes
- *
- * @reg:    FAU atomic register to access. 0 <= reg < 2048.
- *               - Step by 2 for 16 bit access.
- * @value:  Signed value to add.
- * Returns 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_fau_tagwait_fetch_and_add16(cvmx_fau_reg_16_t reg, int16_t value)
-{
-       union {
-               uint64_t i16;
-               cvmx_fau_tagwait16_t t;
-       } result;
-       result.i16 =
-           cvmx_read64_int16(__cvmx_fau_atomic_address(1, reg, value));
-       return result.t;
-}
-
-/**
- * Perform an atomic 8 bit add after the current tag switch
- * completes
- *
- * @reg:    FAU atomic register to access. 0 <= reg < 2048.
- * @value:  Signed value to add.
- * Returns 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_fau_tagwait_fetch_and_add8(cvmx_fau_reg_8_t reg, int8_t value)
-{
-       union {
-               uint64_t i8;
-               cvmx_fau_tagwait8_t t;
-       } result;
-       result.i8 = cvmx_read64_int8(__cvmx_fau_atomic_address(1, reg, value));
-       return result.t;
-}
-
-/**
- * Builds I/O data for async operations
- *
- * @scraddr: Scratch pad byte address to write to.  Must be 8 byte aligned
- * @value:   Signed value to add.
- *                Note: When performing 32 and 64 bit access, only the low
- *                22 bits are available.
- * @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
- * @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
- * @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.
- * Returns Data to write using cvmx_send_single
- */
-static inline uint64_t __cvmx_fau_iobdma_data(uint64_t scraddr, int64_t value,
-                                             uint64_t tagwait,
-                                             cvmx_fau_op_size_t size,
-                                             uint64_t 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.
- *
- * @scraddr: Scratch memory byte address to put response in.
- *                Must be 8 byte aligned.
- * @reg:     FAU atomic register to access. 0 <= reg < 2048.
- *                - Step by 8 for 64 bit access.
- * @value:   Signed value to add.
- *                Note: Only the low 22 bits are available.
- * Returns Placed in the scratch pad register
- */
-static inline void cvmx_fau_async_fetch_and_add64(uint64_t scraddr,
-                                                 cvmx_fau_reg_64_t reg,
-                                                 int64_t 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.
- *
- * @scraddr: Scratch memory byte address to put response in.
- *                Must be 8 byte aligned.
- * @reg:     FAU atomic register to access. 0 <= reg < 2048.
- *                - Step by 4 for 32 bit access.
- * @value:   Signed value to add.
- *                Note: Only the low 22 bits are available.
- * Returns Placed in the scratch pad register
- */
-static inline void cvmx_fau_async_fetch_and_add32(uint64_t scraddr,
-                                                 cvmx_fau_reg_32_t reg,
-                                                 int32_t 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.
- *
- * @scraddr: Scratch memory byte address to put response in.
- *                Must be 8 byte aligned.
- * @reg:     FAU atomic register to access. 0 <= reg < 2048.
- *                - Step by 2 for 16 bit access.
- * @value:   Signed value to add.
- * Returns Placed in the scratch pad register
- */
-static inline void cvmx_fau_async_fetch_and_add16(uint64_t scraddr,
-                                                 cvmx_fau_reg_16_t reg,
-                                                 int16_t 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.
- *
- * @scraddr: Scratch memory byte address to put response in.
- *                Must be 8 byte aligned.
- * @reg:     FAU atomic register to access. 0 <= reg < 2048.
- * @value:   Signed value to add.
- * Returns Placed in the scratch pad register
- */
-static inline void cvmx_fau_async_fetch_and_add8(uint64_t scraddr,
-                                                cvmx_fau_reg_8_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.
- *
- * @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
- *
- * @reg:     FAU atomic register to access. 0 <= reg < 2048.
- *                - Step by 8 for 64 bit access.
- * @value:   Signed value to add.
- *                Note: Only the low 22 bits are available.
- * Returns Placed in the scratch pad register
- */
-static inline void cvmx_fau_async_tagwait_fetch_and_add64(uint64_t scraddr,
-                                                         cvmx_fau_reg_64_t reg,
-                                                         int64_t 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.
- *
- * @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
- *
- * @reg:     FAU atomic register to access. 0 <= reg < 2048.
- *                - Step by 4 for 32 bit access.
- * @value:   Signed value to add.
- *                Note: Only the low 22 bits are available.
- * Returns Placed in the scratch pad register
- */
-static inline void cvmx_fau_async_tagwait_fetch_and_add32(uint64_t scraddr,
-                                                         cvmx_fau_reg_32_t reg,
-                                                         int32_t 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.
- *
- * @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
- *
- * @reg:     FAU atomic register to access. 0 <= reg < 2048.
- *                - Step by 2 for 16 bit access.
- * @value:   Signed value to add.
- *
- * Returns Placed in the scratch pad register
- */
-static inline void cvmx_fau_async_tagwait_fetch_and_add16(uint64_t scraddr,
-                                                         cvmx_fau_reg_16_t reg,
-                                                         int16_t 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.
- *
- * @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
- *
- * @reg:     FAU atomic register to access. 0 <= reg < 2048.
- * @value:   Signed value to add.
- *
- * Returns Placed in the scratch pad register
- */
-static inline void cvmx_fau_async_tagwait_fetch_and_add8(uint64_t scraddr,
-                                                        cvmx_fau_reg_8_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
- *
- * @reg:     FAU atomic register to access. 0 <= reg < 2048.
- *                - Step by 8 for 64 bit access.
- * @value:   Signed value to add.
- */
-static inline void cvmx_fau_atomic_add64(cvmx_fau_reg_64_t reg, int64_t value)
-{
-       cvmx_write64_int64(__cvmx_fau_store_address(0, reg), value);
-}
-
-/**
- * Perform an atomic 32 bit add
- *
- * @reg:     FAU atomic register to access. 0 <= reg < 2048.
- *                - Step by 4 for 32 bit access.
- * @value:   Signed value to add.
- */
-static inline void cvmx_fau_atomic_add32(cvmx_fau_reg_32_t reg, int32_t value)
-{
-       cvmx_write64_int32(__cvmx_fau_store_address(0, reg), value);
-}
-
-/**
- * Perform an atomic 16 bit add
- *
- * @reg:     FAU atomic register to access. 0 <= reg < 2048.
- *                - Step by 2 for 16 bit access.
- * @value:   Signed value to add.
- */
-static inline void cvmx_fau_atomic_add16(cvmx_fau_reg_16_t reg, int16_t value)
-{
-       cvmx_write64_int16(__cvmx_fau_store_address(0, reg), value);
-}
-
-/**
- * Perform an atomic 8 bit add
- *
- * @reg:     FAU atomic register to access. 0 <= reg < 2048.
- * @value:   Signed value to add.
- */
-static inline void cvmx_fau_atomic_add8(cvmx_fau_reg_8_t reg, int8_t value)
-{
-       cvmx_write64_int8(__cvmx_fau_store_address(0, reg), value);
-}
-
-/**
- * Perform an atomic 64 bit write
- *
- * @reg:     FAU atomic register to access. 0 <= reg < 2048.
- *                - Step by 8 for 64 bit access.
- * @value:   Signed value to write.
- */
-static inline void cvmx_fau_atomic_write64(cvmx_fau_reg_64_t reg, int64_t value)
-{
-       cvmx_write64_int64(__cvmx_fau_store_address(1, reg), value);
-}
-
-/**
- * Perform an atomic 32 bit write
- *
- * @reg:     FAU atomic register to access. 0 <= reg < 2048.
- *                - Step by 4 for 32 bit access.
- * @value:   Signed value to write.
- */
-static inline void cvmx_fau_atomic_write32(cvmx_fau_reg_32_t reg, int32_t value)
-{
-       cvmx_write64_int32(__cvmx_fau_store_address(1, reg), value);
-}
-
-/**
- * Perform an atomic 16 bit write
- *
- * @reg:     FAU atomic register to access. 0 <= reg < 2048.
- *                - Step by 2 for 16 bit access.
- * @value:   Signed value to write.
- */
-static inline void cvmx_fau_atomic_write16(cvmx_fau_reg_16_t reg, int16_t value)
-{
-       cvmx_write64_int16(__cvmx_fau_store_address(1, reg), value);
-}
-
-/**
- * Perform an atomic 8 bit write
- *
- * @reg:     FAU atomic register to access. 0 <= reg < 2048.
- * @value:   Signed value to write.
- */
-static inline void cvmx_fau_atomic_write8(cvmx_fau_reg_8_t reg, int8_t value)
-{
-       cvmx_write64_int8(__cvmx_fau_store_address(1, reg), value);
-}
-
-#endif /* __CVMX_FAU_H__ */
diff --git a/drivers/staging/octeon/cvmx-fpa-defs.h b/drivers/staging/octeon/cvmx-fpa-defs.h
deleted file mode 100644 (file)
index bf5546b..0000000
+++ /dev/null
@@ -1,403 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-#ifndef __CVMX_FPA_DEFS_H__
-#define __CVMX_FPA_DEFS_H__
-
-#define CVMX_FPA_BIST_STATUS \
-        CVMX_ADD_IO_SEG(0x00011800280000E8ull)
-#define CVMX_FPA_CTL_STATUS \
-        CVMX_ADD_IO_SEG(0x0001180028000050ull)
-#define CVMX_FPA_FPF0_MARKS \
-        CVMX_ADD_IO_SEG(0x0001180028000000ull)
-#define CVMX_FPA_FPF0_SIZE \
-        CVMX_ADD_IO_SEG(0x0001180028000058ull)
-#define CVMX_FPA_FPF1_MARKS \
-        CVMX_ADD_IO_SEG(0x0001180028000008ull)
-#define CVMX_FPA_FPF2_MARKS \
-        CVMX_ADD_IO_SEG(0x0001180028000010ull)
-#define CVMX_FPA_FPF3_MARKS \
-        CVMX_ADD_IO_SEG(0x0001180028000018ull)
-#define CVMX_FPA_FPF4_MARKS \
-        CVMX_ADD_IO_SEG(0x0001180028000020ull)
-#define CVMX_FPA_FPF5_MARKS \
-        CVMX_ADD_IO_SEG(0x0001180028000028ull)
-#define CVMX_FPA_FPF6_MARKS \
-        CVMX_ADD_IO_SEG(0x0001180028000030ull)
-#define CVMX_FPA_FPF7_MARKS \
-        CVMX_ADD_IO_SEG(0x0001180028000038ull)
-#define CVMX_FPA_FPFX_MARKS(offset) \
-        CVMX_ADD_IO_SEG(0x0001180028000008ull + (((offset) & 7) * 8) - 8 * 1)
-#define CVMX_FPA_FPFX_SIZE(offset) \
-        CVMX_ADD_IO_SEG(0x0001180028000060ull + (((offset) & 7) * 8) - 8 * 1)
-#define CVMX_FPA_INT_ENB \
-        CVMX_ADD_IO_SEG(0x0001180028000048ull)
-#define CVMX_FPA_INT_SUM \
-        CVMX_ADD_IO_SEG(0x0001180028000040ull)
-#define CVMX_FPA_QUE0_PAGE_INDEX \
-        CVMX_ADD_IO_SEG(0x00011800280000F0ull)
-#define CVMX_FPA_QUE1_PAGE_INDEX \
-        CVMX_ADD_IO_SEG(0x00011800280000F8ull)
-#define CVMX_FPA_QUE2_PAGE_INDEX \
-        CVMX_ADD_IO_SEG(0x0001180028000100ull)
-#define CVMX_FPA_QUE3_PAGE_INDEX \
-        CVMX_ADD_IO_SEG(0x0001180028000108ull)
-#define CVMX_FPA_QUE4_PAGE_INDEX \
-        CVMX_ADD_IO_SEG(0x0001180028000110ull)
-#define CVMX_FPA_QUE5_PAGE_INDEX \
-        CVMX_ADD_IO_SEG(0x0001180028000118ull)
-#define CVMX_FPA_QUE6_PAGE_INDEX \
-        CVMX_ADD_IO_SEG(0x0001180028000120ull)
-#define CVMX_FPA_QUE7_PAGE_INDEX \
-        CVMX_ADD_IO_SEG(0x0001180028000128ull)
-#define CVMX_FPA_QUEX_AVAILABLE(offset) \
-        CVMX_ADD_IO_SEG(0x0001180028000098ull + (((offset) & 7) * 8))
-#define CVMX_FPA_QUEX_PAGE_INDEX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800280000F0ull + (((offset) & 7) * 8))
-#define CVMX_FPA_QUE_ACT \
-        CVMX_ADD_IO_SEG(0x0001180028000138ull)
-#define CVMX_FPA_QUE_EXP \
-        CVMX_ADD_IO_SEG(0x0001180028000130ull)
-#define CVMX_FPA_WART_CTL \
-        CVMX_ADD_IO_SEG(0x00011800280000D8ull)
-#define CVMX_FPA_WART_STATUS \
-        CVMX_ADD_IO_SEG(0x00011800280000E0ull)
-
-union cvmx_fpa_bist_status {
-       uint64_t u64;
-       struct cvmx_fpa_bist_status_s {
-               uint64_t reserved_5_63:59;
-               uint64_t frd:1;
-               uint64_t fpf0:1;
-               uint64_t fpf1:1;
-               uint64_t ffr:1;
-               uint64_t fdr:1;
-       } s;
-       struct cvmx_fpa_bist_status_s cn30xx;
-       struct cvmx_fpa_bist_status_s cn31xx;
-       struct cvmx_fpa_bist_status_s cn38xx;
-       struct cvmx_fpa_bist_status_s cn38xxp2;
-       struct cvmx_fpa_bist_status_s cn50xx;
-       struct cvmx_fpa_bist_status_s cn52xx;
-       struct cvmx_fpa_bist_status_s cn52xxp1;
-       struct cvmx_fpa_bist_status_s cn56xx;
-       struct cvmx_fpa_bist_status_s cn56xxp1;
-       struct cvmx_fpa_bist_status_s cn58xx;
-       struct cvmx_fpa_bist_status_s cn58xxp1;
-};
-
-union cvmx_fpa_ctl_status {
-       uint64_t u64;
-       struct cvmx_fpa_ctl_status_s {
-               uint64_t reserved_18_63:46;
-               uint64_t reset:1;
-               uint64_t use_ldt:1;
-               uint64_t use_stt:1;
-               uint64_t enb:1;
-               uint64_t mem1_err:7;
-               uint64_t mem0_err:7;
-       } s;
-       struct cvmx_fpa_ctl_status_s cn30xx;
-       struct cvmx_fpa_ctl_status_s cn31xx;
-       struct cvmx_fpa_ctl_status_s cn38xx;
-       struct cvmx_fpa_ctl_status_s cn38xxp2;
-       struct cvmx_fpa_ctl_status_s cn50xx;
-       struct cvmx_fpa_ctl_status_s cn52xx;
-       struct cvmx_fpa_ctl_status_s cn52xxp1;
-       struct cvmx_fpa_ctl_status_s cn56xx;
-       struct cvmx_fpa_ctl_status_s cn56xxp1;
-       struct cvmx_fpa_ctl_status_s cn58xx;
-       struct cvmx_fpa_ctl_status_s cn58xxp1;
-};
-
-union cvmx_fpa_fpfx_marks {
-       uint64_t u64;
-       struct cvmx_fpa_fpfx_marks_s {
-               uint64_t reserved_22_63:42;
-               uint64_t fpf_wr:11;
-               uint64_t 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;
-};
-
-union cvmx_fpa_fpfx_size {
-       uint64_t u64;
-       struct cvmx_fpa_fpfx_size_s {
-               uint64_t reserved_11_63:53;
-               uint64_t 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;
-};
-
-union cvmx_fpa_fpf0_marks {
-       uint64_t u64;
-       struct cvmx_fpa_fpf0_marks_s {
-               uint64_t reserved_24_63:40;
-               uint64_t fpf_wr:12;
-               uint64_t 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;
-};
-
-union cvmx_fpa_fpf0_size {
-       uint64_t u64;
-       struct cvmx_fpa_fpf0_size_s {
-               uint64_t reserved_12_63:52;
-               uint64_t 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;
-};
-
-union cvmx_fpa_int_enb {
-       uint64_t u64;
-       struct cvmx_fpa_int_enb_s {
-               uint64_t reserved_28_63:36;
-               uint64_t q7_perr:1;
-               uint64_t q7_coff:1;
-               uint64_t q7_und:1;
-               uint64_t q6_perr:1;
-               uint64_t q6_coff:1;
-               uint64_t q6_und:1;
-               uint64_t q5_perr:1;
-               uint64_t q5_coff:1;
-               uint64_t q5_und:1;
-               uint64_t q4_perr:1;
-               uint64_t q4_coff:1;
-               uint64_t q4_und:1;
-               uint64_t q3_perr:1;
-               uint64_t q3_coff:1;
-               uint64_t q3_und:1;
-               uint64_t q2_perr:1;
-               uint64_t q2_coff:1;
-               uint64_t q2_und:1;
-               uint64_t q1_perr:1;
-               uint64_t q1_coff:1;
-               uint64_t q1_und:1;
-               uint64_t q0_perr:1;
-               uint64_t q0_coff:1;
-               uint64_t q0_und:1;
-               uint64_t fed1_dbe:1;
-               uint64_t fed1_sbe:1;
-               uint64_t fed0_dbe:1;
-               uint64_t fed0_sbe:1;
-       } s;
-       struct cvmx_fpa_int_enb_s cn30xx;
-       struct cvmx_fpa_int_enb_s cn31xx;
-       struct cvmx_fpa_int_enb_s cn38xx;
-       struct cvmx_fpa_int_enb_s cn38xxp2;
-       struct cvmx_fpa_int_enb_s cn50xx;
-       struct cvmx_fpa_int_enb_s cn52xx;
-       struct cvmx_fpa_int_enb_s cn52xxp1;
-       struct cvmx_fpa_int_enb_s cn56xx;
-       struct cvmx_fpa_int_enb_s cn56xxp1;
-       struct cvmx_fpa_int_enb_s cn58xx;
-       struct cvmx_fpa_int_enb_s cn58xxp1;
-};
-
-union cvmx_fpa_int_sum {
-       uint64_t u64;
-       struct cvmx_fpa_int_sum_s {
-               uint64_t reserved_28_63:36;
-               uint64_t q7_perr:1;
-               uint64_t q7_coff:1;
-               uint64_t q7_und:1;
-               uint64_t q6_perr:1;
-               uint64_t q6_coff:1;
-               uint64_t q6_und:1;
-               uint64_t q5_perr:1;
-               uint64_t q5_coff:1;
-               uint64_t q5_und:1;
-               uint64_t q4_perr:1;
-               uint64_t q4_coff:1;
-               uint64_t q4_und:1;
-               uint64_t q3_perr:1;
-               uint64_t q3_coff:1;
-               uint64_t q3_und:1;
-               uint64_t q2_perr:1;
-               uint64_t q2_coff:1;
-               uint64_t q2_und:1;
-               uint64_t q1_perr:1;
-               uint64_t q1_coff:1;
-               uint64_t q1_und:1;
-               uint64_t q0_perr:1;
-               uint64_t q0_coff:1;
-               uint64_t q0_und:1;
-               uint64_t fed1_dbe:1;
-               uint64_t fed1_sbe:1;
-               uint64_t fed0_dbe:1;
-               uint64_t fed0_sbe:1;
-       } s;
-       struct cvmx_fpa_int_sum_s cn30xx;
-       struct cvmx_fpa_int_sum_s cn31xx;
-       struct cvmx_fpa_int_sum_s cn38xx;
-       struct cvmx_fpa_int_sum_s cn38xxp2;
-       struct cvmx_fpa_int_sum_s cn50xx;
-       struct cvmx_fpa_int_sum_s cn52xx;
-       struct cvmx_fpa_int_sum_s cn52xxp1;
-       struct cvmx_fpa_int_sum_s cn56xx;
-       struct cvmx_fpa_int_sum_s cn56xxp1;
-       struct cvmx_fpa_int_sum_s cn58xx;
-       struct cvmx_fpa_int_sum_s cn58xxp1;
-};
-
-union cvmx_fpa_quex_available {
-       uint64_t u64;
-       struct cvmx_fpa_quex_available_s {
-               uint64_t reserved_29_63:35;
-               uint64_t que_siz:29;
-       } s;
-       struct cvmx_fpa_quex_available_s cn30xx;
-       struct cvmx_fpa_quex_available_s cn31xx;
-       struct cvmx_fpa_quex_available_s cn38xx;
-       struct cvmx_fpa_quex_available_s cn38xxp2;
-       struct cvmx_fpa_quex_available_s cn50xx;
-       struct cvmx_fpa_quex_available_s cn52xx;
-       struct cvmx_fpa_quex_available_s cn52xxp1;
-       struct cvmx_fpa_quex_available_s cn56xx;
-       struct cvmx_fpa_quex_available_s cn56xxp1;
-       struct cvmx_fpa_quex_available_s cn58xx;
-       struct cvmx_fpa_quex_available_s cn58xxp1;
-};
-
-union cvmx_fpa_quex_page_index {
-       uint64_t u64;
-       struct cvmx_fpa_quex_page_index_s {
-               uint64_t reserved_25_63:39;
-               uint64_t 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;
-};
-
-union cvmx_fpa_que_act {
-       uint64_t u64;
-       struct cvmx_fpa_que_act_s {
-               uint64_t reserved_29_63:35;
-               uint64_t act_que:3;
-               uint64_t 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;
-};
-
-union cvmx_fpa_que_exp {
-       uint64_t u64;
-       struct cvmx_fpa_que_exp_s {
-               uint64_t reserved_29_63:35;
-               uint64_t exp_que:3;
-               uint64_t 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;
-};
-
-union cvmx_fpa_wart_ctl {
-       uint64_t u64;
-       struct cvmx_fpa_wart_ctl_s {
-               uint64_t reserved_16_63:48;
-               uint64_t 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;
-};
-
-union cvmx_fpa_wart_status {
-       uint64_t u64;
-       struct cvmx_fpa_wart_status_s {
-               uint64_t reserved_32_63:32;
-               uint64_t 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;
-};
-
-#endif
diff --git a/drivers/staging/octeon/cvmx-fpa.c b/drivers/staging/octeon/cvmx-fpa.c
deleted file mode 100644 (file)
index ad44b8b..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/**
- * @file
- *
- * Support library for the hardware Free Pool Allocator.
- *
- *
- */
-
-#include "cvmx-config.h"
-#include "cvmx.h"
-#include "cvmx-fpa.h"
-#include "cvmx-ipd.h"
-
-/**
- * Current state of all the pools. Use access functions
- * instead of using it directly.
- */
-CVMX_SHARED cvmx_fpa_pool_info_t cvmx_fpa_pool_info[CVMX_FPA_NUM_POOLS];
-
-/**
- * Setup a FPA pool to control a new block of memory. The
- * buffer pointer must be a physical address.
- *
- * @pool:       Pool to initialize
- *                   0 <= pool < 8
- * @name:       Constant character string to name this pool.
- *                   String is not copied.
- * @buffer:     Pointer to the block of memory to use. This must be
- *                   accessible by all processors and external hardware.
- * @block_size: Size for each block controlled by the FPA
- * @num_blocks: Number of blocks
- *
- * Returns 0 on Success,
- *         -1 on failure
- */
-int cvmx_fpa_setup_pool(uint64_t pool, const char *name, void *buffer,
-                       uint64_t block_size, uint64_t num_blocks)
-{
-       char *ptr;
-       if (!buffer) {
-               cvmx_dprintf
-                   ("ERROR: cvmx_fpa_setup_pool: NULL buffer pointer!\n");
-               return -1;
-       }
-       if (pool >= CVMX_FPA_NUM_POOLS) {
-               cvmx_dprintf("ERROR: cvmx_fpa_setup_pool: Illegal pool!\n");
-               return -1;
-       }
-
-       if (block_size < CVMX_FPA_MIN_BLOCK_SIZE) {
-               cvmx_dprintf
-                   ("ERROR: cvmx_fpa_setup_pool: Block size too small.\n");
-               return -1;
-       }
-
-       if (((unsigned long)buffer & (CVMX_FPA_ALIGNMENT - 1)) != 0) {
-               cvmx_dprintf
-                   ("ERROR: cvmx_fpa_setup_pool: Buffer not aligned properly.\n");
-               return -1;
-       }
-
-       cvmx_fpa_pool_info[pool].name = name;
-       cvmx_fpa_pool_info[pool].size = block_size;
-       cvmx_fpa_pool_info[pool].starting_element_count = num_blocks;
-       cvmx_fpa_pool_info[pool].base = buffer;
-
-       ptr = (char *)buffer;
-       while (num_blocks--) {
-               cvmx_fpa_free(ptr, pool, 0);
-               ptr += block_size;
-       }
-       return 0;
-}
-
-/**
- * Shutdown a Memory pool and validate that it had all of
- * the buffers originally placed in it.
- *
- * @pool:   Pool to shutdown
- * Returns Zero on success
- *         - Positive is count of missing buffers
- *         - Negative is too many buffers or corrupted pointers
- */
-uint64_t cvmx_fpa_shutdown_pool(uint64_t pool)
-{
-       uint64_t errors = 0;
-       uint64_t count = 0;
-       uint64_t base = cvmx_ptr_to_phys(cvmx_fpa_pool_info[pool].base);
-       uint64_t finish =
-           base +
-           cvmx_fpa_pool_info[pool].size *
-           cvmx_fpa_pool_info[pool].starting_element_count;
-       void *ptr;
-       uint64_t address;
-
-       count = 0;
-       do {
-               ptr = cvmx_fpa_alloc(pool);
-               if (ptr)
-                       address = cvmx_ptr_to_phys(ptr);
-               else
-                       address = 0;
-               if (address) {
-                       if ((address >= base) && (address < finish) &&
-                           (((address -
-                              base) % cvmx_fpa_pool_info[pool].size) == 0)) {
-                               count++;
-                       } else {
-                               cvmx_dprintf
-                                   ("ERROR: cvmx_fpa_shutdown_pool: Illegal address 0x%llx in pool %s(%d)\n",
-                                    (unsigned long long)address,
-                                    cvmx_fpa_pool_info[pool].name, (int)pool);
-                               errors++;
-                       }
-               }
-       } while (address);
-
-#ifdef CVMX_ENABLE_PKO_FUNCTIONS
-       if (pool == 0)
-               cvmx_ipd_free_ptr();
-#endif
-
-       if (errors) {
-               cvmx_dprintf
-                   ("ERROR: cvmx_fpa_shutdown_pool: Pool %s(%d) started at 0x%llx, ended at 0x%llx, with a step of 0x%llx\n",
-                    cvmx_fpa_pool_info[pool].name, (int)pool,
-                    (unsigned long long)base, (unsigned long long)finish,
-                    (unsigned long long)cvmx_fpa_pool_info[pool].size);
-               return -errors;
-       } else
-               return 0;
-}
-
-uint64_t cvmx_fpa_get_block_size(uint64_t pool)
-{
-       switch (pool) {
-       case 0:
-               return CVMX_FPA_POOL_0_SIZE;
-       case 1:
-               return CVMX_FPA_POOL_1_SIZE;
-       case 2:
-               return CVMX_FPA_POOL_2_SIZE;
-       case 3:
-               return CVMX_FPA_POOL_3_SIZE;
-       case 4:
-               return CVMX_FPA_POOL_4_SIZE;
-       case 5:
-               return CVMX_FPA_POOL_5_SIZE;
-       case 6:
-               return CVMX_FPA_POOL_6_SIZE;
-       case 7:
-               return CVMX_FPA_POOL_7_SIZE;
-       default:
-               return 0;
-       }
-}
diff --git a/drivers/staging/octeon/cvmx-fpa.h b/drivers/staging/octeon/cvmx-fpa.h
deleted file mode 100644 (file)
index 1f04f96..0000000
+++ /dev/null
@@ -1,299 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/**
- * @file
- *
- * Interface to the hardware Free Pool Allocator.
- *
- *
- */
-
-#ifndef __CVMX_FPA_H__
-#define __CVMX_FPA_H__
-
-#include "cvmx-address.h"
-#include "cvmx-fpa-defs.h"
-
-#define CVMX_FPA_NUM_POOLS      8
-#define CVMX_FPA_MIN_BLOCK_SIZE 128
-#define CVMX_FPA_ALIGNMENT      128
-
-/**
- * Structure describing the data format used for stores to the FPA.
- */
-typedef union {
-       uint64_t u64;
-       struct {
-               /*
-                * the (64-bit word) location in scratchpad to write
-                * to (if len != 0)
-                */
-               uint64_t scraddr:8;
-               /* the number of words in the response (0 => no response) */
-               uint64_t len:8;
-               /* the ID of the device on the non-coherent bus */
-               uint64_t did:8;
-               /*
-                * the address that will appear in the first tick on
-                * the NCB bus.
-                */
-               uint64_t addr:40;
-       } s;
-} cvmx_fpa_iobdma_data_t;
-
-/**
- * Structure describing the current state of a FPA pool.
- */
-typedef struct {
-       /* Name it was created under */
-       const char *name;
-       /* Size of each block */
-       uint64_t size;
-       /* The base memory address of whole block */
-       void *base;
-       /* The number of elements in the pool at creation */
-       uint64_t starting_element_count;
-} cvmx_fpa_pool_info_t;
-
-/**
- * Current state of all the pools. Use access functions
- * instead of using it directly.
- */
-extern cvmx_fpa_pool_info_t cvmx_fpa_pool_info[CVMX_FPA_NUM_POOLS];
-
-/* CSR typedefs have been moved to cvmx-csr-*.h */
-
-/**
- * Return the name of the pool
- *
- * @pool:   Pool to get the name of
- * Returns The name
- */
-static inline const char *cvmx_fpa_get_name(uint64_t pool)
-{
-       return cvmx_fpa_pool_info[pool].name;
-}
-
-/**
- * Return the base of the pool
- *
- * @pool:   Pool to get the base of
- * Returns The base
- */
-static inline void *cvmx_fpa_get_base(uint64_t pool)
-{
-       return cvmx_fpa_pool_info[pool].base;
-}
-
-/**
- * Check if a pointer belongs to an FPA pool. Return non-zero
- * if the supplied pointer is inside the memory controlled by
- * an FPA pool.
- *
- * @pool:   Pool to check
- * @ptr:    Pointer to check
- * Returns Non-zero if pointer is in the pool. Zero if not
- */
-static inline int cvmx_fpa_is_member(uint64_t pool, void *ptr)
-{
-       return ((ptr >= cvmx_fpa_pool_info[pool].base) &&
-               ((char *)ptr <
-                ((char *)(cvmx_fpa_pool_info[pool].base)) +
-                cvmx_fpa_pool_info[pool].size *
-                cvmx_fpa_pool_info[pool].starting_element_count));
-}
-
-/**
- * Enable the FPA for use. Must be performed after any CSR
- * configuration but before any other FPA functions.
- */
-static inline void cvmx_fpa_enable(void)
-{
-       union cvmx_fpa_ctl_status status;
-
-       status.u64 = cvmx_read_csr(CVMX_FPA_CTL_STATUS);
-       if (status.s.enb) {
-               cvmx_dprintf
-                   ("Warning: Enabling FPA when FPA already enabled.\n");
-       }
-
-       /*
-        * Do runtime check as we allow pass1 compiled code to run on
-        * pass2 chips.
-        */
-       if (cvmx_octeon_is_pass1()) {
-               union cvmx_fpa_fpfx_marks marks;
-               int i;
-               for (i = 1; i < 8; i++) {
-                       marks.u64 =
-                           cvmx_read_csr(CVMX_FPA_FPF1_MARKS + (i - 1) * 8ull);
-                       marks.s.fpf_wr = 0xe0;
-                       cvmx_write_csr(CVMX_FPA_FPF1_MARKS + (i - 1) * 8ull,
-                                      marks.u64);
-               }
-
-               /* Enforce a 10 cycle delay between config and enable */
-               cvmx_wait(10);
-       }
-
-       /* FIXME: CVMX_FPA_CTL_STATUS read is unmodelled */
-       status.u64 = 0;
-       status.s.enb = 1;
-       cvmx_write_csr(CVMX_FPA_CTL_STATUS, status.u64);
-}
-
-/**
- * Get a new block from the FPA
- *
- * @pool:   Pool to get the block from
- * Returns Pointer to the block or NULL on failure
- */
-static inline void *cvmx_fpa_alloc(uint64_t pool)
-{
-       uint64_t address =
-           cvmx_read_csr(CVMX_ADDR_DID(CVMX_FULL_DID(CVMX_OCT_DID_FPA, pool)));
-       if (address)
-               return cvmx_phys_to_ptr(address);
-       else
-               return NULL;
-}
-
-/**
- * Asynchronously get a new block from the FPA
- *
- * @scr_addr: Local scratch address to put response in.  This is a byte address,
- *                  but must be 8 byte aligned.
- * @pool:      Pool to get the block from
- */
-static inline void cvmx_fpa_async_alloc(uint64_t scr_addr, uint64_t pool)
-{
-       cvmx_fpa_iobdma_data_t data;
-
-       /*
-        * Hardware only uses 64 bit aligned locations, so convert
-        * from byte address to 64-bit index
-        */
-       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_send_single(data.u64);
-}
-
-/**
- * Free a block allocated with a FPA pool.  Does NOT provide memory
- * ordering in cases where the memory block was modified by the core.
- *
- * @ptr:    Block to free
- * @pool:   Pool to put it in
- * @num_cache_lines:
- *               Cache lines to invalidate
- */
-static inline void cvmx_fpa_free_nosync(void *ptr, uint64_t pool,
-                                       uint64_t 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 */
-       barrier();
-       /* value written is number of cache lines not written back */
-       cvmx_write_io(newptr.u64, num_cache_lines);
-}
-
-/**
- * Free a block allocated with a FPA pool.  Provides required memory
- * ordering in cases where memory block was modified by core.
- *
- * @ptr:    Block to free
- * @pool:   Pool to put it in
- * @num_cache_lines:
- *               Cache lines to invalidate
- */
-static inline void cvmx_fpa_free(void *ptr, uint64_t pool,
-                                uint64_t 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);
-}
-
-/**
- * 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.
- *
- * @pool:       Pool to initialize
- *                   0 <= pool < 8
- * @name:       Constant character string to name this pool.
- *                   String is not copied.
- * @buffer:     Pointer to the block of memory to use. This must be
- *                   accessible by all processors and external hardware.
- * @block_size: Size for each block controlled by the FPA
- * @num_blocks: Number of blocks
- *
- * Returns 0 on Success,
- *         -1 on failure
- */
-extern int cvmx_fpa_setup_pool(uint64_t pool, const char *name, void *buffer,
-                              uint64_t block_size, uint64_t num_blocks);
-
-/**
- * Shutdown a Memory pool and validate that it had all of
- * the buffers originally placed in it. This should only be
- * called by one processor after all hardware has finished
- * using the pool.
- *
- * @pool:   Pool to shutdown
- * Returns Zero on success
- *         - Positive is count of missing buffers
- *         - Negative is too many buffers or corrupted pointers
- */
-extern uint64_t cvmx_fpa_shutdown_pool(uint64_t pool);
-
-/**
- * Get the size of blocks controlled by the pool
- * This is resolved to a constant at compile time.
- *
- * @pool:   Pool to access
- * Returns Size of the block in bytes
- */
-uint64_t cvmx_fpa_get_block_size(uint64_t pool);
-
-#endif /*  __CVM_FPA_H__ */
diff --git a/drivers/staging/octeon/cvmx-gmxx-defs.h b/drivers/staging/octeon/cvmx-gmxx-defs.h
deleted file mode 100644 (file)
index 946a43a..0000000
+++ /dev/null
@@ -1,2529 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-#ifndef __CVMX_GMXX_DEFS_H__
-#define __CVMX_GMXX_DEFS_H__
-
-#define CVMX_GMXX_BAD_REG(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000518ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_BIST(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000400ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_CLK_EN(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080007F0ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_HG2_CONTROL(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000550ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_INF_MODE(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080007F8ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_NXA_ADR(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000510ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_PRTX_CBFC_CTL(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000580ull + (((offset) & 0) * 8) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_PRTX_CFG(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000010ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_ADR_CAM0(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000180ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_ADR_CAM1(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000188ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_ADR_CAM2(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000190ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_ADR_CAM3(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000198ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_ADR_CAM4(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080001A0ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_ADR_CAM5(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080001A8ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_ADR_CAM_EN(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000108ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_ADR_CTL(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000100ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_DECISION(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000040ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_FRM_CHK(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000020ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_FRM_CTL(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000018ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_FRM_MAX(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000030ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_FRM_MIN(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000028ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_IFG(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000058ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_INT_EN(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000008ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_INT_REG(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000000ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_JABBER(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000038ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_PAUSE_DROP_TIME(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000068ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_RX_INBND(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000060ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_STATS_CTL(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000050ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_STATS_OCTS(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000088ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_STATS_OCTS_CTL(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000098ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_STATS_OCTS_DMAC(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080000A8ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_STATS_OCTS_DRP(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080000B8ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_STATS_PKTS(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000080ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_STATS_PKTS_BAD(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080000C0ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_STATS_PKTS_CTL(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000090ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_STATS_PKTS_DMAC(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080000A0ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_STATS_PKTS_DRP(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080000B0ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RXX_UDD_SKP(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000048ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RX_BP_DROPX(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000420ull + (((offset) & 3) * 8) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RX_BP_OFFX(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000460ull + (((offset) & 3) * 8) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RX_BP_ONX(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000440ull + (((offset) & 3) * 8) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RX_HG2_STATUS(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000548ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RX_PASS_EN(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080005F8ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RX_PASS_MAPX(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000600ull + (((offset) & 15) * 8) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RX_PRTS(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000410ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RX_PRT_INFO(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080004E8ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RX_TX_STATUS(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080007E8ull + (((block_id) & 0) * 0x8000000ull))
-#define CVMX_GMXX_RX_XAUI_BAD_COL(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000538ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_RX_XAUI_CTL(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000530ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_SMACX(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000230ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_STAT_BP(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000520ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_APPEND(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000218ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_BURST(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000228ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_CBFC_XOFF(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080005A0ull + (((offset) & 0) * 8) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_CBFC_XON(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080005C0ull + (((offset) & 0) * 8) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_CLK(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000208ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_CTL(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000270ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_MIN_PKT(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000240ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_PAUSE_PKT_INTERVAL(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000248ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_PAUSE_PKT_TIME(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000238ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_PAUSE_TOGO(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000258ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_PAUSE_ZERO(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000260ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_SGMII_CTL(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000300ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_SLOT(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000220ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_SOFT_PAUSE(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000250ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_STAT0(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000280ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_STAT1(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000288ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_STAT2(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000290ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_STAT3(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000298ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_STAT4(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080002A0ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_STAT5(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080002A8ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_STAT6(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080002B0ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_STAT7(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080002B8ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_STAT8(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080002C0ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_STAT9(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080002C8ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_STATS_CTL(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000268ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TXX_THRESH(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000210ull + (((offset) & 3) * 2048) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TX_BP(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080004D0ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TX_CLK_MSKX(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000780ull + (((offset) & 1) * 8) + (((block_id) & 0) * 0x0ull))
-#define CVMX_GMXX_TX_COL_ATTEMPT(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000498ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TX_CORRUPT(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080004D8ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TX_HG2_REG1(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000558ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TX_HG2_REG2(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000560ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TX_IFG(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000488ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TX_INT_EN(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000508ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TX_INT_REG(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000500ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TX_JAM(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000490ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TX_LFSR(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080004F8ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TX_OVR_BP(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080004C8ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TX_PAUSE_PKT_DMAC(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080004A0ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TX_PAUSE_PKT_TYPE(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080004A8ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TX_PRTS(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000480ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TX_SPI_CTL(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080004C0ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TX_SPI_DRAIN(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080004E0ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TX_SPI_MAX(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080004B0ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TX_SPI_ROUNDX(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000680ull + (((offset) & 31) * 8) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TX_SPI_THRESH(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800080004B8ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_TX_XAUI_CTL(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000528ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_GMXX_XAUI_EXT_LOOPBACK(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180008000540ull + (((block_id) & 1) * 0x8000000ull))
-
-union cvmx_gmxx_bad_reg {
-       uint64_t u64;
-       struct cvmx_gmxx_bad_reg_s {
-               uint64_t reserved_31_63:33;
-               uint64_t inb_nxa:4;
-               uint64_t statovr:1;
-               uint64_t loststat:4;
-               uint64_t reserved_18_21:4;
-               uint64_t out_ovr:16;
-               uint64_t ncb_ovr:1;
-               uint64_t out_col:1;
-       } s;
-       struct cvmx_gmxx_bad_reg_cn30xx {
-               uint64_t reserved_31_63:33;
-               uint64_t inb_nxa:4;
-               uint64_t statovr:1;
-               uint64_t reserved_25_25:1;
-               uint64_t loststat:3;
-               uint64_t reserved_5_21:17;
-               uint64_t out_ovr:3;
-               uint64_t 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 {
-               uint64_t reserved_31_63:33;
-               uint64_t inb_nxa:4;
-               uint64_t statovr:1;
-               uint64_t loststat:4;
-               uint64_t reserved_6_21:16;
-               uint64_t out_ovr:4;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_bist {
-       uint64_t u64;
-       struct cvmx_gmxx_bist_s {
-               uint64_t reserved_17_63:47;
-               uint64_t status:17;
-       } s;
-       struct cvmx_gmxx_bist_cn30xx {
-               uint64_t reserved_10_63:54;
-               uint64_t 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 {
-               uint64_t reserved_12_63:52;
-               uint64_t status:12;
-       } cn50xx;
-       struct cvmx_gmxx_bist_cn52xx {
-               uint64_t reserved_16_63:48;
-               uint64_t 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_s cn58xx;
-       struct cvmx_gmxx_bist_s cn58xxp1;
-};
-
-union cvmx_gmxx_clk_en {
-       uint64_t u64;
-       struct cvmx_gmxx_clk_en_s {
-               uint64_t reserved_1_63:63;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_hg2_control {
-       uint64_t u64;
-       struct cvmx_gmxx_hg2_control_s {
-               uint64_t reserved_19_63:45;
-               uint64_t hg2tx_en:1;
-               uint64_t hg2rx_en:1;
-               uint64_t phys_en:1;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_inf_mode {
-       uint64_t u64;
-       struct cvmx_gmxx_inf_mode_s {
-               uint64_t reserved_10_63:54;
-               uint64_t speed:2;
-               uint64_t reserved_6_7:2;
-               uint64_t mode:2;
-               uint64_t reserved_3_3:1;
-               uint64_t p0mii:1;
-               uint64_t en:1;
-               uint64_t type:1;
-       } s;
-       struct cvmx_gmxx_inf_mode_cn30xx {
-               uint64_t reserved_3_63:61;
-               uint64_t p0mii:1;
-               uint64_t en:1;
-               uint64_t type:1;
-       } cn30xx;
-       struct cvmx_gmxx_inf_mode_cn31xx {
-               uint64_t reserved_2_63:62;
-               uint64_t en:1;
-               uint64_t 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 {
-               uint64_t reserved_10_63:54;
-               uint64_t speed:2;
-               uint64_t reserved_6_7:2;
-               uint64_t mode:2;
-               uint64_t reserved_2_3:2;
-               uint64_t en:1;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_nxa_adr {
-       uint64_t u64;
-       struct cvmx_gmxx_nxa_adr_s {
-               uint64_t reserved_6_63:58;
-               uint64_t prt:6;
-       } s;
-       struct cvmx_gmxx_nxa_adr_s cn30xx;
-       struct cvmx_gmxx_nxa_adr_s cn31xx;
-       struct cvmx_gmxx_nxa_adr_s cn38xx;
-       struct cvmx_gmxx_nxa_adr_s cn38xxp2;
-       struct cvmx_gmxx_nxa_adr_s cn50xx;
-       struct cvmx_gmxx_nxa_adr_s cn52xx;
-       struct cvmx_gmxx_nxa_adr_s cn52xxp1;
-       struct cvmx_gmxx_nxa_adr_s cn56xx;
-       struct cvmx_gmxx_nxa_adr_s cn56xxp1;
-       struct cvmx_gmxx_nxa_adr_s cn58xx;
-       struct cvmx_gmxx_nxa_adr_s cn58xxp1;
-};
-
-union cvmx_gmxx_prtx_cbfc_ctl {
-       uint64_t u64;
-       struct cvmx_gmxx_prtx_cbfc_ctl_s {
-               uint64_t phys_en:16;
-               uint64_t logl_en:16;
-               uint64_t phys_bp:16;
-               uint64_t reserved_4_15:12;
-               uint64_t bck_en:1;
-               uint64_t drp_en:1;
-               uint64_t tx_en:1;
-               uint64_t rx_en:1;
-       } s;
-       struct cvmx_gmxx_prtx_cbfc_ctl_s cn52xx;
-       struct cvmx_gmxx_prtx_cbfc_ctl_s cn56xx;
-};
-
-union cvmx_gmxx_prtx_cfg {
-       uint64_t u64;
-       struct cvmx_gmxx_prtx_cfg_s {
-               uint64_t reserved_14_63:50;
-               uint64_t tx_idle:1;
-               uint64_t rx_idle:1;
-               uint64_t reserved_9_11:3;
-               uint64_t speed_msb:1;
-               uint64_t reserved_4_7:4;
-               uint64_t slottime:1;
-               uint64_t duplex:1;
-               uint64_t speed:1;
-               uint64_t en:1;
-       } s;
-       struct cvmx_gmxx_prtx_cfg_cn30xx {
-               uint64_t reserved_4_63:60;
-               uint64_t slottime:1;
-               uint64_t duplex:1;
-               uint64_t speed:1;
-               uint64_t 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_s cn52xx;
-       struct cvmx_gmxx_prtx_cfg_s cn52xxp1;
-       struct cvmx_gmxx_prtx_cfg_s cn56xx;
-       struct cvmx_gmxx_prtx_cfg_s cn56xxp1;
-       struct cvmx_gmxx_prtx_cfg_cn30xx cn58xx;
-       struct cvmx_gmxx_prtx_cfg_cn30xx cn58xxp1;
-};
-
-union cvmx_gmxx_rxx_adr_cam0 {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_adr_cam0_s {
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_adr_cam1 {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_adr_cam1_s {
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_adr_cam2 {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_adr_cam2_s {
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_adr_cam3 {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_adr_cam3_s {
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_adr_cam4 {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_adr_cam4_s {
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_adr_cam5 {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_adr_cam5_s {
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_adr_cam_en {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_adr_cam_en_s {
-               uint64_t reserved_8_63:56;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_adr_ctl {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_adr_ctl_s {
-               uint64_t reserved_4_63:60;
-               uint64_t cam_mode:1;
-               uint64_t mcst:2;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_decision {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_decision_s {
-               uint64_t reserved_5_63:59;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_frm_chk {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_frm_chk_s {
-               uint64_t reserved_10_63:54;
-               uint64_t niberr:1;
-               uint64_t skperr:1;
-               uint64_t rcverr:1;
-               uint64_t lenerr:1;
-               uint64_t alnerr:1;
-               uint64_t fcserr:1;
-               uint64_t jabber:1;
-               uint64_t maxerr:1;
-               uint64_t carext:1;
-               uint64_t 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 {
-               uint64_t reserved_10_63:54;
-               uint64_t niberr:1;
-               uint64_t skperr:1;
-               uint64_t rcverr:1;
-               uint64_t reserved_6_6:1;
-               uint64_t alnerr:1;
-               uint64_t fcserr:1;
-               uint64_t jabber:1;
-               uint64_t reserved_2_2:1;
-               uint64_t carext:1;
-               uint64_t reserved_0_0:1;
-       } cn50xx;
-       struct cvmx_gmxx_rxx_frm_chk_cn52xx {
-               uint64_t reserved_9_63:55;
-               uint64_t skperr:1;
-               uint64_t rcverr:1;
-               uint64_t reserved_5_6:2;
-               uint64_t fcserr:1;
-               uint64_t jabber:1;
-               uint64_t reserved_2_2:1;
-               uint64_t carext:1;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_frm_ctl {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_frm_ctl_s {
-               uint64_t reserved_11_63:53;
-               uint64_t null_dis:1;
-               uint64_t pre_align:1;
-               uint64_t pad_len:1;
-               uint64_t vlan_len:1;
-               uint64_t pre_free:1;
-               uint64_t ctl_smac:1;
-               uint64_t ctl_mcst:1;
-               uint64_t ctl_bck:1;
-               uint64_t ctl_drp:1;
-               uint64_t pre_strp:1;
-               uint64_t pre_chk:1;
-       } s;
-       struct cvmx_gmxx_rxx_frm_ctl_cn30xx {
-               uint64_t reserved_9_63:55;
-               uint64_t pad_len:1;
-               uint64_t vlan_len:1;
-               uint64_t pre_free:1;
-               uint64_t ctl_smac:1;
-               uint64_t ctl_mcst:1;
-               uint64_t ctl_bck:1;
-               uint64_t ctl_drp:1;
-               uint64_t pre_strp:1;
-               uint64_t pre_chk:1;
-       } cn30xx;
-       struct cvmx_gmxx_rxx_frm_ctl_cn31xx {
-               uint64_t reserved_8_63:56;
-               uint64_t vlan_len:1;
-               uint64_t pre_free:1;
-               uint64_t ctl_smac:1;
-               uint64_t ctl_mcst:1;
-               uint64_t ctl_bck:1;
-               uint64_t ctl_drp:1;
-               uint64_t pre_strp:1;
-               uint64_t 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 {
-               uint64_t reserved_11_63:53;
-               uint64_t null_dis:1;
-               uint64_t pre_align:1;
-               uint64_t reserved_7_8:2;
-               uint64_t pre_free:1;
-               uint64_t ctl_smac:1;
-               uint64_t ctl_mcst:1;
-               uint64_t ctl_bck:1;
-               uint64_t ctl_drp:1;
-               uint64_t pre_strp:1;
-               uint64_t 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 {
-               uint64_t reserved_10_63:54;
-               uint64_t pre_align:1;
-               uint64_t reserved_7_8:2;
-               uint64_t pre_free:1;
-               uint64_t ctl_smac:1;
-               uint64_t ctl_mcst:1;
-               uint64_t ctl_bck:1;
-               uint64_t ctl_drp:1;
-               uint64_t pre_strp:1;
-               uint64_t pre_chk:1;
-       } cn56xxp1;
-       struct cvmx_gmxx_rxx_frm_ctl_s cn58xx;
-       struct cvmx_gmxx_rxx_frm_ctl_cn30xx cn58xxp1;
-};
-
-union cvmx_gmxx_rxx_frm_max {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_frm_max_s {
-               uint64_t reserved_16_63:48;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_frm_min {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_frm_min_s {
-               uint64_t reserved_16_63:48;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_ifg {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_ifg_s {
-               uint64_t reserved_4_63:60;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_int_en {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_int_en_s {
-               uint64_t reserved_29_63:35;
-               uint64_t hg2cc:1;
-               uint64_t hg2fld:1;
-               uint64_t undat:1;
-               uint64_t uneop:1;
-               uint64_t unsop:1;
-               uint64_t bad_term:1;
-               uint64_t bad_seq:1;
-               uint64_t rem_fault:1;
-               uint64_t loc_fault:1;
-               uint64_t pause_drp:1;
-               uint64_t phy_dupx:1;
-               uint64_t phy_spd:1;
-               uint64_t phy_link:1;
-               uint64_t ifgerr:1;
-               uint64_t coldet:1;
-               uint64_t falerr:1;
-               uint64_t rsverr:1;
-               uint64_t pcterr:1;
-               uint64_t ovrerr:1;
-               uint64_t niberr:1;
-               uint64_t skperr:1;
-               uint64_t rcverr:1;
-               uint64_t lenerr:1;
-               uint64_t alnerr:1;
-               uint64_t fcserr:1;
-               uint64_t jabber:1;
-               uint64_t maxerr:1;
-               uint64_t carext:1;
-               uint64_t minerr:1;
-       } s;
-       struct cvmx_gmxx_rxx_int_en_cn30xx {
-               uint64_t reserved_19_63:45;
-               uint64_t phy_dupx:1;
-               uint64_t phy_spd:1;
-               uint64_t phy_link:1;
-               uint64_t ifgerr:1;
-               uint64_t coldet:1;
-               uint64_t falerr:1;
-               uint64_t rsverr:1;
-               uint64_t pcterr:1;
-               uint64_t ovrerr:1;
-               uint64_t niberr:1;
-               uint64_t skperr:1;
-               uint64_t rcverr:1;
-               uint64_t lenerr:1;
-               uint64_t alnerr:1;
-               uint64_t fcserr:1;
-               uint64_t jabber:1;
-               uint64_t maxerr:1;
-               uint64_t carext:1;
-               uint64_t 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 {
-               uint64_t reserved_20_63:44;
-               uint64_t pause_drp:1;
-               uint64_t phy_dupx:1;
-               uint64_t phy_spd:1;
-               uint64_t phy_link:1;
-               uint64_t ifgerr:1;
-               uint64_t coldet:1;
-               uint64_t falerr:1;
-               uint64_t rsverr:1;
-               uint64_t pcterr:1;
-               uint64_t ovrerr:1;
-               uint64_t niberr:1;
-               uint64_t skperr:1;
-               uint64_t rcverr:1;
-               uint64_t reserved_6_6:1;
-               uint64_t alnerr:1;
-               uint64_t fcserr:1;
-               uint64_t jabber:1;
-               uint64_t reserved_2_2:1;
-               uint64_t carext:1;
-               uint64_t reserved_0_0:1;
-       } cn50xx;
-       struct cvmx_gmxx_rxx_int_en_cn52xx {
-               uint64_t reserved_29_63:35;
-               uint64_t hg2cc:1;
-               uint64_t hg2fld:1;
-               uint64_t undat:1;
-               uint64_t uneop:1;
-               uint64_t unsop:1;
-               uint64_t bad_term:1;
-               uint64_t bad_seq:1;
-               uint64_t rem_fault:1;
-               uint64_t loc_fault:1;
-               uint64_t pause_drp:1;
-               uint64_t reserved_16_18:3;
-               uint64_t ifgerr:1;
-               uint64_t coldet:1;
-               uint64_t falerr:1;
-               uint64_t rsverr:1;
-               uint64_t pcterr:1;
-               uint64_t ovrerr:1;
-               uint64_t reserved_9_9:1;
-               uint64_t skperr:1;
-               uint64_t rcverr:1;
-               uint64_t reserved_5_6:2;
-               uint64_t fcserr:1;
-               uint64_t jabber:1;
-               uint64_t reserved_2_2:1;
-               uint64_t carext:1;
-               uint64_t 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 {
-               uint64_t reserved_27_63:37;
-               uint64_t undat:1;
-               uint64_t uneop:1;
-               uint64_t unsop:1;
-               uint64_t bad_term:1;
-               uint64_t bad_seq:1;
-               uint64_t rem_fault:1;
-               uint64_t loc_fault:1;
-               uint64_t pause_drp:1;
-               uint64_t reserved_16_18:3;
-               uint64_t ifgerr:1;
-               uint64_t coldet:1;
-               uint64_t falerr:1;
-               uint64_t rsverr:1;
-               uint64_t pcterr:1;
-               uint64_t ovrerr:1;
-               uint64_t reserved_9_9:1;
-               uint64_t skperr:1;
-               uint64_t rcverr:1;
-               uint64_t reserved_5_6:2;
-               uint64_t fcserr:1;
-               uint64_t jabber:1;
-               uint64_t reserved_2_2:1;
-               uint64_t carext:1;
-               uint64_t reserved_0_0:1;
-       } cn56xxp1;
-       struct cvmx_gmxx_rxx_int_en_cn58xx {
-               uint64_t reserved_20_63:44;
-               uint64_t pause_drp:1;
-               uint64_t phy_dupx:1;
-               uint64_t phy_spd:1;
-               uint64_t phy_link:1;
-               uint64_t ifgerr:1;
-               uint64_t coldet:1;
-               uint64_t falerr:1;
-               uint64_t rsverr:1;
-               uint64_t pcterr:1;
-               uint64_t ovrerr:1;
-               uint64_t niberr:1;
-               uint64_t skperr:1;
-               uint64_t rcverr:1;
-               uint64_t lenerr:1;
-               uint64_t alnerr:1;
-               uint64_t fcserr:1;
-               uint64_t jabber:1;
-               uint64_t maxerr:1;
-               uint64_t carext:1;
-               uint64_t minerr:1;
-       } cn58xx;
-       struct cvmx_gmxx_rxx_int_en_cn58xx cn58xxp1;
-};
-
-union cvmx_gmxx_rxx_int_reg {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_int_reg_s {
-               uint64_t reserved_29_63:35;
-               uint64_t hg2cc:1;
-               uint64_t hg2fld:1;
-               uint64_t undat:1;
-               uint64_t uneop:1;
-               uint64_t unsop:1;
-               uint64_t bad_term:1;
-               uint64_t bad_seq:1;
-               uint64_t rem_fault:1;
-               uint64_t loc_fault:1;
-               uint64_t pause_drp:1;
-               uint64_t phy_dupx:1;
-               uint64_t phy_spd:1;
-               uint64_t phy_link:1;
-               uint64_t ifgerr:1;
-               uint64_t coldet:1;
-               uint64_t falerr:1;
-               uint64_t rsverr:1;
-               uint64_t pcterr:1;
-               uint64_t ovrerr:1;
-               uint64_t niberr:1;
-               uint64_t skperr:1;
-               uint64_t rcverr:1;
-               uint64_t lenerr:1;
-               uint64_t alnerr:1;
-               uint64_t fcserr:1;
-               uint64_t jabber:1;
-               uint64_t maxerr:1;
-               uint64_t carext:1;
-               uint64_t minerr:1;
-       } s;
-       struct cvmx_gmxx_rxx_int_reg_cn30xx {
-               uint64_t reserved_19_63:45;
-               uint64_t phy_dupx:1;
-               uint64_t phy_spd:1;
-               uint64_t phy_link:1;
-               uint64_t ifgerr:1;
-               uint64_t coldet:1;
-               uint64_t falerr:1;
-               uint64_t rsverr:1;
-               uint64_t pcterr:1;
-               uint64_t ovrerr:1;
-               uint64_t niberr:1;
-               uint64_t skperr:1;
-               uint64_t rcverr:1;
-               uint64_t lenerr:1;
-               uint64_t alnerr:1;
-               uint64_t fcserr:1;
-               uint64_t jabber:1;
-               uint64_t maxerr:1;
-               uint64_t carext:1;
-               uint64_t 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 {
-               uint64_t reserved_20_63:44;
-               uint64_t pause_drp:1;
-               uint64_t phy_dupx:1;
-               uint64_t phy_spd:1;
-               uint64_t phy_link:1;
-               uint64_t ifgerr:1;
-               uint64_t coldet:1;
-               uint64_t falerr:1;
-               uint64_t rsverr:1;
-               uint64_t pcterr:1;
-               uint64_t ovrerr:1;
-               uint64_t niberr:1;
-               uint64_t skperr:1;
-               uint64_t rcverr:1;
-               uint64_t reserved_6_6:1;
-               uint64_t alnerr:1;
-               uint64_t fcserr:1;
-               uint64_t jabber:1;
-               uint64_t reserved_2_2:1;
-               uint64_t carext:1;
-               uint64_t reserved_0_0:1;
-       } cn50xx;
-       struct cvmx_gmxx_rxx_int_reg_cn52xx {
-               uint64_t reserved_29_63:35;
-               uint64_t hg2cc:1;
-               uint64_t hg2fld:1;
-               uint64_t undat:1;
-               uint64_t uneop:1;
-               uint64_t unsop:1;
-               uint64_t bad_term:1;
-               uint64_t bad_seq:1;
-               uint64_t rem_fault:1;
-               uint64_t loc_fault:1;
-               uint64_t pause_drp:1;
-               uint64_t reserved_16_18:3;
-               uint64_t ifgerr:1;
-               uint64_t coldet:1;
-               uint64_t falerr:1;
-               uint64_t rsverr:1;
-               uint64_t pcterr:1;
-               uint64_t ovrerr:1;
-               uint64_t reserved_9_9:1;
-               uint64_t skperr:1;
-               uint64_t rcverr:1;
-               uint64_t reserved_5_6:2;
-               uint64_t fcserr:1;
-               uint64_t jabber:1;
-               uint64_t reserved_2_2:1;
-               uint64_t carext:1;
-               uint64_t 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 {
-               uint64_t reserved_27_63:37;
-               uint64_t undat:1;
-               uint64_t uneop:1;
-               uint64_t unsop:1;
-               uint64_t bad_term:1;
-               uint64_t bad_seq:1;
-               uint64_t rem_fault:1;
-               uint64_t loc_fault:1;
-               uint64_t pause_drp:1;
-               uint64_t reserved_16_18:3;
-               uint64_t ifgerr:1;
-               uint64_t coldet:1;
-               uint64_t falerr:1;
-               uint64_t rsverr:1;
-               uint64_t pcterr:1;
-               uint64_t ovrerr:1;
-               uint64_t reserved_9_9:1;
-               uint64_t skperr:1;
-               uint64_t rcverr:1;
-               uint64_t reserved_5_6:2;
-               uint64_t fcserr:1;
-               uint64_t jabber:1;
-               uint64_t reserved_2_2:1;
-               uint64_t carext:1;
-               uint64_t reserved_0_0:1;
-       } cn56xxp1;
-       struct cvmx_gmxx_rxx_int_reg_cn58xx {
-               uint64_t reserved_20_63:44;
-               uint64_t pause_drp:1;
-               uint64_t phy_dupx:1;
-               uint64_t phy_spd:1;
-               uint64_t phy_link:1;
-               uint64_t ifgerr:1;
-               uint64_t coldet:1;
-               uint64_t falerr:1;
-               uint64_t rsverr:1;
-               uint64_t pcterr:1;
-               uint64_t ovrerr:1;
-               uint64_t niberr:1;
-               uint64_t skperr:1;
-               uint64_t rcverr:1;
-               uint64_t lenerr:1;
-               uint64_t alnerr:1;
-               uint64_t fcserr:1;
-               uint64_t jabber:1;
-               uint64_t maxerr:1;
-               uint64_t carext:1;
-               uint64_t minerr:1;
-       } cn58xx;
-       struct cvmx_gmxx_rxx_int_reg_cn58xx cn58xxp1;
-};
-
-union cvmx_gmxx_rxx_jabber {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_jabber_s {
-               uint64_t reserved_16_63:48;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_pause_drop_time {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_pause_drop_time_s {
-               uint64_t reserved_16_63:48;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_rx_inbnd {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_rx_inbnd_s {
-               uint64_t reserved_4_63:60;
-               uint64_t duplex:1;
-               uint64_t speed:2;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_stats_ctl {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_stats_ctl_s {
-               uint64_t reserved_1_63:63;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_stats_octs {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_stats_octs_s {
-               uint64_t reserved_48_63:16;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_stats_octs_ctl {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_stats_octs_ctl_s {
-               uint64_t reserved_48_63:16;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_stats_octs_dmac {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_stats_octs_dmac_s {
-               uint64_t reserved_48_63:16;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_stats_octs_drp {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_stats_octs_drp_s {
-               uint64_t reserved_48_63:16;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_stats_pkts {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_stats_pkts_s {
-               uint64_t reserved_32_63:32;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_stats_pkts_bad {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_stats_pkts_bad_s {
-               uint64_t reserved_32_63:32;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_stats_pkts_ctl {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_stats_pkts_ctl_s {
-               uint64_t reserved_32_63:32;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_stats_pkts_dmac {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_stats_pkts_dmac_s {
-               uint64_t reserved_32_63:32;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_stats_pkts_drp {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_stats_pkts_drp_s {
-               uint64_t reserved_32_63:32;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rxx_udd_skp {
-       uint64_t u64;
-       struct cvmx_gmxx_rxx_udd_skp_s {
-               uint64_t reserved_9_63:55;
-               uint64_t fcssel:1;
-               uint64_t reserved_7_7:1;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rx_bp_dropx {
-       uint64_t u64;
-       struct cvmx_gmxx_rx_bp_dropx_s {
-               uint64_t reserved_6_63:58;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rx_bp_offx {
-       uint64_t u64;
-       struct cvmx_gmxx_rx_bp_offx_s {
-               uint64_t reserved_6_63:58;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rx_bp_onx {
-       uint64_t u64;
-       struct cvmx_gmxx_rx_bp_onx_s {
-               uint64_t reserved_9_63:55;
-               uint64_t mark:9;
-       } s;
-       struct cvmx_gmxx_rx_bp_onx_s cn30xx;
-       struct cvmx_gmxx_rx_bp_onx_s cn31xx;
-       struct cvmx_gmxx_rx_bp_onx_s cn38xx;
-       struct cvmx_gmxx_rx_bp_onx_s cn38xxp2;
-       struct cvmx_gmxx_rx_bp_onx_s cn50xx;
-       struct cvmx_gmxx_rx_bp_onx_s cn52xx;
-       struct cvmx_gmxx_rx_bp_onx_s cn52xxp1;
-       struct cvmx_gmxx_rx_bp_onx_s cn56xx;
-       struct cvmx_gmxx_rx_bp_onx_s cn56xxp1;
-       struct cvmx_gmxx_rx_bp_onx_s cn58xx;
-       struct cvmx_gmxx_rx_bp_onx_s cn58xxp1;
-};
-
-union cvmx_gmxx_rx_hg2_status {
-       uint64_t u64;
-       struct cvmx_gmxx_rx_hg2_status_s {
-               uint64_t reserved_48_63:16;
-               uint64_t phtim2go:16;
-               uint64_t xof:16;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rx_pass_en {
-       uint64_t u64;
-       struct cvmx_gmxx_rx_pass_en_s {
-               uint64_t reserved_16_63:48;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rx_pass_mapx {
-       uint64_t u64;
-       struct cvmx_gmxx_rx_pass_mapx_s {
-               uint64_t reserved_4_63:60;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rx_prt_info {
-       uint64_t u64;
-       struct cvmx_gmxx_rx_prt_info_s {
-               uint64_t reserved_32_63:32;
-               uint64_t drop:16;
-               uint64_t commit:16;
-       } s;
-       struct cvmx_gmxx_rx_prt_info_cn30xx {
-               uint64_t reserved_19_63:45;
-               uint64_t drop:3;
-               uint64_t reserved_3_15:13;
-               uint64_t 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 {
-               uint64_t reserved_20_63:44;
-               uint64_t drop:4;
-               uint64_t reserved_4_15:12;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rx_prts {
-       uint64_t u64;
-       struct cvmx_gmxx_rx_prts_s {
-               uint64_t reserved_3_63:61;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rx_tx_status {
-       uint64_t u64;
-       struct cvmx_gmxx_rx_tx_status_s {
-               uint64_t reserved_7_63:57;
-               uint64_t tx:3;
-               uint64_t reserved_3_3:1;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rx_xaui_bad_col {
-       uint64_t u64;
-       struct cvmx_gmxx_rx_xaui_bad_col_s {
-               uint64_t reserved_40_63:24;
-               uint64_t val:1;
-               uint64_t state:3;
-               uint64_t lane_rxc:4;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_rx_xaui_ctl {
-       uint64_t u64;
-       struct cvmx_gmxx_rx_xaui_ctl_s {
-               uint64_t reserved_2_63:62;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_smacx {
-       uint64_t u64;
-       struct cvmx_gmxx_smacx_s {
-               uint64_t reserved_48_63:16;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_stat_bp {
-       uint64_t u64;
-       struct cvmx_gmxx_stat_bp_s {
-               uint64_t reserved_17_63:47;
-               uint64_t bp:1;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_append {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_append_s {
-               uint64_t reserved_4_63:60;
-               uint64_t force_fcs:1;
-               uint64_t fcs:1;
-               uint64_t pad:1;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_burst {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_burst_s {
-               uint64_t reserved_16_63:48;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_cbfc_xoff {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_cbfc_xoff_s {
-               uint64_t reserved_16_63:48;
-               uint64_t xoff:16;
-       } s;
-       struct cvmx_gmxx_txx_cbfc_xoff_s cn52xx;
-       struct cvmx_gmxx_txx_cbfc_xoff_s cn56xx;
-};
-
-union cvmx_gmxx_txx_cbfc_xon {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_cbfc_xon_s {
-               uint64_t reserved_16_63:48;
-               uint64_t xon:16;
-       } s;
-       struct cvmx_gmxx_txx_cbfc_xon_s cn52xx;
-       struct cvmx_gmxx_txx_cbfc_xon_s cn56xx;
-};
-
-union cvmx_gmxx_txx_clk {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_clk_s {
-               uint64_t reserved_6_63:58;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_ctl {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_ctl_s {
-               uint64_t reserved_2_63:62;
-               uint64_t xsdef_en:1;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_min_pkt {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_min_pkt_s {
-               uint64_t reserved_8_63:56;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_pause_pkt_interval {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_pause_pkt_interval_s {
-               uint64_t reserved_16_63:48;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_pause_pkt_time {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_pause_pkt_time_s {
-               uint64_t reserved_16_63:48;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_pause_togo {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_pause_togo_s {
-               uint64_t reserved_32_63:32;
-               uint64_t msg_time:16;
-               uint64_t time:16;
-       } s;
-       struct cvmx_gmxx_txx_pause_togo_cn30xx {
-               uint64_t reserved_16_63:48;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_pause_zero {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_pause_zero_s {
-               uint64_t reserved_1_63:63;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_sgmii_ctl {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_sgmii_ctl_s {
-               uint64_t reserved_1_63:63;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_slot {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_slot_s {
-               uint64_t reserved_10_63:54;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_soft_pause {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_soft_pause_s {
-               uint64_t reserved_16_63:48;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_stat0 {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_stat0_s {
-               uint64_t xsdef:32;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_stat1 {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_stat1_s {
-               uint64_t scol:32;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_stat2 {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_stat2_s {
-               uint64_t reserved_48_63:16;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_stat3 {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_stat3_s {
-               uint64_t reserved_32_63:32;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_stat4 {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_stat4_s {
-               uint64_t hist1:32;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_stat5 {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_stat5_s {
-               uint64_t hist3:32;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_stat6 {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_stat6_s {
-               uint64_t hist5:32;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_stat7 {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_stat7_s {
-               uint64_t hist7:32;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_stat8 {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_stat8_s {
-               uint64_t mcst:32;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_stat9 {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_stat9_s {
-               uint64_t undflw:32;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_stats_ctl {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_stats_ctl_s {
-               uint64_t reserved_1_63:63;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_txx_thresh {
-       uint64_t u64;
-       struct cvmx_gmxx_txx_thresh_s {
-               uint64_t reserved_9_63:55;
-               uint64_t cnt:9;
-       } s;
-       struct cvmx_gmxx_txx_thresh_cn30xx {
-               uint64_t reserved_7_63:57;
-               uint64_t cnt:7;
-       } cn30xx;
-       struct cvmx_gmxx_txx_thresh_cn30xx cn31xx;
-       struct cvmx_gmxx_txx_thresh_s cn38xx;
-       struct cvmx_gmxx_txx_thresh_s cn38xxp2;
-       struct cvmx_gmxx_txx_thresh_cn30xx cn50xx;
-       struct cvmx_gmxx_txx_thresh_s cn52xx;
-       struct cvmx_gmxx_txx_thresh_s cn52xxp1;
-       struct cvmx_gmxx_txx_thresh_s cn56xx;
-       struct cvmx_gmxx_txx_thresh_s cn56xxp1;
-       struct cvmx_gmxx_txx_thresh_s cn58xx;
-       struct cvmx_gmxx_txx_thresh_s cn58xxp1;
-};
-
-union cvmx_gmxx_tx_bp {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_bp_s {
-               uint64_t reserved_4_63:60;
-               uint64_t bp:4;
-       } s;
-       struct cvmx_gmxx_tx_bp_cn30xx {
-               uint64_t reserved_3_63:61;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_tx_clk_mskx {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_clk_mskx_s {
-               uint64_t reserved_1_63:63;
-               uint64_t msk:1;
-       } s;
-       struct cvmx_gmxx_tx_clk_mskx_s cn30xx;
-       struct cvmx_gmxx_tx_clk_mskx_s cn50xx;
-};
-
-union cvmx_gmxx_tx_col_attempt {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_col_attempt_s {
-               uint64_t reserved_5_63:59;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_tx_corrupt {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_corrupt_s {
-               uint64_t reserved_4_63:60;
-               uint64_t corrupt:4;
-       } s;
-       struct cvmx_gmxx_tx_corrupt_cn30xx {
-               uint64_t reserved_3_63:61;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_tx_hg2_reg1 {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_hg2_reg1_s {
-               uint64_t reserved_16_63:48;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_tx_hg2_reg2 {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_hg2_reg2_s {
-               uint64_t reserved_16_63:48;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_tx_ifg {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_ifg_s {
-               uint64_t reserved_8_63:56;
-               uint64_t ifg2:4;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_tx_int_en {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_int_en_s {
-               uint64_t reserved_20_63:44;
-               uint64_t late_col:4;
-               uint64_t xsdef:4;
-               uint64_t xscol:4;
-               uint64_t reserved_6_7:2;
-               uint64_t undflw:4;
-               uint64_t ncb_nxa:1;
-               uint64_t pko_nxa:1;
-       } s;
-       struct cvmx_gmxx_tx_int_en_cn30xx {
-               uint64_t reserved_19_63:45;
-               uint64_t late_col:3;
-               uint64_t reserved_15_15:1;
-               uint64_t xsdef:3;
-               uint64_t reserved_11_11:1;
-               uint64_t xscol:3;
-               uint64_t reserved_5_7:3;
-               uint64_t undflw:3;
-               uint64_t reserved_1_1:1;
-               uint64_t pko_nxa:1;
-       } cn30xx;
-       struct cvmx_gmxx_tx_int_en_cn31xx {
-               uint64_t reserved_15_63:49;
-               uint64_t xsdef:3;
-               uint64_t reserved_11_11:1;
-               uint64_t xscol:3;
-               uint64_t reserved_5_7:3;
-               uint64_t undflw:3;
-               uint64_t reserved_1_1:1;
-               uint64_t pko_nxa:1;
-       } cn31xx;
-       struct cvmx_gmxx_tx_int_en_s cn38xx;
-       struct cvmx_gmxx_tx_int_en_cn38xxp2 {
-               uint64_t reserved_16_63:48;
-               uint64_t xsdef:4;
-               uint64_t xscol:4;
-               uint64_t reserved_6_7:2;
-               uint64_t undflw:4;
-               uint64_t ncb_nxa:1;
-               uint64_t pko_nxa:1;
-       } cn38xxp2;
-       struct cvmx_gmxx_tx_int_en_cn30xx cn50xx;
-       struct cvmx_gmxx_tx_int_en_cn52xx {
-               uint64_t reserved_20_63:44;
-               uint64_t late_col:4;
-               uint64_t xsdef:4;
-               uint64_t xscol:4;
-               uint64_t reserved_6_7:2;
-               uint64_t undflw:4;
-               uint64_t reserved_1_1:1;
-               uint64_t 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_s cn58xx;
-       struct cvmx_gmxx_tx_int_en_s cn58xxp1;
-};
-
-union cvmx_gmxx_tx_int_reg {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_int_reg_s {
-               uint64_t reserved_20_63:44;
-               uint64_t late_col:4;
-               uint64_t xsdef:4;
-               uint64_t xscol:4;
-               uint64_t reserved_6_7:2;
-               uint64_t undflw:4;
-               uint64_t ncb_nxa:1;
-               uint64_t pko_nxa:1;
-       } s;
-       struct cvmx_gmxx_tx_int_reg_cn30xx {
-               uint64_t reserved_19_63:45;
-               uint64_t late_col:3;
-               uint64_t reserved_15_15:1;
-               uint64_t xsdef:3;
-               uint64_t reserved_11_11:1;
-               uint64_t xscol:3;
-               uint64_t reserved_5_7:3;
-               uint64_t undflw:3;
-               uint64_t reserved_1_1:1;
-               uint64_t pko_nxa:1;
-       } cn30xx;
-       struct cvmx_gmxx_tx_int_reg_cn31xx {
-               uint64_t reserved_15_63:49;
-               uint64_t xsdef:3;
-               uint64_t reserved_11_11:1;
-               uint64_t xscol:3;
-               uint64_t reserved_5_7:3;
-               uint64_t undflw:3;
-               uint64_t reserved_1_1:1;
-               uint64_t pko_nxa:1;
-       } cn31xx;
-       struct cvmx_gmxx_tx_int_reg_s cn38xx;
-       struct cvmx_gmxx_tx_int_reg_cn38xxp2 {
-               uint64_t reserved_16_63:48;
-               uint64_t xsdef:4;
-               uint64_t xscol:4;
-               uint64_t reserved_6_7:2;
-               uint64_t undflw:4;
-               uint64_t ncb_nxa:1;
-               uint64_t pko_nxa:1;
-       } cn38xxp2;
-       struct cvmx_gmxx_tx_int_reg_cn30xx cn50xx;
-       struct cvmx_gmxx_tx_int_reg_cn52xx {
-               uint64_t reserved_20_63:44;
-               uint64_t late_col:4;
-               uint64_t xsdef:4;
-               uint64_t xscol:4;
-               uint64_t reserved_6_7:2;
-               uint64_t undflw:4;
-               uint64_t reserved_1_1:1;
-               uint64_t 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_s cn58xx;
-       struct cvmx_gmxx_tx_int_reg_s cn58xxp1;
-};
-
-union cvmx_gmxx_tx_jam {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_jam_s {
-               uint64_t reserved_8_63:56;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_tx_lfsr {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_lfsr_s {
-               uint64_t reserved_16_63:48;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_tx_ovr_bp {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_ovr_bp_s {
-               uint64_t reserved_48_63:16;
-               uint64_t tx_prt_bp:16;
-               uint64_t reserved_12_31:20;
-               uint64_t en:4;
-               uint64_t bp:4;
-               uint64_t ign_full:4;
-       } s;
-       struct cvmx_gmxx_tx_ovr_bp_cn30xx {
-               uint64_t reserved_11_63:53;
-               uint64_t en:3;
-               uint64_t reserved_7_7:1;
-               uint64_t bp:3;
-               uint64_t reserved_3_3:1;
-               uint64_t ign_full:3;
-       } cn30xx;
-       struct cvmx_gmxx_tx_ovr_bp_cn30xx cn31xx;
-       struct cvmx_gmxx_tx_ovr_bp_cn38xx {
-               uint64_t reserved_12_63:52;
-               uint64_t en:4;
-               uint64_t bp:4;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_tx_pause_pkt_dmac {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_pause_pkt_dmac_s {
-               uint64_t reserved_48_63:16;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_tx_pause_pkt_type {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_pause_pkt_type_s {
-               uint64_t reserved_16_63:48;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_tx_prts {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_prts_s {
-               uint64_t reserved_5_63:59;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_tx_spi_ctl {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_spi_ctl_s {
-               uint64_t reserved_2_63:62;
-               uint64_t tpa_clr:1;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_tx_spi_drain {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_spi_drain_s {
-               uint64_t reserved_16_63:48;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_tx_spi_max {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_spi_max_s {
-               uint64_t reserved_23_63:41;
-               uint64_t slice:7;
-               uint64_t max2:8;
-               uint64_t max1:8;
-       } s;
-       struct cvmx_gmxx_tx_spi_max_cn38xx {
-               uint64_t reserved_16_63:48;
-               uint64_t max2:8;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_tx_spi_roundx {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_spi_roundx_s {
-               uint64_t reserved_16_63:48;
-               uint64_t round:16;
-       } s;
-       struct cvmx_gmxx_tx_spi_roundx_s cn58xx;
-       struct cvmx_gmxx_tx_spi_roundx_s cn58xxp1;
-};
-
-union cvmx_gmxx_tx_spi_thresh {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_spi_thresh_s {
-               uint64_t reserved_6_63:58;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_tx_xaui_ctl {
-       uint64_t u64;
-       struct cvmx_gmxx_tx_xaui_ctl_s {
-               uint64_t reserved_11_63:53;
-               uint64_t hg_pause_hgi:2;
-               uint64_t hg_en:1;
-               uint64_t reserved_7_7:1;
-               uint64_t ls_byp:1;
-               uint64_t ls:2;
-               uint64_t reserved_2_3:2;
-               uint64_t uni_en:1;
-               uint64_t 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;
-};
-
-union cvmx_gmxx_xaui_ext_loopback {
-       uint64_t u64;
-       struct cvmx_gmxx_xaui_ext_loopback_s {
-               uint64_t reserved_5_63:59;
-               uint64_t en:1;
-               uint64_t 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;
-};
-
-#endif
diff --git a/drivers/staging/octeon/cvmx-helper-board.c b/drivers/staging/octeon/cvmx-helper-board.c
deleted file mode 100644 (file)
index 57d35dc..0000000
+++ /dev/null
@@ -1,695 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- *
- * Helper functions to abstract board specific data about
- * network ports from the rest of the cvmx-helper files.
- */
-
-#include <asm/octeon/octeon.h>
-#include <asm/octeon/cvmx-bootinfo.h>
-
-#include "cvmx-config.h"
-
-#include "cvmx-mdio.h"
-
-#include "cvmx-helper.h"
-#include "cvmx-helper-util.h"
-#include "cvmx-helper-board.h"
-
-#include "cvmx-gmxx-defs.h"
-#include "cvmx-asxx-defs.h"
-
-/**
- * cvmx_override_board_link_get(int ipd_port) is a function
- * pointer. It is meant to allow customization of the process of
- * talking to a PHY to determine link speed. It is called every
- * time a PHY must be polled for link status. Users should set
- * this pointer to a function before calling any cvmx-helper
- * operations.
- */
-cvmx_helper_link_info_t(*cvmx_override_board_link_get) (int ipd_port) =
-    NULL;
-
-/**
- * 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 replies on the
- * fact that every Octeon board receives a unique board type
- * enumeration from the bootloader.
- *
- * @ipd_port: Octeon IPD port to get the MII address for.
- *
- * Returns MII PHY address and bus number or -1.
- */
-int cvmx_helper_board_get_mii_address(int ipd_port)
-{
-       switch (cvmx_sysinfo_get()->board_type) {
-       case CVMX_BOARD_TYPE_SIM:
-               /* Simulator doesn't have MII */
-               return -1;
-       case CVMX_BOARD_TYPE_EBT3000:
-       case CVMX_BOARD_TYPE_EBT5800:
-       case CVMX_BOARD_TYPE_THUNDER:
-       case CVMX_BOARD_TYPE_NICPRO2:
-               /* Interface 0 is SPI4, interface 1 is RGMII */
-               if ((ipd_port >= 16) && (ipd_port < 20))
-                       return ipd_port - 16;
-               else
-                       return -1;
-       case CVMX_BOARD_TYPE_KODAMA:
-       case CVMX_BOARD_TYPE_EBH3100:
-       case CVMX_BOARD_TYPE_HIKARI:
-       case CVMX_BOARD_TYPE_CN3010_EVB_HS5:
-       case CVMX_BOARD_TYPE_CN3005_EVB_HS5:
-       case CVMX_BOARD_TYPE_CN3020_EVB_HS5:
-               /*
-                * Port 0 is WAN connected to a PHY, Port 1 is GMII
-                * connected to a switch
-                */
-               if (ipd_port == 0)
-                       return 4;
-               else if (ipd_port == 1)
-                       return 9;
-               else
-                       return -1;
-       case CVMX_BOARD_TYPE_NAC38:
-               /* Board has 8 RGMII ports PHYs are 0-7 */
-               if ((ipd_port >= 0) && (ipd_port < 4))
-                       return ipd_port;
-               else if ((ipd_port >= 16) && (ipd_port < 20))
-                       return ipd_port - 16 + 4;
-               else
-                       return -1;
-       case CVMX_BOARD_TYPE_EBH3000:
-               /* Board has dual SPI4 and no PHYs */
-               return -1;
-       case CVMX_BOARD_TYPE_EBH5200:
-       case CVMX_BOARD_TYPE_EBH5201:
-       case CVMX_BOARD_TYPE_EBT5200:
-               /*
-                * Board has 4 SGMII ports. The PHYs start right after the MII
-                * ports MII0 = 0, MII1 = 1, SGMII = 2-5.
-                */
-               if ((ipd_port >= 0) && (ipd_port < 4))
-                       return ipd_port + 2;
-               else
-                       return -1;
-       case CVMX_BOARD_TYPE_EBH5600:
-       case CVMX_BOARD_TYPE_EBH5601:
-       case CVMX_BOARD_TYPE_EBH5610:
-               /*
-                * Board has 8 SGMII ports. 4 connect out, two connect
-                * to a switch, and 2 loop to each other
-                */
-               if ((ipd_port >= 0) && (ipd_port < 4))
-                       return ipd_port + 1;
-               else
-                       return -1;
-       case CVMX_BOARD_TYPE_CUST_NB5:
-               if (ipd_port == 2)
-                       return 4;
-               else
-                       return -1;
-       case CVMX_BOARD_TYPE_NIC_XLE_4G:
-               /* Board has 4 SGMII ports. connected QLM3(interface 1) */
-               if ((ipd_port >= 16) && (ipd_port < 20))
-                       return ipd_port - 16 + 1;
-               else
-                       return -1;
-       case CVMX_BOARD_TYPE_BBGW_REF:
-               /*
-                * No PHYs are connected to Octeon, everything is
-                * through switch.
-                */
-               return -1;
-
-       case CVMX_BOARD_TYPE_CUST_WSX16:
-               if (ipd_port >= 0 && ipd_port <= 3)
-                       return ipd_port;
-               else if (ipd_port >= 16 && ipd_port <= 19)
-                       return ipd_port - 16 + 4;
-               else
-                       return -1;
-       }
-
-       /* Some unknown board. Somebody forgot to update this function... */
-       cvmx_dprintf
-           ("cvmx_helper_board_get_mii_address: Unknown board type %d\n",
-            cvmx_sysinfo_get()->board_type);
-       return -1;
-}
-
-/**
- * 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.
- *
- * @ipd_port: IPD input port associated with the port we want to get link
- *                 status for.
- *
- * Returns 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)
-{
-       cvmx_helper_link_info_t result;
-       int phy_addr;
-       int is_broadcom_phy = 0;
-
-       /* Give the user a chance to override the processing of this function */
-       if (cvmx_override_board_link_get)
-               return cvmx_override_board_link_get(ipd_port);
-
-       /* Unless we fix it later, all links are defaulted to down */
-       result.u64 = 0;
-
-       /*
-        * This switch statement should handle all ports that either don't use
-        * Marvell PHYS, or don't support in-band status.
-        */
-       switch (cvmx_sysinfo_get()->board_type) {
-       case CVMX_BOARD_TYPE_SIM:
-               /* The simulator gives you a simulated 1Gbps full duplex link */
-               result.s.link_up = 1;
-               result.s.full_duplex = 1;
-               result.s.speed = 1000;
-               return result;
-       case CVMX_BOARD_TYPE_EBH3100:
-       case CVMX_BOARD_TYPE_CN3010_EVB_HS5:
-       case CVMX_BOARD_TYPE_CN3005_EVB_HS5:
-       case CVMX_BOARD_TYPE_CN3020_EVB_HS5:
-               /* Port 1 on these boards is always Gigabit */
-               if (ipd_port == 1) {
-                       result.s.link_up = 1;
-                       result.s.full_duplex = 1;
-                       result.s.speed = 1000;
-                       return result;
-               }
-               /* Fall through to the generic code below */
-               break;
-       case CVMX_BOARD_TYPE_CUST_NB5:
-               /* Port 1 on these boards is always Gigabit */
-               if (ipd_port == 1) {
-                       result.s.link_up = 1;
-                       result.s.full_duplex = 1;
-                       result.s.speed = 1000;
-                       return result;
-               } else          /* The other port uses a broadcom PHY */
-                       is_broadcom_phy = 1;
-               break;
-       case CVMX_BOARD_TYPE_BBGW_REF:
-               /* Port 1 on these boards is always Gigabit */
-               if (ipd_port == 2) {
-                       /* Port 2 is not hooked up */
-                       result.u64 = 0;
-                       return result;
-               } else {
-                       /* Ports 0 and 1 connect to the switch */
-                       result.s.link_up = 1;
-                       result.s.full_duplex = 1;
-                       result.s.speed = 1000;
-                       return result;
-               }
-               break;
-       }
-
-       phy_addr = cvmx_helper_board_get_mii_address(ipd_port);
-       if (phy_addr != -1) {
-               if (is_broadcom_phy) {
-                       /*
-                        * Below we are going to read SMI/MDIO
-                        * register 0x19 which works on Broadcom
-                        * parts
-                        */
-                       int phy_status =
-                           cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
-                                          0x19);
-                       switch ((phy_status >> 8) & 0x7) {
-                       case 0:
-                               result.u64 = 0;
-                               break;
-                       case 1:
-                               result.s.link_up = 1;
-                               result.s.full_duplex = 0;
-                               result.s.speed = 10;
-                               break;
-                       case 2:
-                               result.s.link_up = 1;
-                               result.s.full_duplex = 1;
-                               result.s.speed = 10;
-                               break;
-                       case 3:
-                               result.s.link_up = 1;
-                               result.s.full_duplex = 0;
-                               result.s.speed = 100;
-                               break;
-                       case 4:
-                               result.s.link_up = 1;
-                               result.s.full_duplex = 1;
-                               result.s.speed = 100;
-                               break;
-                       case 5:
-                               result.s.link_up = 1;
-                               result.s.full_duplex = 1;
-                               result.s.speed = 100;
-                               break;
-                       case 6:
-                               result.s.link_up = 1;
-                               result.s.full_duplex = 0;
-                               result.s.speed = 1000;
-                               break;
-                       case 7:
-                               result.s.link_up = 1;
-                               result.s.full_duplex = 1;
-                               result.s.speed = 1000;
-                               break;
-                       }
-               } else {
-                       /*
-                        * This code assumes we are using a Marvell
-                        * Gigabit PHY. All the speed information can
-                        * be read from register 17 in one
-                        * go. Somebody using a different PHY will
-                        * need to handle it above in the board
-                        * specific area.
-                        */
-                       int phy_status =
-                           cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff, 17);
-
-                       /*
-                        * If the resolve bit 11 isn't set, see if
-                        * autoneg is turned off (bit 12, reg 0). The
-                        * resolve bit doesn't get set properly when
-                        * autoneg is off, so force it.
-                        */
-                       if ((phy_status & (1 << 11)) == 0) {
-                               int auto_status =
-                                   cvmx_mdio_read(phy_addr >> 8,
-                                                  phy_addr & 0xff, 0);
-                               if ((auto_status & (1 << 12)) == 0)
-                                       phy_status |= 1 << 11;
-                       }
-
-                       /*
-                        * Only return a link if the PHY has finished
-                        * auto negotiation and set the resolved bit
-                        * (bit 11)
-                        */
-                       if (phy_status & (1 << 11)) {
-                               result.s.link_up = 1;
-                               result.s.full_duplex = ((phy_status >> 13) & 1);
-                               switch ((phy_status >> 14) & 3) {
-                               case 0: /* 10 Mbps */
-                                       result.s.speed = 10;
-                                       break;
-                               case 1: /* 100 Mbps */
-                                       result.s.speed = 100;
-                                       break;
-                               case 2: /* 1 Gbps */
-                                       result.s.speed = 1000;
-                                       break;
-                               case 3: /* Illegal */
-                                       result.u64 = 0;
-                                       break;
-                               }
-                       }
-               }
-       } else if (OCTEON_IS_MODEL(OCTEON_CN3XXX)
-                  || OCTEON_IS_MODEL(OCTEON_CN58XX)
-                  || OCTEON_IS_MODEL(OCTEON_CN50XX)) {
-               /*
-                * We don't have a PHY address, so attempt to use
-                * in-band status. It is really important that boards
-                * not supporting in-band status never get
-                * here. Reading broken in-band status tends to do bad
-                * things
-                */
-               union cvmx_gmxx_rxx_rx_inbnd inband_status;
-               int interface = cvmx_helper_get_interface_num(ipd_port);
-               int index = cvmx_helper_get_interface_index_num(ipd_port);
-               inband_status.u64 =
-                   cvmx_read_csr(CVMX_GMXX_RXX_RX_INBND(index, interface));
-
-               result.s.link_up = inband_status.s.status;
-               result.s.full_duplex = inband_status.s.duplex;
-               switch (inband_status.s.speed) {
-               case 0: /* 10 Mbps */
-                       result.s.speed = 10;
-                       break;
-               case 1: /* 100 Mbps */
-                       result.s.speed = 100;
-                       break;
-               case 2: /* 1 Gbps */
-                       result.s.speed = 1000;
-                       break;
-               case 3: /* Illegal */
-                       result.u64 = 0;
-                       break;
-               }
-       } else {
-               /*
-                * We don't have a PHY address and we don't have
-                * in-band status. There is no way to determine the
-                * link speed. Return down assuming this port isn't
-                * wired
-                */
-               result.u64 = 0;
-       }
-
-       /* If link is down, return all fields as zero. */
-       if (!result.s.link_up)
-               result.u64 = 0;
-
-       return result;
-}
-
-/**
- * This function as a board specific method of changing the PHY
- * speed, duplex, and auto-negotiation. This programs the PHY and
- * not Octeon. This can be used to force Octeon's links to
- * specific settings.
- *
- * @phy_addr:  The address of the PHY to program
- * @enable_autoneg:
- *                  Non zero if you want to enable auto-negotiation.
- * @link_info: Link speed to program. If the speed is zero and auto-negotiation
- *                  is enabled, all possible negotiation speeds are advertised.
- *
- * Returns 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)
-{
-
-       /* Set the flow control settings based on link_flags */
-       if ((link_flags & set_phy_link_flags_flow_control_mask) !=
-           set_phy_link_flags_flow_control_dont_touch) {
-               cvmx_mdio_phy_reg_autoneg_adver_t reg_autoneg_adver;
-               reg_autoneg_adver.u16 =
-                   cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
-                                  CVMX_MDIO_PHY_REG_AUTONEG_ADVER);
-               reg_autoneg_adver.s.asymmetric_pause =
-                   (link_flags & set_phy_link_flags_flow_control_mask) ==
-                   set_phy_link_flags_flow_control_enable;
-               reg_autoneg_adver.s.pause =
-                   (link_flags & set_phy_link_flags_flow_control_mask) ==
-                   set_phy_link_flags_flow_control_enable;
-               cvmx_mdio_write(phy_addr >> 8, phy_addr & 0xff,
-                               CVMX_MDIO_PHY_REG_AUTONEG_ADVER,
-                               reg_autoneg_adver.u16);
-       }
-
-       /* If speed isn't set and autoneg is on advertise all supported modes */
-       if ((link_flags & set_phy_link_flags_autoneg)
-           && (link_info.s.speed == 0)) {
-               cvmx_mdio_phy_reg_control_t reg_control;
-               cvmx_mdio_phy_reg_status_t reg_status;
-               cvmx_mdio_phy_reg_autoneg_adver_t reg_autoneg_adver;
-               cvmx_mdio_phy_reg_extended_status_t reg_extended_status;
-               cvmx_mdio_phy_reg_control_1000_t reg_control_1000;
-
-               reg_status.u16 =
-                   cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
-                                  CVMX_MDIO_PHY_REG_STATUS);
-               reg_autoneg_adver.u16 =
-                   cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
-                                  CVMX_MDIO_PHY_REG_AUTONEG_ADVER);
-               reg_autoneg_adver.s.advert_100base_t4 =
-                   reg_status.s.capable_100base_t4;
-               reg_autoneg_adver.s.advert_10base_tx_full =
-                   reg_status.s.capable_10_full;
-               reg_autoneg_adver.s.advert_10base_tx_half =
-                   reg_status.s.capable_10_half;
-               reg_autoneg_adver.s.advert_100base_tx_full =
-                   reg_status.s.capable_100base_x_full;
-               reg_autoneg_adver.s.advert_100base_tx_half =
-                   reg_status.s.capable_100base_x_half;
-               cvmx_mdio_write(phy_addr >> 8, phy_addr & 0xff,
-                               CVMX_MDIO_PHY_REG_AUTONEG_ADVER,
-                               reg_autoneg_adver.u16);
-               if (reg_status.s.capable_extended_status) {
-                       reg_extended_status.u16 =
-                           cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
-                                          CVMX_MDIO_PHY_REG_EXTENDED_STATUS);
-                       reg_control_1000.u16 =
-                           cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
-                                          CVMX_MDIO_PHY_REG_CONTROL_1000);
-                       reg_control_1000.s.advert_1000base_t_full =
-                           reg_extended_status.s.capable_1000base_t_full;
-                       reg_control_1000.s.advert_1000base_t_half =
-                           reg_extended_status.s.capable_1000base_t_half;
-                       cvmx_mdio_write(phy_addr >> 8, phy_addr & 0xff,
-                                       CVMX_MDIO_PHY_REG_CONTROL_1000,
-                                       reg_control_1000.u16);
-               }
-               reg_control.u16 =
-                   cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
-                                  CVMX_MDIO_PHY_REG_CONTROL);
-               reg_control.s.autoneg_enable = 1;
-               reg_control.s.restart_autoneg = 1;
-               cvmx_mdio_write(phy_addr >> 8, phy_addr & 0xff,
-                               CVMX_MDIO_PHY_REG_CONTROL, reg_control.u16);
-       } else if ((link_flags & set_phy_link_flags_autoneg)) {
-               cvmx_mdio_phy_reg_control_t reg_control;
-               cvmx_mdio_phy_reg_status_t reg_status;
-               cvmx_mdio_phy_reg_autoneg_adver_t reg_autoneg_adver;
-               cvmx_mdio_phy_reg_extended_status_t reg_extended_status;
-               cvmx_mdio_phy_reg_control_1000_t reg_control_1000;
-
-               reg_status.u16 =
-                   cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
-                                  CVMX_MDIO_PHY_REG_STATUS);
-               reg_autoneg_adver.u16 =
-                   cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
-                                  CVMX_MDIO_PHY_REG_AUTONEG_ADVER);
-               reg_autoneg_adver.s.advert_100base_t4 = 0;
-               reg_autoneg_adver.s.advert_10base_tx_full = 0;
-               reg_autoneg_adver.s.advert_10base_tx_half = 0;
-               reg_autoneg_adver.s.advert_100base_tx_full = 0;
-               reg_autoneg_adver.s.advert_100base_tx_half = 0;
-               if (reg_status.s.capable_extended_status) {
-                       reg_extended_status.u16 =
-                           cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
-                                          CVMX_MDIO_PHY_REG_EXTENDED_STATUS);
-                       reg_control_1000.u16 =
-                           cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
-                                          CVMX_MDIO_PHY_REG_CONTROL_1000);
-                       reg_control_1000.s.advert_1000base_t_full = 0;
-                       reg_control_1000.s.advert_1000base_t_half = 0;
-               }
-               switch (link_info.s.speed) {
-               case 10:
-                       reg_autoneg_adver.s.advert_10base_tx_full =
-                           link_info.s.full_duplex;
-                       reg_autoneg_adver.s.advert_10base_tx_half =
-                           !link_info.s.full_duplex;
-                       break;
-               case 100:
-                       reg_autoneg_adver.s.advert_100base_tx_full =
-                           link_info.s.full_duplex;
-                       reg_autoneg_adver.s.advert_100base_tx_half =
-                           !link_info.s.full_duplex;
-                       break;
-               case 1000:
-                       reg_control_1000.s.advert_1000base_t_full =
-                           link_info.s.full_duplex;
-                       reg_control_1000.s.advert_1000base_t_half =
-                           !link_info.s.full_duplex;
-                       break;
-               }
-               cvmx_mdio_write(phy_addr >> 8, phy_addr & 0xff,
-                               CVMX_MDIO_PHY_REG_AUTONEG_ADVER,
-                               reg_autoneg_adver.u16);
-               if (reg_status.s.capable_extended_status)
-                       cvmx_mdio_write(phy_addr >> 8, phy_addr & 0xff,
-                                       CVMX_MDIO_PHY_REG_CONTROL_1000,
-                                       reg_control_1000.u16);
-               reg_control.u16 =
-                   cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
-                                  CVMX_MDIO_PHY_REG_CONTROL);
-               reg_control.s.autoneg_enable = 1;
-               reg_control.s.restart_autoneg = 1;
-               cvmx_mdio_write(phy_addr >> 8, phy_addr & 0xff,
-                               CVMX_MDIO_PHY_REG_CONTROL, reg_control.u16);
-       } else {
-               cvmx_mdio_phy_reg_control_t reg_control;
-               reg_control.u16 =
-                   cvmx_mdio_read(phy_addr >> 8, phy_addr & 0xff,
-                                  CVMX_MDIO_PHY_REG_CONTROL);
-               reg_control.s.autoneg_enable = 0;
-               reg_control.s.restart_autoneg = 1;
-               reg_control.s.duplex = link_info.s.full_duplex;
-               if (link_info.s.speed == 1000) {
-                       reg_control.s.speed_msb = 1;
-                       reg_control.s.speed_lsb = 0;
-               } else if (link_info.s.speed == 100) {
-                       reg_control.s.speed_msb = 0;
-                       reg_control.s.speed_lsb = 1;
-               } else if (link_info.s.speed == 10) {
-                       reg_control.s.speed_msb = 0;
-                       reg_control.s.speed_lsb = 0;
-               }
-               cvmx_mdio_write(phy_addr >> 8, phy_addr & 0xff,
-                               CVMX_MDIO_PHY_REG_CONTROL, reg_control.u16);
-       }
-       return 0;
-}
-
-/**
- * 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 modifed for every new Octeon board.
- * Internally it uses switch statements based on the cvmx_sysinfo
- * data to determine board types and revisions. It relys on the
- * fact that every Octeon board receives a unique board type
- * enumeration from the bootloader.
- *
- * @interface: Interface to probe
- * @supported_ports:
- *                  Number of ports Octeon supports.
- *
- * Returns 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)
-{
-       switch (cvmx_sysinfo_get()->board_type) {
-       case CVMX_BOARD_TYPE_CN3005_EVB_HS5:
-               if (interface == 0)
-                       return 2;
-               break;
-       case CVMX_BOARD_TYPE_BBGW_REF:
-               if (interface == 0)
-                       return 2;
-               break;
-       case CVMX_BOARD_TYPE_NIC_XLE_4G:
-               if (interface == 0)
-                       return 0;
-               break;
-               /* The 2nd interface on the EBH5600 is connected to the Marvel switch,
-                  which we don't support. Disable ports connected to it */
-       case CVMX_BOARD_TYPE_EBH5600:
-               if (interface == 1)
-                       return 0;
-               break;
-       }
-       return supported_ports;
-}
-
-/**
- * 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.
- *
- * @interface: Interface to enable
- *
- * Returns Zero on success, negative on failure
- */
-int __cvmx_helper_board_hardware_enable(int interface)
-{
-       if (cvmx_sysinfo_get()->board_type == CVMX_BOARD_TYPE_CN3005_EVB_HS5) {
-               if (interface == 0) {
-                       /* Different config for switch port */
-                       cvmx_write_csr(CVMX_ASXX_TX_CLK_SETX(1, interface), 0);
-                       cvmx_write_csr(CVMX_ASXX_RX_CLK_SETX(1, interface), 0);
-                       /*
-                        * Boards with gigabit WAN ports need a
-                        * different setting that is compatible with
-                        * 100 Mbit settings
-                        */
-                       cvmx_write_csr(CVMX_ASXX_TX_CLK_SETX(0, interface),
-                                      0xc);
-                       cvmx_write_csr(CVMX_ASXX_RX_CLK_SETX(0, interface),
-                                      0xc);
-               }
-       } else if (cvmx_sysinfo_get()->board_type ==
-                  CVMX_BOARD_TYPE_CN3010_EVB_HS5) {
-               /*
-                * Broadcom PHYs require differnet ASX
-                * clocks. Unfortunately many boards don't define a
-                * new board Id and simply mangle the
-                * CN3010_EVB_HS5
-                */
-               if (interface == 0) {
-                       /*
-                        * Some boards use a hacked up bootloader that
-                        * identifies them as CN3010_EVB_HS5
-                        * evaluation boards.  This leads to all kinds
-                        * of configuration problems.  Detect one
-                        * case, and print warning, while trying to do
-                        * the right thing.
-                        */
-                       int phy_addr = cvmx_helper_board_get_mii_address(0);
-                       if (phy_addr != -1) {
-                               int phy_identifier =
-                                   cvmx_mdio_read(phy_addr >> 8,
-                                                  phy_addr & 0xff, 0x2);
-                               /* Is it a Broadcom PHY? */
-                               if (phy_identifier == 0x0143) {
-                                       cvmx_dprintf("\n");
-                                       cvmx_dprintf("ERROR:\n");
-                                       cvmx_dprintf
-                                           ("ERROR: Board type is CVMX_BOARD_TYPE_CN3010_EVB_HS5, but Broadcom PHY found.\n");
-                                       cvmx_dprintf
-                                           ("ERROR: The board type is mis-configured, and software malfunctions are likely.\n");
-                                       cvmx_dprintf
-                                           ("ERROR: All boards require a unique board type to identify them.\n");
-                                       cvmx_dprintf("ERROR:\n");
-                                       cvmx_dprintf("\n");
-                                       cvmx_wait(1000000000);
-                                       cvmx_write_csr(CVMX_ASXX_RX_CLK_SETX
-                                                      (0, interface), 5);
-                                       cvmx_write_csr(CVMX_ASXX_TX_CLK_SETX
-                                                      (0, interface), 5);
-                               }
-                       }
-               }
-       }
-       return 0;
-}
diff --git a/drivers/staging/octeon/cvmx-helper-board.h b/drivers/staging/octeon/cvmx-helper-board.h
deleted file mode 100644 (file)
index b465bec..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/**
- *
- * 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__
-
-#include "cvmx-helper.h"
-
-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,        /* Mask for 2 bit wide flow control field */
-} cvmx_helper_board_set_phy_link_flags_types_t;
-
-/**
- * cvmx_override_board_link_get(int ipd_port) is a function
- * pointer. It is meant to allow customization of the process of
- * talking to a PHY to determine link speed. It is called every
- * time a PHY must be polled for link status. Users should set
- * this pointer to a function before calling any cvmx-helper
- * operations.
- */
-extern cvmx_helper_link_info_t(*cvmx_override_board_link_get) (int ipd_port);
-
-/**
- * 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 modifed for every new Octeon board.
- * Internally it uses switch statements based on the cvmx_sysinfo
- * data to determine board types and revisions. It relys on the
- * fact that every Octeon board receives a unique board type
- * enumeration from the bootloader.
- *
- * @ipd_port: Octeon IPD port to get the MII address for.
- *
- * Returns MII PHY address and bus number or -1.
- */
-extern 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.
- *
- * @phy_addr:  The address of the PHY to program
- * @link_flags:
- *                  Flags to control autonegotiation.  Bit 0 is autonegotiation
- *                  enable/disable to maintain backware compatibility.
- * @link_info: Link speed to program. If the speed is zero and autonegotiation
- *                  is enabled, all possible negotiation speeds are advertised.
- *
- * Returns 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);
-
-/**
- * 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 modifed for every new Octeon board.
- * Internally it uses switch statements based on the cvmx_sysinfo
- * data to determine board types and revisions. It relys on the
- * fact that every Octeon board receives a unique board type
- * enumeration from the bootloader.
- *
- * @ipd_port: IPD input port associated with the port we want to get link
- *                 status for.
- *
- * Returns The ports link status. If the link isn't fully resolved, this must
- *         return zero.
- */
-extern cvmx_helper_link_info_t __cvmx_helper_board_link_get(int ipd_port);
-
-/**
- * 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 modifed for every new Octeon board.
- * Internally it uses switch statements based on the cvmx_sysinfo
- * data to determine board types and revisions. It relys on the
- * fact that every Octeon board receives a unique board type
- * enumeration from the bootloader.
- *
- * @interface: Interface to probe
- * @supported_ports:
- *                  Number of ports Octeon supports.
- *
- * Returns Number of ports the actual board supports. Many times this will
- *         simple be "support_ports".
- */
-extern int __cvmx_helper_board_interface_probe(int interface,
-                                              int supported_ports);
-
-/**
- * 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.
- *
- * @interface: Interface to enable
- *
- * Returns Zero on success, negative on failure
- */
-extern int __cvmx_helper_board_hardware_enable(int interface);
-
-#endif /* __CVMX_HELPER_BOARD_H__ */
diff --git a/drivers/staging/octeon/cvmx-helper-fpa.c b/drivers/staging/octeon/cvmx-helper-fpa.c
deleted file mode 100644 (file)
index c239e5f..0000000
+++ /dev/null
@@ -1,243 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/**
- * @file
- *
- * Helper functions for FPA setup.
- *
- */
-#include "executive-config.h"
-#include "cvmx-config.h"
-#include "cvmx.h"
-#include "cvmx-bootmem.h"
-#include "cvmx-fpa.h"
-#include "cvmx-helper-fpa.h"
-
-/**
- * Allocate memory for and initialize a single FPA pool.
- *
- * @pool:    Pool to initialize
- * @buffer_size:  Size of buffers to allocate in bytes
- * @buffers: Number of buffers to put in the pool. Zero is allowed
- * @name:    String name of the pool for debugging purposes
- * Returns Zero on success, non-zero on failure
- */
-static int __cvmx_helper_initialize_fpa_pool(int pool, uint64_t buffer_size,
-                                            uint64_t buffers, const char *name)
-{
-       uint64_t current_num;
-       void *memory;
-       uint64_t align = CVMX_CACHE_LINE_SIZE;
-
-       /*
-        * Align the allocation so that power of 2 size buffers are
-        * naturally aligned.
-        */
-       while (align < buffer_size)
-               align = align << 1;
-
-       if (buffers == 0)
-               return 0;
-
-       current_num = cvmx_read_csr(CVMX_FPA_QUEX_AVAILABLE(pool));
-       if (current_num) {
-               cvmx_dprintf("Fpa pool %d(%s) already has %llu buffers. "
-                            "Skipping setup.\n",
-                    pool, name, (unsigned long long)current_num);
-               return 0;
-       }
-
-       memory = cvmx_bootmem_alloc(buffer_size * buffers, align);
-       if (memory == NULL) {
-               cvmx_dprintf("Out of memory initializing fpa pool %d(%s).\n",
-                            pool, name);
-               return -1;
-       }
-       cvmx_fpa_setup_pool(pool, name, memory, buffer_size, buffers);
-       return 0;
-}
-
-/**
- * Allocate memory and initialize the FPA pools using memory
- * from cvmx-bootmem. Specifying zero for the number of
- * buffers 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. Use cvmx_helper_initialize_fpa instead of
- * this function directly.
- *
- * @pip_pool: Should always be CVMX_FPA_PACKET_POOL
- * @pip_size: Should always be CVMX_FPA_PACKET_POOL_SIZE
- * @pip_buffers:
- *                 Number of packet buffers.
- * @wqe_pool: Should always be CVMX_FPA_WQE_POOL
- * @wqe_size: Should always be CVMX_FPA_WQE_POOL_SIZE
- * @wqe_entries:
- *                 Number of work queue entries
- * @pko_pool: Should always be CVMX_FPA_OUTPUT_BUFFER_POOL
- * @pko_size: Should always be CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE
- * @pko_buffers:
- *                 PKO Command buffers. You should at minimum have two per
- *                 each PKO queue.
- * @tim_pool: Should always be CVMX_FPA_TIMER_POOL
- * @tim_size: Should always be CVMX_FPA_TIMER_POOL_SIZE
- * @tim_buffers:
- *                 TIM ring buffer command queues. At least two per timer bucket
- *                 is recommened.
- * @dfa_pool: Should always be CVMX_FPA_DFA_POOL
- * @dfa_size: Should always be CVMX_FPA_DFA_POOL_SIZE
- * @dfa_buffers:
- *                 DFA command buffer. A relatively small (32 for example)
- *                 number should work.
- * Returns Zero on success, non-zero if out of memory
- */
-static int __cvmx_helper_initialize_fpa(int pip_pool, int pip_size,
-                                       int pip_buffers, int wqe_pool,
-                                       int wqe_size, int wqe_entries,
-                                       int pko_pool, int pko_size,
-                                       int pko_buffers, int tim_pool,
-                                       int tim_size, int tim_buffers,
-                                       int dfa_pool, int dfa_size,
-                                       int dfa_buffers)
-{
-       int status;
-
-       cvmx_fpa_enable();
-
-       if ((pip_buffers > 0) && (pip_buffers <= 64))
-               cvmx_dprintf
-                   ("Warning: %d packet buffers may not be enough for hardware"
-                    " prefetch. 65 or more is recommended.\n", pip_buffers);
-
-       if (pip_pool >= 0) {
-               status =
-                   __cvmx_helper_initialize_fpa_pool(pip_pool, pip_size,
-                                                     pip_buffers,
-                                                     "Packet Buffers");
-               if (status)
-                       return status;
-       }
-
-       if (wqe_pool >= 0) {
-               status =
-                   __cvmx_helper_initialize_fpa_pool(wqe_pool, wqe_size,
-                                                     wqe_entries,
-                                                     "Work Queue Entries");
-               if (status)
-                       return status;
-       }
-
-       if (pko_pool >= 0) {
-               status =
-                   __cvmx_helper_initialize_fpa_pool(pko_pool, pko_size,
-                                                     pko_buffers,
-                                                     "PKO Command Buffers");
-               if (status)
-                       return status;
-       }
-
-       if (tim_pool >= 0) {
-               status =
-                   __cvmx_helper_initialize_fpa_pool(tim_pool, tim_size,
-                                                     tim_buffers,
-                                                     "TIM Command Buffers");
-               if (status)
-                       return status;
-       }
-
-       if (dfa_pool >= 0) {
-               status =
-                   __cvmx_helper_initialize_fpa_pool(dfa_pool, dfa_size,
-                                                     dfa_buffers,
-                                                     "DFA Command Buffers");
-               if (status)
-                       return status;
-       }
-
-       return 0;
-}
-
-/**
- * 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.
- *
- * @packet_buffers:
- *               Number of packet buffers to allocate
- * @work_queue_entries:
- *               Number of work queue entries
- * @pko_buffers:
- *               PKO Command buffers. You should at minimum have two per
- *               each PKO queue.
- * @tim_buffers:
- *               TIM ring buffer command queues. At least two per timer bucket
- *               is recommened.
- * @dfa_buffers:
- *               DFA command buffer. A relatively small (32 for example)
- *               number should work.
- * Returns 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)
-{
-#ifndef CVMX_FPA_PACKET_POOL
-#define CVMX_FPA_PACKET_POOL -1
-#define CVMX_FPA_PACKET_POOL_SIZE 0
-#endif
-#ifndef CVMX_FPA_WQE_POOL
-#define CVMX_FPA_WQE_POOL -1
-#define CVMX_FPA_WQE_POOL_SIZE 0
-#endif
-#ifndef CVMX_FPA_OUTPUT_BUFFER_POOL
-#define CVMX_FPA_OUTPUT_BUFFER_POOL -1
-#define CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE 0
-#endif
-#ifndef CVMX_FPA_TIMER_POOL
-#define CVMX_FPA_TIMER_POOL -1
-#define CVMX_FPA_TIMER_POOL_SIZE 0
-#endif
-#ifndef CVMX_FPA_DFA_POOL
-#define CVMX_FPA_DFA_POOL -1
-#define CVMX_FPA_DFA_POOL_SIZE 0
-#endif
-       return __cvmx_helper_initialize_fpa(CVMX_FPA_PACKET_POOL,
-                                           CVMX_FPA_PACKET_POOL_SIZE,
-                                           packet_buffers, CVMX_FPA_WQE_POOL,
-                                           CVMX_FPA_WQE_POOL_SIZE,
-                                           work_queue_entries,
-                                           CVMX_FPA_OUTPUT_BUFFER_POOL,
-                                           CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE,
-                                           pko_buffers, CVMX_FPA_TIMER_POOL,
-                                           CVMX_FPA_TIMER_POOL_SIZE,
-                                           tim_buffers, CVMX_FPA_DFA_POOL,
-                                           CVMX_FPA_DFA_POOL_SIZE,
-                                           dfa_buffers);
-}
diff --git a/drivers/staging/octeon/cvmx-helper-fpa.h b/drivers/staging/octeon/cvmx-helper-fpa.h
deleted file mode 100644 (file)
index 5ff8c93..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/**
- * @file
- *
- * 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.
- *
- * @packet_buffers:
- *               Number of packet buffers to allocate
- * @work_queue_entries:
- *               Number of work queue entries
- * @pko_buffers:
- *               PKO Command buffers. You should at minimum have two per
- *               each PKO queue.
- * @tim_buffers:
- *               TIM ring buffer command queues. At least two per timer bucket
- *               is recommened.
- * @dfa_buffers:
- *               DFA command buffer. A relatively small (32 for example)
- *               number should work.
- * Returns Zero on success, non-zero if out of memory
- */
-extern int cvmx_helper_initialize_fpa(int packet_buffers,
-                                     int work_queue_entries, int pko_buffers,
-                                     int tim_buffers, int dfa_buffers);
-
-#endif /* __CVMX_HELPER_H__ */
diff --git a/drivers/staging/octeon/cvmx-helper-loop.c b/drivers/staging/octeon/cvmx-helper-loop.c
deleted file mode 100644 (file)
index 55a571a..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- * Functions for LOOP initialization, configuration,
- * and monitoring.
- */
-#include <asm/octeon/octeon.h>
-
-#include "cvmx-config.h"
-
-#include "cvmx-helper.h"
-#include "cvmx-pip-defs.h"
-
-/**
- * Probe a LOOP interface and determine the number of ports
- * connected to it. The LOOP interface should still be down
- * after this call.
- *
- * @interface: Interface to probe
- *
- * Returns Number of ports on the interface. Zero to disable.
- */
-int __cvmx_helper_loop_probe(int interface)
-{
-       union cvmx_ipd_sub_port_fcs ipd_sub_port_fcs;
-       int num_ports = 4;
-       int port;
-
-       /* We need to disable length checking so packet < 64 bytes and jumbo
-          frames don't get errors */
-       for (port = 0; port < num_ports; port++) {
-               union cvmx_pip_prt_cfgx port_cfg;
-               int ipd_port = cvmx_helper_get_ipd_port(interface, port);
-               port_cfg.u64 = cvmx_read_csr(CVMX_PIP_PRT_CFGX(ipd_port));
-               port_cfg.s.maxerr_en = 0;
-               port_cfg.s.minerr_en = 0;
-               cvmx_write_csr(CVMX_PIP_PRT_CFGX(ipd_port), port_cfg.u64);
-       }
-
-       /* Disable FCS stripping for loopback ports */
-       ipd_sub_port_fcs.u64 = cvmx_read_csr(CVMX_IPD_SUB_PORT_FCS);
-       ipd_sub_port_fcs.s.port_bit2 = 0;
-       cvmx_write_csr(CVMX_IPD_SUB_PORT_FCS, ipd_sub_port_fcs.u64);
-       return num_ports;
-}
-
-/**
- * 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.
- *
- * @interface: Interface to bring up
- *
- * Returns Zero on success, negative on failure
- */
-int __cvmx_helper_loop_enable(int interface)
-{
-       /* Do nothing. */
-       return 0;
-}
diff --git a/drivers/staging/octeon/cvmx-helper-loop.h b/drivers/staging/octeon/cvmx-helper-loop.h
deleted file mode 100644 (file)
index e646a6c..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as published by
- * the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful,
- * but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
- * See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/**
- * @file
- *
- * Functions for LOOP initialization, configuration,
- * and monitoring.
- *
- */
-#ifndef __CVMX_HELPER_LOOP_H__
-#define __CVMX_HELPER_LOOP_H__
-
-/**
- * Probe a LOOP interface and determine the number of ports
- * connected to it. The LOOP interface should still be down after
- * this call.
- *
- * @interface: Interface to probe
- *
- * Returns Number of ports on the interface. Zero to disable.
- */
-extern int __cvmx_helper_loop_probe(int interface);
-
-/**
- * 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.
- *
- * @interface: Interface to bring up
- *
- * Returns Zero on success, negative on failure
- */
-extern int __cvmx_helper_loop_enable(int interface);
-
-#endif
diff --git a/drivers/staging/octeon/cvmx-helper-npi.c b/drivers/staging/octeon/cvmx-helper-npi.c
deleted file mode 100644 (file)
index 7388a1e..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- * Functions for NPI initialization, configuration,
- * and monitoring.
- */
-#include <asm/octeon/octeon.h>
-
-#include "cvmx-config.h"
-
-#include "cvmx-helper.h"
-
-#include "cvmx-pip-defs.h"
-
-/**
- * Probe a NPI interface and determine the number of ports
- * connected to it. The NPI interface should still be down
- * after this call.
- *
- * @interface: Interface to probe
- *
- * Returns Number of ports on the interface. Zero to disable.
- */
-int __cvmx_helper_npi_probe(int interface)
-{
-#if CVMX_PKO_QUEUES_PER_PORT_PCI > 0
-       if (OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))
-               return 4;
-       else if (OCTEON_IS_MODEL(OCTEON_CN56XX)
-                && !OCTEON_IS_MODEL(OCTEON_CN56XX_PASS1_X))
-               /* The packet engines didn't exist before pass 2 */
-               return 4;
-       else if (OCTEON_IS_MODEL(OCTEON_CN52XX)
-                && !OCTEON_IS_MODEL(OCTEON_CN52XX_PASS1_X))
-               /* The packet engines didn't exist before pass 2 */
-               return 4;
-#if 0
-       /*
-        * Technically CN30XX, CN31XX, and CN50XX contain packet
-        * engines, but nobody ever uses them. Since this is the case,
-        * we disable them here.
-        */
-       else if (OCTEON_IS_MODEL(OCTEON_CN31XX)
-                || OCTEON_IS_MODEL(OCTEON_CN50XX))
-               return 2;
-       else if (OCTEON_IS_MODEL(OCTEON_CN30XX))
-               return 1;
-#endif
-#endif
-       return 0;
-}
-
-/**
- * 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.
- *
- * @interface: Interface to bring up
- *
- * Returns Zero on success, negative on failure
- */
-int __cvmx_helper_npi_enable(int interface)
-{
-       /*
-        * On CN50XX, CN52XX, and CN56XX we need to disable length
-        * checking so packet < 64 bytes and jumbo frames don't get
-        * errors.
-        */
-       if (!OCTEON_IS_MODEL(OCTEON_CN3XXX) &&
-           !OCTEON_IS_MODEL(OCTEON_CN58XX)) {
-               int num_ports = cvmx_helper_ports_on_interface(interface);
-               int port;
-               for (port = 0; port < num_ports; port++) {
-                       union cvmx_pip_prt_cfgx port_cfg;
-                       int ipd_port =
-                           cvmx_helper_get_ipd_port(interface, port);
-                       port_cfg.u64 =
-                           cvmx_read_csr(CVMX_PIP_PRT_CFGX(ipd_port));
-                       port_cfg.s.maxerr_en = 0;
-                       port_cfg.s.minerr_en = 0;
-                       cvmx_write_csr(CVMX_PIP_PRT_CFGX(ipd_port),
-                                      port_cfg.u64);
-               }
-       }
-
-       /* Enables are controlled by the remote host, so nothing to do here */
-       return 0;
-}
diff --git a/drivers/staging/octeon/cvmx-helper-npi.h b/drivers/staging/octeon/cvmx-helper-npi.h
deleted file mode 100644 (file)
index 908e7b0..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/**
- * @file
- *
- * Functions for NPI initialization, configuration,
- * and monitoring.
- *
- */
-#ifndef __CVMX_HELPER_NPI_H__
-#define __CVMX_HELPER_NPI_H__
-
-/**
- * Probe a NPI interface and determine the number of ports
- * connected to it. The NPI interface should still be down after
- * this call.
- *
- * @interface: Interface to probe
- *
- * Returns Number of ports on the interface. Zero to disable.
- */
-extern int __cvmx_helper_npi_probe(int interface);
-
-/**
- * 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.
- *
- * @interface: Interface to bring up
- *
- * Returns Zero on success, negative on failure
- */
-extern int __cvmx_helper_npi_enable(int interface);
-
-#endif
diff --git a/drivers/staging/octeon/cvmx-helper-rgmii.c b/drivers/staging/octeon/cvmx-helper-rgmii.c
deleted file mode 100644 (file)
index aa2d5d7..0000000
+++ /dev/null
@@ -1,525 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- * Functions for RGMII/GMII/MII initialization, configuration,
- * and monitoring.
- */
-#include <asm/octeon/octeon.h>
-
-#include "cvmx-config.h"
-
-
-#include "cvmx-mdio.h"
-#include "cvmx-pko.h"
-#include "cvmx-helper.h"
-#include "cvmx-helper-board.h"
-
-#include <asm/octeon/cvmx-npi-defs.h>
-#include "cvmx-gmxx-defs.h"
-#include "cvmx-asxx-defs.h"
-#include "cvmx-dbg-defs.h"
-
-void __cvmx_interrupt_gmxx_enable(int interface);
-void __cvmx_interrupt_asxx_enable(int block);
-
-/**
- * Probe RGMII ports and determine the number present
- *
- * @interface: Interface to probe
- *
- * Returns Number of RGMII/GMII/MII ports (0-4).
- */
-int __cvmx_helper_rgmii_probe(int interface)
-{
-       int num_ports = 0;
-       union cvmx_gmxx_inf_mode mode;
-       mode.u64 = cvmx_read_csr(CVMX_GMXX_INF_MODE(interface));
-
-       if (mode.s.type) {
-               if (OCTEON_IS_MODEL(OCTEON_CN38XX)
-                   || OCTEON_IS_MODEL(OCTEON_CN58XX)) {
-                       cvmx_dprintf("ERROR: RGMII initialize called in "
-                                    "SPI interface\n");
-               } else if (OCTEON_IS_MODEL(OCTEON_CN31XX)
-                          || OCTEON_IS_MODEL(OCTEON_CN30XX)
-                          || OCTEON_IS_MODEL(OCTEON_CN50XX)) {
-                       /*
-                        * On these chips "type" says we're in
-                        * GMII/MII mode. This limits us to 2 ports
-                        */
-                       num_ports = 2;
-               } else {
-                       cvmx_dprintf("ERROR: Unsupported Octeon model in %s\n",
-                                    __func__);
-               }
-       } else {
-               if (OCTEON_IS_MODEL(OCTEON_CN38XX)
-                   || OCTEON_IS_MODEL(OCTEON_CN58XX)) {
-                       num_ports = 4;
-               } else if (OCTEON_IS_MODEL(OCTEON_CN31XX)
-                          || OCTEON_IS_MODEL(OCTEON_CN30XX)
-                          || OCTEON_IS_MODEL(OCTEON_CN50XX)) {
-                       num_ports = 3;
-               } else {
-                       cvmx_dprintf("ERROR: Unsupported Octeon model in %s\n",
-                                    __func__);
-               }
-       }
-       return num_ports;
-}
-
-/**
- * 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.
- *
- * @port:   IPD port number to loop.
- */
-void cvmx_helper_rgmii_internal_loopback(int port)
-{
-       int interface = (port >> 4) & 1;
-       int index = port & 0xf;
-       uint64_t tmp;
-
-       union cvmx_gmxx_prtx_cfg gmx_cfg;
-       gmx_cfg.u64 = 0;
-       gmx_cfg.s.duplex = 1;
-       gmx_cfg.s.slottime = 1;
-       gmx_cfg.s.speed = 1;
-       cvmx_write_csr(CVMX_GMXX_TXX_CLK(index, interface), 1);
-       cvmx_write_csr(CVMX_GMXX_TXX_SLOT(index, interface), 0x200);
-       cvmx_write_csr(CVMX_GMXX_TXX_BURST(index, interface), 0x2000);
-       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
-       tmp = cvmx_read_csr(CVMX_ASXX_PRT_LOOP(interface));
-       cvmx_write_csr(CVMX_ASXX_PRT_LOOP(interface), (1 << index) | tmp);
-       tmp = cvmx_read_csr(CVMX_ASXX_TX_PRT_EN(interface));
-       cvmx_write_csr(CVMX_ASXX_TX_PRT_EN(interface), (1 << index) | tmp);
-       tmp = cvmx_read_csr(CVMX_ASXX_RX_PRT_EN(interface));
-       cvmx_write_csr(CVMX_ASXX_RX_PRT_EN(interface), (1 << index) | tmp);
-       gmx_cfg.s.en = 1;
-       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
-}
-
-/**
- * Workaround ASX setup errata with CN38XX pass1
- *
- * @interface: Interface to setup
- * @port:      Port to setup (0..3)
- * @cpu_clock_hz:
- *                  Chip frequency in Hertz
- *
- * Returns Zero on success, negative on failure
- */
-static int __cvmx_helper_errata_asx_pass1(int interface, int port,
-                                         int cpu_clock_hz)
-{
-       /* Set hi water mark as per errata GMX-4 */
-       if (cpu_clock_hz >= 325000000 && cpu_clock_hz < 375000000)
-               cvmx_write_csr(CVMX_ASXX_TX_HI_WATERX(port, interface), 12);
-       else if (cpu_clock_hz >= 375000000 && cpu_clock_hz < 437000000)
-               cvmx_write_csr(CVMX_ASXX_TX_HI_WATERX(port, interface), 11);
-       else if (cpu_clock_hz >= 437000000 && cpu_clock_hz < 550000000)
-               cvmx_write_csr(CVMX_ASXX_TX_HI_WATERX(port, interface), 10);
-       else if (cpu_clock_hz >= 550000000 && cpu_clock_hz < 687000000)
-               cvmx_write_csr(CVMX_ASXX_TX_HI_WATERX(port, interface), 9);
-       else
-               cvmx_dprintf("Illegal clock frequency (%d). "
-                       "CVMX_ASXX_TX_HI_WATERX not set\n", cpu_clock_hz);
-       return 0;
-}
-
-/**
- * Configure all of the ASX, GMX, and PKO regsiters required
- * to get RGMII to function on the supplied interface.
- *
- * @interface: PKO Interface to configure (0 or 1)
- *
- * Returns Zero on success
- */
-int __cvmx_helper_rgmii_enable(int interface)
-{
-       int num_ports = cvmx_helper_ports_on_interface(interface);
-       int port;
-       struct cvmx_sysinfo *sys_info_ptr = cvmx_sysinfo_get();
-       union cvmx_gmxx_inf_mode mode;
-       union cvmx_asxx_tx_prt_en asx_tx;
-       union cvmx_asxx_rx_prt_en asx_rx;
-
-       mode.u64 = cvmx_read_csr(CVMX_GMXX_INF_MODE(interface));
-
-       if (mode.s.en == 0)
-               return -1;
-       if ((OCTEON_IS_MODEL(OCTEON_CN38XX) ||
-            OCTEON_IS_MODEL(OCTEON_CN58XX)) && mode.s.type == 1)
-               /* Ignore SPI interfaces */
-               return -1;
-
-       /* Configure the ASX registers needed to use the RGMII ports */
-       asx_tx.u64 = 0;
-       asx_tx.s.prt_en = cvmx_build_mask(num_ports);
-       cvmx_write_csr(CVMX_ASXX_TX_PRT_EN(interface), asx_tx.u64);
-
-       asx_rx.u64 = 0;
-       asx_rx.s.prt_en = cvmx_build_mask(num_ports);
-       cvmx_write_csr(CVMX_ASXX_RX_PRT_EN(interface), asx_rx.u64);
-
-       /* Configure the GMX registers needed to use the RGMII ports */
-       for (port = 0; port < num_ports; port++) {
-               /* Setting of CVMX_GMXX_TXX_THRESH has been moved to
-                  __cvmx_helper_setup_gmx() */
-
-               if (cvmx_octeon_is_pass1())
-                       __cvmx_helper_errata_asx_pass1(interface, port,
-                                                      sys_info_ptr->
-                                                      cpu_clock_hz);
-               else {
-                       /*
-                        * Configure more flexible RGMII preamble
-                        * checking. Pass 1 doesn't support this
-                        * feature.
-                        */
-                       union cvmx_gmxx_rxx_frm_ctl frm_ctl;
-                       frm_ctl.u64 =
-                           cvmx_read_csr(CVMX_GMXX_RXX_FRM_CTL
-                                         (port, interface));
-                       /* New field, so must be compile time */
-                       frm_ctl.s.pre_free = 1;
-                       cvmx_write_csr(CVMX_GMXX_RXX_FRM_CTL(port, interface),
-                                      frm_ctl.u64);
-               }
-
-               /*
-                * Each pause frame transmitted will ask for about 10M
-                * bit times before resume.  If buffer space comes
-                * available before that time has expired, an XON
-                * pause frame (0 time) will be transmitted to restart
-                * the flow.
-                */
-               cvmx_write_csr(CVMX_GMXX_TXX_PAUSE_PKT_TIME(port, interface),
-                              20000);
-               cvmx_write_csr(CVMX_GMXX_TXX_PAUSE_PKT_INTERVAL
-                              (port, interface), 19000);
-
-               if (OCTEON_IS_MODEL(OCTEON_CN50XX)) {
-                       cvmx_write_csr(CVMX_ASXX_TX_CLK_SETX(port, interface),
-                                      16);
-                       cvmx_write_csr(CVMX_ASXX_RX_CLK_SETX(port, interface),
-                                      16);
-               } else {
-                       cvmx_write_csr(CVMX_ASXX_TX_CLK_SETX(port, interface),
-                                      24);
-                       cvmx_write_csr(CVMX_ASXX_RX_CLK_SETX(port, interface),
-                                      24);
-               }
-       }
-
-       __cvmx_helper_setup_gmx(interface, num_ports);
-
-       /* enable the ports now */
-       for (port = 0; port < num_ports; port++) {
-               union cvmx_gmxx_prtx_cfg gmx_cfg;
-               cvmx_helper_link_autoconf(cvmx_helper_get_ipd_port
-                                         (interface, port));
-               gmx_cfg.u64 =
-                   cvmx_read_csr(CVMX_GMXX_PRTX_CFG(port, interface));
-               gmx_cfg.s.en = 1;
-               cvmx_write_csr(CVMX_GMXX_PRTX_CFG(port, interface),
-                              gmx_cfg.u64);
-       }
-       __cvmx_interrupt_asxx_enable(interface);
-       __cvmx_interrupt_gmxx_enable(interface);
-
-       return 0;
-}
-
-/**
- * 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().
- *
- * @ipd_port: IPD/PKO port to query
- *
- * Returns Link state
- */
-cvmx_helper_link_info_t __cvmx_helper_rgmii_link_get(int ipd_port)
-{
-       int interface = cvmx_helper_get_interface_num(ipd_port);
-       int index = cvmx_helper_get_interface_index_num(ipd_port);
-       union cvmx_asxx_prt_loop asxx_prt_loop;
-
-       asxx_prt_loop.u64 = cvmx_read_csr(CVMX_ASXX_PRT_LOOP(interface));
-       if (asxx_prt_loop.s.int_loop & (1 << index)) {
-               /* Force 1Gbps full duplex on internal loopback */
-               cvmx_helper_link_info_t result;
-               result.u64 = 0;
-               result.s.full_duplex = 1;
-               result.s.link_up = 1;
-               result.s.speed = 1000;
-               return result;
-       } else
-               return __cvmx_helper_board_link_get(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.
- *
- * @ipd_port:  IPD/PKO port to configure
- * @link_info: The new link state
- *
- * Returns Zero on success, negative on failure
- */
-int __cvmx_helper_rgmii_link_set(int ipd_port,
-                                cvmx_helper_link_info_t link_info)
-{
-       int result = 0;
-       int interface = cvmx_helper_get_interface_num(ipd_port);
-       int index = cvmx_helper_get_interface_index_num(ipd_port);
-       union cvmx_gmxx_prtx_cfg original_gmx_cfg;
-       union cvmx_gmxx_prtx_cfg new_gmx_cfg;
-       union cvmx_pko_mem_queue_qos pko_mem_queue_qos;
-       union cvmx_pko_mem_queue_qos pko_mem_queue_qos_save[16];
-       union cvmx_gmxx_tx_ovr_bp gmx_tx_ovr_bp;
-       union cvmx_gmxx_tx_ovr_bp gmx_tx_ovr_bp_save;
-       int i;
-
-       /* Ignore speed sets in the simulator */
-       if (cvmx_sysinfo_get()->board_type == CVMX_BOARD_TYPE_SIM)
-               return 0;
-
-       /* Read the current settings so we know the current enable state */
-       original_gmx_cfg.u64 =
-           cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
-       new_gmx_cfg = original_gmx_cfg;
-
-       /* Disable the lowest level RX */
-       cvmx_write_csr(CVMX_ASXX_RX_PRT_EN(interface),
-                      cvmx_read_csr(CVMX_ASXX_RX_PRT_EN(interface)) &
-                                    ~(1 << index));
-
-       /* Disable all queues so that TX should become idle */
-       for (i = 0; i < cvmx_pko_get_num_queues(ipd_port); i++) {
-               int queue = cvmx_pko_get_base_queue(ipd_port) + i;
-               cvmx_write_csr(CVMX_PKO_REG_READ_IDX, queue);
-               pko_mem_queue_qos.u64 = cvmx_read_csr(CVMX_PKO_MEM_QUEUE_QOS);
-               pko_mem_queue_qos.s.pid = ipd_port;
-               pko_mem_queue_qos.s.qid = queue;
-               pko_mem_queue_qos_save[i] = pko_mem_queue_qos;
-               pko_mem_queue_qos.s.qos_mask = 0;
-               cvmx_write_csr(CVMX_PKO_MEM_QUEUE_QOS, pko_mem_queue_qos.u64);
-       }
-
-       /* Disable backpressure */
-       gmx_tx_ovr_bp.u64 = cvmx_read_csr(CVMX_GMXX_TX_OVR_BP(interface));
-       gmx_tx_ovr_bp_save = gmx_tx_ovr_bp;
-       gmx_tx_ovr_bp.s.bp &= ~(1 << index);
-       gmx_tx_ovr_bp.s.en |= 1 << index;
-       cvmx_write_csr(CVMX_GMXX_TX_OVR_BP(interface), gmx_tx_ovr_bp.u64);
-       cvmx_read_csr(CVMX_GMXX_TX_OVR_BP(interface));
-
-       /*
-        * Poll the GMX state machine waiting for it to become
-        * idle. Preferably we should only change speed when it is
-        * idle. If it doesn't become idle we will still do the speed
-        * change, but there is a slight chance that GMX will
-        * lockup.
-        */
-       cvmx_write_csr(CVMX_NPI_DBG_SELECT,
-                      interface * 0x800 + index * 0x100 + 0x880);
-       CVMX_WAIT_FOR_FIELD64(CVMX_DBG_DATA, union cvmx_dbg_data, data & 7,
-                       ==, 0, 10000);
-       CVMX_WAIT_FOR_FIELD64(CVMX_DBG_DATA, union cvmx_dbg_data, data & 0xf,
-                       ==, 0, 10000);
-
-       /* Disable the port before we make any changes */
-       new_gmx_cfg.s.en = 0;
-       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), new_gmx_cfg.u64);
-       cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
-
-       /* Set full/half duplex */
-       if (cvmx_octeon_is_pass1())
-               /* Half duplex is broken for 38XX Pass 1 */
-               new_gmx_cfg.s.duplex = 1;
-       else if (!link_info.s.link_up)
-               /* Force full duplex on down links */
-               new_gmx_cfg.s.duplex = 1;
-       else
-               new_gmx_cfg.s.duplex = link_info.s.full_duplex;
-
-       /* Set the link speed. Anything unknown is set to 1Gbps */
-       if (link_info.s.speed == 10) {
-               new_gmx_cfg.s.slottime = 0;
-               new_gmx_cfg.s.speed = 0;
-       } else if (link_info.s.speed == 100) {
-               new_gmx_cfg.s.slottime = 0;
-               new_gmx_cfg.s.speed = 0;
-       } else {
-               new_gmx_cfg.s.slottime = 1;
-               new_gmx_cfg.s.speed = 1;
-       }
-
-       /* Adjust the clocks */
-       if (link_info.s.speed == 10) {
-               cvmx_write_csr(CVMX_GMXX_TXX_CLK(index, interface), 50);
-               cvmx_write_csr(CVMX_GMXX_TXX_SLOT(index, interface), 0x40);
-               cvmx_write_csr(CVMX_GMXX_TXX_BURST(index, interface), 0);
-       } else if (link_info.s.speed == 100) {
-               cvmx_write_csr(CVMX_GMXX_TXX_CLK(index, interface), 5);
-               cvmx_write_csr(CVMX_GMXX_TXX_SLOT(index, interface), 0x40);
-               cvmx_write_csr(CVMX_GMXX_TXX_BURST(index, interface), 0);
-       } else {
-               cvmx_write_csr(CVMX_GMXX_TXX_CLK(index, interface), 1);
-               cvmx_write_csr(CVMX_GMXX_TXX_SLOT(index, interface), 0x200);
-               cvmx_write_csr(CVMX_GMXX_TXX_BURST(index, interface), 0x2000);
-       }
-
-       if (OCTEON_IS_MODEL(OCTEON_CN30XX) || OCTEON_IS_MODEL(OCTEON_CN50XX)) {
-               if ((link_info.s.speed == 10) || (link_info.s.speed == 100)) {
-                       union cvmx_gmxx_inf_mode mode;
-                       mode.u64 = cvmx_read_csr(CVMX_GMXX_INF_MODE(interface));
-
-       /*
-        * Port  .en  .type  .p0mii  Configuration
-        * ----  ---  -----  ------  -----------------------------------------
-        *  X      0     X      X    All links are disabled.
-        *  0      1     X      0    Port 0 is RGMII
-        *  0      1     X      1    Port 0 is MII
-        *  1      1     0      X    Ports 1 and 2 are configured as RGMII ports.
-        *  1      1     1      X    Port 1: GMII/MII; Port 2: disabled. GMII or
-        *                           MII port is selected by GMX_PRT1_CFG[SPEED].
-        */
-
-                       /* In MII mode, CLK_CNT = 1. */
-                       if (((index == 0) && (mode.s.p0mii == 1))
-                           || ((index != 0) && (mode.s.type == 1))) {
-                               cvmx_write_csr(CVMX_GMXX_TXX_CLK
-                                              (index, interface), 1);
-                       }
-               }
-       }
-
-       /* Do a read to make sure all setup stuff is complete */
-       cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
-
-       /* Save the new GMX setting without enabling the port */
-       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), new_gmx_cfg.u64);
-
-       /* Enable the lowest level RX */
-       cvmx_write_csr(CVMX_ASXX_RX_PRT_EN(interface),
-                      cvmx_read_csr(CVMX_ASXX_RX_PRT_EN(interface)) | (1 <<
-                                                                       index));
-
-       /* Re-enable the TX path */
-       for (i = 0; i < cvmx_pko_get_num_queues(ipd_port); i++) {
-               int queue = cvmx_pko_get_base_queue(ipd_port) + i;
-               cvmx_write_csr(CVMX_PKO_REG_READ_IDX, queue);
-               cvmx_write_csr(CVMX_PKO_MEM_QUEUE_QOS,
-                              pko_mem_queue_qos_save[i].u64);
-       }
-
-       /* Restore backpressure */
-       cvmx_write_csr(CVMX_GMXX_TX_OVR_BP(interface), gmx_tx_ovr_bp_save.u64);
-
-       /* Restore the GMX enable state. Port config is complete */
-       new_gmx_cfg.s.en = original_gmx_cfg.s.en;
-       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), new_gmx_cfg.u64);
-
-       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.
- *
- * @ipd_port: IPD/PKO port to loopback.
- * @enable_internal:
- *                 Non zero if you want internal loopback
- * @enable_external:
- *                 Non zero if you want external loopback
- *
- * Returns Zero on success, negative on failure.
- */
-int __cvmx_helper_rgmii_configure_loopback(int ipd_port, int enable_internal,
-                                          int enable_external)
-{
-       int interface = cvmx_helper_get_interface_num(ipd_port);
-       int index = cvmx_helper_get_interface_index_num(ipd_port);
-       int original_enable;
-       union cvmx_gmxx_prtx_cfg gmx_cfg;
-       union cvmx_asxx_prt_loop asxx_prt_loop;
-
-       /* Read the current enable state and save it */
-       gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
-       original_enable = gmx_cfg.s.en;
-       /* Force port to be disabled */
-       gmx_cfg.s.en = 0;
-       if (enable_internal) {
-               /* Force speed if we're doing internal loopback */
-               gmx_cfg.s.duplex = 1;
-               gmx_cfg.s.slottime = 1;
-               gmx_cfg.s.speed = 1;
-               cvmx_write_csr(CVMX_GMXX_TXX_CLK(index, interface), 1);
-               cvmx_write_csr(CVMX_GMXX_TXX_SLOT(index, interface), 0x200);
-               cvmx_write_csr(CVMX_GMXX_TXX_BURST(index, interface), 0x2000);
-       }
-       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
-
-       /* Set the loopback bits */
-       asxx_prt_loop.u64 = cvmx_read_csr(CVMX_ASXX_PRT_LOOP(interface));
-       if (enable_internal)
-               asxx_prt_loop.s.int_loop |= 1 << index;
-       else
-               asxx_prt_loop.s.int_loop &= ~(1 << index);
-       if (enable_external)
-               asxx_prt_loop.s.ext_loop |= 1 << index;
-       else
-               asxx_prt_loop.s.ext_loop &= ~(1 << index);
-       cvmx_write_csr(CVMX_ASXX_PRT_LOOP(interface), asxx_prt_loop.u64);
-
-       /* Force enables in internal loopback */
-       if (enable_internal) {
-               uint64_t tmp;
-               tmp = cvmx_read_csr(CVMX_ASXX_TX_PRT_EN(interface));
-               cvmx_write_csr(CVMX_ASXX_TX_PRT_EN(interface),
-                              (1 << index) | tmp);
-               tmp = cvmx_read_csr(CVMX_ASXX_RX_PRT_EN(interface));
-               cvmx_write_csr(CVMX_ASXX_RX_PRT_EN(interface),
-                              (1 << index) | tmp);
-               original_enable = 1;
-       }
-
-       /* Restore the enable state */
-       gmx_cfg.s.en = original_enable;
-       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
-       return 0;
-}
diff --git a/drivers/staging/octeon/cvmx-helper-rgmii.h b/drivers/staging/octeon/cvmx-helper-rgmii.h
deleted file mode 100644 (file)
index ea26526..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/**
- * @file
- *
- * Functions for RGMII/GMII/MII initialization, configuration,
- * and monitoring.
- *
- */
-#ifndef __CVMX_HELPER_RGMII_H__
-#define __CVMX_HELPER_RGMII_H__
-
-/**
- * Probe RGMII ports and determine the number present
- *
- * @interface: Interface to probe
- *
- * Returns Number of RGMII/GMII/MII ports (0-4).
- */
-extern int __cvmx_helper_rgmii_probe(int interface);
-
-/**
- * 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.
- *
- * @port:   IPD port number to loop.
- */
-extern void cvmx_helper_rgmii_internal_loopback(int port);
-
-/**
- * Configure all of the ASX, GMX, and PKO regsiters required
- * to get RGMII to function on the supplied interface.
- *
- * @interface: PKO Interface to configure (0 or 1)
- *
- * Returns Zero on success
- */
-extern int __cvmx_helper_rgmii_enable(int interface);
-
-/**
- * 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().
- *
- * @ipd_port: IPD/PKO port to query
- *
- * Returns Link state
- */
-extern cvmx_helper_link_info_t __cvmx_helper_rgmii_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.
- *
- * @ipd_port:  IPD/PKO port to configure
- * @link_info: The new link state
- *
- * Returns Zero on success, negative on failure
- */
-extern int __cvmx_helper_rgmii_link_set(int ipd_port,
-                                       cvmx_helper_link_info_t link_info);
-
-/**
- * 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.
- *
- * @ipd_port: IPD/PKO port to loopback.
- * @enable_internal:
- *                 Non zero if you want internal loopback
- * @enable_external:
- *                 Non zero if you want external loopback
- *
- * Returns Zero on success, negative on failure.
- */
-extern int __cvmx_helper_rgmii_configure_loopback(int ipd_port,
-                                                 int enable_internal,
-                                                 int enable_external);
-
-#endif
diff --git a/drivers/staging/octeon/cvmx-helper-sgmii.c b/drivers/staging/octeon/cvmx-helper-sgmii.c
deleted file mode 100644 (file)
index 6214e3b..0000000
+++ /dev/null
@@ -1,550 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- * Functions for SGMII initialization, configuration,
- * and monitoring.
- */
-
-#include <asm/octeon/octeon.h>
-
-#include "cvmx-config.h"
-
-#include "cvmx-mdio.h"
-#include "cvmx-helper.h"
-#include "cvmx-helper-board.h"
-
-#include "cvmx-gmxx-defs.h"
-#include "cvmx-pcsx-defs.h"
-
-void __cvmx_interrupt_gmxx_enable(int interface);
-void __cvmx_interrupt_pcsx_intx_en_reg_enable(int index, int block);
-void __cvmx_interrupt_pcsxx_int_en_reg_enable(int index);
-
-/**
- * Perform initialization required only once for an SGMII port.
- *
- * @interface: Interface to init
- * @index:     Index of prot on the interface
- *
- * Returns Zero on success, negative on failure
- */
-static int __cvmx_helper_sgmii_hardware_init_one_time(int interface, int index)
-{
-       const uint64_t clock_mhz = cvmx_sysinfo_get()->cpu_clock_hz / 1000000;
-       union cvmx_pcsx_miscx_ctl_reg pcs_misc_ctl_reg;
-       union cvmx_pcsx_linkx_timer_count_reg pcsx_linkx_timer_count_reg;
-       union cvmx_gmxx_prtx_cfg gmxx_prtx_cfg;
-
-       /* Disable GMX */
-       gmxx_prtx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
-       gmxx_prtx_cfg.s.en = 0;
-       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmxx_prtx_cfg.u64);
-
-       /*
-        * Write PCS*_LINK*_TIMER_COUNT_REG[COUNT] with the
-        * appropriate value. 1000BASE-X specifies a 10ms
-        * interval. SGMII specifies a 1.6ms interval.
-        */
-       pcs_misc_ctl_reg.u64 =
-           cvmx_read_csr(CVMX_PCSX_MISCX_CTL_REG(index, interface));
-       pcsx_linkx_timer_count_reg.u64 =
-           cvmx_read_csr(CVMX_PCSX_LINKX_TIMER_COUNT_REG(index, interface));
-       if (pcs_misc_ctl_reg.s.mode) {
-               /* 1000BASE-X */
-               pcsx_linkx_timer_count_reg.s.count =
-                   (10000ull * clock_mhz) >> 10;
-       } else {
-               /* SGMII */
-               pcsx_linkx_timer_count_reg.s.count =
-                   (1600ull * clock_mhz) >> 10;
-       }
-       cvmx_write_csr(CVMX_PCSX_LINKX_TIMER_COUNT_REG(index, interface),
-                      pcsx_linkx_timer_count_reg.u64);
-
-       /*
-        * Write the advertisement register to be used as the
-        * tx_Config_Reg<D15:D0> of the autonegotiation.  In
-        * 1000BASE-X mode, tx_Config_Reg<D15:D0> is PCS*_AN*_ADV_REG.
-        * In SGMII PHY mode, tx_Config_Reg<D15:D0> is
-        * PCS*_SGM*_AN_ADV_REG.  In SGMII MAC mode,
-        * tx_Config_Reg<D15:D0> is the fixed value 0x4001, so this
-        * step can be skipped.
-        */
-       if (pcs_misc_ctl_reg.s.mode) {
-               /* 1000BASE-X */
-               union cvmx_pcsx_anx_adv_reg pcsx_anx_adv_reg;
-               pcsx_anx_adv_reg.u64 =
-                   cvmx_read_csr(CVMX_PCSX_ANX_ADV_REG(index, interface));
-               pcsx_anx_adv_reg.s.rem_flt = 0;
-               pcsx_anx_adv_reg.s.pause = 3;
-               pcsx_anx_adv_reg.s.hfd = 1;
-               pcsx_anx_adv_reg.s.fd = 1;
-               cvmx_write_csr(CVMX_PCSX_ANX_ADV_REG(index, interface),
-                              pcsx_anx_adv_reg.u64);
-       } else {
-               union cvmx_pcsx_miscx_ctl_reg pcsx_miscx_ctl_reg;
-               pcsx_miscx_ctl_reg.u64 =
-                   cvmx_read_csr(CVMX_PCSX_MISCX_CTL_REG(index, interface));
-               if (pcsx_miscx_ctl_reg.s.mac_phy) {
-                       /* PHY Mode */
-                       union cvmx_pcsx_sgmx_an_adv_reg pcsx_sgmx_an_adv_reg;
-                       pcsx_sgmx_an_adv_reg.u64 =
-                           cvmx_read_csr(CVMX_PCSX_SGMX_AN_ADV_REG
-                                         (index, interface));
-                       pcsx_sgmx_an_adv_reg.s.link = 1;
-                       pcsx_sgmx_an_adv_reg.s.dup = 1;
-                       pcsx_sgmx_an_adv_reg.s.speed = 2;
-                       cvmx_write_csr(CVMX_PCSX_SGMX_AN_ADV_REG
-                                      (index, interface),
-                                      pcsx_sgmx_an_adv_reg.u64);
-               } else {
-                       /* MAC Mode - Nothing to do */
-               }
-       }
-       return 0;
-}
-
-/**
- * Initialize the SERTES link for the first time or after a loss
- * of link.
- *
- * @interface: Interface to init
- * @index:     Index of prot on the interface
- *
- * Returns Zero on success, negative on failure
- */
-static int __cvmx_helper_sgmii_hardware_init_link(int interface, int index)
-{
-       union cvmx_pcsx_mrx_control_reg control_reg;
-
-       /*
-        * Take PCS through a reset sequence.
-        * PCS*_MR*_CONTROL_REG[PWR_DN] should be cleared to zero.
-        * Write PCS*_MR*_CONTROL_REG[RESET]=1 (while not changing the
-        * value of the other PCS*_MR*_CONTROL_REG bits).  Read
-        * PCS*_MR*_CONTROL_REG[RESET] until it changes value to
-        * zero.
-        */
-       control_reg.u64 =
-           cvmx_read_csr(CVMX_PCSX_MRX_CONTROL_REG(index, interface));
-       if (cvmx_sysinfo_get()->board_type != CVMX_BOARD_TYPE_SIM) {
-               control_reg.s.reset = 1;
-               cvmx_write_csr(CVMX_PCSX_MRX_CONTROL_REG(index, interface),
-                              control_reg.u64);
-               if (CVMX_WAIT_FOR_FIELD64
-                   (CVMX_PCSX_MRX_CONTROL_REG(index, interface),
-                    union cvmx_pcsx_mrx_control_reg, reset, ==, 0, 10000)) {
-                       cvmx_dprintf("SGMII%d: Timeout waiting for port %d "
-                                    "to finish reset\n",
-                            interface, index);
-                       return -1;
-               }
-       }
-
-       /*
-        * Write PCS*_MR*_CONTROL_REG[RST_AN]=1 to ensure a fresh
-        * sgmii negotiation starts.
-        */
-       control_reg.s.rst_an = 1;
-       control_reg.s.an_en = 1;
-       control_reg.s.pwr_dn = 0;
-       cvmx_write_csr(CVMX_PCSX_MRX_CONTROL_REG(index, interface),
-                      control_reg.u64);
-
-       /*
-        * Wait for PCS*_MR*_STATUS_REG[AN_CPT] to be set, indicating
-        * that sgmii autonegotiation is complete. In MAC mode this
-        * isn't an ethernet link, but a link between Octeon and the
-        * PHY.
-        */
-       if ((cvmx_sysinfo_get()->board_type != CVMX_BOARD_TYPE_SIM) &&
-           CVMX_WAIT_FOR_FIELD64(CVMX_PCSX_MRX_STATUS_REG(index, interface),
-                                 union cvmx_pcsx_mrx_status_reg, an_cpt, ==, 1,
-                                 10000)) {
-               /* cvmx_dprintf("SGMII%d: Port %d link timeout\n", interface, index); */
-               return -1;
-       }
-       return 0;
-}
-
-/**
- * Configure an SGMII link to the specified speed after the SERTES
- * link is up.
- *
- * @interface: Interface to init
- * @index:     Index of prot on the interface
- * @link_info: Link state to configure
- *
- * Returns Zero on success, negative on failure
- */
-static int __cvmx_helper_sgmii_hardware_init_link_speed(int interface,
-                                                       int index,
-                                                       cvmx_helper_link_info_t
-                                                       link_info)
-{
-       int is_enabled;
-       union cvmx_gmxx_prtx_cfg gmxx_prtx_cfg;
-       union cvmx_pcsx_miscx_ctl_reg pcsx_miscx_ctl_reg;
-
-       /* Disable GMX before we make any changes. Remember the enable state */
-       gmxx_prtx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
-       is_enabled = gmxx_prtx_cfg.s.en;
-       gmxx_prtx_cfg.s.en = 0;
-       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmxx_prtx_cfg.u64);
-
-       /* Wait for GMX to be idle */
-       if (CVMX_WAIT_FOR_FIELD64
-           (CVMX_GMXX_PRTX_CFG(index, interface), union cvmx_gmxx_prtx_cfg,
-            rx_idle, ==, 1, 10000)
-           || CVMX_WAIT_FOR_FIELD64(CVMX_GMXX_PRTX_CFG(index, interface),
-                                    union cvmx_gmxx_prtx_cfg, tx_idle, ==, 1,
-                                    10000)) {
-               cvmx_dprintf
-                   ("SGMII%d: Timeout waiting for port %d to be idle\n",
-                    interface, index);
-               return -1;
-       }
-
-       /* Read GMX CFG again to make sure the disable completed */
-       gmxx_prtx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
-
-       /*
-        * Get the misc control for PCS. We will need to set the
-        * duplication amount.
-        */
-       pcsx_miscx_ctl_reg.u64 =
-           cvmx_read_csr(CVMX_PCSX_MISCX_CTL_REG(index, interface));
-
-       /*
-        * Use GMXENO to force the link down if the status we get says
-        * it should be down.
-        */
-       pcsx_miscx_ctl_reg.s.gmxeno = !link_info.s.link_up;
-
-       /* Only change the duplex setting if the link is up */
-       if (link_info.s.link_up)
-               gmxx_prtx_cfg.s.duplex = link_info.s.full_duplex;
-
-       /* Do speed based setting for GMX */
-       switch (link_info.s.speed) {
-       case 10:
-               gmxx_prtx_cfg.s.speed = 0;
-               gmxx_prtx_cfg.s.speed_msb = 1;
-               gmxx_prtx_cfg.s.slottime = 0;
-               /* Setting from GMX-603 */
-               pcsx_miscx_ctl_reg.s.samp_pt = 25;
-               cvmx_write_csr(CVMX_GMXX_TXX_SLOT(index, interface), 64);
-               cvmx_write_csr(CVMX_GMXX_TXX_BURST(index, interface), 0);
-               break;
-       case 100:
-               gmxx_prtx_cfg.s.speed = 0;
-               gmxx_prtx_cfg.s.speed_msb = 0;
-               gmxx_prtx_cfg.s.slottime = 0;
-               pcsx_miscx_ctl_reg.s.samp_pt = 0x5;
-               cvmx_write_csr(CVMX_GMXX_TXX_SLOT(index, interface), 64);
-               cvmx_write_csr(CVMX_GMXX_TXX_BURST(index, interface), 0);
-               break;
-       case 1000:
-               gmxx_prtx_cfg.s.speed = 1;
-               gmxx_prtx_cfg.s.speed_msb = 0;
-               gmxx_prtx_cfg.s.slottime = 1;
-               pcsx_miscx_ctl_reg.s.samp_pt = 1;
-               cvmx_write_csr(CVMX_GMXX_TXX_SLOT(index, interface), 512);
-               cvmx_write_csr(CVMX_GMXX_TXX_BURST(index, interface), 8192);
-               break;
-       default:
-               break;
-       }
-
-       /* Write the new misc control for PCS */
-       cvmx_write_csr(CVMX_PCSX_MISCX_CTL_REG(index, interface),
-                      pcsx_miscx_ctl_reg.u64);
-
-       /* Write the new GMX settings with the port still disabled */
-       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmxx_prtx_cfg.u64);
-
-       /* Read GMX CFG again to make sure the config completed */
-       gmxx_prtx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
-
-       /* Restore the enabled / disabled state */
-       gmxx_prtx_cfg.s.en = is_enabled;
-       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmxx_prtx_cfg.u64);
-
-       return 0;
-}
-
-/**
- * Bring up the SGMII interface to be ready for packet I/O but
- * leave I/O disabled using the GMX override. This function
- * follows the bringup documented in 10.6.3 of the manual.
- *
- * @interface: Interface to bringup
- * @num_ports: Number of ports on the interface
- *
- * Returns Zero on success, negative on failure
- */
-static int __cvmx_helper_sgmii_hardware_init(int interface, int num_ports)
-{
-       int index;
-
-       __cvmx_helper_setup_gmx(interface, num_ports);
-
-       for (index = 0; index < num_ports; index++) {
-               int ipd_port = cvmx_helper_get_ipd_port(interface, index);
-               __cvmx_helper_sgmii_hardware_init_one_time(interface, index);
-               __cvmx_helper_sgmii_link_set(ipd_port,
-                                            __cvmx_helper_sgmii_link_get
-                                            (ipd_port));
-
-       }
-
-       return 0;
-}
-
-/**
- * Probe a SGMII interface and determine the number of ports
- * connected to it. The SGMII interface should still be down after
- * this call.
- *
- * @interface: Interface to probe
- *
- * Returns Number of ports on the interface. Zero to disable.
- */
-int __cvmx_helper_sgmii_probe(int interface)
-{
-       union cvmx_gmxx_inf_mode mode;
-
-       /*
-        * Due to errata GMX-700 on CN56XXp1.x and CN52XXp1.x, the
-        * interface needs to be enabled before IPD otherwise per port
-        * backpressure may not work properly
-        */
-       mode.u64 = cvmx_read_csr(CVMX_GMXX_INF_MODE(interface));
-       mode.s.en = 1;
-       cvmx_write_csr(CVMX_GMXX_INF_MODE(interface), mode.u64);
-       return 4;
-}
-
-/**
- * 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.
- *
- * @interface: Interface to bring up
- *
- * Returns Zero on success, negative on failure
- */
-int __cvmx_helper_sgmii_enable(int interface)
-{
-       int num_ports = cvmx_helper_ports_on_interface(interface);
-       int index;
-
-       __cvmx_helper_sgmii_hardware_init(interface, num_ports);
-
-       for (index = 0; index < num_ports; index++) {
-               union cvmx_gmxx_prtx_cfg gmxx_prtx_cfg;
-               gmxx_prtx_cfg.u64 =
-                   cvmx_read_csr(CVMX_GMXX_PRTX_CFG(index, interface));
-               gmxx_prtx_cfg.s.en = 1;
-               cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface),
-                              gmxx_prtx_cfg.u64);
-               __cvmx_interrupt_pcsx_intx_en_reg_enable(index, interface);
-       }
-       __cvmx_interrupt_pcsxx_int_en_reg_enable(interface);
-       __cvmx_interrupt_gmxx_enable(interface);
-       return 0;
-}
-
-/**
- * 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().
- *
- * @ipd_port: IPD/PKO port to query
- *
- * Returns Link state
- */
-cvmx_helper_link_info_t __cvmx_helper_sgmii_link_get(int ipd_port)
-{
-       cvmx_helper_link_info_t result;
-       union cvmx_pcsx_miscx_ctl_reg pcs_misc_ctl_reg;
-       int interface = cvmx_helper_get_interface_num(ipd_port);
-       int index = cvmx_helper_get_interface_index_num(ipd_port);
-       union cvmx_pcsx_mrx_control_reg pcsx_mrx_control_reg;
-
-       result.u64 = 0;
-
-       if (cvmx_sysinfo_get()->board_type == CVMX_BOARD_TYPE_SIM) {
-               /* The simulator gives you a simulated 1Gbps full duplex link */
-               result.s.link_up = 1;
-               result.s.full_duplex = 1;
-               result.s.speed = 1000;
-               return result;
-       }
-
-       pcsx_mrx_control_reg.u64 =
-           cvmx_read_csr(CVMX_PCSX_MRX_CONTROL_REG(index, interface));
-       if (pcsx_mrx_control_reg.s.loopbck1) {
-               /* Force 1Gbps full duplex link for internal loopback */
-               result.s.link_up = 1;
-               result.s.full_duplex = 1;
-               result.s.speed = 1000;
-               return result;
-       }
-
-       pcs_misc_ctl_reg.u64 =
-           cvmx_read_csr(CVMX_PCSX_MISCX_CTL_REG(index, interface));
-       if (pcs_misc_ctl_reg.s.mode) {
-               /* 1000BASE-X */
-               /* FIXME */
-       } else {
-               union cvmx_pcsx_miscx_ctl_reg pcsx_miscx_ctl_reg;
-               pcsx_miscx_ctl_reg.u64 =
-                   cvmx_read_csr(CVMX_PCSX_MISCX_CTL_REG(index, interface));
-               if (pcsx_miscx_ctl_reg.s.mac_phy) {
-                       /* PHY Mode */
-                       union cvmx_pcsx_mrx_status_reg pcsx_mrx_status_reg;
-                       union cvmx_pcsx_anx_results_reg pcsx_anx_results_reg;
-
-                       /*
-                        * Don't bother continuing if the SERTES low
-                        * level link is down
-                        */
-                       pcsx_mrx_status_reg.u64 =
-                           cvmx_read_csr(CVMX_PCSX_MRX_STATUS_REG
-                                         (index, interface));
-                       if (pcsx_mrx_status_reg.s.lnk_st == 0) {
-                               if (__cvmx_helper_sgmii_hardware_init_link
-                                   (interface, index) != 0)
-                                       return result;
-                       }
-
-                       /* Read the autoneg results */
-                       pcsx_anx_results_reg.u64 =
-                           cvmx_read_csr(CVMX_PCSX_ANX_RESULTS_REG
-                                         (index, interface));
-                       if (pcsx_anx_results_reg.s.an_cpt) {
-                               /*
-                                * Auto negotiation is complete. Set
-                                * status accordingly.
-                                */
-                               result.s.full_duplex =
-                                   pcsx_anx_results_reg.s.dup;
-                               result.s.link_up =
-                                   pcsx_anx_results_reg.s.link_ok;
-                               switch (pcsx_anx_results_reg.s.spd) {
-                               case 0:
-                                       result.s.speed = 10;
-                                       break;
-                               case 1:
-                                       result.s.speed = 100;
-                                       break;
-                               case 2:
-                                       result.s.speed = 1000;
-                                       break;
-                               default:
-                                       result.s.speed = 0;
-                                       result.s.link_up = 0;
-                                       break;
-                               }
-                       } else {
-                               /*
-                                * Auto negotiation isn't
-                                * complete. Return link down.
-                                */
-                               result.s.speed = 0;
-                               result.s.link_up = 0;
-                       }
-               } else {        /* MAC Mode */
-
-                       result = __cvmx_helper_board_link_get(ipd_port);
-               }
-       }
-       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.
- *
- * @ipd_port:  IPD/PKO port to configure
- * @link_info: The new link state
- *
- * Returns Zero on success, negative on failure
- */
-int __cvmx_helper_sgmii_link_set(int ipd_port,
-                                cvmx_helper_link_info_t link_info)
-{
-       int interface = cvmx_helper_get_interface_num(ipd_port);
-       int index = cvmx_helper_get_interface_index_num(ipd_port);
-       __cvmx_helper_sgmii_hardware_init_link(interface, index);
-       return __cvmx_helper_sgmii_hardware_init_link_speed(interface, index,
-                                                           link_info);
-}
-
-/**
- * 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.
- *
- * @ipd_port: IPD/PKO port to loopback.
- * @enable_internal:
- *                 Non zero if you want internal loopback
- * @enable_external:
- *                 Non zero if you want external loopback
- *
- * Returns Zero on success, negative on failure.
- */
-int __cvmx_helper_sgmii_configure_loopback(int ipd_port, int enable_internal,
-                                          int enable_external)
-{
-       int interface = cvmx_helper_get_interface_num(ipd_port);
-       int index = cvmx_helper_get_interface_index_num(ipd_port);
-       union cvmx_pcsx_mrx_control_reg pcsx_mrx_control_reg;
-       union cvmx_pcsx_miscx_ctl_reg pcsx_miscx_ctl_reg;
-
-       pcsx_mrx_control_reg.u64 =
-           cvmx_read_csr(CVMX_PCSX_MRX_CONTROL_REG(index, interface));
-       pcsx_mrx_control_reg.s.loopbck1 = enable_internal;
-       cvmx_write_csr(CVMX_PCSX_MRX_CONTROL_REG(index, interface),
-                      pcsx_mrx_control_reg.u64);
-
-       pcsx_miscx_ctl_reg.u64 =
-           cvmx_read_csr(CVMX_PCSX_MISCX_CTL_REG(index, interface));
-       pcsx_miscx_ctl_reg.s.loopbck2 = enable_external;
-       cvmx_write_csr(CVMX_PCSX_MISCX_CTL_REG(index, interface),
-                      pcsx_miscx_ctl_reg.u64);
-
-       __cvmx_helper_sgmii_hardware_init_link(interface, index);
-       return 0;
-}
diff --git a/drivers/staging/octeon/cvmx-helper-sgmii.h b/drivers/staging/octeon/cvmx-helper-sgmii.h
deleted file mode 100644 (file)
index 19b48d6..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/**
- * @file
- *
- * Functions for SGMII initialization, configuration,
- * and monitoring.
- *
- */
-#ifndef __CVMX_HELPER_SGMII_H__
-#define __CVMX_HELPER_SGMII_H__
-
-/**
- * Probe a SGMII interface and determine the number of ports
- * connected to it. The SGMII interface should still be down after
- * this call.
- *
- * @interface: Interface to probe
- *
- * Returns Number of ports on the interface. Zero to disable.
- */
-extern int __cvmx_helper_sgmii_probe(int interface);
-
-/**
- * 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.
- *
- * @interface: Interface to bring up
- *
- * Returns Zero on success, negative on failure
- */
-extern int __cvmx_helper_sgmii_enable(int interface);
-
-/**
- * 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().
- *
- * @ipd_port: IPD/PKO port to query
- *
- * Returns Link state
- */
-extern cvmx_helper_link_info_t __cvmx_helper_sgmii_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.
- *
- * @ipd_port:  IPD/PKO port to configure
- * @link_info: The new link state
- *
- * Returns Zero on success, negative on failure
- */
-extern int __cvmx_helper_sgmii_link_set(int ipd_port,
-                                       cvmx_helper_link_info_t link_info);
-
-/**
- * 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.
- *
- * @ipd_port: IPD/PKO port to loopback.
- * @enable_internal:
- *                 Non zero if you want internal loopback
- * @enable_external:
- *                 Non zero if you want external loopback
- *
- * Returns Zero on success, negative on failure.
- */
-extern int __cvmx_helper_sgmii_configure_loopback(int ipd_port,
-                                                 int enable_internal,
-                                                 int enable_external);
-
-#endif
diff --git a/drivers/staging/octeon/cvmx-helper-spi.c b/drivers/staging/octeon/cvmx-helper-spi.c
deleted file mode 100644 (file)
index 8ba6c83..0000000
+++ /dev/null
@@ -1,195 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-void __cvmx_interrupt_gmxx_enable(int interface);
-void __cvmx_interrupt_spxx_int_msk_enable(int index);
-void __cvmx_interrupt_stxx_int_msk_enable(int index);
-
-/*
- * Functions for SPI initialization, configuration,
- * and monitoring.
- */
-#include <asm/octeon/octeon.h>
-
-#include "cvmx-config.h"
-#include "cvmx-spi.h"
-#include "cvmx-helper.h"
-
-#include "cvmx-pip-defs.h"
-#include "cvmx-pko-defs.h"
-
-/*
- * CVMX_HELPER_SPI_TIMEOUT is used to determine how long the SPI
- * initialization routines wait for SPI training. You can override the
- * value using executive-config.h if necessary.
- */
-#ifndef CVMX_HELPER_SPI_TIMEOUT
-#define CVMX_HELPER_SPI_TIMEOUT 10
-#endif
-
-/**
- * Probe a SPI interface and determine the number of ports
- * connected to it. The SPI interface should still be down after
- * this call.
- *
- * @interface: Interface to probe
- *
- * Returns Number of ports on the interface. Zero to disable.
- */
-int __cvmx_helper_spi_probe(int interface)
-{
-       int num_ports = 0;
-
-       if ((cvmx_sysinfo_get()->board_type != CVMX_BOARD_TYPE_SIM) &&
-           cvmx_spi4000_is_present(interface)) {
-               num_ports = 10;
-       } else {
-               union cvmx_pko_reg_crc_enable enable;
-               num_ports = 16;
-               /*
-                * Unlike the SPI4000, most SPI devices don't
-                * automatically put on the L2 CRC. For everything
-                * except for the SPI4000 have PKO append the L2 CRC
-                * to the packet.
-                */
-               enable.u64 = cvmx_read_csr(CVMX_PKO_REG_CRC_ENABLE);
-               enable.s.enable |= 0xffff << (interface * 16);
-               cvmx_write_csr(CVMX_PKO_REG_CRC_ENABLE, enable.u64);
-       }
-       __cvmx_helper_setup_gmx(interface, num_ports);
-       return num_ports;
-}
-
-/**
- * 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.
- *
- * @interface: Interface to bring up
- *
- * Returns Zero on success, negative on failure
- */
-int __cvmx_helper_spi_enable(int interface)
-{
-       /*
-        * Normally the ethernet L2 CRC is checked and stripped in the
-        * GMX block.  When you are using SPI, this isn' the case and
-        * IPD needs to check the L2 CRC.
-        */
-       int num_ports = cvmx_helper_ports_on_interface(interface);
-       int ipd_port;
-       for (ipd_port = interface * 16; ipd_port < interface * 16 + num_ports;
-            ipd_port++) {
-               union cvmx_pip_prt_cfgx port_config;
-               port_config.u64 = cvmx_read_csr(CVMX_PIP_PRT_CFGX(ipd_port));
-               port_config.s.crc_en = 1;
-               cvmx_write_csr(CVMX_PIP_PRT_CFGX(ipd_port), port_config.u64);
-       }
-
-       if (cvmx_sysinfo_get()->board_type != CVMX_BOARD_TYPE_SIM) {
-               cvmx_spi_start_interface(interface, CVMX_SPI_MODE_DUPLEX,
-                                        CVMX_HELPER_SPI_TIMEOUT, num_ports);
-               if (cvmx_spi4000_is_present(interface))
-                       cvmx_spi4000_initialize(interface);
-       }
-       __cvmx_interrupt_spxx_int_msk_enable(interface);
-       __cvmx_interrupt_stxx_int_msk_enable(interface);
-       __cvmx_interrupt_gmxx_enable(interface);
-       return 0;
-}
-
-/**
- * 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().
- *
- * @ipd_port: IPD/PKO port to query
- *
- * Returns Link state
- */
-cvmx_helper_link_info_t __cvmx_helper_spi_link_get(int ipd_port)
-{
-       cvmx_helper_link_info_t result;
-       int interface = cvmx_helper_get_interface_num(ipd_port);
-       int index = cvmx_helper_get_interface_index_num(ipd_port);
-       result.u64 = 0;
-
-       if (cvmx_sysinfo_get()->board_type == CVMX_BOARD_TYPE_SIM) {
-               /* The simulator gives you a simulated full duplex link */
-               result.s.link_up = 1;
-               result.s.full_duplex = 1;
-               result.s.speed = 10000;
-       } else if (cvmx_spi4000_is_present(interface)) {
-               union cvmx_gmxx_rxx_rx_inbnd inband =
-                   cvmx_spi4000_check_speed(interface, index);
-               result.s.link_up = inband.s.status;
-               result.s.full_duplex = inband.s.duplex;
-               switch (inband.s.speed) {
-               case 0: /* 10 Mbps */
-                       result.s.speed = 10;
-                       break;
-               case 1: /* 100 Mbps */
-                       result.s.speed = 100;
-                       break;
-               case 2: /* 1 Gbps */
-                       result.s.speed = 1000;
-                       break;
-               case 3: /* Illegal */
-                       result.s.speed = 0;
-                       result.s.link_up = 0;
-                       break;
-               }
-       } else {
-               /* For generic SPI we can't determine the link, just return some
-                  sane results */
-               result.s.link_up = 1;
-               result.s.full_duplex = 1;
-               result.s.speed = 10000;
-       }
-       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.
- *
- * @ipd_port:  IPD/PKO port to configure
- * @link_info: The new link state
- *
- * Returns Zero on success, negative on failure
- */
-int __cvmx_helper_spi_link_set(int ipd_port, cvmx_helper_link_info_t link_info)
-{
-       /* Nothing to do. If we have a SPI4000 then the setup was already performed
-          by cvmx_spi4000_check_speed(). If not then there isn't any link
-          info */
-       return 0;
-}
diff --git a/drivers/staging/octeon/cvmx-helper-spi.h b/drivers/staging/octeon/cvmx-helper-spi.h
deleted file mode 100644 (file)
index 69bac03..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- * Functions for SPI initialization, configuration,
- * and monitoring.
- */
-#ifndef __CVMX_HELPER_SPI_H__
-#define __CVMX_HELPER_SPI_H__
-
-/**
- * Probe a SPI interface and determine the number of ports
- * connected to it. The SPI interface should still be down after
- * this call.
- *
- * @interface: Interface to probe
- *
- * Returns Number of ports on the interface. Zero to disable.
- */
-extern int __cvmx_helper_spi_probe(int interface);
-
-/**
- * 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.
- *
- * @interface: Interface to bring up
- *
- * Returns Zero on success, negative on failure
- */
-extern int __cvmx_helper_spi_enable(int interface);
-
-/**
- * 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().
- *
- * @ipd_port: IPD/PKO port to query
- *
- * Returns Link state
- */
-extern cvmx_helper_link_info_t __cvmx_helper_spi_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.
- *
- * @ipd_port:  IPD/PKO port to configure
- * @link_info: The new link state
- *
- * Returns Zero on success, negative on failure
- */
-extern int __cvmx_helper_spi_link_set(int ipd_port,
-                                     cvmx_helper_link_info_t link_info);
-
-#endif
diff --git a/drivers/staging/octeon/cvmx-helper-util.c b/drivers/staging/octeon/cvmx-helper-util.c
deleted file mode 100644 (file)
index 131182b..0000000
+++ /dev/null
@@ -1,433 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- * Small helper utilities.
- */
-#include <linux/kernel.h>
-
-#include <asm/octeon/octeon.h>
-
-#include "cvmx-config.h"
-
-#include "cvmx-fpa.h"
-#include "cvmx-pip.h"
-#include "cvmx-pko.h"
-#include "cvmx-ipd.h"
-#include "cvmx-spi.h"
-
-#include "cvmx-helper.h"
-#include "cvmx-helper-util.h"
-
-#include <asm/octeon/cvmx-ipd-defs.h>
-
-/**
- * Convert a interface mode into a human readable string
- *
- * @mode:   Mode to convert
- *
- * Returns 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_SGMII:
-               return "SGMII";
-       case CVMX_HELPER_INTERFACE_MODE_PICMG:
-               return "PICMG";
-       case CVMX_HELPER_INTERFACE_MODE_NPI:
-               return "NPI";
-       case CVMX_HELPER_INTERFACE_MODE_LOOP:
-               return "LOOP";
-       }
-       return "UNKNOWN";
-}
-
-/**
- * Debug routine to dump the packet structure to the console
- *
- * @work:   Work queue entry containing the packet to dump
- * Returns
- */
-int cvmx_helper_dump_packet(cvmx_wqe_t *work)
-{
-       uint64_t count;
-       uint64_t remaining_bytes;
-       union cvmx_buf_ptr buffer_ptr;
-       uint64_t start_of_buffer;
-       uint8_t *data_address;
-       uint8_t *end_of_data;
-
-       cvmx_dprintf("Packet Length:   %u\n", work->len);
-       cvmx_dprintf("    Input Port:  %u\n", work->ipprt);
-       cvmx_dprintf("    QoS:         %u\n", work->qos);
-       cvmx_dprintf("    Buffers:     %u\n", work->word2.s.bufs);
-
-       if (work->word2.s.bufs == 0) {
-               union cvmx_ipd_wqe_fpa_queue wqe_pool;
-               wqe_pool.u64 = cvmx_read_csr(CVMX_IPD_WQE_FPA_QUEUE);
-               buffer_ptr.u64 = 0;
-               buffer_ptr.s.pool = wqe_pool.s.wqe_pool;
-               buffer_ptr.s.size = 128;
-               buffer_ptr.s.addr = cvmx_ptr_to_phys(work->packet_data);
-               if (likely(!work->word2.s.not_IP)) {
-                       union cvmx_pip_ip_offset pip_ip_offset;
-                       pip_ip_offset.u64 = cvmx_read_csr(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 assumes 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 = cvmx_read_csr(CVMX_PIP_GBL_CFG);
-                       buffer_ptr.s.addr += pip_gbl_cfg.s.nip_shf;
-               }
-       } else
-               buffer_ptr = work->packet_ptr;
-       remaining_bytes = work->len;
-
-       while (remaining_bytes) {
-               start_of_buffer =
-                   ((buffer_ptr.s.addr >> 7) - buffer_ptr.s.back) << 7;
-               cvmx_dprintf("    Buffer Start:%llx\n",
-                            (unsigned long long)start_of_buffer);
-               cvmx_dprintf("    Buffer I   : %u\n", buffer_ptr.s.i);
-               cvmx_dprintf("    Buffer Back: %u\n", buffer_ptr.s.back);
-               cvmx_dprintf("    Buffer Pool: %u\n", buffer_ptr.s.pool);
-               cvmx_dprintf("    Buffer Data: %llx\n",
-                            (unsigned long long)buffer_ptr.s.addr);
-               cvmx_dprintf("    Buffer Size: %u\n", buffer_ptr.s.size);
-
-               cvmx_dprintf("\t\t");
-               data_address = (uint8_t *) cvmx_phys_to_ptr(buffer_ptr.s.addr);
-               end_of_data = data_address + buffer_ptr.s.size;
-               count = 0;
-               while (data_address < end_of_data) {
-                       if (remaining_bytes == 0)
-                               break;
-                       else
-                               remaining_bytes--;
-                       cvmx_dprintf("%02x", (unsigned int)*data_address);
-                       data_address++;
-                       if (remaining_bytes && (count == 7)) {
-                               cvmx_dprintf("\n\t\t");
-                               count = 0;
-                       } else
-                               count++;
-               }
-               cvmx_dprintf("\n");
-
-               if (remaining_bytes)
-                       buffer_ptr = *(union cvmx_buf_ptr *)
-                               cvmx_phys_to_ptr(buffer_ptr.s.addr - 8);
-       }
-       return 0;
-}
-
-/**
- * Setup Random Early Drop on a specific input queue
- *
- * @queue:  Input queue to setup RED on (0-7)
- * @pass_thresh:
- *               Packets will begin slowly dropping when there are less than
- *               this many packet buffers free in FPA 0.
- * @drop_thresh:
- *               All incomming packets will be dropped when there are less
- *               than this many free packet buffers in FPA 0.
- * Returns Zero on success. Negative on failure
- */
-int cvmx_helper_setup_red_queue(int queue, int pass_thresh, int drop_thresh)
-{
-       union cvmx_ipd_qosx_red_marks red_marks;
-       union cvmx_ipd_red_quex_param red_param;
-
-       /* Set RED to begin dropping packets when there are pass_thresh buffers
-          left. It will linearly drop more packets until reaching drop_thresh
-          buffers */
-       red_marks.u64 = 0;
-       red_marks.s.drop = drop_thresh;
-       red_marks.s.pass = pass_thresh;
-       cvmx_write_csr(CVMX_IPD_QOSX_RED_MARKS(queue), red_marks.u64);
-
-       /* Use the actual queue 0 counter, not the average */
-       red_param.u64 = 0;
-       red_param.s.prb_con =
-           (255ul << 24) / (red_marks.s.pass - red_marks.s.drop);
-       red_param.s.avg_con = 1;
-       red_param.s.new_con = 255;
-       red_param.s.use_pcnt = 1;
-       cvmx_write_csr(CVMX_IPD_RED_QUEX_PARAM(queue), red_param.u64);
-       return 0;
-}
-
-/**
- * Setup Random Early Drop to automatically begin dropping packets.
- *
- * @pass_thresh:
- *               Packets will begin slowly dropping when there are less than
- *               this many packet buffers free in FPA 0.
- * @drop_thresh:
- *               All incomming packets will be dropped when there are less
- *               than this many free packet buffers in FPA 0.
- * Returns Zero on success. Negative on failure
- */
-int cvmx_helper_setup_red(int pass_thresh, int drop_thresh)
-{
-       union cvmx_ipd_portx_bp_page_cnt page_cnt;
-       union cvmx_ipd_bp_prt_red_end ipd_bp_prt_red_end;
-       union cvmx_ipd_red_port_enable red_port_enable;
-       int queue;
-       int interface;
-       int port;
-
-       /* Disable backpressure based on queued buffers. It needs SW support */
-       page_cnt.u64 = 0;
-       page_cnt.s.bp_enb = 0;
-       page_cnt.s.page_cnt = 100;
-       for (interface = 0; interface < 2; interface++) {
-               for (port = cvmx_helper_get_first_ipd_port(interface);
-                    port < cvmx_helper_get_last_ipd_port(interface); port++)
-                       cvmx_write_csr(CVMX_IPD_PORTX_BP_PAGE_CNT(port),
-                                      page_cnt.u64);
-       }
-
-       for (queue = 0; queue < 8; queue++)
-               cvmx_helper_setup_red_queue(queue, pass_thresh, drop_thresh);
-
-       /* Shutoff the dropping based on the per port page count. SW isn't
-          decrementing it right now */
-       ipd_bp_prt_red_end.u64 = 0;
-       ipd_bp_prt_red_end.s.prt_enb = 0;
-       cvmx_write_csr(CVMX_IPD_BP_PRT_RED_END, ipd_bp_prt_red_end.u64);
-
-       red_port_enable.u64 = 0;
-       red_port_enable.s.prt_enb = 0xfffffffffull;
-       red_port_enable.s.avg_dly = 10000;
-       red_port_enable.s.prb_dly = 10000;
-       cvmx_write_csr(CVMX_IPD_RED_PORT_ENABLE, red_port_enable.u64);
-
-       return 0;
-}
-
-/**
- * Setup the common GMX settings that determine the number of
- * ports. These setting apply to almost all configurations of all
- * chips.
- *
- * @interface: Interface to configure
- * @num_ports: Number of ports on the interface
- *
- * Returns Zero on success, negative on failure
- */
-int __cvmx_helper_setup_gmx(int interface, 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;
-       int index;
-
-       /* Tell GMX the number of TX ports on this interface */
-       gmx_tx_prts.u64 = cvmx_read_csr(CVMX_GMXX_TX_PRTS(interface));
-       gmx_tx_prts.s.prts = num_ports;
-       cvmx_write_csr(CVMX_GMXX_TX_PRTS(interface), gmx_tx_prts.u64);
-
-       /* Tell GMX the number of RX ports on this interface.  This only
-        ** applies to *GMII and XAUI ports */
-       if (cvmx_helper_interface_get_mode(interface) ==
-           CVMX_HELPER_INTERFACE_MODE_RGMII
-           || cvmx_helper_interface_get_mode(interface) ==
-           CVMX_HELPER_INTERFACE_MODE_SGMII
-           || cvmx_helper_interface_get_mode(interface) ==
-           CVMX_HELPER_INTERFACE_MODE_GMII
-           || cvmx_helper_interface_get_mode(interface) ==
-           CVMX_HELPER_INTERFACE_MODE_XAUI) {
-               if (num_ports > 4) {
-                       cvmx_dprintf("__cvmx_helper_setup_gmx: Illegal "
-                                    "num_ports\n");
-                       return -1;
-               }
-
-               gmx_rx_prts.u64 = cvmx_read_csr(CVMX_GMXX_RX_PRTS(interface));
-               gmx_rx_prts.s.prts = num_ports;
-               cvmx_write_csr(CVMX_GMXX_RX_PRTS(interface), gmx_rx_prts.u64);
-       }
-
-       /* Skip setting CVMX_PKO_REG_GMX_PORT_MODE on 30XX, 31XX, and 50XX */
-       if (!OCTEON_IS_MODEL(OCTEON_CN30XX) && !OCTEON_IS_MODEL(OCTEON_CN31XX)
-           && !OCTEON_IS_MODEL(OCTEON_CN50XX)) {
-               /* Tell PKO the number of ports on this interface */
-               pko_mode.u64 = cvmx_read_csr(CVMX_PKO_REG_GMX_PORT_MODE);
-               if (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;
-               }
-               cvmx_write_csr(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 = cvmx_read_csr(CVMX_GMXX_TXX_THRESH(0, interface));
-       if (OCTEON_IS_MODEL(OCTEON_CN30XX) || OCTEON_IS_MODEL(OCTEON_CN31XX)
-           || OCTEON_IS_MODEL(OCTEON_CN50XX)) {
-               /* These chips have a fixed max threshold of 0x40 */
-               gmx_tx_thresh.s.cnt = 0x40;
-       } else {
-               /* Choose the max value for the number of ports */
-               if (num_ports <= 1)
-                       gmx_tx_thresh.s.cnt = 0x100 / 1;
-               else if (num_ports == 2)
-                       gmx_tx_thresh.s.cnt = 0x100 / 2;
-               else
-                       gmx_tx_thresh.s.cnt = 0x100 / 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++)
-               cvmx_write_csr(CVMX_GMXX_TXX_THRESH(index, interface),
-                              gmx_tx_thresh.u64);
-
-       return 0;
-}
-
-/**
- * Returns the IPD/PKO port number for a port on the given
- * interface.
- *
- * @interface: Interface to use
- * @port:      Port on the interface
- *
- * Returns IPD/PKO port number
- */
-int cvmx_helper_get_ipd_port(int interface, int port)
-{
-       switch (interface) {
-       case 0:
-               return port;
-       case 1:
-               return port + 16;
-       case 2:
-               return port + 32;
-       case 3:
-               return port + 36;
-       }
-       return -1;
-}
-
-/**
- * Returns the interface number for an IPD/PKO port number.
- *
- * @ipd_port: IPD/PKO port number
- *
- * Returns Interface number
- */
-int cvmx_helper_get_interface_num(int ipd_port)
-{
-       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
-               cvmx_dprintf("cvmx_helper_get_interface_num: Illegal IPD "
-                            "port number\n");
-
-       return -1;
-}
-
-/**
- * Returns the interface index number for an IPD/PKO port
- * number.
- *
- * @ipd_port: IPD/PKO port number
- *
- * Returns Interface index number
- */
-int cvmx_helper_get_interface_index_num(int ipd_port)
-{
-       if (ipd_port < 32)
-               return ipd_port & 15;
-       else if (ipd_port < 36)
-               return ipd_port & 3;
-       else if (ipd_port < 40)
-               return ipd_port & 3;
-       else
-               cvmx_dprintf("cvmx_helper_get_interface_index_num: "
-                            "Illegal IPD port number\n");
-
-       return -1;
-}
diff --git a/drivers/staging/octeon/cvmx-helper-util.h b/drivers/staging/octeon/cvmx-helper-util.h
deleted file mode 100644 (file)
index 6a6e52f..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- *
- * Small helper utilities.
- *
- */
-
-#ifndef __CVMX_HELPER_UTIL_H__
-#define __CVMX_HELPER_UTIL_H__
-
-/**
- * Convert a interface mode into a human readable string
- *
- * @mode:   Mode to convert
- *
- * Returns String
- */
-extern const char
-    *cvmx_helper_interface_mode_to_string(cvmx_helper_interface_mode_t mode);
-
-/**
- * Debug routine to dump the packet structure to the console
- *
- * @work:   Work queue entry containing the packet to dump
- * Returns
- */
-extern int cvmx_helper_dump_packet(cvmx_wqe_t *work);
-
-/**
- * Setup Random Early Drop on a specific input queue
- *
- * @queue:  Input queue to setup RED on (0-7)
- * @pass_thresh:
- *               Packets will begin slowly dropping when there are less than
- *               this many packet buffers free in FPA 0.
- * @drop_thresh:
- *               All incomming packets will be dropped when there are less
- *               than this many free packet buffers in FPA 0.
- * Returns Zero on success. Negative on failure
- */
-extern int cvmx_helper_setup_red_queue(int queue, int pass_thresh,
-                                      int drop_thresh);
-
-/**
- * Setup Random Early Drop to automatically begin dropping packets.
- *
- * @pass_thresh:
- *               Packets will begin slowly dropping when there are less than
- *               this many packet buffers free in FPA 0.
- * @drop_thresh:
- *               All incomming packets will be dropped when there are less
- *               than this many free packet buffers in FPA 0.
- * Returns Zero on success. Negative on failure
- */
-extern int cvmx_helper_setup_red(int pass_thresh, int drop_thresh);
-
-/**
- * Get the version of the CVMX libraries.
- *
- * Returns Version string. Note this buffer is allocated statically
- *         and will be shared by all callers.
- */
-extern const char *cvmx_helper_get_version(void);
-
-/**
- * Setup the common GMX settings that determine the number of
- * ports. These setting apply to almost all configurations of all
- * chips.
- *
- * @interface: Interface to configure
- * @num_ports: Number of ports on the interface
- *
- * Returns Zero on success, negative on failure
- */
-extern int __cvmx_helper_setup_gmx(int interface, int num_ports);
-
-/**
- * Returns the IPD/PKO port number for a port on the given
- * interface.
- *
- * @interface: Interface to use
- * @port:      Port on the interface
- *
- * Returns IPD/PKO port number
- */
-extern int cvmx_helper_get_ipd_port(int interface, int port);
-
-/**
- * Returns the IPD/PKO port number for the first port on the given
- * interface.
- *
- * @interface: Interface to use
- *
- * Returns IPD/PKO port number
- */
-static inline int cvmx_helper_get_first_ipd_port(int interface)
-{
-       return cvmx_helper_get_ipd_port(interface, 0);
-}
-
-/**
- * Returns the IPD/PKO port number for the last port on the given
- * interface.
- *
- * @interface: Interface to use
- *
- * Returns IPD/PKO port number
- */
-static inline int cvmx_helper_get_last_ipd_port(int interface)
-{
-       extern int cvmx_helper_ports_on_interface(int interface);
-
-       return cvmx_helper_get_first_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.
- *
- * @work:   Work queue entry with packet to free
- */
-static inline void cvmx_helper_free_packet_data(cvmx_wqe_t *work)
-{
-       uint64_t number_buffers;
-       union cvmx_buf_ptr buffer_ptr;
-       union cvmx_buf_ptr next_buffer_ptr;
-       uint64_t 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 =
-                   *(union cvmx_buf_ptr *) 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 =
-                   *(union cvmx_buf_ptr *) 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;
-       }
-}
-
-/**
- * Returns the interface number for an IPD/PKO port number.
- *
- * @ipd_port: IPD/PKO port number
- *
- * Returns Interface number
- */
-extern int cvmx_helper_get_interface_num(int ipd_port);
-
-/**
- * Returns the interface index number for an IPD/PKO port
- * number.
- *
- * @ipd_port: IPD/PKO port number
- *
- * Returns Interface index number
- */
-extern int cvmx_helper_get_interface_index_num(int ipd_port);
-
-#endif /* __CVMX_HELPER_H__ */
diff --git a/drivers/staging/octeon/cvmx-helper-xaui.c b/drivers/staging/octeon/cvmx-helper-xaui.c
deleted file mode 100644 (file)
index a11e676..0000000
+++ /dev/null
@@ -1,348 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- * Functions for XAUI initialization, configuration,
- * and monitoring.
- *
- */
-
-#include <asm/octeon/octeon.h>
-
-#include "cvmx-config.h"
-
-#include "cvmx-helper.h"
-
-#include "cvmx-pko-defs.h"
-#include "cvmx-gmxx-defs.h"
-#include "cvmx-pcsxx-defs.h"
-
-void __cvmx_interrupt_gmxx_enable(int interface);
-void __cvmx_interrupt_pcsx_intx_en_reg_enable(int index, int block);
-void __cvmx_interrupt_pcsxx_int_en_reg_enable(int index);
-/**
- * Probe a XAUI interface and determine the number of ports
- * connected to it. The XAUI interface should still be down
- * after this call.
- *
- * @interface: Interface to probe
- *
- * Returns Number of ports on the interface. Zero to disable.
- */
-int __cvmx_helper_xaui_probe(int interface)
-{
-       int i;
-       union cvmx_gmxx_hg2_control gmx_hg2_control;
-       union cvmx_gmxx_inf_mode mode;
-
-       /*
-        * Due to errata GMX-700 on CN56XXp1.x and CN52XXp1.x, the
-        * interface needs to be enabled before IPD otherwise per port
-        * backpressure may not work properly.
-        */
-       mode.u64 = cvmx_read_csr(CVMX_GMXX_INF_MODE(interface));
-       mode.s.en = 1;
-       cvmx_write_csr(CVMX_GMXX_INF_MODE(interface), mode.u64);
-
-       __cvmx_helper_setup_gmx(interface, 1);
-
-       /*
-        * Setup PKO to support 16 ports for HiGig2 virtual
-        * ports. We're pointing all of the PKO packet ports for this
-        * interface to the XAUI. This allows us to use HiGig2
-        * backpressure per port.
-        */
-       for (i = 0; i < 16; i++) {
-               union cvmx_pko_mem_port_ptrs pko_mem_port_ptrs;
-               pko_mem_port_ptrs.u64 = 0;
-               /*
-                * We set each PKO port to have equal priority in a
-                * round robin fashion.
-                */
-               pko_mem_port_ptrs.s.static_p = 0;
-               pko_mem_port_ptrs.s.qos_mask = 0xff;
-               /* All PKO ports map to the same XAUI hardware port */
-               pko_mem_port_ptrs.s.eid = interface * 4;
-               pko_mem_port_ptrs.s.pid = interface * 16 + i;
-               cvmx_write_csr(CVMX_PKO_MEM_PORT_PTRS, pko_mem_port_ptrs.u64);
-       }
-
-       /* If HiGig2 is enabled return 16 ports, otherwise return 1 port */
-       gmx_hg2_control.u64 = cvmx_read_csr(CVMX_GMXX_HG2_CONTROL(interface));
-       if (gmx_hg2_control.s.hg2tx_en)
-               return 16;
-       else
-               return 1;
-}
-
-/**
- * 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.
- *
- * @interface: Interface to bring up
- *
- * Returns Zero on success, negative on failure
- */
-int __cvmx_helper_xaui_enable(int interface)
-{
-       union cvmx_gmxx_prtx_cfg gmx_cfg;
-       union cvmx_pcsxx_control1_reg xauiCtl;
-       union cvmx_pcsxx_misc_ctl_reg xauiMiscCtl;
-       union cvmx_gmxx_tx_xaui_ctl gmxXauiTxCtl;
-       union cvmx_gmxx_rxx_int_en gmx_rx_int_en;
-       union cvmx_gmxx_tx_int_en gmx_tx_int_en;
-       union cvmx_pcsxx_int_en_reg pcsx_int_en_reg;
-
-       /* (1) Interface has already been enabled. */
-
-       /* (2) Disable GMX. */
-       xauiMiscCtl.u64 = cvmx_read_csr(CVMX_PCSXX_MISC_CTL_REG(interface));
-       xauiMiscCtl.s.gmxeno = 1;
-       cvmx_write_csr(CVMX_PCSXX_MISC_CTL_REG(interface), xauiMiscCtl.u64);
-
-       /* (3) Disable GMX and PCSX interrupts. */
-       gmx_rx_int_en.u64 = cvmx_read_csr(CVMX_GMXX_RXX_INT_EN(0, interface));
-       cvmx_write_csr(CVMX_GMXX_RXX_INT_EN(0, interface), 0x0);
-       gmx_tx_int_en.u64 = cvmx_read_csr(CVMX_GMXX_TX_INT_EN(interface));
-       cvmx_write_csr(CVMX_GMXX_TX_INT_EN(interface), 0x0);
-       pcsx_int_en_reg.u64 = cvmx_read_csr(CVMX_PCSXX_INT_EN_REG(interface));
-       cvmx_write_csr(CVMX_PCSXX_INT_EN_REG(interface), 0x0);
-
-       /* (4) Bring up the PCSX and GMX reconciliation layer. */
-       /* (4)a Set polarity and lane swapping. */
-       /* (4)b */
-       gmxXauiTxCtl.u64 = cvmx_read_csr(CVMX_GMXX_TX_XAUI_CTL(interface));
-       /* Enable better IFG packing and improves performance */
-       gmxXauiTxCtl.s.dic_en = 1;
-       gmxXauiTxCtl.s.uni_en = 0;
-       cvmx_write_csr(CVMX_GMXX_TX_XAUI_CTL(interface), gmxXauiTxCtl.u64);
-
-       /* (4)c Aply reset sequence */
-       xauiCtl.u64 = cvmx_read_csr(CVMX_PCSXX_CONTROL1_REG(interface));
-       xauiCtl.s.lo_pwr = 0;
-       xauiCtl.s.reset = 1;
-       cvmx_write_csr(CVMX_PCSXX_CONTROL1_REG(interface), xauiCtl.u64);
-
-       /* Wait for PCS to come out of reset */
-       if (CVMX_WAIT_FOR_FIELD64
-           (CVMX_PCSXX_CONTROL1_REG(interface), union cvmx_pcsxx_control1_reg,
-            reset, ==, 0, 10000))
-               return -1;
-       /* Wait for PCS to be aligned */
-       if (CVMX_WAIT_FOR_FIELD64
-           (CVMX_PCSXX_10GBX_STATUS_REG(interface),
-            union cvmx_pcsxx_10gbx_status_reg, alignd, ==, 1, 10000))
-               return -1;
-       /* Wait for RX to be ready */
-       if (CVMX_WAIT_FOR_FIELD64
-           (CVMX_GMXX_RX_XAUI_CTL(interface), union cvmx_gmxx_rx_xaui_ctl,
-                   status, ==, 0, 10000))
-               return -1;
-
-       /* (6) Configure GMX */
-       gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(0, interface));
-       gmx_cfg.s.en = 0;
-       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(0, interface), gmx_cfg.u64);
-
-       /* Wait for GMX RX to be idle */
-       if (CVMX_WAIT_FOR_FIELD64
-           (CVMX_GMXX_PRTX_CFG(0, interface), union cvmx_gmxx_prtx_cfg,
-                   rx_idle, ==, 1, 10000))
-               return -1;
-       /* Wait for GMX TX to be idle */
-       if (CVMX_WAIT_FOR_FIELD64
-           (CVMX_GMXX_PRTX_CFG(0, interface), union cvmx_gmxx_prtx_cfg,
-                   tx_idle, ==, 1, 10000))
-               return -1;
-
-       /* GMX configure */
-       gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(0, interface));
-       gmx_cfg.s.speed = 1;
-       gmx_cfg.s.speed_msb = 0;
-       gmx_cfg.s.slottime = 1;
-       cvmx_write_csr(CVMX_GMXX_TX_PRTS(interface), 1);
-       cvmx_write_csr(CVMX_GMXX_TXX_SLOT(0, interface), 512);
-       cvmx_write_csr(CVMX_GMXX_TXX_BURST(0, interface), 8192);
-       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(0, interface), gmx_cfg.u64);
-
-       /* (7) Clear out any error state */
-       cvmx_write_csr(CVMX_GMXX_RXX_INT_REG(0, interface),
-                      cvmx_read_csr(CVMX_GMXX_RXX_INT_REG(0, interface)));
-       cvmx_write_csr(CVMX_GMXX_TX_INT_REG(interface),
-                      cvmx_read_csr(CVMX_GMXX_TX_INT_REG(interface)));
-       cvmx_write_csr(CVMX_PCSXX_INT_REG(interface),
-                      cvmx_read_csr(CVMX_PCSXX_INT_REG(interface)));
-
-       /* Wait for receive link */
-       if (CVMX_WAIT_FOR_FIELD64
-           (CVMX_PCSXX_STATUS1_REG(interface), union cvmx_pcsxx_status1_reg,
-            rcv_lnk, ==, 1, 10000))
-               return -1;
-       if (CVMX_WAIT_FOR_FIELD64
-           (CVMX_PCSXX_STATUS2_REG(interface), union cvmx_pcsxx_status2_reg,
-            xmtflt, ==, 0, 10000))
-               return -1;
-       if (CVMX_WAIT_FOR_FIELD64
-           (CVMX_PCSXX_STATUS2_REG(interface), union cvmx_pcsxx_status2_reg,
-            rcvflt, ==, 0, 10000))
-               return -1;
-
-       cvmx_write_csr(CVMX_GMXX_RXX_INT_EN(0, interface), gmx_rx_int_en.u64);
-       cvmx_write_csr(CVMX_GMXX_TX_INT_EN(interface), gmx_tx_int_en.u64);
-       cvmx_write_csr(CVMX_PCSXX_INT_EN_REG(interface), pcsx_int_en_reg.u64);
-
-       cvmx_helper_link_autoconf(cvmx_helper_get_ipd_port(interface, 0));
-
-       /* (8) Enable packet reception */
-       xauiMiscCtl.s.gmxeno = 0;
-       cvmx_write_csr(CVMX_PCSXX_MISC_CTL_REG(interface), xauiMiscCtl.u64);
-
-       gmx_cfg.u64 = cvmx_read_csr(CVMX_GMXX_PRTX_CFG(0, interface));
-       gmx_cfg.s.en = 1;
-       cvmx_write_csr(CVMX_GMXX_PRTX_CFG(0, interface), gmx_cfg.u64);
-
-       __cvmx_interrupt_pcsx_intx_en_reg_enable(0, interface);
-       __cvmx_interrupt_pcsx_intx_en_reg_enable(1, interface);
-       __cvmx_interrupt_pcsx_intx_en_reg_enable(2, interface);
-       __cvmx_interrupt_pcsx_intx_en_reg_enable(3, interface);
-       __cvmx_interrupt_pcsxx_int_en_reg_enable(interface);
-       __cvmx_interrupt_gmxx_enable(interface);
-
-       return 0;
-}
-
-/**
- * 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().
- *
- * @ipd_port: IPD/PKO port to query
- *
- * Returns Link state
- */
-cvmx_helper_link_info_t __cvmx_helper_xaui_link_get(int ipd_port)
-{
-       int interface = cvmx_helper_get_interface_num(ipd_port);
-       union cvmx_gmxx_tx_xaui_ctl gmxx_tx_xaui_ctl;
-       union cvmx_gmxx_rx_xaui_ctl gmxx_rx_xaui_ctl;
-       union cvmx_pcsxx_status1_reg pcsxx_status1_reg;
-       cvmx_helper_link_info_t result;
-
-       gmxx_tx_xaui_ctl.u64 = cvmx_read_csr(CVMX_GMXX_TX_XAUI_CTL(interface));
-       gmxx_rx_xaui_ctl.u64 = cvmx_read_csr(CVMX_GMXX_RX_XAUI_CTL(interface));
-       pcsxx_status1_reg.u64 =
-           cvmx_read_csr(CVMX_PCSXX_STATUS1_REG(interface));
-       result.u64 = 0;
-
-       /* Only return a link if both RX and TX are happy */
-       if ((gmxx_tx_xaui_ctl.s.ls == 0) && (gmxx_rx_xaui_ctl.s.status == 0) &&
-           (pcsxx_status1_reg.s.rcv_lnk == 1)) {
-               result.s.link_up = 1;
-               result.s.full_duplex = 1;
-               result.s.speed = 10000;
-       } else {
-               /* Disable GMX and PCSX interrupts. */
-               cvmx_write_csr(CVMX_GMXX_RXX_INT_EN(0, interface), 0x0);
-               cvmx_write_csr(CVMX_GMXX_TX_INT_EN(interface), 0x0);
-               cvmx_write_csr(CVMX_PCSXX_INT_EN_REG(interface), 0x0);
-       }
-       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.
- *
- * @ipd_port:  IPD/PKO port to configure
- * @link_info: The new link state
- *
- * Returns Zero on success, negative on failure
- */
-int __cvmx_helper_xaui_link_set(int ipd_port, cvmx_helper_link_info_t link_info)
-{
-       int interface = cvmx_helper_get_interface_num(ipd_port);
-       union cvmx_gmxx_tx_xaui_ctl gmxx_tx_xaui_ctl;
-       union cvmx_gmxx_rx_xaui_ctl gmxx_rx_xaui_ctl;
-
-       gmxx_tx_xaui_ctl.u64 = cvmx_read_csr(CVMX_GMXX_TX_XAUI_CTL(interface));
-       gmxx_rx_xaui_ctl.u64 = cvmx_read_csr(CVMX_GMXX_RX_XAUI_CTL(interface));
-
-       /* If the link shouldn't be up, then just return */
-       if (!link_info.s.link_up)
-               return 0;
-
-       /* Do nothing if both RX and TX are happy */
-       if ((gmxx_tx_xaui_ctl.s.ls == 0) && (gmxx_rx_xaui_ctl.s.status == 0))
-               return 0;
-
-       /* Bring the link up */
-       return __cvmx_helper_xaui_enable(interface);
-}
-
-/**
- * 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.
- *
- * @ipd_port: IPD/PKO port to loopback.
- * @enable_internal:
- *                 Non zero if you want internal loopback
- * @enable_external:
- *                 Non zero if you want external loopback
- *
- * Returns Zero on success, negative on failure.
- */
-extern int __cvmx_helper_xaui_configure_loopback(int ipd_port,
-                                                int enable_internal,
-                                                int enable_external)
-{
-       int interface = cvmx_helper_get_interface_num(ipd_port);
-       union cvmx_pcsxx_control1_reg pcsxx_control1_reg;
-       union cvmx_gmxx_xaui_ext_loopback gmxx_xaui_ext_loopback;
-
-       /* Set the internal loop */
-       pcsxx_control1_reg.u64 =
-           cvmx_read_csr(CVMX_PCSXX_CONTROL1_REG(interface));
-       pcsxx_control1_reg.s.loopbck1 = enable_internal;
-       cvmx_write_csr(CVMX_PCSXX_CONTROL1_REG(interface),
-                      pcsxx_control1_reg.u64);
-
-       /* Set the external loop */
-       gmxx_xaui_ext_loopback.u64 =
-           cvmx_read_csr(CVMX_GMXX_XAUI_EXT_LOOPBACK(interface));
-       gmxx_xaui_ext_loopback.s.en = enable_external;
-       cvmx_write_csr(CVMX_GMXX_XAUI_EXT_LOOPBACK(interface),
-                      gmxx_xaui_ext_loopback.u64);
-
-       /* Take the link through a reset */
-       return __cvmx_helper_xaui_enable(interface);
-}
diff --git a/drivers/staging/octeon/cvmx-helper-xaui.h b/drivers/staging/octeon/cvmx-helper-xaui.h
deleted file mode 100644 (file)
index 4b4db2f..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/**
- * @file
- *
- * Functions for XAUI initialization, configuration,
- * and monitoring.
- *
- */
-#ifndef __CVMX_HELPER_XAUI_H__
-#define __CVMX_HELPER_XAUI_H__
-
-/**
- * Probe a XAUI interface and determine the number of ports
- * connected to it. The XAUI interface should still be down
- * after this call.
- *
- * @interface: Interface to probe
- *
- * Returns Number of ports on the interface. Zero to disable.
- */
-extern int __cvmx_helper_xaui_probe(int interface);
-
-/**
- * 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.
- *
- * @interface: Interface to bring up
- *
- * Returns Zero on success, negative on failure
- */
-extern int __cvmx_helper_xaui_enable(int interface);
-
-/**
- * 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().
- *
- * @ipd_port: IPD/PKO port to query
- *
- * Returns Link state
- */
-extern cvmx_helper_link_info_t __cvmx_helper_xaui_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.
- *
- * @ipd_port:  IPD/PKO port to configure
- * @link_info: The new link state
- *
- * Returns Zero on success, negative on failure
- */
-extern int __cvmx_helper_xaui_link_set(int ipd_port,
-                                      cvmx_helper_link_info_t link_info);
-
-/**
- * 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.
- *
- * @ipd_port: IPD/PKO port to loopback.
- * @enable_internal:
- *                 Non zero if you want internal loopback
- * @enable_external:
- *                 Non zero if you want external loopback
- *
- * Returns Zero on success, negative on failure.
- */
-extern int __cvmx_helper_xaui_configure_loopback(int ipd_port,
-                                                int enable_internal,
-                                                int enable_external);
-#endif
diff --git a/drivers/staging/octeon/cvmx-helper.c b/drivers/staging/octeon/cvmx-helper.c
deleted file mode 100644 (file)
index e9c5c83..0000000
+++ /dev/null
@@ -1,1058 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- *
- * Helper functions for common, but complicated tasks.
- *
- */
-#include <asm/octeon/octeon.h>
-
-#include "cvmx-config.h"
-
-#include "cvmx-fpa.h"
-#include "cvmx-pip.h"
-#include "cvmx-pko.h"
-#include "cvmx-ipd.h"
-#include "cvmx-spi.h"
-#include "cvmx-helper.h"
-#include "cvmx-helper-board.h"
-
-#include "cvmx-pip-defs.h"
-#include "cvmx-smix-defs.h"
-#include "cvmx-asxx-defs.h"
-
-/**
- * cvmx_override_pko_queue_priority(int ipd_port, uint64_t
- * 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 pko_port,
-                                         uint64_t priorities[16]);
-
-/**
- * cvmx_override_ipd_port_setup(int ipd_port) is a function
- * pointer. It is meant to allow customization of the IPD port
- * 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);
-
-/* Port count per interface */
-static int interface_port_count[4] = { 0, 0, 0, 0 };
-
-/* Port last configured link info index by IPD/PKO port */
-static cvmx_helper_link_info_t
-    port_link_info[CVMX_PIP_NUM_INPUT_PORTS];
-
-/**
- * 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.
- *
- * Returns Number of interfaces on chip
- */
-int cvmx_helper_get_number_of_interfaces(void)
-{
-       if (OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN52XX))
-               return 4;
-       else
-               return 3;
-}
-
-/**
- * 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.
- *
- * @interface: Interface to get the port count for
- *
- * Returns Number of ports on interface. Can be Zero.
- */
-int cvmx_helper_ports_on_interface(int interface)
-{
-       return interface_port_count[interface];
-}
-
-/**
- * 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.
- *
- * @interface: Interface to probe
- *
- * Returns Mode of the interface. Unknown or unsupported interfaces return
- *         DISABLED.
- */
-cvmx_helper_interface_mode_t cvmx_helper_interface_get_mode(int interface)
-{
-       union cvmx_gmxx_inf_mode mode;
-       if (interface == 2)
-               return CVMX_HELPER_INTERFACE_MODE_NPI;
-
-       if (interface == 3) {
-               if (OCTEON_IS_MODEL(OCTEON_CN56XX)
-                   || OCTEON_IS_MODEL(OCTEON_CN52XX))
-                       return CVMX_HELPER_INTERFACE_MODE_LOOP;
-               else
-                       return CVMX_HELPER_INTERFACE_MODE_DISABLED;
-       }
-
-       if (interface == 0
-           && cvmx_sysinfo_get()->board_type == CVMX_BOARD_TYPE_CN3005_EVB_HS5
-           && cvmx_sysinfo_get()->board_rev_major == 1) {
-               /*
-                * Lie about interface type of CN3005 board.  This
-                * board has a switch on port 1 like the other
-                * evaluation boards, but it is connected over RGMII
-                * instead of GMII.  Report GMII mode so that the
-                * speed is forced to 1 Gbit full duplex.  Other than
-                * some initial configuration (which does not use the
-                * output of this function) there is no difference in
-                * setup between GMII and RGMII modes.
-                */
-               return CVMX_HELPER_INTERFACE_MODE_GMII;
-       }
-
-       /* Interface 1 is always disabled on CN31XX and CN30XX */
-       if ((interface == 1)
-           && (OCTEON_IS_MODEL(OCTEON_CN31XX) || OCTEON_IS_MODEL(OCTEON_CN30XX)
-               || OCTEON_IS_MODEL(OCTEON_CN50XX)
-               || OCTEON_IS_MODEL(OCTEON_CN52XX)))
-               return CVMX_HELPER_INTERFACE_MODE_DISABLED;
-
-       mode.u64 = cvmx_read_csr(CVMX_GMXX_INF_MODE(interface));
-
-       if (OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN52XX)) {
-               switch (mode.cn56xx.mode) {
-               case 0:
-                       return CVMX_HELPER_INTERFACE_MODE_DISABLED;
-               case 1:
-                       return CVMX_HELPER_INTERFACE_MODE_XAUI;
-               case 2:
-                       return CVMX_HELPER_INTERFACE_MODE_SGMII;
-               case 3:
-                       return CVMX_HELPER_INTERFACE_MODE_PICMG;
-               default:
-                       return CVMX_HELPER_INTERFACE_MODE_DISABLED;
-               }
-       } else {
-               if (!mode.s.en)
-                       return CVMX_HELPER_INTERFACE_MODE_DISABLED;
-
-               if (mode.s.type) {
-                       if (OCTEON_IS_MODEL(OCTEON_CN38XX)
-                           || OCTEON_IS_MODEL(OCTEON_CN58XX))
-                               return CVMX_HELPER_INTERFACE_MODE_SPI;
-                       else
-                               return CVMX_HELPER_INTERFACE_MODE_GMII;
-               } else
-                       return CVMX_HELPER_INTERFACE_MODE_RGMII;
-       }
-}
-
-/**
- * Configure the IPD/PIP tagging and QoS options for a specific
- * port. This function determines the POW work queue entry
- * contents for a port. The setup performed here is controlled by
- * the defines in executive-config.h.
- *
- * @ipd_port: Port to configure. This follows the IPD numbering, not the
- *                 per interface numbering
- *
- * Returns Zero on success, negative on failure
- */
-static int __cvmx_helper_port_setup_ipd(int ipd_port)
-{
-       union cvmx_pip_prt_cfgx port_config;
-       union cvmx_pip_prt_tagx tag_config;
-
-       port_config.u64 = cvmx_read_csr(CVMX_PIP_PRT_CFGX(ipd_port));
-       tag_config.u64 = cvmx_read_csr(CVMX_PIP_PRT_TAGX(ipd_port));
-
-       /* Have each port go to a different POW queue */
-       port_config.s.qos = ipd_port & 0x7;
-
-       /* Process the headers and place the IP header in the work queue */
-       port_config.s.mode = CVMX_HELPER_INPUT_PORT_SKIP_MODE;
-
-       tag_config.s.ip6_src_flag = CVMX_HELPER_INPUT_TAG_IPV6_SRC_IP;
-       tag_config.s.ip6_dst_flag = CVMX_HELPER_INPUT_TAG_IPV6_DST_IP;
-       tag_config.s.ip6_sprt_flag = CVMX_HELPER_INPUT_TAG_IPV6_SRC_PORT;
-       tag_config.s.ip6_dprt_flag = CVMX_HELPER_INPUT_TAG_IPV6_DST_PORT;
-       tag_config.s.ip6_nxth_flag = CVMX_HELPER_INPUT_TAG_IPV6_NEXT_HEADER;
-       tag_config.s.ip4_src_flag = CVMX_HELPER_INPUT_TAG_IPV4_SRC_IP;
-       tag_config.s.ip4_dst_flag = CVMX_HELPER_INPUT_TAG_IPV4_DST_IP;
-       tag_config.s.ip4_sprt_flag = CVMX_HELPER_INPUT_TAG_IPV4_SRC_PORT;
-       tag_config.s.ip4_dprt_flag = CVMX_HELPER_INPUT_TAG_IPV4_DST_PORT;
-       tag_config.s.ip4_pctl_flag = CVMX_HELPER_INPUT_TAG_IPV4_PROTOCOL;
-       tag_config.s.inc_prt_flag = CVMX_HELPER_INPUT_TAG_INPUT_PORT;
-       tag_config.s.tcp6_tag_type = CVMX_HELPER_INPUT_TAG_TYPE;
-       tag_config.s.tcp4_tag_type = CVMX_HELPER_INPUT_TAG_TYPE;
-       tag_config.s.ip6_tag_type = CVMX_HELPER_INPUT_TAG_TYPE;
-       tag_config.s.ip4_tag_type = CVMX_HELPER_INPUT_TAG_TYPE;
-       tag_config.s.non_tag_type = CVMX_HELPER_INPUT_TAG_TYPE;
-       /* Put all packets in group 0. Other groups can be used by the app */
-       tag_config.s.grp = 0;
-
-       cvmx_pip_config_port(ipd_port, port_config, tag_config);
-
-       /* Give the user a chance to override our setting for each port */
-       if (cvmx_override_ipd_port_setup)
-               cvmx_override_ipd_port_setup(ipd_port);
-
-       return 0;
-}
-
-/**
- * This function probes an interface to determine the actual
- * number of hardware ports connected to it. It doesn't setup the
- * ports or enable them. The main goal here is to set the global
- * interface_port_count[interface] correctly. Hardware setup of the
- * ports will be performed later.
- *
- * @interface: Interface to probe
- *
- * Returns Zero on success, negative on failure
- */
-int cvmx_helper_interface_probe(int interface)
-{
-       /* 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 */
-       switch (cvmx_helper_interface_get_mode(interface)) {
-               /* These types don't support ports to IPD/PKO */
-       case CVMX_HELPER_INTERFACE_MODE_DISABLED:
-       case CVMX_HELPER_INTERFACE_MODE_PCIE:
-               interface_port_count[interface] = 0;
-               break;
-               /* XAUI is a single high speed port */
-       case CVMX_HELPER_INTERFACE_MODE_XAUI:
-               interface_port_count[interface] =
-                   __cvmx_helper_xaui_probe(interface);
-               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:
-               interface_port_count[interface] =
-                   __cvmx_helper_rgmii_probe(interface);
-               break;
-               /*
-                * SPI4 can have 1-16 ports depending on the device at
-                * the other end.
-                */
-       case CVMX_HELPER_INTERFACE_MODE_SPI:
-               interface_port_count[interface] =
-                   __cvmx_helper_spi_probe(interface);
-               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_PICMG:
-               interface_port_count[interface] =
-                   __cvmx_helper_sgmii_probe(interface);
-               break;
-               /* PCI target Network Packet Interface */
-       case CVMX_HELPER_INTERFACE_MODE_NPI:
-               interface_port_count[interface] =
-                   __cvmx_helper_npi_probe(interface);
-               break;
-               /*
-                * Special loopback only ports. These are not the same
-                * as other ports in loopback mode.
-                */
-       case CVMX_HELPER_INTERFACE_MODE_LOOP:
-               interface_port_count[interface] =
-                   __cvmx_helper_loop_probe(interface);
-               break;
-       }
-
-       interface_port_count[interface] =
-           __cvmx_helper_board_interface_probe(interface,
-                                               interface_port_count
-                                               [interface]);
-
-       /* Make sure all global variables propagate to other cores */
-       CVMX_SYNCWS;
-
-       return 0;
-}
-
-/**
- * Setup the IPD/PIP for the ports on an interface. Packet
- * classification and tagging are set for every port on the
- * interface. The number of ports on the interface must already
- * have been probed.
- *
- * @interface: Interface to setup IPD/PIP for
- *
- * Returns Zero on success, negative on failure
- */
-static int __cvmx_helper_interface_setup_ipd(int interface)
-{
-       int ipd_port = cvmx_helper_get_ipd_port(interface, 0);
-       int num_ports = interface_port_count[interface];
-
-       while (num_ports--) {
-               __cvmx_helper_port_setup_ipd(ipd_port);
-               ipd_port++;
-       }
-       return 0;
-}
-
-/**
- * Setup global setting for IPD/PIP not related to a specific
- * interface or port. This must be called before IPD is enabled.
- *
- * Returns Zero on success, negative on failure.
- */
-static int __cvmx_helper_global_setup_ipd(void)
-{
-       /* Setup the global packet input options */
-       cvmx_ipd_config(CVMX_FPA_PACKET_POOL_SIZE / 8,
-                       CVMX_HELPER_FIRST_MBUFF_SKIP / 8,
-                       CVMX_HELPER_NOT_FIRST_MBUFF_SKIP / 8,
-                       /* The +8 is to account for the next ptr */
-                       (CVMX_HELPER_FIRST_MBUFF_SKIP + 8) / 128,
-                       /* The +8 is to account for the next ptr */
-                       (CVMX_HELPER_NOT_FIRST_MBUFF_SKIP + 8) / 128,
-                       CVMX_FPA_WQE_POOL,
-                       CVMX_IPD_OPC_MODE_STT,
-                       CVMX_HELPER_ENABLE_BACK_PRESSURE);
-       return 0;
-}
-
-/**
- * Setup the PKO for the ports on an interface. The number of
- * queues per port and the priority of each PKO output queue
- * is set here. PKO must be disabled when this function is called.
- *
- * @interface: Interface to setup PKO for
- *
- * Returns Zero on success, negative on failure
- */
-static int __cvmx_helper_interface_setup_pko(int interface)
-{
-       /*
-        * Each packet output queue has an associated priority. The
-        * higher the priority, the more often it can send a packet. A
-        * priority of 8 means it can send in all 8 rounds of
-        * contention. We're going to make each queue one less than
-        * the last.  The vector of priorities has been extended to
-        * support CN5xxx CPUs, where up to 16 queues can be
-        * associated to a port.  To keep backward compatibility we
-        * don't change the initial 8 priorities and replicate them in
-        * the second half.  With per-core PKO queues (PKO lockless
-        * operation) all queues have the same priority.
-        */
-       uint64_t priorities[16] =
-           { 8, 7, 6, 5, 4, 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, 1 };
-
-       /*
-        * Setup the IPD/PIP and PKO for the ports discovered
-        * above. Here packet classification, tagging and output
-        * priorities are set.
-        */
-       int ipd_port = cvmx_helper_get_ipd_port(interface, 0);
-       int num_ports = interface_port_count[interface];
-       while (num_ports--) {
-               /*
-                * Give the user a chance to override the per queue
-                * priorities.
-                */
-               if (cvmx_override_pko_queue_priority)
-                       cvmx_override_pko_queue_priority(ipd_port, priorities);
-
-               cvmx_pko_config_port(ipd_port,
-                                    cvmx_pko_get_base_queue_per_core(ipd_port,
-                                                                     0),
-                                    cvmx_pko_get_num_queues(ipd_port),
-                                    priorities);
-               ipd_port++;
-       }
-       return 0;
-}
-
-/**
- * Setup global setting for PKO not related to a specific
- * interface or port. This must be called before PKO is enabled.
- *
- * Returns Zero on success, negative on failure.
- */
-static int __cvmx_helper_global_setup_pko(void)
-{
-       /*
-        * Disable tagwait FAU timeout. This needs to be done before
-        * anyone might start packet output using tags.
-        */
-       union cvmx_iob_fau_timeout fau_to;
-       fau_to.u64 = 0;
-       fau_to.s.tout_val = 0xfff;
-       fau_to.s.tout_enb = 0;
-       cvmx_write_csr(CVMX_IOB_FAU_TIMEOUT, fau_to.u64);
-       return 0;
-}
-
-/**
- * Setup global backpressure setting.
- *
- * Returns Zero on success, negative on failure
- */
-static int __cvmx_helper_global_setup_backpressure(void)
-{
-#if CVMX_HELPER_DISABLE_RGMII_BACKPRESSURE
-       /* Disable backpressure if configured to do so */
-       /* Disable backpressure (pause frame) generation */
-       int num_interfaces = cvmx_helper_get_number_of_interfaces();
-       int interface;
-       for (interface = 0; interface < num_interfaces; 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_NPI:
-               case CVMX_HELPER_INTERFACE_MODE_LOOP:
-               case CVMX_HELPER_INTERFACE_MODE_XAUI:
-                       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_PICMG:
-                       cvmx_gmx_set_backpressure_override(interface, 0xf);
-                       break;
-               }
-       }
-#endif
-
-       return 0;
-}
-
-/**
- * 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.
- *
- * @interface: Interface to enable
- *
- * Returns Zero on success, negative on failure
- */
-static int __cvmx_helper_packet_hardware_enable(int interface)
-{
-       int result = 0;
-       switch (cvmx_helper_interface_get_mode(interface)) {
-               /* These types don't support ports to IPD/PKO */
-       case CVMX_HELPER_INTERFACE_MODE_DISABLED:
-       case CVMX_HELPER_INTERFACE_MODE_PCIE:
-               /* Nothing to do */
-               break;
-               /* XAUI is a single high speed port */
-       case CVMX_HELPER_INTERFACE_MODE_XAUI:
-               result = __cvmx_helper_xaui_enable(interface);
-               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:
-               result = __cvmx_helper_rgmii_enable(interface);
-               break;
-               /*
-                * SPI4 can have 1-16 ports depending on the device at
-                * the other end
-                */
-       case CVMX_HELPER_INTERFACE_MODE_SPI:
-               result = __cvmx_helper_spi_enable(interface);
-               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_PICMG:
-               result = __cvmx_helper_sgmii_enable(interface);
-               break;
-               /* PCI target Network Packet Interface */
-       case CVMX_HELPER_INTERFACE_MODE_NPI:
-               result = __cvmx_helper_npi_enable(interface);
-               break;
-               /*
-                * Special loopback only ports. These are not the same
-                * as other ports in loopback mode
-                */
-       case CVMX_HELPER_INTERFACE_MODE_LOOP:
-               result = __cvmx_helper_loop_enable(interface);
-               break;
-       }
-       result |= __cvmx_helper_board_hardware_enable(interface);
-       return result;
-}
-
-/**
- * Function to adjust internal IPD pointer alignments
- *
- * Returns 0 on success
- *         !0 on failure
- */
-int __cvmx_helper_errata_fix_ipd_ptr_alignment(void)
-{
-#define FIX_IPD_FIRST_BUFF_PAYLOAD_BYTES \
-     (CVMX_FPA_PACKET_POOL_SIZE-8-CVMX_HELPER_FIRST_MBUFF_SKIP)
-#define FIX_IPD_NON_FIRST_BUFF_PAYLOAD_BYTES \
-       (CVMX_FPA_PACKET_POOL_SIZE-8-CVMX_HELPER_NOT_FIRST_MBUFF_SKIP)
-#define FIX_IPD_OUTPORT 0
-       /* Ports 0-15 are interface 0, 16-31 are interface 1 */
-#define INTERFACE(port) (port >> 4)
-#define INDEX(port) (port & 0xf)
-       uint64_t *p64;
-       cvmx_pko_command_word0_t pko_command;
-       union cvmx_buf_ptr g_buffer, pkt_buffer;
-       cvmx_wqe_t *work;
-       int size, num_segs = 0, wqe_pcnt, pkt_pcnt;
-       union cvmx_gmxx_prtx_cfg gmx_cfg;
-       int retry_cnt;
-       int retry_loop_cnt;
-       int mtu;
-       int i;
-       cvmx_helper_link_info_t link_info;
-
-       /* Save values for restore at end */
-       uint64_t prtx_cfg =
-           cvmx_read_csr(CVMX_GMXX_PRTX_CFG
-                         (INDEX(FIX_IPD_OUTPORT), INTERFACE(FIX_IPD_OUTPORT)));
-       uint64_t tx_ptr_en =
-           cvmx_read_csr(CVMX_ASXX_TX_PRT_EN(INTERFACE(FIX_IPD_OUTPORT)));
-       uint64_t rx_ptr_en =
-           cvmx_read_csr(CVMX_ASXX_RX_PRT_EN(INTERFACE(FIX_IPD_OUTPORT)));
-       uint64_t rxx_jabber =
-           cvmx_read_csr(CVMX_GMXX_RXX_JABBER
-                         (INDEX(FIX_IPD_OUTPORT), INTERFACE(FIX_IPD_OUTPORT)));
-       uint64_t frame_max =
-           cvmx_read_csr(CVMX_GMXX_RXX_FRM_MAX
-                         (INDEX(FIX_IPD_OUTPORT), INTERFACE(FIX_IPD_OUTPORT)));
-
-       /* Configure port to gig FDX as required for loopback mode */
-       cvmx_helper_rgmii_internal_loopback(FIX_IPD_OUTPORT);
-
-       /*
-        * Disable reception on all ports so if traffic is present it
-        * will not interfere.
-        */
-       cvmx_write_csr(CVMX_ASXX_RX_PRT_EN(INTERFACE(FIX_IPD_OUTPORT)), 0);
-
-       cvmx_wait(100000000ull);
-
-       for (retry_loop_cnt = 0; retry_loop_cnt < 10; retry_loop_cnt++) {
-               retry_cnt = 100000;
-               wqe_pcnt = cvmx_read_csr(CVMX_IPD_PTR_COUNT);
-               pkt_pcnt = (wqe_pcnt >> 7) & 0x7f;
-               wqe_pcnt &= 0x7f;
-
-               num_segs = (2 + pkt_pcnt - wqe_pcnt) & 3;
-
-               if (num_segs == 0)
-                       goto fix_ipd_exit;
-
-               num_segs += 1;
-
-               size =
-                   FIX_IPD_FIRST_BUFF_PAYLOAD_BYTES +
-                   ((num_segs - 1) * FIX_IPD_NON_FIRST_BUFF_PAYLOAD_BYTES) -
-                   (FIX_IPD_NON_FIRST_BUFF_PAYLOAD_BYTES / 2);
-
-               cvmx_write_csr(CVMX_ASXX_PRT_LOOP(INTERFACE(FIX_IPD_OUTPORT)),
-                              1 << INDEX(FIX_IPD_OUTPORT));
-               CVMX_SYNC;
-
-               g_buffer.u64 = 0;
-               g_buffer.s.addr =
-                   cvmx_ptr_to_phys(cvmx_fpa_alloc(CVMX_FPA_WQE_POOL));
-               if (g_buffer.s.addr == 0) {
-                       cvmx_dprintf("WARNING: FIX_IPD_PTR_ALIGNMENT "
-                                    "buffer allocation failure.\n");
-                       goto fix_ipd_exit;
-               }
-
-               g_buffer.s.pool = CVMX_FPA_WQE_POOL;
-               g_buffer.s.size = num_segs;
-
-               pkt_buffer.u64 = 0;
-               pkt_buffer.s.addr =
-                   cvmx_ptr_to_phys(cvmx_fpa_alloc(CVMX_FPA_PACKET_POOL));
-               if (pkt_buffer.s.addr == 0) {
-                       cvmx_dprintf("WARNING: FIX_IPD_PTR_ALIGNMENT "
-                                    "buffer allocation failure.\n");
-                       goto fix_ipd_exit;
-               }
-               pkt_buffer.s.i = 1;
-               pkt_buffer.s.pool = CVMX_FPA_PACKET_POOL;
-               pkt_buffer.s.size = FIX_IPD_FIRST_BUFF_PAYLOAD_BYTES;
-
-               p64 = (uint64_t *) cvmx_phys_to_ptr(pkt_buffer.s.addr);
-               p64[0] = 0xffffffffffff0000ull;
-               p64[1] = 0x08004510ull;
-               p64[2] = ((uint64_t) (size - 14) << 48) | 0x5ae740004000ull;
-               p64[3] = 0x3a5fc0a81073c0a8ull;
-
-               for (i = 0; i < num_segs; i++) {
-                       if (i > 0)
-                               pkt_buffer.s.size =
-                                   FIX_IPD_NON_FIRST_BUFF_PAYLOAD_BYTES;
-
-                       if (i == (num_segs - 1))
-                               pkt_buffer.s.i = 0;
-
-                       *(uint64_t *) cvmx_phys_to_ptr(g_buffer.s.addr +
-                                                      8 * i) = pkt_buffer.u64;
-               }
-
-               /* Build the PKO command */
-               pko_command.u64 = 0;
-               pko_command.s.segs = num_segs;
-               pko_command.s.total_bytes = size;
-               pko_command.s.dontfree = 0;
-               pko_command.s.gather = 1;
-
-               gmx_cfg.u64 =
-                   cvmx_read_csr(CVMX_GMXX_PRTX_CFG
-                                 (INDEX(FIX_IPD_OUTPORT),
-                                  INTERFACE(FIX_IPD_OUTPORT)));
-               gmx_cfg.s.en = 1;
-               cvmx_write_csr(CVMX_GMXX_PRTX_CFG
-                              (INDEX(FIX_IPD_OUTPORT),
-                               INTERFACE(FIX_IPD_OUTPORT)), gmx_cfg.u64);
-               cvmx_write_csr(CVMX_ASXX_TX_PRT_EN(INTERFACE(FIX_IPD_OUTPORT)),
-                              1 << INDEX(FIX_IPD_OUTPORT));
-               cvmx_write_csr(CVMX_ASXX_RX_PRT_EN(INTERFACE(FIX_IPD_OUTPORT)),
-                              1 << INDEX(FIX_IPD_OUTPORT));
-
-               mtu =
-                   cvmx_read_csr(CVMX_GMXX_RXX_JABBER
-                                 (INDEX(FIX_IPD_OUTPORT),
-                                  INTERFACE(FIX_IPD_OUTPORT)));
-               cvmx_write_csr(CVMX_GMXX_RXX_JABBER
-                              (INDEX(FIX_IPD_OUTPORT),
-                               INTERFACE(FIX_IPD_OUTPORT)), 65392 - 14 - 4);
-               cvmx_write_csr(CVMX_GMXX_RXX_FRM_MAX
-                              (INDEX(FIX_IPD_OUTPORT),
-                               INTERFACE(FIX_IPD_OUTPORT)), 65392 - 14 - 4);
-
-               cvmx_pko_send_packet_prepare(FIX_IPD_OUTPORT,
-                                            cvmx_pko_get_base_queue
-                                            (FIX_IPD_OUTPORT),
-                                            CVMX_PKO_LOCK_CMD_QUEUE);
-               cvmx_pko_send_packet_finish(FIX_IPD_OUTPORT,
-                                           cvmx_pko_get_base_queue
-                                           (FIX_IPD_OUTPORT), pko_command,
-                                           g_buffer, CVMX_PKO_LOCK_CMD_QUEUE);
-
-               CVMX_SYNC;
-
-               do {
-                       work = cvmx_pow_work_request_sync(CVMX_POW_WAIT);
-                       retry_cnt--;
-               } while ((work == NULL) && (retry_cnt > 0));
-
-               if (!retry_cnt)
-                       cvmx_dprintf("WARNING: FIX_IPD_PTR_ALIGNMENT "
-                                    "get_work() timeout occurred.\n");
-
-               /* Free packet */
-               if (work)
-                       cvmx_helper_free_packet_data(work);
-       }
-
-fix_ipd_exit:
-
-       /* Return CSR configs to saved values */
-       cvmx_write_csr(CVMX_GMXX_PRTX_CFG
-                      (INDEX(FIX_IPD_OUTPORT), INTERFACE(FIX_IPD_OUTPORT)),
-                      prtx_cfg);
-       cvmx_write_csr(CVMX_ASXX_TX_PRT_EN(INTERFACE(FIX_IPD_OUTPORT)),
-                      tx_ptr_en);
-       cvmx_write_csr(CVMX_ASXX_RX_PRT_EN(INTERFACE(FIX_IPD_OUTPORT)),
-                      rx_ptr_en);
-       cvmx_write_csr(CVMX_GMXX_RXX_JABBER
-                      (INDEX(FIX_IPD_OUTPORT), INTERFACE(FIX_IPD_OUTPORT)),
-                      rxx_jabber);
-       cvmx_write_csr(CVMX_GMXX_RXX_FRM_MAX
-                      (INDEX(FIX_IPD_OUTPORT), INTERFACE(FIX_IPD_OUTPORT)),
-                      frame_max);
-       cvmx_write_csr(CVMX_ASXX_PRT_LOOP(INTERFACE(FIX_IPD_OUTPORT)), 0);
-       /* Set link to down so autonegotiation will set it up again */
-       link_info.u64 = 0;
-       cvmx_helper_link_set(FIX_IPD_OUTPORT, link_info);
-
-       /*
-        * Bring the link back up as autonegotiation is not done in
-        * user applications.
-        */
-       cvmx_helper_link_autoconf(FIX_IPD_OUTPORT);
-
-       CVMX_SYNC;
-       if (num_segs)
-               cvmx_dprintf("WARNING: FIX_IPD_PTR_ALIGNMENT failed.\n");
-
-       return !!num_segs;
-
-}
-
-/**
- * Called after all internal packet IO paths are setup. This
- * function enables IPD/PIP and begins packet input and output.
- *
- * Returns Zero on success, negative on failure
- */
-int cvmx_helper_ipd_and_packet_input_enable(void)
-{
-       int num_interfaces;
-       int interface;
-
-       /* 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++) {
-               if (cvmx_helper_ports_on_interface(interface) > 0)
-                       __cvmx_helper_packet_hardware_enable(interface);
-       }
-
-       /* Finally enable PKO now that the entire path is up and running */
-       cvmx_pko_enable();
-
-       if ((OCTEON_IS_MODEL(OCTEON_CN31XX_PASS1)
-            || OCTEON_IS_MODEL(OCTEON_CN30XX_PASS1))
-           && (cvmx_sysinfo_get()->board_type != CVMX_BOARD_TYPE_SIM))
-               __cvmx_helper_errata_fix_ipd_ptr_alignment();
-       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.
- *
- * Returns Zero on success, non-zero on failure
- */
-int cvmx_helper_initialize_packet_io_global(void)
-{
-       int result = 0;
-       int interface;
-       union cvmx_l2c_cfg l2c_cfg;
-       union cvmx_smix_en smix_en;
-       const int num_interfaces = cvmx_helper_get_number_of_interfaces();
-
-       /*
-        * CN52XX pass 1: Due to a bug in 2nd order CDR, it needs to
-        * be disabled.
-        */
-       if (OCTEON_IS_MODEL(OCTEON_CN52XX_PASS1_0))
-               __cvmx_helper_errata_qlm_disable_2nd_order_cdr(1);
-
-       /*
-        * 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.
-        */
-       l2c_cfg.u64 = cvmx_read_csr(CVMX_L2C_CFG);
-       l2c_cfg.s.lrf_arb_mode = 0;
-       l2c_cfg.s.rfb_arb_mode = 0;
-       cvmx_write_csr(CVMX_L2C_CFG, l2c_cfg.u64);
-
-       /* Make sure SMI/MDIO is enabled so we can query PHYs */
-       smix_en.u64 = cvmx_read_csr(CVMX_SMIX_EN(0));
-       if (!smix_en.s.en) {
-               smix_en.s.en = 1;
-               cvmx_write_csr(CVMX_SMIX_EN(0), smix_en.u64);
-       }
-
-       /* Newer chips actually have two SMI/MDIO interfaces */
-       if (!OCTEON_IS_MODEL(OCTEON_CN3XXX) &&
-           !OCTEON_IS_MODEL(OCTEON_CN58XX) &&
-           !OCTEON_IS_MODEL(OCTEON_CN50XX)) {
-               smix_en.u64 = cvmx_read_csr(CVMX_SMIX_EN(1));
-               if (!smix_en.s.en) {
-                       smix_en.s.en = 1;
-                       cvmx_write_csr(CVMX_SMIX_EN(1), smix_en.u64);
-               }
-       }
-
-       cvmx_pko_initialize_global();
-       for (interface = 0; interface < num_interfaces; interface++) {
-               result |= cvmx_helper_interface_probe(interface);
-               if (cvmx_helper_ports_on_interface(interface) > 0)
-                       cvmx_dprintf("Interface %d has %d ports (%s)\n",
-                                    interface,
-                                    cvmx_helper_ports_on_interface(interface),
-                                    cvmx_helper_interface_mode_to_string
-                                    (cvmx_helper_interface_get_mode
-                                     (interface)));
-               result |= __cvmx_helper_interface_setup_ipd(interface);
-               result |= __cvmx_helper_interface_setup_pko(interface);
-       }
-
-       result |= __cvmx_helper_global_setup_ipd();
-       result |= __cvmx_helper_global_setup_pko();
-
-       /* Enable any flow control and backpressure */
-       result |= __cvmx_helper_global_setup_backpressure();
-
-#if CVMX_HELPER_ENABLE_IPD
-       result |= cvmx_helper_ipd_and_packet_input_enable();
-#endif
-       return result;
-}
-
-/**
- * Does core local initialization for packet io
- *
- * Returns Zero on success, non-zero on failure
- */
-int cvmx_helper_initialize_packet_io_local(void)
-{
-       return cvmx_pko_initialize_local();
-}
-
-/**
- * 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));
- *
- * @ipd_port: IPD/PKO port to auto configure
- *
- * Returns Link state after configure
- */
-cvmx_helper_link_info_t cvmx_helper_link_autoconf(int ipd_port)
-{
-       cvmx_helper_link_info_t link_info;
-       int interface = cvmx_helper_get_interface_num(ipd_port);
-       int index = cvmx_helper_get_interface_index_num(ipd_port);
-
-       if (index >= cvmx_helper_ports_on_interface(interface)) {
-               link_info.u64 = 0;
-               return link_info;
-       }
-
-       link_info = cvmx_helper_link_get(ipd_port);
-       if (link_info.u64 == port_link_info[ipd_port].u64)
-               return link_info;
-
-       /* If we fail to set the link speed, port_link_info will not change */
-       cvmx_helper_link_set(ipd_port, link_info);
-
-       /*
-        * port_link_info should be the current value, which will be
-        * different than expect if cvmx_helper_link_set() failed.
-        */
-       return port_link_info[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().
- *
- * @ipd_port: IPD/PKO port to query
- *
- * Returns Link state
- */
-cvmx_helper_link_info_t cvmx_helper_link_get(int ipd_port)
-{
-       cvmx_helper_link_info_t result;
-       int interface = cvmx_helper_get_interface_num(ipd_port);
-       int index = cvmx_helper_get_interface_index_num(ipd_port);
-
-       /* The default result will be a down link unless the code below
-          changes it */
-       result.u64 = 0;
-
-       if (index >= cvmx_helper_ports_on_interface(interface))
-               return result;
-
-       switch (cvmx_helper_interface_get_mode(interface)) {
-       case CVMX_HELPER_INTERFACE_MODE_DISABLED:
-       case CVMX_HELPER_INTERFACE_MODE_PCIE:
-               /* Network links are not supported */
-               break;
-       case CVMX_HELPER_INTERFACE_MODE_XAUI:
-               result = __cvmx_helper_xaui_link_get(ipd_port);
-               break;
-       case CVMX_HELPER_INTERFACE_MODE_GMII:
-               if (index == 0)
-                       result = __cvmx_helper_rgmii_link_get(ipd_port);
-               else {
-                       result.s.full_duplex = 1;
-                       result.s.link_up = 1;
-                       result.s.speed = 1000;
-               }
-               break;
-       case CVMX_HELPER_INTERFACE_MODE_RGMII:
-               result = __cvmx_helper_rgmii_link_get(ipd_port);
-               break;
-       case CVMX_HELPER_INTERFACE_MODE_SPI:
-               result = __cvmx_helper_spi_link_get(ipd_port);
-               break;
-       case CVMX_HELPER_INTERFACE_MODE_SGMII:
-       case CVMX_HELPER_INTERFACE_MODE_PICMG:
-               result = __cvmx_helper_sgmii_link_get(ipd_port);
-               break;
-       case CVMX_HELPER_INTERFACE_MODE_NPI:
-       case CVMX_HELPER_INTERFACE_MODE_LOOP:
-               /* Network links are not supported */
-               break;
-       }
-       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.
- *
- * @ipd_port:  IPD/PKO port to configure
- * @link_info: The new link state
- *
- * Returns Zero on success, negative on failure
- */
-int cvmx_helper_link_set(int ipd_port, cvmx_helper_link_info_t link_info)
-{
-       int result = -1;
-       int interface = cvmx_helper_get_interface_num(ipd_port);
-       int index = cvmx_helper_get_interface_index_num(ipd_port);
-
-       if (index >= cvmx_helper_ports_on_interface(interface))
-               return -1;
-
-       switch (cvmx_helper_interface_get_mode(interface)) {
-       case CVMX_HELPER_INTERFACE_MODE_DISABLED:
-       case CVMX_HELPER_INTERFACE_MODE_PCIE:
-               break;
-       case CVMX_HELPER_INTERFACE_MODE_XAUI:
-               result = __cvmx_helper_xaui_link_set(ipd_port, link_info);
-               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:
-               result = __cvmx_helper_rgmii_link_set(ipd_port, link_info);
-               break;
-       case CVMX_HELPER_INTERFACE_MODE_SPI:
-               result = __cvmx_helper_spi_link_set(ipd_port, link_info);
-               break;
-       case CVMX_HELPER_INTERFACE_MODE_SGMII:
-       case CVMX_HELPER_INTERFACE_MODE_PICMG:
-               result = __cvmx_helper_sgmii_link_set(ipd_port, link_info);
-               break;
-       case CVMX_HELPER_INTERFACE_MODE_NPI:
-       case CVMX_HELPER_INTERFACE_MODE_LOOP:
-               break;
-       }
-       /* 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)
-               port_link_info[ipd_port].u64 = link_info.u64;
-       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.
- *
- * @ipd_port: IPD/PKO port to loopback.
- * @enable_internal:
- *                 Non zero if you want internal loopback
- * @enable_external:
- *                 Non zero if you want external loopback
- *
- * Returns Zero on success, negative on failure.
- */
-int cvmx_helper_configure_loopback(int ipd_port, int enable_internal,
-                                  int enable_external)
-{
-       int result = -1;
-       int interface = cvmx_helper_get_interface_num(ipd_port);
-       int index = cvmx_helper_get_interface_index_num(ipd_port);
-
-       if (index >= cvmx_helper_ports_on_interface(interface))
-               return -1;
-
-       switch (cvmx_helper_interface_get_mode(interface)) {
-       case CVMX_HELPER_INTERFACE_MODE_DISABLED:
-       case CVMX_HELPER_INTERFACE_MODE_PCIE:
-       case CVMX_HELPER_INTERFACE_MODE_SPI:
-       case CVMX_HELPER_INTERFACE_MODE_NPI:
-       case CVMX_HELPER_INTERFACE_MODE_LOOP:
-               break;
-       case CVMX_HELPER_INTERFACE_MODE_XAUI:
-               result =
-                   __cvmx_helper_xaui_configure_loopback(ipd_port,
-                                                         enable_internal,
-                                                         enable_external);
-               break;
-       case CVMX_HELPER_INTERFACE_MODE_RGMII:
-       case CVMX_HELPER_INTERFACE_MODE_GMII:
-               result =
-                   __cvmx_helper_rgmii_configure_loopback(ipd_port,
-                                                          enable_internal,
-                                                          enable_external);
-               break;
-       case CVMX_HELPER_INTERFACE_MODE_SGMII:
-       case CVMX_HELPER_INTERFACE_MODE_PICMG:
-               result =
-                   __cvmx_helper_sgmii_configure_loopback(ipd_port,
-                                                          enable_internal,
-                                                          enable_external);
-               break;
-       }
-       return result;
-}
diff --git a/drivers/staging/octeon/cvmx-helper.h b/drivers/staging/octeon/cvmx-helper.h
deleted file mode 100644 (file)
index 51916f3..0000000
+++ /dev/null
@@ -1,227 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- *
- * Helper functions for common, but complicated tasks.
- *
- */
-
-#ifndef __CVMX_HELPER_H__
-#define __CVMX_HELPER_H__
-
-#include "cvmx-config.h"
-#include "cvmx-fpa.h"
-#include "cvmx-wqe.h"
-
-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_t;
-
-typedef union {
-       uint64_t u64;
-       struct {
-               uint64_t reserved_20_63:44;
-               uint64_t link_up:1;         /**< Is the physical link up? */
-               uint64_t full_duplex:1;     /**< 1 if the link is full duplex */
-               uint64_t speed:18;          /**< Speed of the link in Mbps */
-       } s;
-} cvmx_helper_link_info_t;
-
-#include "cvmx-helper-fpa.h"
-
-#include <asm/octeon/cvmx-helper-errata.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-util.h"
-#include "cvmx-helper-xaui.h"
-
-/**
- * cvmx_override_pko_queue_priority(int ipd_port, uint64_t
- * 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.
- */
-extern void (*cvmx_override_pko_queue_priority) (int pko_port,
-                                                uint64_t priorities[16]);
-
-/**
- * cvmx_override_ipd_port_setup(int ipd_port) is a function
- * pointer. It is meant to allow customization of the IPD port
- * 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.
- */
-extern void (*cvmx_override_ipd_port_setup) (int ipd_port);
-
-/**
- * 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.
- *
- * Returns 0 on success
- *         -1 on failure
- */
-extern int cvmx_helper_ipd_and_packet_input_enable(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.
- *
- * Returns Zero on success, non-zero on failure
- */
-extern int cvmx_helper_initialize_packet_io_global(void);
-
-/**
- * Does core local initialization for packet io
- *
- * Returns Zero on success, non-zero on failure
- */
-extern int cvmx_helper_initialize_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.
- *
- * @interface: Which interface to return port count for.
- *
- * Returns Port count for interface
- *         -1 for uninitialized interface
- */
-extern 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.
- *
- * Returns Number of interfaces on chip
- */
-extern 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.
- *
- * @interface: Interface to probe
- *
- * Returns Mode of the interface. Unknown or unsupported interfaces return
- *         DISABLED.
- */
-extern cvmx_helper_interface_mode_t cvmx_helper_interface_get_mode(int
-                                                                  interface);
-
-/**
- * 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));
- *
- * @ipd_port: IPD/PKO port to auto configure
- *
- * Returns Link state after configure
- */
-extern 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().
- *
- * @ipd_port: IPD/PKO port to query
- *
- * Returns Link state
- */
-extern 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.
- *
- * @ipd_port:  IPD/PKO port to configure
- * @link_info: The new link state
- *
- * Returns Zero on success, negative on failure
- */
-extern 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 doesn't setup the
- * ports or enable them. The main goal here is to set the global
- * interface_port_count[interface] correctly. Hardware setup of the
- * ports will be performed later.
- *
- * @interface: Interface to probe
- *
- * Returns Zero on success, negative on failure
- */
-extern int cvmx_helper_interface_probe(int interface);
-
-/**
- * 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.
- *
- * @ipd_port: IPD/PKO port to loopback.
- * @enable_internal:
- *                 Non zero if you want internal loopback
- * @enable_external:
- *                 Non zero if you want external loopback
- *
- * Returns Zero on success, negative on failure.
- */
-extern int cvmx_helper_configure_loopback(int ipd_port, int enable_internal,
-                                         int enable_external);
-
-#endif /* __CVMX_HELPER_H__ */
diff --git a/drivers/staging/octeon/cvmx-interrupt-decodes.c b/drivers/staging/octeon/cvmx-interrupt-decodes.c
deleted file mode 100644 (file)
index a3337e3..0000000
+++ /dev/null
@@ -1,371 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2009 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- *
- * Automatically generated functions useful for enabling
- * and decoding RSL_INT_BLOCKS interrupts.
- *
- */
-
-#include <asm/octeon/octeon.h>
-
-#include "cvmx-gmxx-defs.h"
-#include "cvmx-pcsx-defs.h"
-#include "cvmx-pcsxx-defs.h"
-#include "cvmx-spxx-defs.h"
-#include "cvmx-stxx-defs.h"
-
-#ifndef PRINT_ERROR
-#define PRINT_ERROR(format, ...)
-#endif
-
-
-/**
- * __cvmx_interrupt_gmxx_rxx_int_en_enable enables all interrupt bits in cvmx_gmxx_rxx_int_en_t
- */
-void __cvmx_interrupt_gmxx_rxx_int_en_enable(int index, int block)
-{
-       union cvmx_gmxx_rxx_int_en gmx_rx_int_en;
-       cvmx_write_csr(CVMX_GMXX_RXX_INT_REG(index, block),
-                      cvmx_read_csr(CVMX_GMXX_RXX_INT_REG(index, block)));
-       gmx_rx_int_en.u64 = 0;
-       if (OCTEON_IS_MODEL(OCTEON_CN56XX)) {
-               /* Skipping gmx_rx_int_en.s.reserved_29_63 */
-               gmx_rx_int_en.s.hg2cc = 1;
-               gmx_rx_int_en.s.hg2fld = 1;
-               gmx_rx_int_en.s.undat = 1;
-               gmx_rx_int_en.s.uneop = 1;
-               gmx_rx_int_en.s.unsop = 1;
-               gmx_rx_int_en.s.bad_term = 1;
-               gmx_rx_int_en.s.bad_seq = 1;
-               gmx_rx_int_en.s.rem_fault = 1;
-               gmx_rx_int_en.s.loc_fault = 1;
-               gmx_rx_int_en.s.pause_drp = 1;
-               /* Skipping gmx_rx_int_en.s.reserved_16_18 */
-               /*gmx_rx_int_en.s.ifgerr = 1; */
-               /*gmx_rx_int_en.s.coldet = 1; // Collsion detect */
-               /*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
-               /*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
-               /*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
-               gmx_rx_int_en.s.ovrerr = 1;
-               /* Skipping gmx_rx_int_en.s.reserved_9_9 */
-               gmx_rx_int_en.s.skperr = 1;
-               gmx_rx_int_en.s.rcverr = 1;
-               /* Skipping gmx_rx_int_en.s.reserved_5_6 */
-               /*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
-               gmx_rx_int_en.s.jabber = 1;
-               /* Skipping gmx_rx_int_en.s.reserved_2_2 */
-               gmx_rx_int_en.s.carext = 1;
-               /* Skipping gmx_rx_int_en.s.reserved_0_0 */
-       }
-       if (OCTEON_IS_MODEL(OCTEON_CN30XX)) {
-               /* Skipping gmx_rx_int_en.s.reserved_19_63 */
-               /*gmx_rx_int_en.s.phy_dupx = 1; */
-               /*gmx_rx_int_en.s.phy_spd = 1; */
-               /*gmx_rx_int_en.s.phy_link = 1; */
-               /*gmx_rx_int_en.s.ifgerr = 1; */
-               /*gmx_rx_int_en.s.coldet = 1; // Collsion detect */
-               /*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
-               /*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
-               /*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
-               gmx_rx_int_en.s.ovrerr = 1;
-               gmx_rx_int_en.s.niberr = 1;
-               gmx_rx_int_en.s.skperr = 1;
-               gmx_rx_int_en.s.rcverr = 1;
-               /*gmx_rx_int_en.s.lenerr = 1; // Length errors are handled when we get work */
-               gmx_rx_int_en.s.alnerr = 1;
-               /*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
-               gmx_rx_int_en.s.jabber = 1;
-               gmx_rx_int_en.s.maxerr = 1;
-               gmx_rx_int_en.s.carext = 1;
-               gmx_rx_int_en.s.minerr = 1;
-       }
-       if (OCTEON_IS_MODEL(OCTEON_CN50XX)) {
-               /* Skipping gmx_rx_int_en.s.reserved_20_63 */
-               gmx_rx_int_en.s.pause_drp = 1;
-               /*gmx_rx_int_en.s.phy_dupx = 1; */
-               /*gmx_rx_int_en.s.phy_spd = 1; */
-               /*gmx_rx_int_en.s.phy_link = 1; */
-               /*gmx_rx_int_en.s.ifgerr = 1; */
-               /*gmx_rx_int_en.s.coldet = 1; // Collsion detect */
-               /*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
-               /*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
-               /*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
-               gmx_rx_int_en.s.ovrerr = 1;
-               gmx_rx_int_en.s.niberr = 1;
-               gmx_rx_int_en.s.skperr = 1;
-               gmx_rx_int_en.s.rcverr = 1;
-               /* Skipping gmx_rx_int_en.s.reserved_6_6 */
-               gmx_rx_int_en.s.alnerr = 1;
-               /*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
-               gmx_rx_int_en.s.jabber = 1;
-               /* Skipping gmx_rx_int_en.s.reserved_2_2 */
-               gmx_rx_int_en.s.carext = 1;
-               /* Skipping gmx_rx_int_en.s.reserved_0_0 */
-       }
-       if (OCTEON_IS_MODEL(OCTEON_CN38XX)) {
-               /* Skipping gmx_rx_int_en.s.reserved_19_63 */
-               /*gmx_rx_int_en.s.phy_dupx = 1; */
-               /*gmx_rx_int_en.s.phy_spd = 1; */
-               /*gmx_rx_int_en.s.phy_link = 1; */
-               /*gmx_rx_int_en.s.ifgerr = 1; */
-               /*gmx_rx_int_en.s.coldet = 1; // Collsion detect */
-               /*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
-               /*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
-               /*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
-               gmx_rx_int_en.s.ovrerr = 1;
-               gmx_rx_int_en.s.niberr = 1;
-               gmx_rx_int_en.s.skperr = 1;
-               gmx_rx_int_en.s.rcverr = 1;
-               /*gmx_rx_int_en.s.lenerr = 1; // Length errors are handled when we get work */
-               gmx_rx_int_en.s.alnerr = 1;
-               /*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
-               gmx_rx_int_en.s.jabber = 1;
-               gmx_rx_int_en.s.maxerr = 1;
-               gmx_rx_int_en.s.carext = 1;
-               gmx_rx_int_en.s.minerr = 1;
-       }
-       if (OCTEON_IS_MODEL(OCTEON_CN31XX)) {
-               /* Skipping gmx_rx_int_en.s.reserved_19_63 */
-               /*gmx_rx_int_en.s.phy_dupx = 1; */
-               /*gmx_rx_int_en.s.phy_spd = 1; */
-               /*gmx_rx_int_en.s.phy_link = 1; */
-               /*gmx_rx_int_en.s.ifgerr = 1; */
-               /*gmx_rx_int_en.s.coldet = 1; // Collsion detect */
-               /*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
-               /*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
-               /*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
-               gmx_rx_int_en.s.ovrerr = 1;
-               gmx_rx_int_en.s.niberr = 1;
-               gmx_rx_int_en.s.skperr = 1;
-               gmx_rx_int_en.s.rcverr = 1;
-               /*gmx_rx_int_en.s.lenerr = 1; // Length errors are handled when we get work */
-               gmx_rx_int_en.s.alnerr = 1;
-               /*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
-               gmx_rx_int_en.s.jabber = 1;
-               gmx_rx_int_en.s.maxerr = 1;
-               gmx_rx_int_en.s.carext = 1;
-               gmx_rx_int_en.s.minerr = 1;
-       }
-       if (OCTEON_IS_MODEL(OCTEON_CN58XX)) {
-               /* Skipping gmx_rx_int_en.s.reserved_20_63 */
-               gmx_rx_int_en.s.pause_drp = 1;
-               /*gmx_rx_int_en.s.phy_dupx = 1; */
-               /*gmx_rx_int_en.s.phy_spd = 1; */
-               /*gmx_rx_int_en.s.phy_link = 1; */
-               /*gmx_rx_int_en.s.ifgerr = 1; */
-               /*gmx_rx_int_en.s.coldet = 1; // Collsion detect */
-               /*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
-               /*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
-               /*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
-               gmx_rx_int_en.s.ovrerr = 1;
-               gmx_rx_int_en.s.niberr = 1;
-               gmx_rx_int_en.s.skperr = 1;
-               gmx_rx_int_en.s.rcverr = 1;
-               /*gmx_rx_int_en.s.lenerr = 1; // Length errors are handled when we get work */
-               gmx_rx_int_en.s.alnerr = 1;
-               /*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
-               gmx_rx_int_en.s.jabber = 1;
-               gmx_rx_int_en.s.maxerr = 1;
-               gmx_rx_int_en.s.carext = 1;
-               gmx_rx_int_en.s.minerr = 1;
-       }
-       if (OCTEON_IS_MODEL(OCTEON_CN52XX)) {
-               /* Skipping gmx_rx_int_en.s.reserved_29_63 */
-               gmx_rx_int_en.s.hg2cc = 1;
-               gmx_rx_int_en.s.hg2fld = 1;
-               gmx_rx_int_en.s.undat = 1;
-               gmx_rx_int_en.s.uneop = 1;
-               gmx_rx_int_en.s.unsop = 1;
-               gmx_rx_int_en.s.bad_term = 1;
-               gmx_rx_int_en.s.bad_seq = 0;
-               gmx_rx_int_en.s.rem_fault = 1;
-               gmx_rx_int_en.s.loc_fault = 0;
-               gmx_rx_int_en.s.pause_drp = 1;
-               /* Skipping gmx_rx_int_en.s.reserved_16_18 */
-               /*gmx_rx_int_en.s.ifgerr = 1; */
-               /*gmx_rx_int_en.s.coldet = 1; // Collsion detect */
-               /*gmx_rx_int_en.s.falerr = 1; // False carrier error or extend error after slottime */
-               /*gmx_rx_int_en.s.rsverr = 1; // RGMII reserved opcodes */
-               /*gmx_rx_int_en.s.pcterr = 1; // Bad Preamble / Protocol */
-               gmx_rx_int_en.s.ovrerr = 1;
-               /* Skipping gmx_rx_int_en.s.reserved_9_9 */
-               gmx_rx_int_en.s.skperr = 1;
-               gmx_rx_int_en.s.rcverr = 1;
-               /* Skipping gmx_rx_int_en.s.reserved_5_6 */
-               /*gmx_rx_int_en.s.fcserr = 1; // FCS errors are handled when we get work */
-               gmx_rx_int_en.s.jabber = 1;
-               /* Skipping gmx_rx_int_en.s.reserved_2_2 */
-               gmx_rx_int_en.s.carext = 1;
-               /* Skipping gmx_rx_int_en.s.reserved_0_0 */
-       }
-       cvmx_write_csr(CVMX_GMXX_RXX_INT_EN(index, block), gmx_rx_int_en.u64);
-}
-/**
- * __cvmx_interrupt_pcsx_intx_en_reg_enable enables all interrupt bits in cvmx_pcsx_intx_en_reg_t
- */
-void __cvmx_interrupt_pcsx_intx_en_reg_enable(int index, int block)
-{
-       union cvmx_pcsx_intx_en_reg pcs_int_en_reg;
-       cvmx_write_csr(CVMX_PCSX_INTX_REG(index, block),
-                      cvmx_read_csr(CVMX_PCSX_INTX_REG(index, block)));
-       pcs_int_en_reg.u64 = 0;
-       if (OCTEON_IS_MODEL(OCTEON_CN56XX)) {
-               /* Skipping pcs_int_en_reg.s.reserved_12_63 */
-               /*pcs_int_en_reg.s.dup = 1; // This happens during normal operation */
-               pcs_int_en_reg.s.sync_bad_en = 1;
-               pcs_int_en_reg.s.an_bad_en = 1;
-               pcs_int_en_reg.s.rxlock_en = 1;
-               pcs_int_en_reg.s.rxbad_en = 1;
-               /*pcs_int_en_reg.s.rxerr_en = 1; // This happens during normal operation */
-               pcs_int_en_reg.s.txbad_en = 1;
-               pcs_int_en_reg.s.txfifo_en = 1;
-               pcs_int_en_reg.s.txfifu_en = 1;
-               pcs_int_en_reg.s.an_err_en = 1;
-               /*pcs_int_en_reg.s.xmit_en = 1; // This happens during normal operation */
-               /*pcs_int_en_reg.s.lnkspd_en = 1; // This happens during normal operation */
-       }
-       if (OCTEON_IS_MODEL(OCTEON_CN52XX)) {
-               /* Skipping pcs_int_en_reg.s.reserved_12_63 */
-               /*pcs_int_en_reg.s.dup = 1; // This happens during normal operation */
-               pcs_int_en_reg.s.sync_bad_en = 1;
-               pcs_int_en_reg.s.an_bad_en = 1;
-               pcs_int_en_reg.s.rxlock_en = 1;
-               pcs_int_en_reg.s.rxbad_en = 1;
-               /*pcs_int_en_reg.s.rxerr_en = 1; // This happens during normal operation */
-               pcs_int_en_reg.s.txbad_en = 1;
-               pcs_int_en_reg.s.txfifo_en = 1;
-               pcs_int_en_reg.s.txfifu_en = 1;
-               pcs_int_en_reg.s.an_err_en = 1;
-               /*pcs_int_en_reg.s.xmit_en = 1; // This happens during normal operation */
-               /*pcs_int_en_reg.s.lnkspd_en = 1; // This happens during normal operation */
-       }
-       cvmx_write_csr(CVMX_PCSX_INTX_EN_REG(index, block), pcs_int_en_reg.u64);
-}
-/**
- * __cvmx_interrupt_pcsxx_int_en_reg_enable enables all interrupt bits in cvmx_pcsxx_int_en_reg_t
- */
-void __cvmx_interrupt_pcsxx_int_en_reg_enable(int index)
-{
-       union cvmx_pcsxx_int_en_reg pcsx_int_en_reg;
-       cvmx_write_csr(CVMX_PCSXX_INT_REG(index),
-                      cvmx_read_csr(CVMX_PCSXX_INT_REG(index)));
-       pcsx_int_en_reg.u64 = 0;
-       if (OCTEON_IS_MODEL(OCTEON_CN56XX)) {
-               /* Skipping pcsx_int_en_reg.s.reserved_6_63 */
-               pcsx_int_en_reg.s.algnlos_en = 1;
-               pcsx_int_en_reg.s.synlos_en = 1;
-               pcsx_int_en_reg.s.bitlckls_en = 1;
-               pcsx_int_en_reg.s.rxsynbad_en = 1;
-               pcsx_int_en_reg.s.rxbad_en = 1;
-               pcsx_int_en_reg.s.txflt_en = 1;
-       }
-       if (OCTEON_IS_MODEL(OCTEON_CN52XX)) {
-               /* Skipping pcsx_int_en_reg.s.reserved_6_63 */
-               pcsx_int_en_reg.s.algnlos_en = 1;
-               pcsx_int_en_reg.s.synlos_en = 1;
-               pcsx_int_en_reg.s.bitlckls_en = 0;      /* Happens if XAUI module is not installed */
-               pcsx_int_en_reg.s.rxsynbad_en = 1;
-               pcsx_int_en_reg.s.rxbad_en = 1;
-               pcsx_int_en_reg.s.txflt_en = 1;
-       }
-       cvmx_write_csr(CVMX_PCSXX_INT_EN_REG(index), pcsx_int_en_reg.u64);
-}
-
-/**
- * __cvmx_interrupt_spxx_int_msk_enable enables all interrupt bits in cvmx_spxx_int_msk_t
- */
-void __cvmx_interrupt_spxx_int_msk_enable(int index)
-{
-       union cvmx_spxx_int_msk spx_int_msk;
-       cvmx_write_csr(CVMX_SPXX_INT_REG(index),
-                      cvmx_read_csr(CVMX_SPXX_INT_REG(index)));
-       spx_int_msk.u64 = 0;
-       if (OCTEON_IS_MODEL(OCTEON_CN38XX)) {
-               /* Skipping spx_int_msk.s.reserved_12_63 */
-               spx_int_msk.s.calerr = 1;
-               spx_int_msk.s.syncerr = 1;
-               spx_int_msk.s.diperr = 1;
-               spx_int_msk.s.tpaovr = 1;
-               spx_int_msk.s.rsverr = 1;
-               spx_int_msk.s.drwnng = 1;
-               spx_int_msk.s.clserr = 1;
-               spx_int_msk.s.spiovr = 1;
-               /* Skipping spx_int_msk.s.reserved_2_3 */
-               spx_int_msk.s.abnorm = 1;
-               spx_int_msk.s.prtnxa = 1;
-       }
-       if (OCTEON_IS_MODEL(OCTEON_CN58XX)) {
-               /* Skipping spx_int_msk.s.reserved_12_63 */
-               spx_int_msk.s.calerr = 1;
-               spx_int_msk.s.syncerr = 1;
-               spx_int_msk.s.diperr = 1;
-               spx_int_msk.s.tpaovr = 1;
-               spx_int_msk.s.rsverr = 1;
-               spx_int_msk.s.drwnng = 1;
-               spx_int_msk.s.clserr = 1;
-               spx_int_msk.s.spiovr = 1;
-               /* Skipping spx_int_msk.s.reserved_2_3 */
-               spx_int_msk.s.abnorm = 1;
-               spx_int_msk.s.prtnxa = 1;
-       }
-       cvmx_write_csr(CVMX_SPXX_INT_MSK(index), spx_int_msk.u64);
-}
-/**
- * __cvmx_interrupt_stxx_int_msk_enable enables all interrupt bits in cvmx_stxx_int_msk_t
- */
-void __cvmx_interrupt_stxx_int_msk_enable(int index)
-{
-       union cvmx_stxx_int_msk stx_int_msk;
-       cvmx_write_csr(CVMX_STXX_INT_REG(index),
-                      cvmx_read_csr(CVMX_STXX_INT_REG(index)));
-       stx_int_msk.u64 = 0;
-       if (OCTEON_IS_MODEL(OCTEON_CN38XX)) {
-               /* Skipping stx_int_msk.s.reserved_8_63 */
-               stx_int_msk.s.frmerr = 1;
-               stx_int_msk.s.unxfrm = 1;
-               stx_int_msk.s.nosync = 1;
-               stx_int_msk.s.diperr = 1;
-               stx_int_msk.s.datovr = 1;
-               stx_int_msk.s.ovrbst = 1;
-               stx_int_msk.s.calpar1 = 1;
-               stx_int_msk.s.calpar0 = 1;
-       }
-       if (OCTEON_IS_MODEL(OCTEON_CN58XX)) {
-               /* Skipping stx_int_msk.s.reserved_8_63 */
-               stx_int_msk.s.frmerr = 1;
-               stx_int_msk.s.unxfrm = 1;
-               stx_int_msk.s.nosync = 1;
-               stx_int_msk.s.diperr = 1;
-               stx_int_msk.s.datovr = 1;
-               stx_int_msk.s.ovrbst = 1;
-               stx_int_msk.s.calpar1 = 1;
-               stx_int_msk.s.calpar0 = 1;
-       }
-       cvmx_write_csr(CVMX_STXX_INT_MSK(index), stx_int_msk.u64);
-}
diff --git a/drivers/staging/octeon/cvmx-interrupt-rsl.c b/drivers/staging/octeon/cvmx-interrupt-rsl.c
deleted file mode 100644 (file)
index df50048..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- * Utility functions to decode Octeon's RSL_INT_BLOCKS
- * interrupts into error messages.
- */
-
-#include <asm/octeon/octeon.h>
-
-#include "cvmx-asxx-defs.h"
-#include "cvmx-gmxx-defs.h"
-
-#ifndef PRINT_ERROR
-#define PRINT_ERROR(format, ...)
-#endif
-
-void __cvmx_interrupt_gmxx_rxx_int_en_enable(int index, int block);
-
-/**
- * Enable ASX error interrupts that exist on CN3XXX, CN50XX, and
- * CN58XX.
- *
- * @block:  Interface to enable 0-1
- */
-void __cvmx_interrupt_asxx_enable(int block)
-{
-       int mask;
-       union cvmx_asxx_int_en csr;
-       /*
-        * CN38XX and CN58XX have two interfaces with 4 ports per
-        * interface. All other chips have a max of 3 ports on
-        * interface 0
-        */
-       if (OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX))
-               mask = 0xf;     /* Set enables for 4 ports */
-       else
-               mask = 0x7;     /* Set enables for 3 ports */
-
-       /* Enable interface interrupts */
-       csr.u64 = cvmx_read_csr(CVMX_ASXX_INT_EN(block));
-       csr.s.txpsh = mask;
-       csr.s.txpop = mask;
-       csr.s.ovrflw = mask;
-       cvmx_write_csr(CVMX_ASXX_INT_EN(block), csr.u64);
-}
-/**
- * Enable GMX error reporting for the supplied interface
- *
- * @interface: Interface to enable
- */
-void __cvmx_interrupt_gmxx_enable(int interface)
-{
-       union cvmx_gmxx_inf_mode mode;
-       union cvmx_gmxx_tx_int_en gmx_tx_int_en;
-       int num_ports;
-       int index;
-
-       mode.u64 = cvmx_read_csr(CVMX_GMXX_INF_MODE(interface));
-
-       if (OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN52XX)) {
-               if (mode.s.en) {
-                       switch (mode.cn56xx.mode) {
-                       case 1: /* XAUI */
-                               num_ports = 1;
-                               break;
-                       case 2: /* SGMII */
-                       case 3: /* PICMG */
-                               num_ports = 4;
-                               break;
-                       default:        /* Disabled */
-                               num_ports = 0;
-                               break;
-                       }
-               } else
-                       num_ports = 0;
-       } else {
-               if (mode.s.en) {
-                       if (OCTEON_IS_MODEL(OCTEON_CN38XX)
-                           || OCTEON_IS_MODEL(OCTEON_CN58XX)) {
-                               /*
-                                * SPI on CN38XX and CN58XX report all
-                                * errors through port 0.  RGMII needs
-                                * to check all 4 ports
-                                */
-                               if (mode.s.type)
-                                       num_ports = 1;
-                               else
-                                       num_ports = 4;
-                       } else {
-                               /*
-                                * CN30XX, CN31XX, and CN50XX have two
-                                * or three ports. GMII and MII has 2,
-                                * RGMII has three
-                                */
-                               if (mode.s.type)
-                                       num_ports = 2;
-                               else
-                                       num_ports = 3;
-                       }
-               } else
-                       num_ports = 0;
-       }
-
-       gmx_tx_int_en.u64 = 0;
-       if (num_ports) {
-               if (OCTEON_IS_MODEL(OCTEON_CN38XX)
-                   || OCTEON_IS_MODEL(OCTEON_CN58XX))
-                       gmx_tx_int_en.s.ncb_nxa = 1;
-               gmx_tx_int_en.s.pko_nxa = 1;
-       }
-       gmx_tx_int_en.s.undflw = (1 << num_ports) - 1;
-       cvmx_write_csr(CVMX_GMXX_TX_INT_EN(interface), gmx_tx_int_en.u64);
-       for (index = 0; index < num_ports; index++)
-               __cvmx_interrupt_gmxx_rxx_int_en_enable(index, interface);
-}
diff --git a/drivers/staging/octeon/cvmx-ipd.h b/drivers/staging/octeon/cvmx-ipd.h
deleted file mode 100644 (file)
index 115a552..0000000
+++ /dev/null
@@ -1,338 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/**
- *
- * Interface to the hardware Input Packet Data unit.
- */
-
-#ifndef __CVMX_IPD_H__
-#define __CVMX_IPD_H__
-
-#include <asm/octeon/octeon-feature.h>
-
-#include <asm/octeon/cvmx-ipd-defs.h>
-
-enum cvmx_ipd_mode {
-   CVMX_IPD_OPC_MODE_STT = 0LL,   /* All blocks DRAM, not cached in L2 */
-   CVMX_IPD_OPC_MODE_STF = 1LL,   /* All bloccks into  L2 */
-   CVMX_IPD_OPC_MODE_STF1_STT = 2LL,   /* 1st block L2, rest DRAM */
-   CVMX_IPD_OPC_MODE_STF2_STT = 3LL    /* 1st, 2nd blocks L2, rest DRAM */
-};
-
-#ifndef CVMX_ENABLE_LEN_M8_FIX
-#define CVMX_ENABLE_LEN_M8_FIX 0
-#endif
-
-/* CSR typedefs have been moved to cvmx-csr-*.h */
-typedef union cvmx_ipd_1st_mbuff_skip cvmx_ipd_mbuff_first_skip_t;
-typedef union cvmx_ipd_1st_next_ptr_back cvmx_ipd_first_next_ptr_back_t;
-
-typedef cvmx_ipd_mbuff_first_skip_t cvmx_ipd_mbuff_not_first_skip_t;
-typedef cvmx_ipd_first_next_ptr_back_t cvmx_ipd_second_next_ptr_back_t;
-
-/**
- * Configure IPD
- *
- * @mbuff_size: Packets buffer size in 8 byte words
- * @first_mbuff_skip:
- *                   Number of 8 byte words to skip in the first buffer
- * @not_first_mbuff_skip:
- *                   Number of 8 byte words to skip in each following buffer
- * @first_back: Must be same as first_mbuff_skip / 128
- * @second_back:
- *                   Must be same as not_first_mbuff_skip / 128
- * @wqe_fpa_pool:
- *                   FPA pool to get work entries from
- * @cache_mode:
- * @back_pres_enable_flag:
- *                   Enable or disable port back pressure
- */
-static inline void cvmx_ipd_config(uint64_t mbuff_size,
-                                  uint64_t first_mbuff_skip,
-                                  uint64_t not_first_mbuff_skip,
-                                  uint64_t first_back,
-                                  uint64_t second_back,
-                                  uint64_t wqe_fpa_pool,
-                                  enum cvmx_ipd_mode cache_mode,
-                                  uint64_t back_pres_enable_flag)
-{
-       cvmx_ipd_mbuff_first_skip_t first_skip;
-       cvmx_ipd_mbuff_not_first_skip_t not_first_skip;
-       union cvmx_ipd_packet_mbuff_size size;
-       cvmx_ipd_first_next_ptr_back_t first_back_struct;
-       cvmx_ipd_second_next_ptr_back_t second_back_struct;
-       union cvmx_ipd_wqe_fpa_queue wqe_pool;
-       union cvmx_ipd_ctl_status ipd_ctl_reg;
-
-       first_skip.u64 = 0;
-       first_skip.s.skip_sz = first_mbuff_skip;
-       cvmx_write_csr(CVMX_IPD_1ST_MBUFF_SKIP, first_skip.u64);
-
-       not_first_skip.u64 = 0;
-       not_first_skip.s.skip_sz = not_first_mbuff_skip;
-       cvmx_write_csr(CVMX_IPD_NOT_1ST_MBUFF_SKIP, not_first_skip.u64);
-
-       size.u64 = 0;
-       size.s.mb_size = mbuff_size;
-       cvmx_write_csr(CVMX_IPD_PACKET_MBUFF_SIZE, size.u64);
-
-       first_back_struct.u64 = 0;
-       first_back_struct.s.back = first_back;
-       cvmx_write_csr(CVMX_IPD_1st_NEXT_PTR_BACK, first_back_struct.u64);
-
-       second_back_struct.u64 = 0;
-       second_back_struct.s.back = second_back;
-       cvmx_write_csr(CVMX_IPD_2nd_NEXT_PTR_BACK, second_back_struct.u64);
-
-       wqe_pool.u64 = 0;
-       wqe_pool.s.wqe_pool = wqe_fpa_pool;
-       cvmx_write_csr(CVMX_IPD_WQE_FPA_QUEUE, wqe_pool.u64);
-
-       ipd_ctl_reg.u64 = cvmx_read_csr(CVMX_IPD_CTL_STATUS);
-       ipd_ctl_reg.s.opc_mode = cache_mode;
-       ipd_ctl_reg.s.pbp_en = back_pres_enable_flag;
-       cvmx_write_csr(CVMX_IPD_CTL_STATUS, ipd_ctl_reg.u64);
-
-       /* Note: the example RED code that used to be here has been moved to
-          cvmx_helper_setup_red */
-}
-
-/**
- * Enable IPD
- */
-static inline void cvmx_ipd_enable(void)
-{
-       union cvmx_ipd_ctl_status ipd_reg;
-       ipd_reg.u64 = cvmx_read_csr(CVMX_IPD_CTL_STATUS);
-       if (ipd_reg.s.ipd_en) {
-               cvmx_dprintf
-                   ("Warning: Enabling IPD when IPD already enabled.\n");
-       }
-       ipd_reg.s.ipd_en = 1;
-#if  CVMX_ENABLE_LEN_M8_FIX
-       if (!OCTEON_IS_MODEL(OCTEON_CN38XX_PASS2))
-               ipd_reg.s.len_m8 = TRUE;
-#endif
-       cvmx_write_csr(CVMX_IPD_CTL_STATUS, ipd_reg.u64);
-}
-
-/**
- * Disable IPD
- */
-static inline void cvmx_ipd_disable(void)
-{
-       union cvmx_ipd_ctl_status ipd_reg;
-       ipd_reg.u64 = cvmx_read_csr(CVMX_IPD_CTL_STATUS);
-       ipd_reg.s.ipd_en = 0;
-       cvmx_write_csr(CVMX_IPD_CTL_STATUS, ipd_reg.u64);
-}
-
-/**
- * Supportive function for cvmx_fpa_shutdown_pool.
- */
-static inline void cvmx_ipd_free_ptr(void)
-{
-       /* Only CN38XXp{1,2} cannot read pointer out of the IPD */
-       if (!OCTEON_IS_MODEL(OCTEON_CN38XX_PASS1)
-           && !OCTEON_IS_MODEL(OCTEON_CN38XX_PASS2)) {
-               int no_wptr = 0;
-               union cvmx_ipd_ptr_count ipd_ptr_count;
-               ipd_ptr_count.u64 = cvmx_read_csr(CVMX_IPD_PTR_COUNT);
-
-               /* Handle Work Queue Entry in cn56xx and cn52xx */
-               if (octeon_has_feature(OCTEON_FEATURE_NO_WPTR)) {
-                       union cvmx_ipd_ctl_status ipd_ctl_status;
-                       ipd_ctl_status.u64 = cvmx_read_csr(CVMX_IPD_CTL_STATUS);
-                       if (ipd_ctl_status.s.no_wptr)
-                               no_wptr = 1;
-               }
-
-               /* Free the prefetched WQE */
-               if (ipd_ptr_count.s.wqev_cnt) {
-                       union cvmx_ipd_wqe_ptr_valid ipd_wqe_ptr_valid;
-                       ipd_wqe_ptr_valid.u64 =
-                           cvmx_read_csr(CVMX_IPD_WQE_PTR_VALID);
-                       if (no_wptr)
-                               cvmx_fpa_free(cvmx_phys_to_ptr
-                                             ((uint64_t) ipd_wqe_ptr_valid.s.
-                                              ptr << 7), CVMX_FPA_PACKET_POOL,
-                                             0);
-                       else
-                               cvmx_fpa_free(cvmx_phys_to_ptr
-                                             ((uint64_t) ipd_wqe_ptr_valid.s.
-                                              ptr << 7), CVMX_FPA_WQE_POOL, 0);
-               }
-
-               /* Free all WQE in the fifo */
-               if (ipd_ptr_count.s.wqe_pcnt) {
-                       int i;
-                       union cvmx_ipd_pwp_ptr_fifo_ctl ipd_pwp_ptr_fifo_ctl;
-                       ipd_pwp_ptr_fifo_ctl.u64 =
-                           cvmx_read_csr(CVMX_IPD_PWP_PTR_FIFO_CTL);
-                       for (i = 0; i < ipd_ptr_count.s.wqe_pcnt; i++) {
-                               ipd_pwp_ptr_fifo_ctl.s.cena = 0;
-                               ipd_pwp_ptr_fifo_ctl.s.raddr =
-                                   ipd_pwp_ptr_fifo_ctl.s.max_cnts +
-                                   (ipd_pwp_ptr_fifo_ctl.s.wraddr +
-                                    i) % ipd_pwp_ptr_fifo_ctl.s.max_cnts;
-                               cvmx_write_csr(CVMX_IPD_PWP_PTR_FIFO_CTL,
-                                              ipd_pwp_ptr_fifo_ctl.u64);
-                               ipd_pwp_ptr_fifo_ctl.u64 =
-                                   cvmx_read_csr(CVMX_IPD_PWP_PTR_FIFO_CTL);
-                               if (no_wptr)
-                                       cvmx_fpa_free(cvmx_phys_to_ptr
-                                                     ((uint64_t)
-                                                      ipd_pwp_ptr_fifo_ctl.s.
-                                                      ptr << 7),
-                                                     CVMX_FPA_PACKET_POOL, 0);
-                               else
-                                       cvmx_fpa_free(cvmx_phys_to_ptr
-                                                     ((uint64_t)
-                                                      ipd_pwp_ptr_fifo_ctl.s.
-                                                      ptr << 7),
-                                                     CVMX_FPA_WQE_POOL, 0);
-                       }
-                       ipd_pwp_ptr_fifo_ctl.s.cena = 1;
-                       cvmx_write_csr(CVMX_IPD_PWP_PTR_FIFO_CTL,
-                                      ipd_pwp_ptr_fifo_ctl.u64);
-               }
-
-               /* Free the prefetched packet */
-               if (ipd_ptr_count.s.pktv_cnt) {
-                       union cvmx_ipd_pkt_ptr_valid ipd_pkt_ptr_valid;
-                       ipd_pkt_ptr_valid.u64 =
-                           cvmx_read_csr(CVMX_IPD_PKT_PTR_VALID);
-                       cvmx_fpa_free(cvmx_phys_to_ptr
-                                     (ipd_pkt_ptr_valid.s.ptr << 7),
-                                     CVMX_FPA_PACKET_POOL, 0);
-               }
-
-               /* Free the per port prefetched packets */
-               if (1) {
-                       int i;
-                       union cvmx_ipd_prc_port_ptr_fifo_ctl
-                           ipd_prc_port_ptr_fifo_ctl;
-                       ipd_prc_port_ptr_fifo_ctl.u64 =
-                           cvmx_read_csr(CVMX_IPD_PRC_PORT_PTR_FIFO_CTL);
-
-                       for (i = 0; i < ipd_prc_port_ptr_fifo_ctl.s.max_pkt;
-                            i++) {
-                               ipd_prc_port_ptr_fifo_ctl.s.cena = 0;
-                               ipd_prc_port_ptr_fifo_ctl.s.raddr =
-                                   i % ipd_prc_port_ptr_fifo_ctl.s.max_pkt;
-                               cvmx_write_csr(CVMX_IPD_PRC_PORT_PTR_FIFO_CTL,
-                                              ipd_prc_port_ptr_fifo_ctl.u64);
-                               ipd_prc_port_ptr_fifo_ctl.u64 =
-                                   cvmx_read_csr
-                                   (CVMX_IPD_PRC_PORT_PTR_FIFO_CTL);
-                               cvmx_fpa_free(cvmx_phys_to_ptr
-                                             ((uint64_t)
-                                              ipd_prc_port_ptr_fifo_ctl.s.
-                                              ptr << 7), CVMX_FPA_PACKET_POOL,
-                                             0);
-                       }
-                       ipd_prc_port_ptr_fifo_ctl.s.cena = 1;
-                       cvmx_write_csr(CVMX_IPD_PRC_PORT_PTR_FIFO_CTL,
-                                      ipd_prc_port_ptr_fifo_ctl.u64);
-               }
-
-               /* Free all packets in the holding fifo */
-               if (ipd_ptr_count.s.pfif_cnt) {
-                       int i;
-                       union cvmx_ipd_prc_hold_ptr_fifo_ctl
-                           ipd_prc_hold_ptr_fifo_ctl;
-
-                       ipd_prc_hold_ptr_fifo_ctl.u64 =
-                           cvmx_read_csr(CVMX_IPD_PRC_HOLD_PTR_FIFO_CTL);
-
-                       for (i = 0; i < ipd_ptr_count.s.pfif_cnt; i++) {
-                               ipd_prc_hold_ptr_fifo_ctl.s.cena = 0;
-                               ipd_prc_hold_ptr_fifo_ctl.s.raddr =
-                                   (ipd_prc_hold_ptr_fifo_ctl.s.praddr +
-                                    i) % ipd_prc_hold_ptr_fifo_ctl.s.max_pkt;
-                               cvmx_write_csr(CVMX_IPD_PRC_HOLD_PTR_FIFO_CTL,
-                                              ipd_prc_hold_ptr_fifo_ctl.u64);
-                               ipd_prc_hold_ptr_fifo_ctl.u64 =
-                                   cvmx_read_csr
-                                   (CVMX_IPD_PRC_HOLD_PTR_FIFO_CTL);
-                               cvmx_fpa_free(cvmx_phys_to_ptr
-                                             ((uint64_t)
-                                              ipd_prc_hold_ptr_fifo_ctl.s.
-                                              ptr << 7), CVMX_FPA_PACKET_POOL,
-                                             0);
-                       }
-                       ipd_prc_hold_ptr_fifo_ctl.s.cena = 1;
-                       cvmx_write_csr(CVMX_IPD_PRC_HOLD_PTR_FIFO_CTL,
-                                      ipd_prc_hold_ptr_fifo_ctl.u64);
-               }
-
-               /* Free all packets in the fifo */
-               if (ipd_ptr_count.s.pkt_pcnt) {
-                       int i;
-                       union cvmx_ipd_pwp_ptr_fifo_ctl ipd_pwp_ptr_fifo_ctl;
-                       ipd_pwp_ptr_fifo_ctl.u64 =
-                           cvmx_read_csr(CVMX_IPD_PWP_PTR_FIFO_CTL);
-
-                       for (i = 0; i < ipd_ptr_count.s.pkt_pcnt; i++) {
-                               ipd_pwp_ptr_fifo_ctl.s.cena = 0;
-                               ipd_pwp_ptr_fifo_ctl.s.raddr =
-                                   (ipd_pwp_ptr_fifo_ctl.s.praddr +
-                                    i) % ipd_pwp_ptr_fifo_ctl.s.max_cnts;
-                               cvmx_write_csr(CVMX_IPD_PWP_PTR_FIFO_CTL,
-                                              ipd_pwp_ptr_fifo_ctl.u64);
-                               ipd_pwp_ptr_fifo_ctl.u64 =
-                                   cvmx_read_csr(CVMX_IPD_PWP_PTR_FIFO_CTL);
-                               cvmx_fpa_free(cvmx_phys_to_ptr
-                                             ((uint64_t) ipd_pwp_ptr_fifo_ctl.
-                                              s.ptr << 7),
-                                             CVMX_FPA_PACKET_POOL, 0);
-                       }
-                       ipd_pwp_ptr_fifo_ctl.s.cena = 1;
-                       cvmx_write_csr(CVMX_IPD_PWP_PTR_FIFO_CTL,
-                                      ipd_pwp_ptr_fifo_ctl.u64);
-               }
-
-               /* Reset the IPD to get all buffers out of it */
-               {
-                       union cvmx_ipd_ctl_status ipd_ctl_status;
-                       ipd_ctl_status.u64 = cvmx_read_csr(CVMX_IPD_CTL_STATUS);
-                       ipd_ctl_status.s.reset = 1;
-                       cvmx_write_csr(CVMX_IPD_CTL_STATUS, ipd_ctl_status.u64);
-               }
-
-               /* Reset the PIP */
-               {
-                       union cvmx_pip_sft_rst pip_sft_rst;
-                       pip_sft_rst.u64 = cvmx_read_csr(CVMX_PIP_SFT_RST);
-                       pip_sft_rst.s.rst = 1;
-                       cvmx_write_csr(CVMX_PIP_SFT_RST, pip_sft_rst.u64);
-               }
-       }
-}
-
-#endif /*  __CVMX_IPD_H__ */
diff --git a/drivers/staging/octeon/cvmx-mdio.h b/drivers/staging/octeon/cvmx-mdio.h
deleted file mode 100644 (file)
index d88ab8d..0000000
+++ /dev/null
@@ -1,506 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- *
- * Interface to the SMI/MDIO hardware, including support for both IEEE 802.3
- * clause 22 and clause 45 operations.
- *
- */
-
-#ifndef __CVMX_MIO_H__
-#define __CVMX_MIO_H__
-
-#include "cvmx-smix-defs.h"
-
-/**
- * PHY register 0 from the 802.3 spec
- */
-#define CVMX_MDIO_PHY_REG_CONTROL 0
-typedef union {
-       uint16_t u16;
-       struct {
-               uint16_t reset:1;
-               uint16_t loopback:1;
-               uint16_t speed_lsb:1;
-               uint16_t autoneg_enable:1;
-               uint16_t power_down:1;
-               uint16_t isolate:1;
-               uint16_t restart_autoneg:1;
-               uint16_t duplex:1;
-               uint16_t collision_test:1;
-               uint16_t speed_msb:1;
-               uint16_t unidirectional_enable:1;
-               uint16_t reserved_0_4:5;
-       } s;
-} cvmx_mdio_phy_reg_control_t;
-
-/**
- * PHY register 1 from the 802.3 spec
- */
-#define CVMX_MDIO_PHY_REG_STATUS 1
-typedef union {
-       uint16_t u16;
-       struct {
-               uint16_t capable_100base_t4:1;
-               uint16_t capable_100base_x_full:1;
-               uint16_t capable_100base_x_half:1;
-               uint16_t capable_10_full:1;
-               uint16_t capable_10_half:1;
-               uint16_t capable_100base_t2_full:1;
-               uint16_t capable_100base_t2_half:1;
-               uint16_t capable_extended_status:1;
-               uint16_t capable_unidirectional:1;
-               uint16_t capable_mf_preamble_suppression:1;
-               uint16_t autoneg_complete:1;
-               uint16_t remote_fault:1;
-               uint16_t capable_autoneg:1;
-               uint16_t link_status:1;
-               uint16_t jabber_detect:1;
-               uint16_t capable_extended_registers:1;
-
-       } s;
-} cvmx_mdio_phy_reg_status_t;
-
-/**
- * PHY register 2 from the 802.3 spec
- */
-#define CVMX_MDIO_PHY_REG_ID1 2
-typedef union {
-       uint16_t u16;
-       struct {
-               uint16_t oui_bits_3_18;
-       } s;
-} cvmx_mdio_phy_reg_id1_t;
-
-/**
- * PHY register 3 from the 802.3 spec
- */
-#define CVMX_MDIO_PHY_REG_ID2 3
-typedef union {
-       uint16_t u16;
-       struct {
-               uint16_t oui_bits_19_24:6;
-               uint16_t model:6;
-               uint16_t revision:4;
-       } s;
-} cvmx_mdio_phy_reg_id2_t;
-
-/**
- * PHY register 4 from the 802.3 spec
- */
-#define CVMX_MDIO_PHY_REG_AUTONEG_ADVER 4
-typedef union {
-       uint16_t u16;
-       struct {
-               uint16_t next_page:1;
-               uint16_t reserved_14:1;
-               uint16_t remote_fault:1;
-               uint16_t reserved_12:1;
-               uint16_t asymmetric_pause:1;
-               uint16_t pause:1;
-               uint16_t advert_100base_t4:1;
-               uint16_t advert_100base_tx_full:1;
-               uint16_t advert_100base_tx_half:1;
-               uint16_t advert_10base_tx_full:1;
-               uint16_t advert_10base_tx_half:1;
-               uint16_t selector:5;
-       } s;
-} cvmx_mdio_phy_reg_autoneg_adver_t;
-
-/**
- * PHY register 5 from the 802.3 spec
- */
-#define CVMX_MDIO_PHY_REG_LINK_PARTNER_ABILITY 5
-typedef union {
-       uint16_t u16;
-       struct {
-               uint16_t next_page:1;
-               uint16_t ack:1;
-               uint16_t remote_fault:1;
-               uint16_t reserved_12:1;
-               uint16_t asymmetric_pause:1;
-               uint16_t pause:1;
-               uint16_t advert_100base_t4:1;
-               uint16_t advert_100base_tx_full:1;
-               uint16_t advert_100base_tx_half:1;
-               uint16_t advert_10base_tx_full:1;
-               uint16_t advert_10base_tx_half:1;
-               uint16_t selector:5;
-       } s;
-} cvmx_mdio_phy_reg_link_partner_ability_t;
-
-/**
- * PHY register 6 from the 802.3 spec
- */
-#define CVMX_MDIO_PHY_REG_AUTONEG_EXPANSION 6
-typedef union {
-       uint16_t u16;
-       struct {
-               uint16_t reserved_5_15:11;
-               uint16_t parallel_detection_fault:1;
-               uint16_t link_partner_next_page_capable:1;
-               uint16_t local_next_page_capable:1;
-               uint16_t page_received:1;
-               uint16_t link_partner_autoneg_capable:1;
-
-       } s;
-} cvmx_mdio_phy_reg_autoneg_expansion_t;
-
-/**
- * PHY register 9 from the 802.3 spec
- */
-#define CVMX_MDIO_PHY_REG_CONTROL_1000 9
-typedef union {
-       uint16_t u16;
-       struct {
-               uint16_t test_mode:3;
-               uint16_t manual_master_slave:1;
-               uint16_t master:1;
-               uint16_t port_type:1;
-               uint16_t advert_1000base_t_full:1;
-               uint16_t advert_1000base_t_half:1;
-               uint16_t reserved_0_7:8;
-       } s;
-} cvmx_mdio_phy_reg_control_1000_t;
-
-/**
- * PHY register 10 from the 802.3 spec
- */
-#define CVMX_MDIO_PHY_REG_STATUS_1000 10
-typedef union {
-       uint16_t u16;
-       struct {
-               uint16_t master_slave_fault:1;
-               uint16_t is_master:1;
-               uint16_t local_receiver_ok:1;
-               uint16_t remote_receiver_ok:1;
-               uint16_t remote_capable_1000base_t_full:1;
-               uint16_t remote_capable_1000base_t_half:1;
-               uint16_t reserved_8_9:2;
-               uint16_t idle_error_count:8;
-       } s;
-} cvmx_mdio_phy_reg_status_1000_t;
-
-/**
- * PHY register 15 from the 802.3 spec
- */
-#define CVMX_MDIO_PHY_REG_EXTENDED_STATUS 15
-typedef union {
-       uint16_t u16;
-       struct {
-               uint16_t capable_1000base_x_full:1;
-               uint16_t capable_1000base_x_half:1;
-               uint16_t capable_1000base_t_full:1;
-               uint16_t capable_1000base_t_half:1;
-               uint16_t reserved_0_11:12;
-       } s;
-} cvmx_mdio_phy_reg_extended_status_t;
-
-/**
- * PHY register 13 from the 802.3 spec
- */
-#define CVMX_MDIO_PHY_REG_MMD_CONTROL 13
-typedef union {
-       uint16_t u16;
-       struct {
-               uint16_t function:2;
-               uint16_t reserved_5_13:9;
-               uint16_t devad:5;
-       } s;
-} cvmx_mdio_phy_reg_mmd_control_t;
-
-/**
- * PHY register 14 from the 802.3 spec
- */
-#define CVMX_MDIO_PHY_REG_MMD_ADDRESS_DATA 14
-typedef union {
-       uint16_t u16;
-       struct {
-               uint16_t address_data:16;
-       } s;
-} cvmx_mdio_phy_reg_mmd_address_data_t;
-
-/* Operating request encodings. */
-#define MDIO_CLAUSE_22_WRITE    0
-#define MDIO_CLAUSE_22_READ     1
-
-#define MDIO_CLAUSE_45_ADDRESS  0
-#define MDIO_CLAUSE_45_WRITE    1
-#define MDIO_CLAUSE_45_READ_INC 2
-#define MDIO_CLAUSE_45_READ     3
-
-/* MMD identifiers, mostly for accessing devices within XENPAK modules. */
-#define CVMX_MMD_DEVICE_PMA_PMD      1
-#define CVMX_MMD_DEVICE_WIS          2
-#define CVMX_MMD_DEVICE_PCS          3
-#define CVMX_MMD_DEVICE_PHY_XS       4
-#define CVMX_MMD_DEVICE_DTS_XS       5
-#define CVMX_MMD_DEVICE_TC           6
-#define CVMX_MMD_DEVICE_CL22_EXT     29
-#define CVMX_MMD_DEVICE_VENDOR_1     30
-#define CVMX_MMD_DEVICE_VENDOR_2     31
-
-/* Helper function to put MDIO interface into clause 45 mode */
-static inline void __cvmx_mdio_set_clause45_mode(int bus_id)
-{
-       union cvmx_smix_clk smi_clk;
-       /* Put bus into clause 45 mode */
-       smi_clk.u64 = cvmx_read_csr(CVMX_SMIX_CLK(bus_id));
-       smi_clk.s.mode = 1;
-       smi_clk.s.preamble = 1;
-       cvmx_write_csr(CVMX_SMIX_CLK(bus_id), smi_clk.u64);
-}
-
-/* Helper function to put MDIO interface into clause 22 mode */
-static inline void __cvmx_mdio_set_clause22_mode(int bus_id)
-{
-       union cvmx_smix_clk smi_clk;
-       /* Put bus into clause 22 mode */
-       smi_clk.u64 = cvmx_read_csr(CVMX_SMIX_CLK(bus_id));
-       smi_clk.s.mode = 0;
-       cvmx_write_csr(CVMX_SMIX_CLK(bus_id), smi_clk.u64);
-}
-
-/**
- * Perform an MII read. This function is used to read PHY
- * registers controlling auto negotiation.
- *
- * @bus_id:   MDIO bus number. Zero on most chips, but some chips (ex CN56XX)
- *                 support multiple busses.
- * @phy_id:   The MII phy id
- * @location: Register location to read
- *
- * Returns Result from the read or -1 on failure
- */
-static inline int cvmx_mdio_read(int bus_id, int phy_id, int location)
-{
-       union cvmx_smix_cmd smi_cmd;
-       union cvmx_smix_rd_dat smi_rd;
-       int timeout = 1000;
-
-       if (octeon_has_feature(OCTEON_FEATURE_MDIO_CLAUSE_45))
-               __cvmx_mdio_set_clause22_mode(bus_id);
-
-       smi_cmd.u64 = 0;
-       smi_cmd.s.phy_op = MDIO_CLAUSE_22_READ;
-       smi_cmd.s.phy_adr = phy_id;
-       smi_cmd.s.reg_adr = location;
-       cvmx_write_csr(CVMX_SMIX_CMD(bus_id), smi_cmd.u64);
-
-       do {
-               cvmx_wait(1000);
-               smi_rd.u64 = cvmx_read_csr(CVMX_SMIX_RD_DAT(bus_id));
-       } while (smi_rd.s.pending && timeout--);
-
-       if (smi_rd.s.val)
-               return smi_rd.s.dat;
-       else
-               return -1;
-}
-
-/**
- * Perform an MII write. This function is used to write PHY
- * registers controlling auto negotiation.
- *
- * @bus_id:   MDIO bus number. Zero on most chips, but some chips (ex CN56XX)
- *                 support multiple busses.
- * @phy_id:   The MII phy id
- * @location: Register location to write
- * @val:      Value to write
- *
- * Returns -1 on error
- *         0 on success
- */
-static inline int cvmx_mdio_write(int bus_id, int phy_id, int location, int val)
-{
-       union cvmx_smix_cmd smi_cmd;
-       union cvmx_smix_wr_dat smi_wr;
-       int timeout = 1000;
-
-       if (octeon_has_feature(OCTEON_FEATURE_MDIO_CLAUSE_45))
-               __cvmx_mdio_set_clause22_mode(bus_id);
-
-       smi_wr.u64 = 0;
-       smi_wr.s.dat = val;
-       cvmx_write_csr(CVMX_SMIX_WR_DAT(bus_id), smi_wr.u64);
-
-       smi_cmd.u64 = 0;
-       smi_cmd.s.phy_op = MDIO_CLAUSE_22_WRITE;
-       smi_cmd.s.phy_adr = phy_id;
-       smi_cmd.s.reg_adr = location;
-       cvmx_write_csr(CVMX_SMIX_CMD(bus_id), smi_cmd.u64);
-
-       do {
-               cvmx_wait(1000);
-               smi_wr.u64 = cvmx_read_csr(CVMX_SMIX_WR_DAT(bus_id));
-       } while (smi_wr.s.pending && --timeout);
-       if (timeout <= 0)
-               return -1;
-
-       return 0;
-}
-
-/**
- * Perform an IEEE 802.3 clause 45 MII read. This function is used to
- * read PHY registers controlling auto negotiation.
- *
- * @bus_id:   MDIO bus number. Zero on most chips, but some chips (ex CN56XX)
- *                 support multiple busses.
- * @phy_id:   The MII phy id
- * @device:   MDIO Managable Device (MMD) id
- * @location: Register location to read
- *
- * Returns Result from the read or -1 on failure
- */
-
-static inline int cvmx_mdio_45_read(int bus_id, int phy_id, int device,
-                                   int location)
-{
-       union cvmx_smix_cmd smi_cmd;
-       union cvmx_smix_rd_dat smi_rd;
-       union cvmx_smix_wr_dat smi_wr;
-       int timeout = 1000;
-
-       if (!octeon_has_feature(OCTEON_FEATURE_MDIO_CLAUSE_45))
-               return -1;
-
-       __cvmx_mdio_set_clause45_mode(bus_id);
-
-       smi_wr.u64 = 0;
-       smi_wr.s.dat = location;
-       cvmx_write_csr(CVMX_SMIX_WR_DAT(bus_id), smi_wr.u64);
-
-       smi_cmd.u64 = 0;
-       smi_cmd.s.phy_op = MDIO_CLAUSE_45_ADDRESS;
-       smi_cmd.s.phy_adr = phy_id;
-       smi_cmd.s.reg_adr = device;
-       cvmx_write_csr(CVMX_SMIX_CMD(bus_id), smi_cmd.u64);
-
-       do {
-               cvmx_wait(1000);
-               smi_wr.u64 = cvmx_read_csr(CVMX_SMIX_WR_DAT(bus_id));
-       } while (smi_wr.s.pending && --timeout);
-       if (timeout <= 0) {
-               cvmx_dprintf("cvmx_mdio_45_read: bus_id %d phy_id %2d "
-                            "device %2d register %2d   TIME OUT(address)\n",
-                    bus_id, phy_id, device, location);
-               return -1;
-       }
-
-       smi_cmd.u64 = 0;
-       smi_cmd.s.phy_op = MDIO_CLAUSE_45_READ;
-       smi_cmd.s.phy_adr = phy_id;
-       smi_cmd.s.reg_adr = device;
-       cvmx_write_csr(CVMX_SMIX_CMD(bus_id), smi_cmd.u64);
-
-       do {
-               cvmx_wait(1000);
-               smi_rd.u64 = cvmx_read_csr(CVMX_SMIX_RD_DAT(bus_id));
-       } while (smi_rd.s.pending && --timeout);
-
-       if (timeout <= 0) {
-               cvmx_dprintf("cvmx_mdio_45_read: bus_id %d phy_id %2d "
-                            "device %2d register %2d   TIME OUT(data)\n",
-                    bus_id, phy_id, device, location);
-               return -1;
-       }
-
-       if (smi_rd.s.val)
-               return smi_rd.s.dat;
-       else {
-               cvmx_dprintf("cvmx_mdio_45_read: bus_id %d phy_id %2d "
-                            "device %2d register %2d   INVALID READ\n",
-                    bus_id, phy_id, device, location);
-               return -1;
-       }
-}
-
-/**
- * Perform an IEEE 802.3 clause 45 MII write. This function is used to
- * write PHY registers controlling auto negotiation.
- *
- * @bus_id:   MDIO bus number. Zero on most chips, but some chips (ex CN56XX)
- *                 support multiple busses.
- * @phy_id:   The MII phy id
- * @device:   MDIO Managable Device (MMD) id
- * @location: Register location to write
- * @val:      Value to write
- *
- * Returns -1 on error
- *         0 on success
- */
-static inline int cvmx_mdio_45_write(int bus_id, int phy_id, int device,
-                                    int location, int val)
-{
-       union cvmx_smix_cmd smi_cmd;
-       union cvmx_smix_wr_dat smi_wr;
-       int timeout = 1000;
-
-       if (!octeon_has_feature(OCTEON_FEATURE_MDIO_CLAUSE_45))
-               return -1;
-
-       __cvmx_mdio_set_clause45_mode(bus_id);
-
-       smi_wr.u64 = 0;
-       smi_wr.s.dat = location;
-       cvmx_write_csr(CVMX_SMIX_WR_DAT(bus_id), smi_wr.u64);
-
-       smi_cmd.u64 = 0;
-       smi_cmd.s.phy_op = MDIO_CLAUSE_45_ADDRESS;
-       smi_cmd.s.phy_adr = phy_id;
-       smi_cmd.s.reg_adr = device;
-       cvmx_write_csr(CVMX_SMIX_CMD(bus_id), smi_cmd.u64);
-
-       do {
-               cvmx_wait(1000);
-               smi_wr.u64 = cvmx_read_csr(CVMX_SMIX_WR_DAT(bus_id));
-       } while (smi_wr.s.pending && --timeout);
-       if (timeout <= 0)
-               return -1;
-
-       smi_wr.u64 = 0;
-       smi_wr.s.dat = val;
-       cvmx_write_csr(CVMX_SMIX_WR_DAT(bus_id), smi_wr.u64);
-
-       smi_cmd.u64 = 0;
-       smi_cmd.s.phy_op = MDIO_CLAUSE_45_WRITE;
-       smi_cmd.s.phy_adr = phy_id;
-       smi_cmd.s.reg_adr = device;
-       cvmx_write_csr(CVMX_SMIX_CMD(bus_id), smi_cmd.u64);
-
-       do {
-               cvmx_wait(1000);
-               smi_wr.u64 = cvmx_read_csr(CVMX_SMIX_WR_DAT(bus_id));
-       } while (smi_wr.s.pending && --timeout);
-       if (timeout <= 0)
-               return -1;
-
-       return 0;
-}
-
-#endif
diff --git a/drivers/staging/octeon/cvmx-packet.h b/drivers/staging/octeon/cvmx-packet.h
deleted file mode 100644 (file)
index 62ffe78..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/**
- *
- * Packet buffer defines.
- */
-
-#ifndef __CVMX_PACKET_H__
-#define __CVMX_PACKET_H__
-
-/**
- * This structure defines a buffer pointer on Octeon
- */
-union cvmx_buf_ptr {
-       void *ptr;
-       uint64_t u64;
-       struct {
-               /*
-                * if set, invert the "free" pick of the overall
-                * packet. HW always sets this bit to 0 on inbound
-                * packet
-                */
-               uint64_t i:1;
-               /*
-                * Indicates the amount to back up to get to the
-                * buffer start in cache lines. In most cases this is
-                * less than one complete cache line, so the value is
-                * zero.
-                */
-               uint64_t back:4;
-               /* The pool that the buffer came from / goes to */
-               uint64_t pool:3;
-               /* The size of the segment pointed to by addr (in bytes) */
-               uint64_t size:16;
-               /* Pointer to the first byte of the data, NOT buffer */
-               uint64_t addr:40;
-       } s;
-};
-
-#endif /*  __CVMX_PACKET_H__ */
diff --git a/drivers/staging/octeon/cvmx-pcsx-defs.h b/drivers/staging/octeon/cvmx-pcsx-defs.h
deleted file mode 100644 (file)
index d45952d..0000000
+++ /dev/null
@@ -1,370 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-#ifndef __CVMX_PCSX_DEFS_H__
-#define __CVMX_PCSX_DEFS_H__
-
-#define CVMX_PCSX_ANX_ADV_REG(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0001010ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSX_ANX_EXT_ST_REG(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0001028ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSX_ANX_LP_ABIL_REG(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0001018ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSX_ANX_RESULTS_REG(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0001020ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSX_INTX_EN_REG(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0001088ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSX_INTX_REG(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0001080ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSX_LINKX_TIMER_COUNT_REG(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0001040ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSX_LOG_ANLX_REG(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0001090ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSX_MISCX_CTL_REG(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0001078ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSX_MRX_CONTROL_REG(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0001000ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSX_MRX_STATUS_REG(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0001008ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSX_RXX_STATES_REG(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0001058ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSX_RXX_SYNC_REG(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0001050ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSX_SGMX_AN_ADV_REG(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0001068ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSX_SGMX_LP_ADV_REG(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0001070ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSX_TXX_STATES_REG(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0001060ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSX_TX_RXX_POLARITY_REG(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0001048ull + (((offset) & 3) * 1024) + (((block_id) & 1) * 0x8000000ull))
-
-union cvmx_pcsx_anx_adv_reg {
-       uint64_t u64;
-       struct cvmx_pcsx_anx_adv_reg_s {
-               uint64_t reserved_16_63:48;
-               uint64_t np:1;
-               uint64_t reserved_14_14:1;
-               uint64_t rem_flt:2;
-               uint64_t reserved_9_11:3;
-               uint64_t pause:2;
-               uint64_t hfd:1;
-               uint64_t fd:1;
-               uint64_t 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;
-};
-
-union cvmx_pcsx_anx_ext_st_reg {
-       uint64_t u64;
-       struct cvmx_pcsx_anx_ext_st_reg_s {
-               uint64_t reserved_16_63:48;
-               uint64_t thou_xfd:1;
-               uint64_t thou_xhd:1;
-               uint64_t thou_tfd:1;
-               uint64_t thou_thd:1;
-               uint64_t 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;
-};
-
-union cvmx_pcsx_anx_lp_abil_reg {
-       uint64_t u64;
-       struct cvmx_pcsx_anx_lp_abil_reg_s {
-               uint64_t reserved_16_63:48;
-               uint64_t np:1;
-               uint64_t ack:1;
-               uint64_t rem_flt:2;
-               uint64_t reserved_9_11:3;
-               uint64_t pause:2;
-               uint64_t hfd:1;
-               uint64_t fd:1;
-               uint64_t 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;
-};
-
-union cvmx_pcsx_anx_results_reg {
-       uint64_t u64;
-       struct cvmx_pcsx_anx_results_reg_s {
-               uint64_t reserved_7_63:57;
-               uint64_t pause:2;
-               uint64_t spd:2;
-               uint64_t an_cpt:1;
-               uint64_t dup:1;
-               uint64_t 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;
-};
-
-union cvmx_pcsx_intx_en_reg {
-       uint64_t u64;
-       struct cvmx_pcsx_intx_en_reg_s {
-               uint64_t reserved_12_63:52;
-               uint64_t dup:1;
-               uint64_t sync_bad_en:1;
-               uint64_t an_bad_en:1;
-               uint64_t rxlock_en:1;
-               uint64_t rxbad_en:1;
-               uint64_t rxerr_en:1;
-               uint64_t txbad_en:1;
-               uint64_t txfifo_en:1;
-               uint64_t txfifu_en:1;
-               uint64_t an_err_en:1;
-               uint64_t xmit_en:1;
-               uint64_t lnkspd_en:1;
-       } s;
-       struct cvmx_pcsx_intx_en_reg_s cn52xx;
-       struct cvmx_pcsx_intx_en_reg_s cn52xxp1;
-       struct cvmx_pcsx_intx_en_reg_s cn56xx;
-       struct cvmx_pcsx_intx_en_reg_s cn56xxp1;
-};
-
-union cvmx_pcsx_intx_reg {
-       uint64_t u64;
-       struct cvmx_pcsx_intx_reg_s {
-               uint64_t reserved_12_63:52;
-               uint64_t dup:1;
-               uint64_t sync_bad:1;
-               uint64_t an_bad:1;
-               uint64_t rxlock:1;
-               uint64_t rxbad:1;
-               uint64_t rxerr:1;
-               uint64_t txbad:1;
-               uint64_t txfifo:1;
-               uint64_t txfifu:1;
-               uint64_t an_err:1;
-               uint64_t xmit:1;
-               uint64_t lnkspd:1;
-       } s;
-       struct cvmx_pcsx_intx_reg_s cn52xx;
-       struct cvmx_pcsx_intx_reg_s cn52xxp1;
-       struct cvmx_pcsx_intx_reg_s cn56xx;
-       struct cvmx_pcsx_intx_reg_s cn56xxp1;
-};
-
-union cvmx_pcsx_linkx_timer_count_reg {
-       uint64_t u64;
-       struct cvmx_pcsx_linkx_timer_count_reg_s {
-               uint64_t reserved_16_63:48;
-               uint64_t 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;
-};
-
-union cvmx_pcsx_log_anlx_reg {
-       uint64_t u64;
-       struct cvmx_pcsx_log_anlx_reg_s {
-               uint64_t reserved_4_63:60;
-               uint64_t lafifovfl:1;
-               uint64_t la_en:1;
-               uint64_t 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;
-};
-
-union cvmx_pcsx_miscx_ctl_reg {
-       uint64_t u64;
-       struct cvmx_pcsx_miscx_ctl_reg_s {
-               uint64_t reserved_13_63:51;
-               uint64_t sgmii:1;
-               uint64_t gmxeno:1;
-               uint64_t loopbck2:1;
-               uint64_t mac_phy:1;
-               uint64_t mode:1;
-               uint64_t an_ovrd:1;
-               uint64_t 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;
-};
-
-union cvmx_pcsx_mrx_control_reg {
-       uint64_t u64;
-       struct cvmx_pcsx_mrx_control_reg_s {
-               uint64_t reserved_16_63:48;
-               uint64_t reset:1;
-               uint64_t loopbck1:1;
-               uint64_t spdlsb:1;
-               uint64_t an_en:1;
-               uint64_t pwr_dn:1;
-               uint64_t reserved_10_10:1;
-               uint64_t rst_an:1;
-               uint64_t dup:1;
-               uint64_t coltst:1;
-               uint64_t spdmsb:1;
-               uint64_t uni:1;
-               uint64_t 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;
-};
-
-union cvmx_pcsx_mrx_status_reg {
-       uint64_t u64;
-       struct cvmx_pcsx_mrx_status_reg_s {
-               uint64_t reserved_16_63:48;
-               uint64_t hun_t4:1;
-               uint64_t hun_xfd:1;
-               uint64_t hun_xhd:1;
-               uint64_t ten_fd:1;
-               uint64_t ten_hd:1;
-               uint64_t hun_t2fd:1;
-               uint64_t hun_t2hd:1;
-               uint64_t ext_st:1;
-               uint64_t reserved_7_7:1;
-               uint64_t prb_sup:1;
-               uint64_t an_cpt:1;
-               uint64_t rm_flt:1;
-               uint64_t an_abil:1;
-               uint64_t lnk_st:1;
-               uint64_t reserved_1_1:1;
-               uint64_t 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;
-};
-
-union cvmx_pcsx_rxx_states_reg {
-       uint64_t u64;
-       struct cvmx_pcsx_rxx_states_reg_s {
-               uint64_t reserved_16_63:48;
-               uint64_t rx_bad:1;
-               uint64_t rx_st:5;
-               uint64_t sync_bad:1;
-               uint64_t sync:4;
-               uint64_t an_bad:1;
-               uint64_t 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;
-};
-
-union cvmx_pcsx_rxx_sync_reg {
-       uint64_t u64;
-       struct cvmx_pcsx_rxx_sync_reg_s {
-               uint64_t reserved_2_63:62;
-               uint64_t sync:1;
-               uint64_t 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;
-};
-
-union cvmx_pcsx_sgmx_an_adv_reg {
-       uint64_t u64;
-       struct cvmx_pcsx_sgmx_an_adv_reg_s {
-               uint64_t reserved_16_63:48;
-               uint64_t link:1;
-               uint64_t ack:1;
-               uint64_t reserved_13_13:1;
-               uint64_t dup:1;
-               uint64_t speed:2;
-               uint64_t reserved_1_9:9;
-               uint64_t 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;
-};
-
-union cvmx_pcsx_sgmx_lp_adv_reg {
-       uint64_t u64;
-       struct cvmx_pcsx_sgmx_lp_adv_reg_s {
-               uint64_t reserved_16_63:48;
-               uint64_t link:1;
-               uint64_t reserved_13_14:2;
-               uint64_t dup:1;
-               uint64_t speed:2;
-               uint64_t reserved_1_9:9;
-               uint64_t 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;
-};
-
-union cvmx_pcsx_txx_states_reg {
-       uint64_t u64;
-       struct cvmx_pcsx_txx_states_reg_s {
-               uint64_t reserved_7_63:57;
-               uint64_t xmit:2;
-               uint64_t tx_bad:1;
-               uint64_t 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;
-};
-
-union cvmx_pcsx_tx_rxx_polarity_reg {
-       uint64_t u64;
-       struct cvmx_pcsx_tx_rxx_polarity_reg_s {
-               uint64_t reserved_4_63:60;
-               uint64_t rxovrd:1;
-               uint64_t autorxpl:1;
-               uint64_t rxplrt:1;
-               uint64_t 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;
-};
-
-#endif
diff --git a/drivers/staging/octeon/cvmx-pcsxx-defs.h b/drivers/staging/octeon/cvmx-pcsxx-defs.h
deleted file mode 100644 (file)
index 55d120f..0000000
+++ /dev/null
@@ -1,316 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-#ifndef __CVMX_PCSXX_DEFS_H__
-#define __CVMX_PCSXX_DEFS_H__
-
-#define CVMX_PCSXX_10GBX_STATUS_REG(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000828ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSXX_BIST_STATUS_REG(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000870ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSXX_BIT_LOCK_STATUS_REG(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000850ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSXX_CONTROL1_REG(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000800ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSXX_CONTROL2_REG(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000818ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSXX_INT_EN_REG(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000860ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSXX_INT_REG(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000858ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSXX_LOG_ANL_REG(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000868ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSXX_MISC_CTL_REG(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000848ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSXX_RX_SYNC_STATES_REG(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000838ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSXX_SPD_ABIL_REG(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000810ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSXX_STATUS1_REG(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000808ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSXX_STATUS2_REG(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000820ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSXX_TX_RX_POLARITY_REG(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000840ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_PCSXX_TX_RX_STATES_REG(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800B0000830ull + (((block_id) & 1) * 0x8000000ull))
-
-union cvmx_pcsxx_10gbx_status_reg {
-       uint64_t u64;
-       struct cvmx_pcsxx_10gbx_status_reg_s {
-               uint64_t reserved_13_63:51;
-               uint64_t alignd:1;
-               uint64_t pattst:1;
-               uint64_t reserved_4_10:7;
-               uint64_t l3sync:1;
-               uint64_t l2sync:1;
-               uint64_t l1sync:1;
-               uint64_t l0sync:1;
-       } s;
-       struct cvmx_pcsxx_10gbx_status_reg_s cn52xx;
-       struct cvmx_pcsxx_10gbx_status_reg_s cn52xxp1;
-       struct cvmx_pcsxx_10gbx_status_reg_s cn56xx;
-       struct cvmx_pcsxx_10gbx_status_reg_s cn56xxp1;
-};
-
-union cvmx_pcsxx_bist_status_reg {
-       uint64_t u64;
-       struct cvmx_pcsxx_bist_status_reg_s {
-               uint64_t reserved_1_63:63;
-               uint64_t bist_status:1;
-       } s;
-       struct cvmx_pcsxx_bist_status_reg_s cn52xx;
-       struct cvmx_pcsxx_bist_status_reg_s cn52xxp1;
-       struct cvmx_pcsxx_bist_status_reg_s cn56xx;
-       struct cvmx_pcsxx_bist_status_reg_s cn56xxp1;
-};
-
-union cvmx_pcsxx_bit_lock_status_reg {
-       uint64_t u64;
-       struct cvmx_pcsxx_bit_lock_status_reg_s {
-               uint64_t reserved_4_63:60;
-               uint64_t bitlck3:1;
-               uint64_t bitlck2:1;
-               uint64_t bitlck1:1;
-               uint64_t bitlck0:1;
-       } s;
-       struct cvmx_pcsxx_bit_lock_status_reg_s cn52xx;
-       struct cvmx_pcsxx_bit_lock_status_reg_s cn52xxp1;
-       struct cvmx_pcsxx_bit_lock_status_reg_s cn56xx;
-       struct cvmx_pcsxx_bit_lock_status_reg_s cn56xxp1;
-};
-
-union cvmx_pcsxx_control1_reg {
-       uint64_t u64;
-       struct cvmx_pcsxx_control1_reg_s {
-               uint64_t reserved_16_63:48;
-               uint64_t reset:1;
-               uint64_t loopbck1:1;
-               uint64_t spdsel1:1;
-               uint64_t reserved_12_12:1;
-               uint64_t lo_pwr:1;
-               uint64_t reserved_7_10:4;
-               uint64_t spdsel0:1;
-               uint64_t spd:4;
-               uint64_t reserved_0_1:2;
-       } s;
-       struct cvmx_pcsxx_control1_reg_s cn52xx;
-       struct cvmx_pcsxx_control1_reg_s cn52xxp1;
-       struct cvmx_pcsxx_control1_reg_s cn56xx;
-       struct cvmx_pcsxx_control1_reg_s cn56xxp1;
-};
-
-union cvmx_pcsxx_control2_reg {
-       uint64_t u64;
-       struct cvmx_pcsxx_control2_reg_s {
-               uint64_t reserved_2_63:62;
-               uint64_t type:2;
-       } s;
-       struct cvmx_pcsxx_control2_reg_s cn52xx;
-       struct cvmx_pcsxx_control2_reg_s cn52xxp1;
-       struct cvmx_pcsxx_control2_reg_s cn56xx;
-       struct cvmx_pcsxx_control2_reg_s cn56xxp1;
-};
-
-union cvmx_pcsxx_int_en_reg {
-       uint64_t u64;
-       struct cvmx_pcsxx_int_en_reg_s {
-               uint64_t reserved_6_63:58;
-               uint64_t algnlos_en:1;
-               uint64_t synlos_en:1;
-               uint64_t bitlckls_en:1;
-               uint64_t rxsynbad_en:1;
-               uint64_t rxbad_en:1;
-               uint64_t txflt_en:1;
-       } s;
-       struct cvmx_pcsxx_int_en_reg_s cn52xx;
-       struct cvmx_pcsxx_int_en_reg_s cn52xxp1;
-       struct cvmx_pcsxx_int_en_reg_s cn56xx;
-       struct cvmx_pcsxx_int_en_reg_s cn56xxp1;
-};
-
-union cvmx_pcsxx_int_reg {
-       uint64_t u64;
-       struct cvmx_pcsxx_int_reg_s {
-               uint64_t reserved_6_63:58;
-               uint64_t algnlos:1;
-               uint64_t synlos:1;
-               uint64_t bitlckls:1;
-               uint64_t rxsynbad:1;
-               uint64_t rxbad:1;
-               uint64_t txflt:1;
-       } s;
-       struct cvmx_pcsxx_int_reg_s cn52xx;
-       struct cvmx_pcsxx_int_reg_s cn52xxp1;
-       struct cvmx_pcsxx_int_reg_s cn56xx;
-       struct cvmx_pcsxx_int_reg_s cn56xxp1;
-};
-
-union cvmx_pcsxx_log_anl_reg {
-       uint64_t u64;
-       struct cvmx_pcsxx_log_anl_reg_s {
-               uint64_t reserved_7_63:57;
-               uint64_t enc_mode:1;
-               uint64_t drop_ln:2;
-               uint64_t lafifovfl:1;
-               uint64_t la_en:1;
-               uint64_t pkt_sz:2;
-       } s;
-       struct cvmx_pcsxx_log_anl_reg_s cn52xx;
-       struct cvmx_pcsxx_log_anl_reg_s cn52xxp1;
-       struct cvmx_pcsxx_log_anl_reg_s cn56xx;
-       struct cvmx_pcsxx_log_anl_reg_s cn56xxp1;
-};
-
-union cvmx_pcsxx_misc_ctl_reg {
-       uint64_t u64;
-       struct cvmx_pcsxx_misc_ctl_reg_s {
-               uint64_t reserved_4_63:60;
-               uint64_t tx_swap:1;
-               uint64_t rx_swap:1;
-               uint64_t xaui:1;
-               uint64_t gmxeno:1;
-       } s;
-       struct cvmx_pcsxx_misc_ctl_reg_s cn52xx;
-       struct cvmx_pcsxx_misc_ctl_reg_s cn52xxp1;
-       struct cvmx_pcsxx_misc_ctl_reg_s cn56xx;
-       struct cvmx_pcsxx_misc_ctl_reg_s cn56xxp1;
-};
-
-union cvmx_pcsxx_rx_sync_states_reg {
-       uint64_t u64;
-       struct cvmx_pcsxx_rx_sync_states_reg_s {
-               uint64_t reserved_16_63:48;
-               uint64_t sync3st:4;
-               uint64_t sync2st:4;
-               uint64_t sync1st:4;
-               uint64_t sync0st:4;
-       } s;
-       struct cvmx_pcsxx_rx_sync_states_reg_s cn52xx;
-       struct cvmx_pcsxx_rx_sync_states_reg_s cn52xxp1;
-       struct cvmx_pcsxx_rx_sync_states_reg_s cn56xx;
-       struct cvmx_pcsxx_rx_sync_states_reg_s cn56xxp1;
-};
-
-union cvmx_pcsxx_spd_abil_reg {
-       uint64_t u64;
-       struct cvmx_pcsxx_spd_abil_reg_s {
-               uint64_t reserved_2_63:62;
-               uint64_t tenpasst:1;
-               uint64_t tengb:1;
-       } s;
-       struct cvmx_pcsxx_spd_abil_reg_s cn52xx;
-       struct cvmx_pcsxx_spd_abil_reg_s cn52xxp1;
-       struct cvmx_pcsxx_spd_abil_reg_s cn56xx;
-       struct cvmx_pcsxx_spd_abil_reg_s cn56xxp1;
-};
-
-union cvmx_pcsxx_status1_reg {
-       uint64_t u64;
-       struct cvmx_pcsxx_status1_reg_s {
-               uint64_t reserved_8_63:56;
-               uint64_t flt:1;
-               uint64_t reserved_3_6:4;
-               uint64_t rcv_lnk:1;
-               uint64_t lpable:1;
-               uint64_t reserved_0_0:1;
-       } s;
-       struct cvmx_pcsxx_status1_reg_s cn52xx;
-       struct cvmx_pcsxx_status1_reg_s cn52xxp1;
-       struct cvmx_pcsxx_status1_reg_s cn56xx;
-       struct cvmx_pcsxx_status1_reg_s cn56xxp1;
-};
-
-union cvmx_pcsxx_status2_reg {
-       uint64_t u64;
-       struct cvmx_pcsxx_status2_reg_s {
-               uint64_t reserved_16_63:48;
-               uint64_t dev:2;
-               uint64_t reserved_12_13:2;
-               uint64_t xmtflt:1;
-               uint64_t rcvflt:1;
-               uint64_t reserved_3_9:7;
-               uint64_t tengb_w:1;
-               uint64_t tengb_x:1;
-               uint64_t tengb_r:1;
-       } s;
-       struct cvmx_pcsxx_status2_reg_s cn52xx;
-       struct cvmx_pcsxx_status2_reg_s cn52xxp1;
-       struct cvmx_pcsxx_status2_reg_s cn56xx;
-       struct cvmx_pcsxx_status2_reg_s cn56xxp1;
-};
-
-union cvmx_pcsxx_tx_rx_polarity_reg {
-       uint64_t u64;
-       struct cvmx_pcsxx_tx_rx_polarity_reg_s {
-               uint64_t reserved_10_63:54;
-               uint64_t xor_rxplrt:4;
-               uint64_t xor_txplrt:4;
-               uint64_t rxplrt:1;
-               uint64_t txplrt:1;
-       } s;
-       struct cvmx_pcsxx_tx_rx_polarity_reg_s cn52xx;
-       struct cvmx_pcsxx_tx_rx_polarity_reg_cn52xxp1 {
-               uint64_t reserved_2_63:62;
-               uint64_t rxplrt:1;
-               uint64_t txplrt:1;
-       } cn52xxp1;
-       struct cvmx_pcsxx_tx_rx_polarity_reg_s cn56xx;
-       struct cvmx_pcsxx_tx_rx_polarity_reg_cn52xxp1 cn56xxp1;
-};
-
-union cvmx_pcsxx_tx_rx_states_reg {
-       uint64_t u64;
-       struct cvmx_pcsxx_tx_rx_states_reg_s {
-               uint64_t reserved_14_63:50;
-               uint64_t term_err:1;
-               uint64_t syn3bad:1;
-               uint64_t syn2bad:1;
-               uint64_t syn1bad:1;
-               uint64_t syn0bad:1;
-               uint64_t rxbad:1;
-               uint64_t algn_st:3;
-               uint64_t rx_st:2;
-               uint64_t tx_st:3;
-       } s;
-       struct cvmx_pcsxx_tx_rx_states_reg_s cn52xx;
-       struct cvmx_pcsxx_tx_rx_states_reg_cn52xxp1 {
-               uint64_t reserved_13_63:51;
-               uint64_t syn3bad:1;
-               uint64_t syn2bad:1;
-               uint64_t syn1bad:1;
-               uint64_t syn0bad:1;
-               uint64_t rxbad:1;
-               uint64_t algn_st:3;
-               uint64_t rx_st:2;
-               uint64_t tx_st:3;
-       } cn52xxp1;
-       struct cvmx_pcsxx_tx_rx_states_reg_s cn56xx;
-       struct cvmx_pcsxx_tx_rx_states_reg_cn52xxp1 cn56xxp1;
-};
-
-#endif
diff --git a/drivers/staging/octeon/cvmx-pip-defs.h b/drivers/staging/octeon/cvmx-pip-defs.h
deleted file mode 100644 (file)
index 5a36910..0000000
+++ /dev/null
@@ -1,1267 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-#ifndef __CVMX_PIP_DEFS_H__
-#define __CVMX_PIP_DEFS_H__
-
-/*
- * Enumeration representing the amount of packet processing
- * and validation performed by the input hardware.
- */
-enum cvmx_pip_port_parse_mode {
-       /*
-        * Packet input doesn't perform any processing of the input
-        * packet.
-        */
-       CVMX_PIP_PORT_CFG_MODE_NONE = 0ull,
-       /*
-        * Full packet processing is performed with pointer starting
-        * at the L2 (ethernet MAC) header.
-        */
-       CVMX_PIP_PORT_CFG_MODE_SKIPL2 = 1ull,
-       /*
-        * Input packets are assumed to be IP.  Results from non IP
-        * packets is undefined. Pointers reference the beginning of
-        * the IP header.
-        */
-       CVMX_PIP_PORT_CFG_MODE_SKIPIP = 2ull
-};
-
-#define CVMX_PIP_BCK_PRS \
-        CVMX_ADD_IO_SEG(0x00011800A0000038ull)
-#define CVMX_PIP_BIST_STATUS \
-        CVMX_ADD_IO_SEG(0x00011800A0000000ull)
-#define CVMX_PIP_CRC_CTLX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0000040ull + (((offset) & 1) * 8))
-#define CVMX_PIP_CRC_IVX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0000050ull + (((offset) & 1) * 8))
-#define CVMX_PIP_DEC_IPSECX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0000080ull + (((offset) & 3) * 8))
-#define CVMX_PIP_DSA_SRC_GRP \
-        CVMX_ADD_IO_SEG(0x00011800A0000190ull)
-#define CVMX_PIP_DSA_VID_GRP \
-        CVMX_ADD_IO_SEG(0x00011800A0000198ull)
-#define CVMX_PIP_FRM_LEN_CHKX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0000180ull + (((offset) & 1) * 8))
-#define CVMX_PIP_GBL_CFG \
-        CVMX_ADD_IO_SEG(0x00011800A0000028ull)
-#define CVMX_PIP_GBL_CTL \
-        CVMX_ADD_IO_SEG(0x00011800A0000020ull)
-#define CVMX_PIP_HG_PRI_QOS \
-        CVMX_ADD_IO_SEG(0x00011800A00001A0ull)
-#define CVMX_PIP_INT_EN \
-        CVMX_ADD_IO_SEG(0x00011800A0000010ull)
-#define CVMX_PIP_INT_REG \
-        CVMX_ADD_IO_SEG(0x00011800A0000008ull)
-#define CVMX_PIP_IP_OFFSET \
-        CVMX_ADD_IO_SEG(0x00011800A0000060ull)
-#define CVMX_PIP_PRT_CFGX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0000200ull + (((offset) & 63) * 8))
-#define CVMX_PIP_PRT_TAGX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0000400ull + (((offset) & 63) * 8))
-#define CVMX_PIP_QOS_DIFFX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0000600ull + (((offset) & 63) * 8))
-#define CVMX_PIP_QOS_VLANX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A00000C0ull + (((offset) & 7) * 8))
-#define CVMX_PIP_QOS_WATCHX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0000100ull + (((offset) & 7) * 8))
-#define CVMX_PIP_RAW_WORD \
-        CVMX_ADD_IO_SEG(0x00011800A00000B0ull)
-#define CVMX_PIP_SFT_RST \
-        CVMX_ADD_IO_SEG(0x00011800A0000030ull)
-#define CVMX_PIP_STAT0_PRTX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0000800ull + (((offset) & 63) * 80))
-#define CVMX_PIP_STAT1_PRTX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0000808ull + (((offset) & 63) * 80))
-#define CVMX_PIP_STAT2_PRTX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0000810ull + (((offset) & 63) * 80))
-#define CVMX_PIP_STAT3_PRTX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0000818ull + (((offset) & 63) * 80))
-#define CVMX_PIP_STAT4_PRTX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0000820ull + (((offset) & 63) * 80))
-#define CVMX_PIP_STAT5_PRTX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0000828ull + (((offset) & 63) * 80))
-#define CVMX_PIP_STAT6_PRTX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0000830ull + (((offset) & 63) * 80))
-#define CVMX_PIP_STAT7_PRTX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0000838ull + (((offset) & 63) * 80))
-#define CVMX_PIP_STAT8_PRTX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0000840ull + (((offset) & 63) * 80))
-#define CVMX_PIP_STAT9_PRTX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0000848ull + (((offset) & 63) * 80))
-#define CVMX_PIP_STAT_CTL \
-        CVMX_ADD_IO_SEG(0x00011800A0000018ull)
-#define CVMX_PIP_STAT_INB_ERRSX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0001A10ull + (((offset) & 63) * 32))
-#define CVMX_PIP_STAT_INB_OCTSX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0001A08ull + (((offset) & 63) * 32))
-#define CVMX_PIP_STAT_INB_PKTSX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0001A00ull + (((offset) & 63) * 32))
-#define CVMX_PIP_TAG_INCX(offset) \
-        CVMX_ADD_IO_SEG(0x00011800A0001800ull + (((offset) & 63) * 8))
-#define CVMX_PIP_TAG_MASK \
-        CVMX_ADD_IO_SEG(0x00011800A0000070ull)
-#define CVMX_PIP_TAG_SECRET \
-        CVMX_ADD_IO_SEG(0x00011800A0000068ull)
-#define CVMX_PIP_TODO_ENTRY \
-        CVMX_ADD_IO_SEG(0x00011800A0000078ull)
-
-union cvmx_pip_bck_prs {
-       uint64_t u64;
-       struct cvmx_pip_bck_prs_s {
-               uint64_t bckprs:1;
-               uint64_t reserved_13_62:50;
-               uint64_t hiwater:5;
-               uint64_t reserved_5_7:3;
-               uint64_t 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;
-};
-
-union cvmx_pip_bist_status {
-       uint64_t u64;
-       struct cvmx_pip_bist_status_s {
-               uint64_t reserved_18_63:46;
-               uint64_t bist:18;
-       } s;
-       struct cvmx_pip_bist_status_s cn30xx;
-       struct cvmx_pip_bist_status_s cn31xx;
-       struct cvmx_pip_bist_status_s cn38xx;
-       struct cvmx_pip_bist_status_s cn38xxp2;
-       struct cvmx_pip_bist_status_cn50xx {
-               uint64_t reserved_17_63:47;
-               uint64_t bist:17;
-       } cn50xx;
-       struct cvmx_pip_bist_status_s cn52xx;
-       struct cvmx_pip_bist_status_s cn52xxp1;
-       struct cvmx_pip_bist_status_s cn56xx;
-       struct cvmx_pip_bist_status_s cn56xxp1;
-       struct cvmx_pip_bist_status_s cn58xx;
-       struct cvmx_pip_bist_status_s cn58xxp1;
-};
-
-union cvmx_pip_crc_ctlx {
-       uint64_t u64;
-       struct cvmx_pip_crc_ctlx_s {
-               uint64_t reserved_2_63:62;
-               uint64_t invres:1;
-               uint64_t 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;
-};
-
-union cvmx_pip_crc_ivx {
-       uint64_t u64;
-       struct cvmx_pip_crc_ivx_s {
-               uint64_t reserved_32_63:32;
-               uint64_t 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;
-};
-
-union cvmx_pip_dec_ipsecx {
-       uint64_t u64;
-       struct cvmx_pip_dec_ipsecx_s {
-               uint64_t reserved_18_63:46;
-               uint64_t tcp:1;
-               uint64_t udp:1;
-               uint64_t 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;
-};
-
-union cvmx_pip_dsa_src_grp {
-       uint64_t u64;
-       struct cvmx_pip_dsa_src_grp_s {
-               uint64_t map15:4;
-               uint64_t map14:4;
-               uint64_t map13:4;
-               uint64_t map12:4;
-               uint64_t map11:4;
-               uint64_t map10:4;
-               uint64_t map9:4;
-               uint64_t map8:4;
-               uint64_t map7:4;
-               uint64_t map6:4;
-               uint64_t map5:4;
-               uint64_t map4:4;
-               uint64_t map3:4;
-               uint64_t map2:4;
-               uint64_t map1:4;
-               uint64_t 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;
-};
-
-union cvmx_pip_dsa_vid_grp {
-       uint64_t u64;
-       struct cvmx_pip_dsa_vid_grp_s {
-               uint64_t map15:4;
-               uint64_t map14:4;
-               uint64_t map13:4;
-               uint64_t map12:4;
-               uint64_t map11:4;
-               uint64_t map10:4;
-               uint64_t map9:4;
-               uint64_t map8:4;
-               uint64_t map7:4;
-               uint64_t map6:4;
-               uint64_t map5:4;
-               uint64_t map4:4;
-               uint64_t map3:4;
-               uint64_t map2:4;
-               uint64_t map1:4;
-               uint64_t 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;
-};
-
-union cvmx_pip_frm_len_chkx {
-       uint64_t u64;
-       struct cvmx_pip_frm_len_chkx_s {
-               uint64_t reserved_32_63:32;
-               uint64_t maxlen:16;
-               uint64_t 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;
-};
-
-union cvmx_pip_gbl_cfg {
-       uint64_t u64;
-       struct cvmx_pip_gbl_cfg_s {
-               uint64_t reserved_19_63:45;
-               uint64_t tag_syn:1;
-               uint64_t ip6_udp:1;
-               uint64_t max_l2:1;
-               uint64_t reserved_11_15:5;
-               uint64_t raw_shf:3;
-               uint64_t reserved_3_7:5;
-               uint64_t 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;
-};
-
-union cvmx_pip_gbl_ctl {
-       uint64_t u64;
-       struct cvmx_pip_gbl_ctl_s {
-               uint64_t reserved_27_63:37;
-               uint64_t dsa_grp_tvid:1;
-               uint64_t dsa_grp_scmd:1;
-               uint64_t dsa_grp_sid:1;
-               uint64_t reserved_21_23:3;
-               uint64_t ring_en:1;
-               uint64_t reserved_17_19:3;
-               uint64_t ignrs:1;
-               uint64_t vs_wqe:1;
-               uint64_t vs_qos:1;
-               uint64_t l2_mal:1;
-               uint64_t tcp_flag:1;
-               uint64_t l4_len:1;
-               uint64_t l4_chk:1;
-               uint64_t l4_prt:1;
-               uint64_t l4_mal:1;
-               uint64_t reserved_6_7:2;
-               uint64_t ip6_eext:2;
-               uint64_t ip4_opts:1;
-               uint64_t ip_hop:1;
-               uint64_t ip_mal:1;
-               uint64_t ip_chk:1;
-       } s;
-       struct cvmx_pip_gbl_ctl_cn30xx {
-               uint64_t reserved_17_63:47;
-               uint64_t ignrs:1;
-               uint64_t vs_wqe:1;
-               uint64_t vs_qos:1;
-               uint64_t l2_mal:1;
-               uint64_t tcp_flag:1;
-               uint64_t l4_len:1;
-               uint64_t l4_chk:1;
-               uint64_t l4_prt:1;
-               uint64_t l4_mal:1;
-               uint64_t reserved_6_7:2;
-               uint64_t ip6_eext:2;
-               uint64_t ip4_opts:1;
-               uint64_t ip_hop:1;
-               uint64_t ip_mal:1;
-               uint64_t 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_s cn52xx;
-       struct cvmx_pip_gbl_ctl_s cn52xxp1;
-       struct cvmx_pip_gbl_ctl_s cn56xx;
-       struct cvmx_pip_gbl_ctl_cn56xxp1 {
-               uint64_t reserved_21_63:43;
-               uint64_t ring_en:1;
-               uint64_t reserved_17_19:3;
-               uint64_t ignrs:1;
-               uint64_t vs_wqe:1;
-               uint64_t vs_qos:1;
-               uint64_t l2_mal:1;
-               uint64_t tcp_flag:1;
-               uint64_t l4_len:1;
-               uint64_t l4_chk:1;
-               uint64_t l4_prt:1;
-               uint64_t l4_mal:1;
-               uint64_t reserved_6_7:2;
-               uint64_t ip6_eext:2;
-               uint64_t ip4_opts:1;
-               uint64_t ip_hop:1;
-               uint64_t ip_mal:1;
-               uint64_t ip_chk:1;
-       } cn56xxp1;
-       struct cvmx_pip_gbl_ctl_cn30xx cn58xx;
-       struct cvmx_pip_gbl_ctl_cn30xx cn58xxp1;
-};
-
-union cvmx_pip_hg_pri_qos {
-       uint64_t u64;
-       struct cvmx_pip_hg_pri_qos_s {
-               uint64_t reserved_11_63:53;
-               uint64_t qos:3;
-               uint64_t reserved_6_7:2;
-               uint64_t 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;
-};
-
-union cvmx_pip_int_en {
-       uint64_t u64;
-       struct cvmx_pip_int_en_s {
-               uint64_t reserved_13_63:51;
-               uint64_t punyerr:1;
-               uint64_t lenerr:1;
-               uint64_t maxerr:1;
-               uint64_t minerr:1;
-               uint64_t beperr:1;
-               uint64_t feperr:1;
-               uint64_t todoovr:1;
-               uint64_t skprunt:1;
-               uint64_t badtag:1;
-               uint64_t prtnxa:1;
-               uint64_t bckprs:1;
-               uint64_t crcerr:1;
-               uint64_t pktdrp:1;
-       } s;
-       struct cvmx_pip_int_en_cn30xx {
-               uint64_t reserved_9_63:55;
-               uint64_t beperr:1;
-               uint64_t feperr:1;
-               uint64_t todoovr:1;
-               uint64_t skprunt:1;
-               uint64_t badtag:1;
-               uint64_t prtnxa:1;
-               uint64_t bckprs:1;
-               uint64_t crcerr:1;
-               uint64_t 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 {
-               uint64_t reserved_12_63:52;
-               uint64_t lenerr:1;
-               uint64_t maxerr:1;
-               uint64_t minerr:1;
-               uint64_t beperr:1;
-               uint64_t feperr:1;
-               uint64_t todoovr:1;
-               uint64_t skprunt:1;
-               uint64_t badtag:1;
-               uint64_t prtnxa:1;
-               uint64_t bckprs:1;
-               uint64_t reserved_1_1:1;
-               uint64_t pktdrp:1;
-       } cn50xx;
-       struct cvmx_pip_int_en_cn52xx {
-               uint64_t reserved_13_63:51;
-               uint64_t punyerr:1;
-               uint64_t lenerr:1;
-               uint64_t maxerr:1;
-               uint64_t minerr:1;
-               uint64_t beperr:1;
-               uint64_t feperr:1;
-               uint64_t todoovr:1;
-               uint64_t skprunt:1;
-               uint64_t badtag:1;
-               uint64_t prtnxa:1;
-               uint64_t bckprs:1;
-               uint64_t reserved_1_1:1;
-               uint64_t pktdrp:1;
-       } cn52xx;
-       struct cvmx_pip_int_en_cn52xx cn52xxp1;
-       struct cvmx_pip_int_en_s cn56xx;
-       struct cvmx_pip_int_en_cn56xxp1 {
-               uint64_t reserved_12_63:52;
-               uint64_t lenerr:1;
-               uint64_t maxerr:1;
-               uint64_t minerr:1;
-               uint64_t beperr:1;
-               uint64_t feperr:1;
-               uint64_t todoovr:1;
-               uint64_t skprunt:1;
-               uint64_t badtag:1;
-               uint64_t prtnxa:1;
-               uint64_t bckprs:1;
-               uint64_t crcerr:1;
-               uint64_t pktdrp:1;
-       } cn56xxp1;
-       struct cvmx_pip_int_en_cn58xx {
-               uint64_t reserved_13_63:51;
-               uint64_t punyerr:1;
-               uint64_t reserved_9_11:3;
-               uint64_t beperr:1;
-               uint64_t feperr:1;
-               uint64_t todoovr:1;
-               uint64_t skprunt:1;
-               uint64_t badtag:1;
-               uint64_t prtnxa:1;
-               uint64_t bckprs:1;
-               uint64_t crcerr:1;
-               uint64_t pktdrp:1;
-       } cn58xx;
-       struct cvmx_pip_int_en_cn30xx cn58xxp1;
-};
-
-union cvmx_pip_int_reg {
-       uint64_t u64;
-       struct cvmx_pip_int_reg_s {
-               uint64_t reserved_13_63:51;
-               uint64_t punyerr:1;
-               uint64_t lenerr:1;
-               uint64_t maxerr:1;
-               uint64_t minerr:1;
-               uint64_t beperr:1;
-               uint64_t feperr:1;
-               uint64_t todoovr:1;
-               uint64_t skprunt:1;
-               uint64_t badtag:1;
-               uint64_t prtnxa:1;
-               uint64_t bckprs:1;
-               uint64_t crcerr:1;
-               uint64_t pktdrp:1;
-       } s;
-       struct cvmx_pip_int_reg_cn30xx {
-               uint64_t reserved_9_63:55;
-               uint64_t beperr:1;
-               uint64_t feperr:1;
-               uint64_t todoovr:1;
-               uint64_t skprunt:1;
-               uint64_t badtag:1;
-               uint64_t prtnxa:1;
-               uint64_t bckprs:1;
-               uint64_t crcerr:1;
-               uint64_t 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 {
-               uint64_t reserved_12_63:52;
-               uint64_t lenerr:1;
-               uint64_t maxerr:1;
-               uint64_t minerr:1;
-               uint64_t beperr:1;
-               uint64_t feperr:1;
-               uint64_t todoovr:1;
-               uint64_t skprunt:1;
-               uint64_t badtag:1;
-               uint64_t prtnxa:1;
-               uint64_t bckprs:1;
-               uint64_t reserved_1_1:1;
-               uint64_t pktdrp:1;
-       } cn50xx;
-       struct cvmx_pip_int_reg_cn52xx {
-               uint64_t reserved_13_63:51;
-               uint64_t punyerr:1;
-               uint64_t lenerr:1;
-               uint64_t maxerr:1;
-               uint64_t minerr:1;
-               uint64_t beperr:1;
-               uint64_t feperr:1;
-               uint64_t todoovr:1;
-               uint64_t skprunt:1;
-               uint64_t badtag:1;
-               uint64_t prtnxa:1;
-               uint64_t bckprs:1;
-               uint64_t reserved_1_1:1;
-               uint64_t pktdrp:1;
-       } cn52xx;
-       struct cvmx_pip_int_reg_cn52xx cn52xxp1;
-       struct cvmx_pip_int_reg_s cn56xx;
-       struct cvmx_pip_int_reg_cn56xxp1 {
-               uint64_t reserved_12_63:52;
-               uint64_t lenerr:1;
-               uint64_t maxerr:1;
-               uint64_t minerr:1;
-               uint64_t beperr:1;
-               uint64_t feperr:1;
-               uint64_t todoovr:1;
-               uint64_t skprunt:1;
-               uint64_t badtag:1;
-               uint64_t prtnxa:1;
-               uint64_t bckprs:1;
-               uint64_t crcerr:1;
-               uint64_t pktdrp:1;
-       } cn56xxp1;
-       struct cvmx_pip_int_reg_cn58xx {
-               uint64_t reserved_13_63:51;
-               uint64_t punyerr:1;
-               uint64_t reserved_9_11:3;
-               uint64_t beperr:1;
-               uint64_t feperr:1;
-               uint64_t todoovr:1;
-               uint64_t skprunt:1;
-               uint64_t badtag:1;
-               uint64_t prtnxa:1;
-               uint64_t bckprs:1;
-               uint64_t crcerr:1;
-               uint64_t pktdrp:1;
-       } cn58xx;
-       struct cvmx_pip_int_reg_cn30xx cn58xxp1;
-};
-
-union cvmx_pip_ip_offset {
-       uint64_t u64;
-       struct cvmx_pip_ip_offset_s {
-               uint64_t reserved_3_63:61;
-               uint64_t 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;
-};
-
-union cvmx_pip_prt_cfgx {
-       uint64_t u64;
-       struct cvmx_pip_prt_cfgx_s {
-               uint64_t reserved_53_63:11;
-               uint64_t pad_len:1;
-               uint64_t vlan_len:1;
-               uint64_t lenerr_en:1;
-               uint64_t maxerr_en:1;
-               uint64_t minerr_en:1;
-               uint64_t grp_wat_47:4;
-               uint64_t qos_wat_47:4;
-               uint64_t reserved_37_39:3;
-               uint64_t rawdrp:1;
-               uint64_t tag_inc:2;
-               uint64_t dyn_rs:1;
-               uint64_t inst_hdr:1;
-               uint64_t grp_wat:4;
-               uint64_t hg_qos:1;
-               uint64_t qos:3;
-               uint64_t qos_wat:4;
-               uint64_t qos_vsel:1;
-               uint64_t qos_vod:1;
-               uint64_t qos_diff:1;
-               uint64_t qos_vlan:1;
-               uint64_t reserved_13_15:3;
-               uint64_t crc_en:1;
-               uint64_t higig_en:1;
-               uint64_t dsa_en:1;
-               uint64_t mode:2;
-               uint64_t reserved_7_7:1;
-               uint64_t skip:7;
-       } s;
-       struct cvmx_pip_prt_cfgx_cn30xx {
-               uint64_t reserved_37_63:27;
-               uint64_t rawdrp:1;
-               uint64_t tag_inc:2;
-               uint64_t dyn_rs:1;
-               uint64_t inst_hdr:1;
-               uint64_t grp_wat:4;
-               uint64_t reserved_27_27:1;
-               uint64_t qos:3;
-               uint64_t qos_wat:4;
-               uint64_t reserved_18_19:2;
-               uint64_t qos_diff:1;
-               uint64_t qos_vlan:1;
-               uint64_t reserved_10_15:6;
-               uint64_t mode:2;
-               uint64_t reserved_7_7:1;
-               uint64_t skip:7;
-       } cn30xx;
-       struct cvmx_pip_prt_cfgx_cn30xx cn31xx;
-       struct cvmx_pip_prt_cfgx_cn38xx {
-               uint64_t reserved_37_63:27;
-               uint64_t rawdrp:1;
-               uint64_t tag_inc:2;
-               uint64_t dyn_rs:1;
-               uint64_t inst_hdr:1;
-               uint64_t grp_wat:4;
-               uint64_t reserved_27_27:1;
-               uint64_t qos:3;
-               uint64_t qos_wat:4;
-               uint64_t reserved_18_19:2;
-               uint64_t qos_diff:1;
-               uint64_t qos_vlan:1;
-               uint64_t reserved_13_15:3;
-               uint64_t crc_en:1;
-               uint64_t reserved_10_11:2;
-               uint64_t mode:2;
-               uint64_t reserved_7_7:1;
-               uint64_t skip:7;
-       } cn38xx;
-       struct cvmx_pip_prt_cfgx_cn38xx cn38xxp2;
-       struct cvmx_pip_prt_cfgx_cn50xx {
-               uint64_t reserved_53_63:11;
-               uint64_t pad_len:1;
-               uint64_t vlan_len:1;
-               uint64_t lenerr_en:1;
-               uint64_t maxerr_en:1;
-               uint64_t minerr_en:1;
-               uint64_t grp_wat_47:4;
-               uint64_t qos_wat_47:4;
-               uint64_t reserved_37_39:3;
-               uint64_t rawdrp:1;
-               uint64_t tag_inc:2;
-               uint64_t dyn_rs:1;
-               uint64_t inst_hdr:1;
-               uint64_t grp_wat:4;
-               uint64_t reserved_27_27:1;
-               uint64_t qos:3;
-               uint64_t qos_wat:4;
-               uint64_t reserved_19_19:1;
-               uint64_t qos_vod:1;
-               uint64_t qos_diff:1;
-               uint64_t qos_vlan:1;
-               uint64_t reserved_13_15:3;
-               uint64_t crc_en:1;
-               uint64_t reserved_10_11:2;
-               uint64_t mode:2;
-               uint64_t reserved_7_7:1;
-               uint64_t skip:7;
-       } cn50xx;
-       struct cvmx_pip_prt_cfgx_s cn52xx;
-       struct cvmx_pip_prt_cfgx_s cn52xxp1;
-       struct cvmx_pip_prt_cfgx_s cn56xx;
-       struct cvmx_pip_prt_cfgx_cn50xx cn56xxp1;
-       struct cvmx_pip_prt_cfgx_cn58xx {
-               uint64_t reserved_37_63:27;
-               uint64_t rawdrp:1;
-               uint64_t tag_inc:2;
-               uint64_t dyn_rs:1;
-               uint64_t inst_hdr:1;
-               uint64_t grp_wat:4;
-               uint64_t reserved_27_27:1;
-               uint64_t qos:3;
-               uint64_t qos_wat:4;
-               uint64_t reserved_19_19:1;
-               uint64_t qos_vod:1;
-               uint64_t qos_diff:1;
-               uint64_t qos_vlan:1;
-               uint64_t reserved_13_15:3;
-               uint64_t crc_en:1;
-               uint64_t reserved_10_11:2;
-               uint64_t mode:2;
-               uint64_t reserved_7_7:1;
-               uint64_t skip:7;
-       } cn58xx;
-       struct cvmx_pip_prt_cfgx_cn58xx cn58xxp1;
-};
-
-union cvmx_pip_prt_tagx {
-       uint64_t u64;
-       struct cvmx_pip_prt_tagx_s {
-               uint64_t reserved_40_63:24;
-               uint64_t grptagbase:4;
-               uint64_t grptagmask:4;
-               uint64_t grptag:1;
-               uint64_t grptag_mskip:1;
-               uint64_t tag_mode:2;
-               uint64_t inc_vs:2;
-               uint64_t inc_vlan:1;
-               uint64_t inc_prt_flag:1;
-               uint64_t ip6_dprt_flag:1;
-               uint64_t ip4_dprt_flag:1;
-               uint64_t ip6_sprt_flag:1;
-               uint64_t ip4_sprt_flag:1;
-               uint64_t ip6_nxth_flag:1;
-               uint64_t ip4_pctl_flag:1;
-               uint64_t ip6_dst_flag:1;
-               uint64_t ip4_dst_flag:1;
-               uint64_t ip6_src_flag:1;
-               uint64_t ip4_src_flag:1;
-               uint64_t tcp6_tag_type:2;
-               uint64_t tcp4_tag_type:2;
-               uint64_t ip6_tag_type:2;
-               uint64_t ip4_tag_type:2;
-               uint64_t non_tag_type:2;
-               uint64_t grp:4;
-       } s;
-       struct cvmx_pip_prt_tagx_cn30xx {
-               uint64_t reserved_40_63:24;
-               uint64_t grptagbase:4;
-               uint64_t grptagmask:4;
-               uint64_t grptag:1;
-               uint64_t reserved_30_30:1;
-               uint64_t tag_mode:2;
-               uint64_t inc_vs:2;
-               uint64_t inc_vlan:1;
-               uint64_t inc_prt_flag:1;
-               uint64_t ip6_dprt_flag:1;
-               uint64_t ip4_dprt_flag:1;
-               uint64_t ip6_sprt_flag:1;
-               uint64_t ip4_sprt_flag:1;
-               uint64_t ip6_nxth_flag:1;
-               uint64_t ip4_pctl_flag:1;
-               uint64_t ip6_dst_flag:1;
-               uint64_t ip4_dst_flag:1;
-               uint64_t ip6_src_flag:1;
-               uint64_t ip4_src_flag:1;
-               uint64_t tcp6_tag_type:2;
-               uint64_t tcp4_tag_type:2;
-               uint64_t ip6_tag_type:2;
-               uint64_t ip4_tag_type:2;
-               uint64_t non_tag_type:2;
-               uint64_t 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_s cn50xx;
-       struct cvmx_pip_prt_tagx_s cn52xx;
-       struct cvmx_pip_prt_tagx_s cn52xxp1;
-       struct cvmx_pip_prt_tagx_s cn56xx;
-       struct cvmx_pip_prt_tagx_s cn56xxp1;
-       struct cvmx_pip_prt_tagx_cn30xx cn58xx;
-       struct cvmx_pip_prt_tagx_cn30xx cn58xxp1;
-};
-
-union cvmx_pip_qos_diffx {
-       uint64_t u64;
-       struct cvmx_pip_qos_diffx_s {
-               uint64_t reserved_3_63:61;
-               uint64_t 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;
-};
-
-union cvmx_pip_qos_vlanx {
-       uint64_t u64;
-       struct cvmx_pip_qos_vlanx_s {
-               uint64_t reserved_7_63:57;
-               uint64_t qos1:3;
-               uint64_t reserved_3_3:1;
-               uint64_t qos:3;
-       } s;
-       struct cvmx_pip_qos_vlanx_cn30xx {
-               uint64_t reserved_3_63:61;
-               uint64_t 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;
-};
-
-union cvmx_pip_qos_watchx {
-       uint64_t u64;
-       struct cvmx_pip_qos_watchx_s {
-               uint64_t reserved_48_63:16;
-               uint64_t mask:16;
-               uint64_t reserved_28_31:4;
-               uint64_t grp:4;
-               uint64_t reserved_23_23:1;
-               uint64_t qos:3;
-               uint64_t reserved_19_19:1;
-               uint64_t match_type:3;
-               uint64_t match_value:16;
-       } s;
-       struct cvmx_pip_qos_watchx_cn30xx {
-               uint64_t reserved_48_63:16;
-               uint64_t mask:16;
-               uint64_t reserved_28_31:4;
-               uint64_t grp:4;
-               uint64_t reserved_23_23:1;
-               uint64_t qos:3;
-               uint64_t reserved_18_19:2;
-               uint64_t match_type:2;
-               uint64_t 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_s cn50xx;
-       struct cvmx_pip_qos_watchx_s cn52xx;
-       struct cvmx_pip_qos_watchx_s cn52xxp1;
-       struct cvmx_pip_qos_watchx_s cn56xx;
-       struct cvmx_pip_qos_watchx_s cn56xxp1;
-       struct cvmx_pip_qos_watchx_cn30xx cn58xx;
-       struct cvmx_pip_qos_watchx_cn30xx cn58xxp1;
-};
-
-union cvmx_pip_raw_word {
-       uint64_t u64;
-       struct cvmx_pip_raw_word_s {
-               uint64_t reserved_56_63:8;
-               uint64_t 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;
-};
-
-union cvmx_pip_sft_rst {
-       uint64_t u64;
-       struct cvmx_pip_sft_rst_s {
-               uint64_t reserved_1_63:63;
-               uint64_t 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;
-};
-
-union cvmx_pip_stat0_prtx {
-       uint64_t u64;
-       struct cvmx_pip_stat0_prtx_s {
-               uint64_t drp_pkts:32;
-               uint64_t 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;
-};
-
-union cvmx_pip_stat1_prtx {
-       uint64_t u64;
-       struct cvmx_pip_stat1_prtx_s {
-               uint64_t reserved_48_63:16;
-               uint64_t 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;
-};
-
-union cvmx_pip_stat2_prtx {
-       uint64_t u64;
-       struct cvmx_pip_stat2_prtx_s {
-               uint64_t pkts:32;
-               uint64_t 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;
-};
-
-union cvmx_pip_stat3_prtx {
-       uint64_t u64;
-       struct cvmx_pip_stat3_prtx_s {
-               uint64_t bcst:32;
-               uint64_t 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;
-};
-
-union cvmx_pip_stat4_prtx {
-       uint64_t u64;
-       struct cvmx_pip_stat4_prtx_s {
-               uint64_t h65to127:32;
-               uint64_t 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;
-};
-
-union cvmx_pip_stat5_prtx {
-       uint64_t u64;
-       struct cvmx_pip_stat5_prtx_s {
-               uint64_t h256to511:32;
-               uint64_t 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;
-};
-
-union cvmx_pip_stat6_prtx {
-       uint64_t u64;
-       struct cvmx_pip_stat6_prtx_s {
-               uint64_t h1024to1518:32;
-               uint64_t 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;
-};
-
-union cvmx_pip_stat7_prtx {
-       uint64_t u64;
-       struct cvmx_pip_stat7_prtx_s {
-               uint64_t fcs:32;
-               uint64_t 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;
-};
-
-union cvmx_pip_stat8_prtx {
-       uint64_t u64;
-       struct cvmx_pip_stat8_prtx_s {
-               uint64_t frag:32;
-               uint64_t 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;
-};
-
-union cvmx_pip_stat9_prtx {
-       uint64_t u64;
-       struct cvmx_pip_stat9_prtx_s {
-               uint64_t jabber:32;
-               uint64_t 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;
-};
-
-union cvmx_pip_stat_ctl {
-       uint64_t u64;
-       struct cvmx_pip_stat_ctl_s {
-               uint64_t reserved_1_63:63;
-               uint64_t rdclr:1;
-       } s;
-       struct cvmx_pip_stat_ctl_s cn30xx;
-       struct cvmx_pip_stat_ctl_s cn31xx;
-       struct cvmx_pip_stat_ctl_s cn38xx;
-       struct cvmx_pip_stat_ctl_s cn38xxp2;
-       struct cvmx_pip_stat_ctl_s cn50xx;
-       struct cvmx_pip_stat_ctl_s cn52xx;
-       struct cvmx_pip_stat_ctl_s cn52xxp1;
-       struct cvmx_pip_stat_ctl_s cn56xx;
-       struct cvmx_pip_stat_ctl_s cn56xxp1;
-       struct cvmx_pip_stat_ctl_s cn58xx;
-       struct cvmx_pip_stat_ctl_s cn58xxp1;
-};
-
-union cvmx_pip_stat_inb_errsx {
-       uint64_t u64;
-       struct cvmx_pip_stat_inb_errsx_s {
-               uint64_t reserved_16_63:48;
-               uint64_t 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;
-};
-
-union cvmx_pip_stat_inb_octsx {
-       uint64_t u64;
-       struct cvmx_pip_stat_inb_octsx_s {
-               uint64_t reserved_48_63:16;
-               uint64_t 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;
-};
-
-union cvmx_pip_stat_inb_pktsx {
-       uint64_t u64;
-       struct cvmx_pip_stat_inb_pktsx_s {
-               uint64_t reserved_32_63:32;
-               uint64_t 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;
-};
-
-union cvmx_pip_tag_incx {
-       uint64_t u64;
-       struct cvmx_pip_tag_incx_s {
-               uint64_t reserved_8_63:56;
-               uint64_t 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;
-};
-
-union cvmx_pip_tag_mask {
-       uint64_t u64;
-       struct cvmx_pip_tag_mask_s {
-               uint64_t reserved_16_63:48;
-               uint64_t 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;
-};
-
-union cvmx_pip_tag_secret {
-       uint64_t u64;
-       struct cvmx_pip_tag_secret_s {
-               uint64_t reserved_32_63:32;
-               uint64_t dst:16;
-               uint64_t 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;
-};
-
-union cvmx_pip_todo_entry {
-       uint64_t u64;
-       struct cvmx_pip_todo_entry_s {
-               uint64_t val:1;
-               uint64_t reserved_62_62:1;
-               uint64_t 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;
-};
-
-#endif
diff --git a/drivers/staging/octeon/cvmx-pip.h b/drivers/staging/octeon/cvmx-pip.h
deleted file mode 100644 (file)
index 78dbce8..0000000
+++ /dev/null
@@ -1,524 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- * Interface to the hardware Packet Input Processing unit.
- *
- */
-
-#ifndef __CVMX_PIP_H__
-#define __CVMX_PIP_H__
-
-#include "cvmx-wqe.h"
-#include "cvmx-fpa.h"
-#include "cvmx-pip-defs.h"
-
-#define CVMX_PIP_NUM_INPUT_PORTS                40
-#define CVMX_PIP_NUM_WATCHERS                   4
-
-/*
- * 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,
-       /* RGM+SPI 1 = partially received packet (buffering/bandwidth
-        * not adequate) */
-       CVMX_PIP_PARTIAL_ERR = 1ull,
-       /* RGM+SPI 2 = receive packet too large and truncated */
-       CVMX_PIP_JABBER_ERR = 2ull,
-       /*
-        * RGM 3 = max frame error (pkt len > max frame len) (with FCS
-        * error)
-        */
-       CVMX_PIP_OVER_FCS_ERR = 3ull,
-       /* RGM+SPI 4 = max frame error (pkt len > max frame len) */
-       CVMX_PIP_OVER_ERR = 4ull,
-       /*
-        * RGM 5 = nibble error (data not byte multiple - 100M and 10M
-        * only)
-        */
-       CVMX_PIP_ALIGN_ERR = 5ull,
-       /*
-        * RGM 6 = min frame error (pkt len < min frame len) (with FCS
-        * error)
-        */
-       CVMX_PIP_UNDER_FCS_ERR = 6ull,
-       /* RGM     7 = FCS error */
-       CVMX_PIP_GMX_FCS_ERR = 7ull,
-       /* RGM+SPI 8 = min frame error (pkt len < min frame len) */
-       CVMX_PIP_UNDER_ERR = 8ull,
-       /* RGM     9 = Frame carrier extend error */
-       CVMX_PIP_EXTEND_ERR = 9ull,
-       /*
-        * RGM 10 = length mismatch (len did not match len in L2
-        * length/type)
-        */
-       CVMX_PIP_LENGTH_ERR = 10ull,
-       /* RGM 11 = Frame error (some or all data bits marked err) */
-       CVMX_PIP_DAT_ERR = 11ull,
-       /*     SPI 11 = DIP4 error */
-       CVMX_PIP_DIP_ERR = 11ull,
-       /*
-        * RGM 12 = packet was not large enough to pass the skipper -
-        * no inspection could occur.
-        */
-       CVMX_PIP_SKIP_ERR = 12ull,
-       /*
-        * RGM 13 = studder error (data not repeated - 100M and 10M
-        * only)
-        */
-       CVMX_PIP_NIBBLE_ERR = 13ull,
-       /* RGM+SPI 16 = FCS error */
-       CVMX_PIP_PIP_FCS = 16L,
-       /*
-        * RGM+SPI+PCI 17 = packet was not large enough to pass the
-        * skipper - no inspection could occur.
-        */
-       CVMX_PIP_PIP_SKIP_ERR = 17L,
-       /*
-        * RGM+SPI+PCI 18 = malformed l2 (packet not long enough to
-        * cover L2 hdr).
-        */
-       CVMX_PIP_PIP_L2_MAL_HDR = 18L
-       /*
-        * 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 {
-       /* Inbound octets marked to be dropped by the IPD */
-       uint32_t dropped_octets;
-       /* Inbound packets marked to be dropped by the IPD */
-       uint32_t dropped_packets;
-       /* RAW PCI Packets received by PIP per port */
-       uint32_t pci_raw_packets;
-       /* Number of octets processed by PIP */
-       uint32_t octets;
-       /* Number of packets processed by PIP */
-       uint32_t packets;
-       /*
-        * Number of indentified L2 multicast packets.  Does not
-        * include broadcast packets.  Only includes packets whose
-        * parse mode is SKIP_TO_L2
-        */
-       uint32_t multicast_packets;
-       /*
-        * Number of indentified L2 broadcast packets.  Does not
-        * include multicast packets.  Only includes packets whose
-        * parse mode is SKIP_TO_L2
-        */
-       uint32_t broadcast_packets;
-       /* Number of 64B packets */
-       uint32_t len_64_packets;
-       /* Number of 65-127B packets */
-       uint32_t len_65_127_packets;
-       /* Number of 128-255B packets */
-       uint32_t len_128_255_packets;
-       /* Number of 256-511B packets */
-       uint32_t len_256_511_packets;
-       /* Number of 512-1023B packets */
-       uint32_t len_512_1023_packets;
-       /* Number of 1024-1518B packets */
-       uint32_t len_1024_1518_packets;
-       /* Number of 1519-max packets */
-       uint32_t len_1519_max_packets;
-       /* Number of packets with FCS or Align opcode errors */
-       uint32_t fcs_align_err_packets;
-       /* Number of packets with length < min */
-       uint32_t runt_packets;
-       /* Number of packets with length < min and FCS error */
-       uint32_t runt_crc_packets;
-       /* Number of packets with length > max */
-       uint32_t oversize_packets;
-       /* Number of packets with length > max and FCS error */
-       uint32_t oversize_crc_packets;
-       /* Number of packets without GMX/SPX/PCI errors received by PIP */
-       uint32_t inb_packets;
-       /*
-        * Total number of octets from all packets received by PIP,
-        * including CRC
-        */
-       uint64_t inb_octets;
-       /* Number of packets with GMX/SPX/PCI errors received by PIP */
-       uint16_t inb_errors;
-} cvmx_pip_port_status_t;
-
-/**
- * Definition of the PIP custom header that can be prepended
- * to a packet by external hardware.
- */
-typedef union {
-       uint64_t u64;
-       struct {
-               /*
-                * Documented as R - Set if the Packet is RAWFULL. If
-                * set, this header must be the full 8 bytes.
-                */
-               uint64_t rawfull:1;
-               /* Must be zero */
-               uint64_t reserved0:5;
-               /* PIP parse mode for this packet */
-               uint64_t parse_mode:2;
-               /* Must be zero */
-               uint64_t reserved1:1;
-               /*
-                * Skip amount, including this header, to the
-                * beginning of the packet
-                */
-               uint64_t skip_len:7;
-               /* Must be zero */
-               uint64_t reserved2:6;
-               /* POW input queue for this packet */
-               uint64_t qos:3;
-               /* POW input group for this packet */
-               uint64_t grp:4;
-               /*
-                * Flag to store this packet in the work queue entry,
-                * if possible
-                */
-               uint64_t rs:1;
-               /* POW input tag type */
-               uint64_t tag_type:2;
-               /* POW input tag */
-               uint64_t tag:32;
-       } s;
-} cvmx_pip_pkt_inst_hdr_t;
-
-/* CSR typedefs have been moved to cvmx-csr-*.h */
-
-/**
- * Configure an ethernet input port
- *
- * @port_num: Port number to configure
- * @port_cfg: Port hardware configuration
- * @port_tag_cfg:
- *                 Port POW tagging configuration
- */
-static inline void cvmx_pip_config_port(uint64_t port_num,
-                                       union cvmx_pip_prt_cfgx port_cfg,
-                                       union cvmx_pip_prt_tagx port_tag_cfg)
-{
-       cvmx_write_csr(CVMX_PIP_PRT_CFGX(port_num), port_cfg.u64);
-       cvmx_write_csr(CVMX_PIP_PRT_TAGX(port_num), port_tag_cfg.u64);
-}
-#if 0
-/**
- * @deprecated      This function is a thin wrapper around the Pass1 version
- *                  of the CVMX_PIP_QOS_WATCHX CSR; Pass2 has added a field for
- *                  setting the group that is incompatible with this function,
- *                  the preferred upgrade path is to use the CSR directly.
- *
- * Configure the global QoS packet watchers. Each watcher is
- * capable of matching a field in a packet to determine the
- * QoS queue for scheduling.
- *
- * @watcher:    Watcher number to configure (0 - 3).
- * @match_type: Watcher match type
- * @match_value:
- *                   Value the watcher will match against
- * @qos:        QoS queue for packets matching this watcher
- */
-static inline void cvmx_pip_config_watcher(uint64_t watcher,
-                                          cvmx_pip_qos_watch_types match_type,
-                                          uint64_t match_value, uint64_t qos)
-{
-       cvmx_pip_port_watcher_cfg_t watcher_config;
-
-       watcher_config.u64 = 0;
-       watcher_config.s.match_type = match_type;
-       watcher_config.s.match_value = match_value;
-       watcher_config.s.qos = qos;
-
-       cvmx_write_csr(CVMX_PIP_QOS_WATCHX(watcher), watcher_config.u64);
-}
-#endif
-/**
- * Configure the VLAN priority to QoS queue mapping.
- *
- * @vlan_priority:
- *               VLAN priority (0-7)
- * @qos:    QoS queue for packets matching this watcher
- */
-static inline void cvmx_pip_config_vlan_qos(uint64_t vlan_priority,
-                                           uint64_t qos)
-{
-       union cvmx_pip_qos_vlanx pip_qos_vlanx;
-       pip_qos_vlanx.u64 = 0;
-       pip_qos_vlanx.s.qos = qos;
-       cvmx_write_csr(CVMX_PIP_QOS_VLANX(vlan_priority), pip_qos_vlanx.u64);
-}
-
-/**
- * Configure the Diffserv to QoS queue mapping.
- *
- * @diffserv: Diffserv field value (0-63)
- * @qos:      QoS queue for packets matching this watcher
- */
-static inline void cvmx_pip_config_diffserv_qos(uint64_t diffserv, uint64_t qos)
-{
-       union cvmx_pip_qos_diffx pip_qos_diffx;
-       pip_qos_diffx.u64 = 0;
-       pip_qos_diffx.s.qos = qos;
-       cvmx_write_csr(CVMX_PIP_QOS_DIFFX(diffserv), pip_qos_diffx.u64);
-}
-
-/**
- * Get the status counters for a port.
- *
- * @port_num: Port number to get statistics for.
- * @clear:    Set to 1 to clear the counters after they are read
- * @status:   Where to put the results.
- */
-static inline void cvmx_pip_get_port_status(uint64_t port_num, uint64_t clear,
-                                           cvmx_pip_port_status_t *status)
-{
-       union cvmx_pip_stat_ctl pip_stat_ctl;
-       union cvmx_pip_stat0_prtx stat0;
-       union cvmx_pip_stat1_prtx stat1;
-       union cvmx_pip_stat2_prtx stat2;
-       union cvmx_pip_stat3_prtx stat3;
-       union cvmx_pip_stat4_prtx stat4;
-       union cvmx_pip_stat5_prtx stat5;
-       union cvmx_pip_stat6_prtx stat6;
-       union cvmx_pip_stat7_prtx stat7;
-       union cvmx_pip_stat8_prtx stat8;
-       union cvmx_pip_stat9_prtx stat9;
-       union cvmx_pip_stat_inb_pktsx pip_stat_inb_pktsx;
-       union cvmx_pip_stat_inb_octsx pip_stat_inb_octsx;
-       union cvmx_pip_stat_inb_errsx pip_stat_inb_errsx;
-
-       pip_stat_ctl.u64 = 0;
-       pip_stat_ctl.s.rdclr = clear;
-       cvmx_write_csr(CVMX_PIP_STAT_CTL, pip_stat_ctl.u64);
-
-       stat0.u64 = cvmx_read_csr(CVMX_PIP_STAT0_PRTX(port_num));
-       stat1.u64 = cvmx_read_csr(CVMX_PIP_STAT1_PRTX(port_num));
-       stat2.u64 = cvmx_read_csr(CVMX_PIP_STAT2_PRTX(port_num));
-       stat3.u64 = cvmx_read_csr(CVMX_PIP_STAT3_PRTX(port_num));
-       stat4.u64 = cvmx_read_csr(CVMX_PIP_STAT4_PRTX(port_num));
-       stat5.u64 = cvmx_read_csr(CVMX_PIP_STAT5_PRTX(port_num));
-       stat6.u64 = cvmx_read_csr(CVMX_PIP_STAT6_PRTX(port_num));
-       stat7.u64 = cvmx_read_csr(CVMX_PIP_STAT7_PRTX(port_num));
-       stat8.u64 = cvmx_read_csr(CVMX_PIP_STAT8_PRTX(port_num));
-       stat9.u64 = cvmx_read_csr(CVMX_PIP_STAT9_PRTX(port_num));
-       pip_stat_inb_pktsx.u64 =
-           cvmx_read_csr(CVMX_PIP_STAT_INB_PKTSX(port_num));
-       pip_stat_inb_octsx.u64 =
-           cvmx_read_csr(CVMX_PIP_STAT_INB_OCTSX(port_num));
-       pip_stat_inb_errsx.u64 =
-           cvmx_read_csr(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;
-       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;
-
-       if (cvmx_octeon_is_pass1()) {
-               /*
-                * Kludge to fix Octeon Pass 1 errata - Drop counts
-                * don't work.
-                */
-               if (status->inb_packets > status->packets)
-                       status->dropped_packets =
-                           status->inb_packets - status->packets;
-               else
-                       status->dropped_packets = 0;
-               if (status->inb_octets - status->inb_packets * 4 >
-                   status->octets)
-                       status->dropped_octets =
-                           status->inb_octets - status->inb_packets * 4 -
-                           status->octets;
-               else
-                       status->dropped_octets = 0;
-       }
-}
-
-/**
- * Configure the hardware CRC engine
- *
- * @interface: Interface to configure (0 or 1)
- * @invert_result:
- *                 Invert the result of the CRC
- * @reflect:  Reflect
- * @initialization_vector:
- *                 CRC initialization vector
- */
-static inline void cvmx_pip_config_crc(uint64_t interface,
-                                      uint64_t invert_result, uint64_t reflect,
-                                      uint32_t initialization_vector)
-{
-       if (OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX)) {
-               union cvmx_pip_crc_ctlx config;
-               union cvmx_pip_crc_ivx pip_crc_ivx;
-
-               config.u64 = 0;
-               config.s.invres = invert_result;
-               config.s.reflect = reflect;
-               cvmx_write_csr(CVMX_PIP_CRC_CTLX(interface), config.u64);
-
-               pip_crc_ivx.u64 = 0;
-               pip_crc_ivx.s.iv = initialization_vector;
-               cvmx_write_csr(CVMX_PIP_CRC_IVX(interface), pip_crc_ivx.u64);
-       }
-}
-
-/**
- * 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.
- *
- * @mask_index: Which tag mask to clear (0..3)
- */
-static inline void cvmx_pip_tag_mask_clear(uint64_t mask_index)
-{
-       uint64_t index;
-       union cvmx_pip_tag_incx 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++)
-               cvmx_write_csr(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.
- *
- * @mask_index: Which tag mask to modify (0..3)
- * @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.
- * @len:    Number of bytes to include. Usually this is the sizeof()
- *          the field.
- */
-static inline void cvmx_pip_tag_mask_set(uint64_t mask_index, uint64_t offset,
-                                        uint64_t len)
-{
-       while (len--) {
-               union cvmx_pip_tag_incx pip_tag_incx;
-               uint64_t index = mask_index * 16 + offset / 8;
-               pip_tag_incx.u64 = cvmx_read_csr(CVMX_PIP_TAG_INCX(index));
-               pip_tag_incx.s.en |= 0x80 >> (offset & 0x7);
-               cvmx_write_csr(CVMX_PIP_TAG_INCX(index), pip_tag_incx.u64);
-               offset++;
-       }
-}
-
-#endif /*  __CVMX_PIP_H__ */
diff --git a/drivers/staging/octeon/cvmx-pko-defs.h b/drivers/staging/octeon/cvmx-pko-defs.h
deleted file mode 100644 (file)
index 50e779c..0000000
+++ /dev/null
@@ -1,1133 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-#ifndef __CVMX_PKO_DEFS_H__
-#define __CVMX_PKO_DEFS_H__
-
-#define CVMX_PKO_MEM_COUNT0 \
-        CVMX_ADD_IO_SEG(0x0001180050001080ull)
-#define CVMX_PKO_MEM_COUNT1 \
-        CVMX_ADD_IO_SEG(0x0001180050001088ull)
-#define CVMX_PKO_MEM_DEBUG0 \
-        CVMX_ADD_IO_SEG(0x0001180050001100ull)
-#define CVMX_PKO_MEM_DEBUG1 \
-        CVMX_ADD_IO_SEG(0x0001180050001108ull)
-#define CVMX_PKO_MEM_DEBUG10 \
-        CVMX_ADD_IO_SEG(0x0001180050001150ull)
-#define CVMX_PKO_MEM_DEBUG11 \
-        CVMX_ADD_IO_SEG(0x0001180050001158ull)
-#define CVMX_PKO_MEM_DEBUG12 \
-        CVMX_ADD_IO_SEG(0x0001180050001160ull)
-#define CVMX_PKO_MEM_DEBUG13 \
-        CVMX_ADD_IO_SEG(0x0001180050001168ull)
-#define CVMX_PKO_MEM_DEBUG14 \
-        CVMX_ADD_IO_SEG(0x0001180050001170ull)
-#define CVMX_PKO_MEM_DEBUG2 \
-        CVMX_ADD_IO_SEG(0x0001180050001110ull)
-#define CVMX_PKO_MEM_DEBUG3 \
-        CVMX_ADD_IO_SEG(0x0001180050001118ull)
-#define CVMX_PKO_MEM_DEBUG4 \
-        CVMX_ADD_IO_SEG(0x0001180050001120ull)
-#define CVMX_PKO_MEM_DEBUG5 \
-        CVMX_ADD_IO_SEG(0x0001180050001128ull)
-#define CVMX_PKO_MEM_DEBUG6 \
-        CVMX_ADD_IO_SEG(0x0001180050001130ull)
-#define CVMX_PKO_MEM_DEBUG7 \
-        CVMX_ADD_IO_SEG(0x0001180050001138ull)
-#define CVMX_PKO_MEM_DEBUG8 \
-        CVMX_ADD_IO_SEG(0x0001180050001140ull)
-#define CVMX_PKO_MEM_DEBUG9 \
-        CVMX_ADD_IO_SEG(0x0001180050001148ull)
-#define CVMX_PKO_MEM_PORT_PTRS \
-        CVMX_ADD_IO_SEG(0x0001180050001010ull)
-#define CVMX_PKO_MEM_PORT_QOS \
-        CVMX_ADD_IO_SEG(0x0001180050001018ull)
-#define CVMX_PKO_MEM_PORT_RATE0 \
-        CVMX_ADD_IO_SEG(0x0001180050001020ull)
-#define CVMX_PKO_MEM_PORT_RATE1 \
-        CVMX_ADD_IO_SEG(0x0001180050001028ull)
-#define CVMX_PKO_MEM_QUEUE_PTRS \
-        CVMX_ADD_IO_SEG(0x0001180050001000ull)
-#define CVMX_PKO_MEM_QUEUE_QOS \
-        CVMX_ADD_IO_SEG(0x0001180050001008ull)
-#define CVMX_PKO_REG_BIST_RESULT \
-        CVMX_ADD_IO_SEG(0x0001180050000080ull)
-#define CVMX_PKO_REG_CMD_BUF \
-        CVMX_ADD_IO_SEG(0x0001180050000010ull)
-#define CVMX_PKO_REG_CRC_CTLX(offset) \
-        CVMX_ADD_IO_SEG(0x0001180050000028ull + (((offset) & 1) * 8))
-#define CVMX_PKO_REG_CRC_ENABLE \
-        CVMX_ADD_IO_SEG(0x0001180050000020ull)
-#define CVMX_PKO_REG_CRC_IVX(offset) \
-        CVMX_ADD_IO_SEG(0x0001180050000038ull + (((offset) & 1) * 8))
-#define CVMX_PKO_REG_DEBUG0 \
-        CVMX_ADD_IO_SEG(0x0001180050000098ull)
-#define CVMX_PKO_REG_DEBUG1 \
-        CVMX_ADD_IO_SEG(0x00011800500000A0ull)
-#define CVMX_PKO_REG_DEBUG2 \
-        CVMX_ADD_IO_SEG(0x00011800500000A8ull)
-#define CVMX_PKO_REG_DEBUG3 \
-        CVMX_ADD_IO_SEG(0x00011800500000B0ull)
-#define CVMX_PKO_REG_ENGINE_INFLIGHT \
-        CVMX_ADD_IO_SEG(0x0001180050000050ull)
-#define CVMX_PKO_REG_ENGINE_THRESH \
-        CVMX_ADD_IO_SEG(0x0001180050000058ull)
-#define CVMX_PKO_REG_ERROR \
-        CVMX_ADD_IO_SEG(0x0001180050000088ull)
-#define CVMX_PKO_REG_FLAGS \
-        CVMX_ADD_IO_SEG(0x0001180050000000ull)
-#define CVMX_PKO_REG_GMX_PORT_MODE \
-        CVMX_ADD_IO_SEG(0x0001180050000018ull)
-#define CVMX_PKO_REG_INT_MASK \
-        CVMX_ADD_IO_SEG(0x0001180050000090ull)
-#define CVMX_PKO_REG_QUEUE_MODE \
-        CVMX_ADD_IO_SEG(0x0001180050000048ull)
-#define CVMX_PKO_REG_QUEUE_PTRS1 \
-        CVMX_ADD_IO_SEG(0x0001180050000100ull)
-#define CVMX_PKO_REG_READ_IDX \
-        CVMX_ADD_IO_SEG(0x0001180050000008ull)
-
-union cvmx_pko_mem_count0 {
-       uint64_t u64;
-       struct cvmx_pko_mem_count0_s {
-               uint64_t reserved_32_63:32;
-               uint64_t 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;
-};
-
-union cvmx_pko_mem_count1 {
-       uint64_t u64;
-       struct cvmx_pko_mem_count1_s {
-               uint64_t reserved_48_63:16;
-               uint64_t 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;
-};
-
-union cvmx_pko_mem_debug0 {
-       uint64_t u64;
-       struct cvmx_pko_mem_debug0_s {
-               uint64_t fau:28;
-               uint64_t cmd:14;
-               uint64_t segs:6;
-               uint64_t 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;
-};
-
-union cvmx_pko_mem_debug1 {
-       uint64_t u64;
-       struct cvmx_pko_mem_debug1_s {
-               uint64_t i:1;
-               uint64_t back:4;
-               uint64_t pool:3;
-               uint64_t size:16;
-               uint64_t 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;
-};
-
-union cvmx_pko_mem_debug10 {
-       uint64_t u64;
-       struct cvmx_pko_mem_debug10_s {
-               uint64_t reserved_0_63:64;
-       } s;
-       struct cvmx_pko_mem_debug10_cn30xx {
-               uint64_t fau:28;
-               uint64_t cmd:14;
-               uint64_t segs:6;
-               uint64_t 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 {
-               uint64_t reserved_49_63:15;
-               uint64_t ptrs1:17;
-               uint64_t reserved_17_31:15;
-               uint64_t 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;
-};
-
-union cvmx_pko_mem_debug11 {
-       uint64_t u64;
-       struct cvmx_pko_mem_debug11_s {
-               uint64_t i:1;
-               uint64_t back:4;
-               uint64_t pool:3;
-               uint64_t size:16;
-               uint64_t reserved_0_39:40;
-       } s;
-       struct cvmx_pko_mem_debug11_cn30xx {
-               uint64_t i:1;
-               uint64_t back:4;
-               uint64_t pool:3;
-               uint64_t size:16;
-               uint64_t 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 {
-               uint64_t reserved_23_63:41;
-               uint64_t maj:1;
-               uint64_t uid:3;
-               uint64_t sop:1;
-               uint64_t len:1;
-               uint64_t chk:1;
-               uint64_t cnt:13;
-               uint64_t 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;
-};
-
-union cvmx_pko_mem_debug12 {
-       uint64_t u64;
-       struct cvmx_pko_mem_debug12_s {
-               uint64_t reserved_0_63:64;
-       } s;
-       struct cvmx_pko_mem_debug12_cn30xx {
-               uint64_t 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 {
-               uint64_t fau:28;
-               uint64_t cmd:14;
-               uint64_t segs:6;
-               uint64_t 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;
-};
-
-union cvmx_pko_mem_debug13 {
-       uint64_t u64;
-       struct cvmx_pko_mem_debug13_s {
-               uint64_t i:1;
-               uint64_t back:4;
-               uint64_t pool:3;
-               uint64_t reserved_0_55:56;
-       } s;
-       struct cvmx_pko_mem_debug13_cn30xx {
-               uint64_t reserved_51_63:13;
-               uint64_t widx:17;
-               uint64_t ridx2:17;
-               uint64_t 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 {
-               uint64_t i:1;
-               uint64_t back:4;
-               uint64_t pool:3;
-               uint64_t size:16;
-               uint64_t 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;
-};
-
-union cvmx_pko_mem_debug14 {
-       uint64_t u64;
-       struct cvmx_pko_mem_debug14_s {
-               uint64_t reserved_0_63:64;
-       } s;
-       struct cvmx_pko_mem_debug14_cn30xx {
-               uint64_t reserved_17_63:47;
-               uint64_t 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 {
-               uint64_t data:64;
-       } cn52xx;
-       struct cvmx_pko_mem_debug14_cn52xx cn52xxp1;
-       struct cvmx_pko_mem_debug14_cn52xx cn56xx;
-       struct cvmx_pko_mem_debug14_cn52xx cn56xxp1;
-};
-
-union cvmx_pko_mem_debug2 {
-       uint64_t u64;
-       struct cvmx_pko_mem_debug2_s {
-               uint64_t i:1;
-               uint64_t back:4;
-               uint64_t pool:3;
-               uint64_t size:16;
-               uint64_t 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;
-};
-
-union cvmx_pko_mem_debug3 {
-       uint64_t u64;
-       struct cvmx_pko_mem_debug3_s {
-               uint64_t reserved_0_63:64;
-       } s;
-       struct cvmx_pko_mem_debug3_cn30xx {
-               uint64_t i:1;
-               uint64_t back:4;
-               uint64_t pool:3;
-               uint64_t size:16;
-               uint64_t 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 {
-               uint64_t 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;
-};
-
-union cvmx_pko_mem_debug4 {
-       uint64_t u64;
-       struct cvmx_pko_mem_debug4_s {
-               uint64_t reserved_0_63:64;
-       } s;
-       struct cvmx_pko_mem_debug4_cn30xx {
-               uint64_t 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 {
-               uint64_t cmnd_segs:3;
-               uint64_t cmnd_siz:16;
-               uint64_t cmnd_off:6;
-               uint64_t uid:3;
-               uint64_t dread_sop:1;
-               uint64_t init_dwrite:1;
-               uint64_t chk_once:1;
-               uint64_t chk_mode:1;
-               uint64_t active:1;
-               uint64_t static_p:1;
-               uint64_t qos:3;
-               uint64_t qcb_ridx:5;
-               uint64_t qid_off_max:4;
-               uint64_t qid_off:4;
-               uint64_t qid_base:8;
-               uint64_t wait:1;
-               uint64_t minor:2;
-               uint64_t major:3;
-       } cn50xx;
-       struct cvmx_pko_mem_debug4_cn52xx {
-               uint64_t curr_siz:8;
-               uint64_t curr_off:16;
-               uint64_t cmnd_segs:6;
-               uint64_t cmnd_siz:16;
-               uint64_t cmnd_off:6;
-               uint64_t uid:2;
-               uint64_t dread_sop:1;
-               uint64_t init_dwrite:1;
-               uint64_t chk_once:1;
-               uint64_t chk_mode:1;
-               uint64_t wait:1;
-               uint64_t minor:2;
-               uint64_t 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;
-};
-
-union cvmx_pko_mem_debug5 {
-       uint64_t u64;
-       struct cvmx_pko_mem_debug5_s {
-               uint64_t reserved_0_63:64;
-       } s;
-       struct cvmx_pko_mem_debug5_cn30xx {
-               uint64_t dwri_mod:1;
-               uint64_t dwri_sop:1;
-               uint64_t dwri_len:1;
-               uint64_t dwri_cnt:13;
-               uint64_t cmnd_siz:16;
-               uint64_t uid:1;
-               uint64_t xfer_wor:1;
-               uint64_t xfer_dwr:1;
-               uint64_t cbuf_fre:1;
-               uint64_t reserved_27_27:1;
-               uint64_t chk_mode:1;
-               uint64_t active:1;
-               uint64_t qos:3;
-               uint64_t qcb_ridx:5;
-               uint64_t qid_off:3;
-               uint64_t qid_base:7;
-               uint64_t wait:1;
-               uint64_t minor:2;
-               uint64_t 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 {
-               uint64_t curr_ptr:29;
-               uint64_t curr_siz:16;
-               uint64_t curr_off:16;
-               uint64_t cmnd_segs:3;
-       } cn50xx;
-       struct cvmx_pko_mem_debug5_cn52xx {
-               uint64_t reserved_54_63:10;
-               uint64_t nxt_inflt:6;
-               uint64_t curr_ptr:40;
-               uint64_t 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;
-};
-
-union cvmx_pko_mem_debug6 {
-       uint64_t u64;
-       struct cvmx_pko_mem_debug6_s {
-               uint64_t reserved_37_63:27;
-               uint64_t qid_offres:4;
-               uint64_t qid_offths:4;
-               uint64_t preempter:1;
-               uint64_t preemptee:1;
-               uint64_t preempted:1;
-               uint64_t active:1;
-               uint64_t statc:1;
-               uint64_t qos:3;
-               uint64_t qcb_ridx:5;
-               uint64_t qid_offmax:4;
-               uint64_t reserved_0_11:12;
-       } s;
-       struct cvmx_pko_mem_debug6_cn30xx {
-               uint64_t reserved_11_63:53;
-               uint64_t qid_offm:3;
-               uint64_t static_p:1;
-               uint64_t work_min:3;
-               uint64_t dwri_chk:1;
-               uint64_t dwri_uid:1;
-               uint64_t 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 {
-               uint64_t reserved_11_63:53;
-               uint64_t curr_ptr:11;
-       } cn50xx;
-       struct cvmx_pko_mem_debug6_cn52xx {
-               uint64_t reserved_37_63:27;
-               uint64_t qid_offres:4;
-               uint64_t qid_offths:4;
-               uint64_t preempter:1;
-               uint64_t preemptee:1;
-               uint64_t preempted:1;
-               uint64_t active:1;
-               uint64_t statc:1;
-               uint64_t qos:3;
-               uint64_t qcb_ridx:5;
-               uint64_t qid_offmax:4;
-               uint64_t qid_off:4;
-               uint64_t 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;
-};
-
-union cvmx_pko_mem_debug7 {
-       uint64_t u64;
-       struct cvmx_pko_mem_debug7_s {
-               uint64_t qos:5;
-               uint64_t tail:1;
-               uint64_t reserved_0_57:58;
-       } s;
-       struct cvmx_pko_mem_debug7_cn30xx {
-               uint64_t reserved_58_63:6;
-               uint64_t dwb:9;
-               uint64_t start:33;
-               uint64_t 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 {
-               uint64_t qos:5;
-               uint64_t tail:1;
-               uint64_t buf_siz:13;
-               uint64_t buf_ptr:33;
-               uint64_t qcb_widx:6;
-               uint64_t 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;
-};
-
-union cvmx_pko_mem_debug8 {
-       uint64_t u64;
-       struct cvmx_pko_mem_debug8_s {
-               uint64_t reserved_59_63:5;
-               uint64_t tail:1;
-               uint64_t buf_siz:13;
-               uint64_t reserved_0_44:45;
-       } s;
-       struct cvmx_pko_mem_debug8_cn30xx {
-               uint64_t qos:5;
-               uint64_t tail:1;
-               uint64_t buf_siz:13;
-               uint64_t buf_ptr:33;
-               uint64_t qcb_widx:6;
-               uint64_t 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 {
-               uint64_t reserved_28_63:36;
-               uint64_t doorbell:20;
-               uint64_t reserved_6_7:2;
-               uint64_t static_p:1;
-               uint64_t s_tail:1;
-               uint64_t static_q:1;
-               uint64_t qos:3;
-       } cn50xx;
-       struct cvmx_pko_mem_debug8_cn52xx {
-               uint64_t reserved_29_63:35;
-               uint64_t preempter:1;
-               uint64_t doorbell:20;
-               uint64_t reserved_7_7:1;
-               uint64_t preemptee:1;
-               uint64_t static_p:1;
-               uint64_t s_tail:1;
-               uint64_t static_q:1;
-               uint64_t 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;
-};
-
-union cvmx_pko_mem_debug9 {
-       uint64_t u64;
-       struct cvmx_pko_mem_debug9_s {
-               uint64_t reserved_49_63:15;
-               uint64_t ptrs0:17;
-               uint64_t reserved_0_31:32;
-       } s;
-       struct cvmx_pko_mem_debug9_cn30xx {
-               uint64_t reserved_28_63:36;
-               uint64_t doorbell:20;
-               uint64_t reserved_5_7:3;
-               uint64_t s_tail:1;
-               uint64_t static_q:1;
-               uint64_t qos:3;
-       } cn30xx;
-       struct cvmx_pko_mem_debug9_cn30xx cn31xx;
-       struct cvmx_pko_mem_debug9_cn38xx {
-               uint64_t reserved_28_63:36;
-               uint64_t doorbell:20;
-               uint64_t reserved_6_7:2;
-               uint64_t static_p:1;
-               uint64_t s_tail:1;
-               uint64_t static_q:1;
-               uint64_t qos:3;
-       } cn38xx;
-       struct cvmx_pko_mem_debug9_cn38xx cn38xxp2;
-       struct cvmx_pko_mem_debug9_cn50xx {
-               uint64_t reserved_49_63:15;
-               uint64_t ptrs0:17;
-               uint64_t reserved_17_31:15;
-               uint64_t 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;
-};
-
-union cvmx_pko_mem_port_ptrs {
-       uint64_t u64;
-       struct cvmx_pko_mem_port_ptrs_s {
-               uint64_t reserved_62_63:2;
-               uint64_t static_p:1;
-               uint64_t qos_mask:8;
-               uint64_t reserved_16_52:37;
-               uint64_t bp_port:6;
-               uint64_t eid:4;
-               uint64_t 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;
-};
-
-union cvmx_pko_mem_port_qos {
-       uint64_t u64;
-       struct cvmx_pko_mem_port_qos_s {
-               uint64_t reserved_61_63:3;
-               uint64_t qos_mask:8;
-               uint64_t reserved_10_52:43;
-               uint64_t eid:4;
-               uint64_t 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;
-};
-
-union cvmx_pko_mem_port_rate0 {
-       uint64_t u64;
-       struct cvmx_pko_mem_port_rate0_s {
-               uint64_t reserved_51_63:13;
-               uint64_t rate_word:19;
-               uint64_t rate_pkt:24;
-               uint64_t reserved_6_7:2;
-               uint64_t pid:6;
-       } s;
-       struct cvmx_pko_mem_port_rate0_s cn52xx;
-       struct cvmx_pko_mem_port_rate0_s cn52xxp1;
-       struct cvmx_pko_mem_port_rate0_s cn56xx;
-       struct cvmx_pko_mem_port_rate0_s cn56xxp1;
-};
-
-union cvmx_pko_mem_port_rate1 {
-       uint64_t u64;
-       struct cvmx_pko_mem_port_rate1_s {
-               uint64_t reserved_32_63:32;
-               uint64_t rate_lim:24;
-               uint64_t reserved_6_7:2;
-               uint64_t pid:6;
-       } s;
-       struct cvmx_pko_mem_port_rate1_s cn52xx;
-       struct cvmx_pko_mem_port_rate1_s cn52xxp1;
-       struct cvmx_pko_mem_port_rate1_s cn56xx;
-       struct cvmx_pko_mem_port_rate1_s cn56xxp1;
-};
-
-union cvmx_pko_mem_queue_ptrs {
-       uint64_t u64;
-       struct cvmx_pko_mem_queue_ptrs_s {
-               uint64_t s_tail:1;
-               uint64_t static_p:1;
-               uint64_t static_q:1;
-               uint64_t qos_mask:8;
-               uint64_t buf_ptr:36;
-               uint64_t tail:1;
-               uint64_t index:3;
-               uint64_t port:6;
-               uint64_t 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;
-};
-
-union cvmx_pko_mem_queue_qos {
-       uint64_t u64;
-       struct cvmx_pko_mem_queue_qos_s {
-               uint64_t reserved_61_63:3;
-               uint64_t qos_mask:8;
-               uint64_t reserved_13_52:40;
-               uint64_t pid:6;
-               uint64_t 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;
-};
-
-union cvmx_pko_reg_bist_result {
-       uint64_t u64;
-       struct cvmx_pko_reg_bist_result_s {
-               uint64_t reserved_0_63:64;
-       } s;
-       struct cvmx_pko_reg_bist_result_cn30xx {
-               uint64_t reserved_27_63:37;
-               uint64_t psb2:5;
-               uint64_t count:1;
-               uint64_t rif:1;
-               uint64_t wif:1;
-               uint64_t ncb:1;
-               uint64_t out:1;
-               uint64_t crc:1;
-               uint64_t chk:1;
-               uint64_t qsb:2;
-               uint64_t qcb:2;
-               uint64_t pdb:4;
-               uint64_t 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 {
-               uint64_t reserved_33_63:31;
-               uint64_t csr:1;
-               uint64_t iob:1;
-               uint64_t out_crc:1;
-               uint64_t out_ctl:3;
-               uint64_t out_sta:1;
-               uint64_t out_wif:1;
-               uint64_t prt_chk:3;
-               uint64_t prt_nxt:1;
-               uint64_t prt_psb:6;
-               uint64_t ncb_inb:2;
-               uint64_t prt_qcb:2;
-               uint64_t prt_qsb:3;
-               uint64_t dat_dat:4;
-               uint64_t dat_ptr:4;
-       } cn50xx;
-       struct cvmx_pko_reg_bist_result_cn52xx {
-               uint64_t reserved_35_63:29;
-               uint64_t csr:1;
-               uint64_t iob:1;
-               uint64_t out_dat:1;
-               uint64_t out_ctl:3;
-               uint64_t out_sta:1;
-               uint64_t out_wif:1;
-               uint64_t prt_chk:3;
-               uint64_t prt_nxt:1;
-               uint64_t prt_psb:8;
-               uint64_t ncb_inb:2;
-               uint64_t prt_qcb:2;
-               uint64_t prt_qsb:3;
-               uint64_t prt_ctl:2;
-               uint64_t dat_dat:2;
-               uint64_t 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;
-};
-
-union cvmx_pko_reg_cmd_buf {
-       uint64_t u64;
-       struct cvmx_pko_reg_cmd_buf_s {
-               uint64_t reserved_23_63:41;
-               uint64_t pool:3;
-               uint64_t reserved_13_19:7;
-               uint64_t 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;
-};
-
-union cvmx_pko_reg_crc_ctlx {
-       uint64_t u64;
-       struct cvmx_pko_reg_crc_ctlx_s {
-               uint64_t reserved_2_63:62;
-               uint64_t invres:1;
-               uint64_t 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;
-};
-
-union cvmx_pko_reg_crc_enable {
-       uint64_t u64;
-       struct cvmx_pko_reg_crc_enable_s {
-               uint64_t reserved_32_63:32;
-               uint64_t 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;
-};
-
-union cvmx_pko_reg_crc_ivx {
-       uint64_t u64;
-       struct cvmx_pko_reg_crc_ivx_s {
-               uint64_t reserved_32_63:32;
-               uint64_t 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;
-};
-
-union cvmx_pko_reg_debug0 {
-       uint64_t u64;
-       struct cvmx_pko_reg_debug0_s {
-               uint64_t asserts:64;
-       } s;
-       struct cvmx_pko_reg_debug0_cn30xx {
-               uint64_t reserved_17_63:47;
-               uint64_t 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;
-};
-
-union cvmx_pko_reg_debug1 {
-       uint64_t u64;
-       struct cvmx_pko_reg_debug1_s {
-               uint64_t 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;
-};
-
-union cvmx_pko_reg_debug2 {
-       uint64_t u64;
-       struct cvmx_pko_reg_debug2_s {
-               uint64_t 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;
-};
-
-union cvmx_pko_reg_debug3 {
-       uint64_t u64;
-       struct cvmx_pko_reg_debug3_s {
-               uint64_t 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;
-};
-
-union cvmx_pko_reg_engine_inflight {
-       uint64_t u64;
-       struct cvmx_pko_reg_engine_inflight_s {
-               uint64_t reserved_40_63:24;
-               uint64_t engine9:4;
-               uint64_t engine8:4;
-               uint64_t engine7:4;
-               uint64_t engine6:4;
-               uint64_t engine5:4;
-               uint64_t engine4:4;
-               uint64_t engine3:4;
-               uint64_t engine2:4;
-               uint64_t engine1:4;
-               uint64_t engine0:4;
-       } s;
-       struct cvmx_pko_reg_engine_inflight_s cn52xx;
-       struct cvmx_pko_reg_engine_inflight_s cn52xxp1;
-       struct cvmx_pko_reg_engine_inflight_s cn56xx;
-       struct cvmx_pko_reg_engine_inflight_s cn56xxp1;
-};
-
-union cvmx_pko_reg_engine_thresh {
-       uint64_t u64;
-       struct cvmx_pko_reg_engine_thresh_s {
-               uint64_t reserved_10_63:54;
-               uint64_t mask:10;
-       } s;
-       struct cvmx_pko_reg_engine_thresh_s cn52xx;
-       struct cvmx_pko_reg_engine_thresh_s cn52xxp1;
-       struct cvmx_pko_reg_engine_thresh_s cn56xx;
-       struct cvmx_pko_reg_engine_thresh_s cn56xxp1;
-};
-
-union cvmx_pko_reg_error {
-       uint64_t u64;
-       struct cvmx_pko_reg_error_s {
-               uint64_t reserved_3_63:61;
-               uint64_t currzero:1;
-               uint64_t doorbell:1;
-               uint64_t parity:1;
-       } s;
-       struct cvmx_pko_reg_error_cn30xx {
-               uint64_t reserved_2_63:62;
-               uint64_t doorbell:1;
-               uint64_t 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_s cn50xx;
-       struct cvmx_pko_reg_error_s cn52xx;
-       struct cvmx_pko_reg_error_s cn52xxp1;
-       struct cvmx_pko_reg_error_s cn56xx;
-       struct cvmx_pko_reg_error_s cn56xxp1;
-       struct cvmx_pko_reg_error_s cn58xx;
-       struct cvmx_pko_reg_error_s cn58xxp1;
-};
-
-union cvmx_pko_reg_flags {
-       uint64_t u64;
-       struct cvmx_pko_reg_flags_s {
-               uint64_t reserved_4_63:60;
-               uint64_t reset:1;
-               uint64_t store_be:1;
-               uint64_t ena_dwb:1;
-               uint64_t ena_pko:1;
-       } s;
-       struct cvmx_pko_reg_flags_s cn30xx;
-       struct cvmx_pko_reg_flags_s cn31xx;
-       struct cvmx_pko_reg_flags_s cn38xx;
-       struct cvmx_pko_reg_flags_s cn38xxp2;
-       struct cvmx_pko_reg_flags_s cn50xx;
-       struct cvmx_pko_reg_flags_s cn52xx;
-       struct cvmx_pko_reg_flags_s cn52xxp1;
-       struct cvmx_pko_reg_flags_s cn56xx;
-       struct cvmx_pko_reg_flags_s cn56xxp1;
-       struct cvmx_pko_reg_flags_s cn58xx;
-       struct cvmx_pko_reg_flags_s cn58xxp1;
-};
-
-union cvmx_pko_reg_gmx_port_mode {
-       uint64_t u64;
-       struct cvmx_pko_reg_gmx_port_mode_s {
-               uint64_t reserved_6_63:58;
-               uint64_t mode1:3;
-               uint64_t 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;
-};
-
-union cvmx_pko_reg_int_mask {
-       uint64_t u64;
-       struct cvmx_pko_reg_int_mask_s {
-               uint64_t reserved_3_63:61;
-               uint64_t currzero:1;
-               uint64_t doorbell:1;
-               uint64_t parity:1;
-       } s;
-       struct cvmx_pko_reg_int_mask_cn30xx {
-               uint64_t reserved_2_63:62;
-               uint64_t doorbell:1;
-               uint64_t 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_s cn50xx;
-       struct cvmx_pko_reg_int_mask_s cn52xx;
-       struct cvmx_pko_reg_int_mask_s cn52xxp1;
-       struct cvmx_pko_reg_int_mask_s cn56xx;
-       struct cvmx_pko_reg_int_mask_s cn56xxp1;
-       struct cvmx_pko_reg_int_mask_s cn58xx;
-       struct cvmx_pko_reg_int_mask_s cn58xxp1;
-};
-
-union cvmx_pko_reg_queue_mode {
-       uint64_t u64;
-       struct cvmx_pko_reg_queue_mode_s {
-               uint64_t reserved_2_63:62;
-               uint64_t 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;
-};
-
-union cvmx_pko_reg_queue_ptrs1 {
-       uint64_t u64;
-       struct cvmx_pko_reg_queue_ptrs1_s {
-               uint64_t reserved_2_63:62;
-               uint64_t idx3:1;
-               uint64_t 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;
-};
-
-union cvmx_pko_reg_read_idx {
-       uint64_t u64;
-       struct cvmx_pko_reg_read_idx_s {
-               uint64_t reserved_16_63:48;
-               uint64_t inc:8;
-               uint64_t 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;
-};
-
-#endif
diff --git a/drivers/staging/octeon/cvmx-pko.c b/drivers/staging/octeon/cvmx-pko.c
deleted file mode 100644 (file)
index 50a2c9b..0000000
+++ /dev/null
@@ -1,506 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- * Support library for the hardware Packet Output unit.
- */
-
-#include <asm/octeon/octeon.h>
-
-#include "cvmx-config.h"
-#include "cvmx-pko.h"
-#include "cvmx-helper.h"
-
-/**
- * Internal state of packet output
- */
-
-/**
- * Call before any other calls to initialize the packet
- * output system.  This does chip global config, and should only be
- * done by one core.
- */
-
-void cvmx_pko_initialize_global(void)
-{
-       int i;
-       uint64_t priority = 8;
-       union cvmx_pko_reg_cmd_buf config;
-
-       /*
-        * Set the size of the PKO command buffers to an odd number of
-        * 64bit words. This allows the normal two word send to stay
-        * aligned and never span a command word buffer.
-        */
-       config.u64 = 0;
-       config.s.pool = CVMX_FPA_OUTPUT_BUFFER_POOL;
-       config.s.size = CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE / 8 - 1;
-
-       cvmx_write_csr(CVMX_PKO_REG_CMD_BUF, config.u64);
-
-       for (i = 0; i < CVMX_PKO_MAX_OUTPUT_QUEUES; i++)
-               cvmx_pko_config_port(CVMX_PKO_MEM_QUEUE_PTRS_ILLEGAL_PID, i, 1,
-                                    &priority);
-
-       /*
-        * If we aren't using all of the queues optimize PKO's
-        * internal memory.
-        */
-       if (OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX)
-           || OCTEON_IS_MODEL(OCTEON_CN56XX)
-           || OCTEON_IS_MODEL(OCTEON_CN52XX)) {
-               int num_interfaces = cvmx_helper_get_number_of_interfaces();
-               int last_port =
-                   cvmx_helper_get_last_ipd_port(num_interfaces - 1);
-               int max_queues =
-                   cvmx_pko_get_base_queue(last_port) +
-                   cvmx_pko_get_num_queues(last_port);
-               if (OCTEON_IS_MODEL(OCTEON_CN38XX)) {
-                       if (max_queues <= 32)
-                               cvmx_write_csr(CVMX_PKO_REG_QUEUE_MODE, 2);
-                       else if (max_queues <= 64)
-                               cvmx_write_csr(CVMX_PKO_REG_QUEUE_MODE, 1);
-               } else {
-                       if (max_queues <= 64)
-                               cvmx_write_csr(CVMX_PKO_REG_QUEUE_MODE, 2);
-                       else if (max_queues <= 128)
-                               cvmx_write_csr(CVMX_PKO_REG_QUEUE_MODE, 1);
-               }
-       }
-}
-
-/**
- * This function does per-core initialization required by the PKO routines.
- * This must be called on all cores that will do packet output, and must
- * be called after the FPA has been initialized and filled with pages.
- *
- * Returns 0 on success
- *         !0 on failure
- */
-int cvmx_pko_initialize_local(void)
-{
-       /* Nothing to do */
-       return 0;
-}
-
-/**
- * Enables the packet output hardware. It must already be
- * configured.
- */
-void cvmx_pko_enable(void)
-{
-       union cvmx_pko_reg_flags flags;
-
-       flags.u64 = cvmx_read_csr(CVMX_PKO_REG_FLAGS);
-       if (flags.s.ena_pko)
-               cvmx_dprintf
-                   ("Warning: Enabling PKO when PKO already enabled.\n");
-
-       flags.s.ena_dwb = 1;
-       flags.s.ena_pko = 1;
-       /*
-        * always enable big endian for 3-word command. Does nothing
-        * for 2-word.
-        */
-       flags.s.store_be = 1;
-       cvmx_write_csr(CVMX_PKO_REG_FLAGS, flags.u64);
-}
-
-/**
- * Disables the packet output. Does not affect any configuration.
- */
-void cvmx_pko_disable(void)
-{
-       union cvmx_pko_reg_flags pko_reg_flags;
-       pko_reg_flags.u64 = cvmx_read_csr(CVMX_PKO_REG_FLAGS);
-       pko_reg_flags.s.ena_pko = 0;
-       cvmx_write_csr(CVMX_PKO_REG_FLAGS, pko_reg_flags.u64);
-}
-
-
-/**
- * Reset the packet output.
- */
-static void __cvmx_pko_reset(void)
-{
-       union cvmx_pko_reg_flags pko_reg_flags;
-       pko_reg_flags.u64 = cvmx_read_csr(CVMX_PKO_REG_FLAGS);
-       pko_reg_flags.s.reset = 1;
-       cvmx_write_csr(CVMX_PKO_REG_FLAGS, pko_reg_flags.u64);
-}
-
-/**
- * Shutdown and free resources required by packet output.
- */
-void cvmx_pko_shutdown(void)
-{
-       union cvmx_pko_mem_queue_ptrs config;
-       int queue;
-
-       cvmx_pko_disable();
-
-       for (queue = 0; queue < CVMX_PKO_MAX_OUTPUT_QUEUES; queue++) {
-               config.u64 = 0;
-               config.s.tail = 1;
-               config.s.index = 0;
-               config.s.port = CVMX_PKO_MEM_QUEUE_PTRS_ILLEGAL_PID;
-               config.s.queue = queue & 0x7f;
-               config.s.qos_mask = 0;
-               config.s.buf_ptr = 0;
-               if (!OCTEON_IS_MODEL(OCTEON_CN3XXX)) {
-                       union cvmx_pko_reg_queue_ptrs1 config1;
-                       config1.u64 = 0;
-                       config1.s.qid7 = queue >> 7;
-                       cvmx_write_csr(CVMX_PKO_REG_QUEUE_PTRS1, config1.u64);
-               }
-               cvmx_write_csr(CVMX_PKO_MEM_QUEUE_PTRS, config.u64);
-               cvmx_cmd_queue_shutdown(CVMX_CMD_QUEUE_PKO(queue));
-       }
-       __cvmx_pko_reset();
-}
-
-/**
- * Configure a output port and the associated queues for use.
- *
- * @port:       Port to configure.
- * @base_queue: First queue number to associate with this port.
- * @num_queues: Number of queues to associate with this port
- * @priority:   Array of priority levels for each queue. Values are
- *                   allowed to be 0-8. A value of 8 get 8 times the traffic
- *                   of a value of 1.  A value of 0 indicates that no rounds
- *                   will be participated in. These priorities can be changed
- *                   on the fly while the pko is enabled. A priority of 9
- *                   indicates that static priority should be used.  If static
- *                   priority is used all queues with static priority must be
- *                   contiguous starting at the base_queue, and lower numbered
- *                   queues have higher priority than higher numbered queues.
- *                   There must be num_queues elements in the array.
- */
-cvmx_pko_status_t cvmx_pko_config_port(uint64_t port, uint64_t base_queue,
-                                      uint64_t num_queues,
-                                      const uint64_t priority[])
-{
-       cvmx_pko_status_t result_code;
-       uint64_t queue;
-       union cvmx_pko_mem_queue_ptrs config;
-       union cvmx_pko_reg_queue_ptrs1 config1;
-       int static_priority_base = -1;
-       int static_priority_end = -1;
-
-       if ((port >= CVMX_PKO_NUM_OUTPUT_PORTS)
-           && (port != CVMX_PKO_MEM_QUEUE_PTRS_ILLEGAL_PID)) {
-               cvmx_dprintf("ERROR: cvmx_pko_config_port: Invalid port %llu\n",
-                            (unsigned long long)port);
-               return CVMX_PKO_INVALID_PORT;
-       }
-
-       if (base_queue + num_queues > CVMX_PKO_MAX_OUTPUT_QUEUES) {
-               cvmx_dprintf
-                   ("ERROR: cvmx_pko_config_port: Invalid queue range %llu\n",
-                    (unsigned long long)(base_queue + num_queues));
-               return CVMX_PKO_INVALID_QUEUE;
-       }
-
-       if (port != CVMX_PKO_MEM_QUEUE_PTRS_ILLEGAL_PID) {
-               /*
-                * Validate the static queue priority setup and set
-                * static_priority_base and static_priority_end
-                * accordingly.
-                */
-               for (queue = 0; queue < num_queues; queue++) {
-                       /* Find first queue of static priority */
-                       if (static_priority_base == -1
-                           && priority[queue] ==
-                           CVMX_PKO_QUEUE_STATIC_PRIORITY)
-                               static_priority_base = queue;
-                       /* Find last queue of static priority */
-                       if (static_priority_base != -1
-                           && static_priority_end == -1
-                           && priority[queue] != CVMX_PKO_QUEUE_STATIC_PRIORITY
-                           && queue)
-                               static_priority_end = queue - 1;
-                       else if (static_priority_base != -1
-                                && static_priority_end == -1
-                                && queue == num_queues - 1)
-                               /* all queues are static priority */
-                               static_priority_end = queue;
-                       /*
-                        * Check to make sure all static priority
-                        * queues are contiguous.  Also catches some
-                        * cases of static priorites not starting at
-                        * queue 0.
-                        */
-                       if (static_priority_end != -1
-                           && (int)queue > static_priority_end
-                           && priority[queue] ==
-                           CVMX_PKO_QUEUE_STATIC_PRIORITY) {
-                               cvmx_dprintf("ERROR: cvmx_pko_config_port: "
-                                            "Static priority queues aren't "
-                                            "contiguous or don't start at "
-                                            "base queue. q: %d, eq: %d\n",
-                                       (int)queue, static_priority_end);
-                               return CVMX_PKO_INVALID_PRIORITY;
-                       }
-               }
-               if (static_priority_base > 0) {
-                       cvmx_dprintf("ERROR: cvmx_pko_config_port: Static "
-                                    "priority queues don't start at base "
-                                    "queue. sq: %d\n",
-                               static_priority_base);
-                       return CVMX_PKO_INVALID_PRIORITY;
-               }
-#if 0
-               cvmx_dprintf("Port %d: Static priority queue base: %d, "
-                            "end: %d\n", port,
-                       static_priority_base, static_priority_end);
-#endif
-       }
-       /*
-        * At this point, static_priority_base and static_priority_end
-        * are either both -1, or are valid start/end queue
-        * numbers.
-        */
-
-       result_code = CVMX_PKO_SUCCESS;
-
-#ifdef PKO_DEBUG
-       cvmx_dprintf("num queues: %d (%lld,%lld)\n", num_queues,
-                    CVMX_PKO_QUEUES_PER_PORT_INTERFACE0,
-                    CVMX_PKO_QUEUES_PER_PORT_INTERFACE1);
-#endif
-
-       for (queue = 0; queue < num_queues; queue++) {
-               uint64_t *buf_ptr = NULL;
-
-               config1.u64 = 0;
-               config1.s.idx3 = queue >> 3;
-               config1.s.qid7 = (base_queue + queue) >> 7;
-
-               config.u64 = 0;
-               config.s.tail = queue == (num_queues - 1);
-               config.s.index = queue;
-               config.s.port = port;
-               config.s.queue = base_queue + queue;
-
-               if (!cvmx_octeon_is_pass1()) {
-                       config.s.static_p = static_priority_base >= 0;
-                       config.s.static_q = (int)queue <= static_priority_end;
-                       config.s.s_tail = (int)queue == static_priority_end;
-               }
-               /*
-                * Convert the priority into an enable bit field. Try
-                * to space the bits out evenly so the packet don't
-                * get grouped up
-                */
-               switch ((int)priority[queue]) {
-               case 0:
-                       config.s.qos_mask = 0x00;
-                       break;
-               case 1:
-                       config.s.qos_mask = 0x01;
-                       break;
-               case 2:
-                       config.s.qos_mask = 0x11;
-                       break;
-               case 3:
-                       config.s.qos_mask = 0x49;
-                       break;
-               case 4:
-                       config.s.qos_mask = 0x55;
-                       break;
-               case 5:
-                       config.s.qos_mask = 0x57;
-                       break;
-               case 6:
-                       config.s.qos_mask = 0x77;
-                       break;
-               case 7:
-                       config.s.qos_mask = 0x7f;
-                       break;
-               case 8:
-                       config.s.qos_mask = 0xff;
-                       break;
-               case CVMX_PKO_QUEUE_STATIC_PRIORITY:
-                       /* Pass 1 will fall through to the error case */
-                       if (!cvmx_octeon_is_pass1()) {
-                               config.s.qos_mask = 0xff;
-                               break;
-                       }
-               default:
-                       cvmx_dprintf("ERROR: cvmx_pko_config_port: Invalid "
-                                    "priority %llu\n",
-                               (unsigned long long)priority[queue]);
-                       config.s.qos_mask = 0xff;
-                       result_code = CVMX_PKO_INVALID_PRIORITY;
-                       break;
-               }
-
-               if (port != CVMX_PKO_MEM_QUEUE_PTRS_ILLEGAL_PID) {
-                       cvmx_cmd_queue_result_t cmd_res =
-                           cvmx_cmd_queue_initialize(CVMX_CMD_QUEUE_PKO
-                                                     (base_queue + queue),
-                                                     CVMX_PKO_MAX_QUEUE_DEPTH,
-                                                     CVMX_FPA_OUTPUT_BUFFER_POOL,
-                                                     CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE
-                                                     -
-                                                     CVMX_PKO_COMMAND_BUFFER_SIZE_ADJUST
-                                                     * 8);
-                       if (cmd_res != CVMX_CMD_QUEUE_SUCCESS) {
-                               switch (cmd_res) {
-                               case CVMX_CMD_QUEUE_NO_MEMORY:
-                                       cvmx_dprintf("ERROR: "
-                                                    "cvmx_pko_config_port: "
-                                                    "Unable to allocate "
-                                                    "output buffer.\n");
-                                       return CVMX_PKO_NO_MEMORY;
-                               case CVMX_CMD_QUEUE_ALREADY_SETUP:
-                                       cvmx_dprintf
-                                           ("ERROR: cvmx_pko_config_port: Port already setup.\n");
-                                       return CVMX_PKO_PORT_ALREADY_SETUP;
-                               case CVMX_CMD_QUEUE_INVALID_PARAM:
-                               default:
-                                       cvmx_dprintf
-                                           ("ERROR: cvmx_pko_config_port: Command queue initialization failed.\n");
-                                       return CVMX_PKO_CMD_QUEUE_INIT_ERROR;
-                               }
-                       }
-
-                       buf_ptr =
-                           (uint64_t *)
-                           cvmx_cmd_queue_buffer(CVMX_CMD_QUEUE_PKO
-                                                 (base_queue + queue));
-                       config.s.buf_ptr = cvmx_ptr_to_phys(buf_ptr);
-               } else
-                       config.s.buf_ptr = 0;
-
-               CVMX_SYNCWS;
-
-               if (!OCTEON_IS_MODEL(OCTEON_CN3XXX))
-                       cvmx_write_csr(CVMX_PKO_REG_QUEUE_PTRS1, config1.u64);
-               cvmx_write_csr(CVMX_PKO_MEM_QUEUE_PTRS, config.u64);
-       }
-
-       return result_code;
-}
-
-#ifdef PKO_DEBUG
-/**
- * Show map of ports -> queues for different cores.
- */
-void cvmx_pko_show_queue_map()
-{
-       int core, port;
-       int pko_output_ports = 36;
-
-       cvmx_dprintf("port");
-       for (port = 0; port < pko_output_ports; port++)
-               cvmx_dprintf("%3d ", port);
-       cvmx_dprintf("\n");
-
-       for (core = 0; core < CVMX_MAX_CORES; core++) {
-               cvmx_dprintf("\n%2d: ", core);
-               for (port = 0; port < pko_output_ports; port++) {
-                       cvmx_dprintf("%3d ",
-                                    cvmx_pko_get_base_queue_per_core(port,
-                                                                     core));
-               }
-       }
-       cvmx_dprintf("\n");
-}
-#endif
-
-/**
- * Rate limit a PKO port to a max packets/sec. This function is only
- * supported on CN51XX and higher, excluding CN58XX.
- *
- * @port:      Port to rate limit
- * @packets_s: Maximum packet/sec
- * @burst:     Maximum number of packets to burst in a row before rate
- *                  limiting cuts in.
- *
- * Returns Zero on success, negative on failure
- */
-int cvmx_pko_rate_limit_packets(int port, int packets_s, int burst)
-{
-       union cvmx_pko_mem_port_rate0 pko_mem_port_rate0;
-       union cvmx_pko_mem_port_rate1 pko_mem_port_rate1;
-
-       pko_mem_port_rate0.u64 = 0;
-       pko_mem_port_rate0.s.pid = port;
-       pko_mem_port_rate0.s.rate_pkt =
-           cvmx_sysinfo_get()->cpu_clock_hz / packets_s / 16;
-       /* No cost per word since we are limited by packets/sec, not bits/sec */
-       pko_mem_port_rate0.s.rate_word = 0;
-
-       pko_mem_port_rate1.u64 = 0;
-       pko_mem_port_rate1.s.pid = port;
-       pko_mem_port_rate1.s.rate_lim =
-           ((uint64_t) pko_mem_port_rate0.s.rate_pkt * burst) >> 8;
-
-       cvmx_write_csr(CVMX_PKO_MEM_PORT_RATE0, pko_mem_port_rate0.u64);
-       cvmx_write_csr(CVMX_PKO_MEM_PORT_RATE1, pko_mem_port_rate1.u64);
-       return 0;
-}
-
-/**
- * Rate limit a PKO port to a max bits/sec. This function is only
- * supported on CN51XX and higher, excluding CN58XX.
- *
- * @port:   Port to rate limit
- * @bits_s: PKO rate limit in bits/sec
- * @burst:  Maximum number of bits to burst before rate
- *               limiting cuts in.
- *
- * Returns Zero on success, negative on failure
- */
-int cvmx_pko_rate_limit_bits(int port, uint64_t bits_s, int burst)
-{
-       union cvmx_pko_mem_port_rate0 pko_mem_port_rate0;
-       union cvmx_pko_mem_port_rate1 pko_mem_port_rate1;
-       uint64_t clock_rate = cvmx_sysinfo_get()->cpu_clock_hz;
-       uint64_t tokens_per_bit = clock_rate * 16 / bits_s;
-
-       pko_mem_port_rate0.u64 = 0;
-       pko_mem_port_rate0.s.pid = port;
-       /*
-        * Each packet has a 12 bytes of interframe gap, an 8 byte
-        * preamble, and a 4 byte CRC. These are not included in the
-        * per word count. Multiply by 8 to covert to bits and divide
-        * by 256 for limit granularity.
-        */
-       pko_mem_port_rate0.s.rate_pkt = (12 + 8 + 4) * 8 * tokens_per_bit / 256;
-       /* Each 8 byte word has 64bits */
-       pko_mem_port_rate0.s.rate_word = 64 * tokens_per_bit;
-
-       pko_mem_port_rate1.u64 = 0;
-       pko_mem_port_rate1.s.pid = port;
-       pko_mem_port_rate1.s.rate_lim = tokens_per_bit * burst / 256;
-
-       cvmx_write_csr(CVMX_PKO_MEM_PORT_RATE0, pko_mem_port_rate0.u64);
-       cvmx_write_csr(CVMX_PKO_MEM_PORT_RATE1, pko_mem_port_rate1.u64);
-       return 0;
-}
diff --git a/drivers/staging/octeon/cvmx-pko.h b/drivers/staging/octeon/cvmx-pko.h
deleted file mode 100644 (file)
index de3412a..0000000
+++ /dev/null
@@ -1,610 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/**
- *
- * 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_PKO_H__
-#define __CVMX_PKO_H__
-
-#include "cvmx-fpa.h"
-#include "cvmx-pow.h"
-#include "cvmx-cmd-queue.h"
-#include "cvmx-pko-defs.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_MODEL(OCTEON_CN31XX) || \
-       OCTEON_IS_MODEL(OCTEON_CN3010) || OCTEON_IS_MODEL(OCTEON_CN3005) || \
-       OCTEON_IS_MODEL(OCTEON_CN50XX)) ? 32 : \
-               (OCTEON_IS_MODEL(OCTEON_CN58XX) || \
-               OCTEON_IS_MODEL(OCTEON_CN56XX)) ? 256 : 128)
-#define CVMX_PKO_NUM_OUTPUT_PORTS       40
-/* use this for queues that are not used */
-#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_status_t;
-
-/**
- * This enumeration represents the differnet locking modes supported by PKO.
- */
-typedef enum {
-       /*
-        * 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_NONE = 0,
-       /*
-        * PKO performs an atomic tagswitch to insure exclusive access
-        * to the output queue. This will maintain packet ordering on
-        * output.
-        */
-       CVMX_PKO_LOCK_ATOMIC_TAG = 1,
-       /*
-        * 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.
-        */
-       CVMX_PKO_LOCK_CMD_QUEUE = 2,
-} cvmx_pko_lock_t;
-
-typedef struct {
-       uint32_t packets;
-       uint64_t octets;
-       uint64_t doorbell;
-} cvmx_pko_port_status_t;
-
-/**
- * This structure defines the address to use on a packet enqueue
- */
-typedef union {
-       uint64_t u64;
-       struct {
-               /* Must CVMX_IO_SEG */
-               uint64_t mem_space:2;
-               /* Must be zero */
-               uint64_t reserved:13;
-               /* Must be one */
-               uint64_t is_io:1;
-               /* The ID of the device on the non-coherent bus */
-               uint64_t did:8;
-               /* Must be zero */
-               uint64_t reserved2:4;
-               /* Must be zero */
-               uint64_t reserved3:18;
-               /*
-                * The hardware likes to have the output port in
-                * addition to the output queue,
-                */
-               uint64_t port:6;
-               /*
-                * The output queue to send the packet to (0-127 are
-                * legal)
-                */
-               uint64_t queue:9;
-               /* Must be zero */
-               uint64_t reserved4:3;
-       } s;
-} cvmx_pko_doorbell_address_t;
-
-/**
- * Structure of the first packet output command word.
- */
-typedef union {
-       uint64_t u64;
-       struct {
-               /*
-                * The size of the reg1 operation - could be 8, 16,
-                * 32, or 64 bits.
-                */
-               uint64_t size1:2;
-               /*
-                * The size of the reg0 operation - could be 8, 16,
-                * 32, or 64 bits.
-                */
-               uint64_t size0:2;
-               /*
-                * If set, subtract 1, if clear, subtract packet
-                * size.
-                */
-               uint64_t subone1:1;
-               /*
-                * The register, subtract will be done if reg1 is
-                * non-zero.
-                */
-               uint64_t reg1:11;
-               /* If set, subtract 1, if clear, subtract packet size */
-               uint64_t subone0:1;
-               /* The register, subtract will be done if reg0 is non-zero */
-               uint64_t reg0:11;
-               /*
-                * When set, interpret segment pointer and segment
-                * bytes in little endian order.
-                */
-               uint64_t le:1;
-               /*
-                * When set, packet data not allocated in L2 cache by
-                * PKO.
-                */
-               uint64_t n2:1;
-               /*
-                * If set and rsp is set, word3 contains a pointer to
-                * a work queue entry.
-                */
-               uint64_t wqp:1;
-               /* If set, the hardware will send a response when done */
-               uint64_t rsp:1;
-               /*
-                * If set, the supplied pkt_ptr is really a pointer to
-                * a list of pkt_ptr's.
-                */
-               uint64_t gather:1;
-               /*
-                * If ipoffp1 is non zero, (ipoffp1-1) is the number
-                * of bytes to IP header, and the hardware will
-                * calculate and insert the UDP/TCP checksum.
-                */
-               uint64_t ipoffp1:7;
-               /*
-                * If set, ignore the I bit (force to zero) from all
-                * pointer structures.
-                */
-               uint64_t ignore_i:1;
-               /*
-                * If clear, the hardware will attempt to free the
-                * buffers containing the packet.
-                */
-               uint64_t dontfree:1;
-               /*
-                * The total number of segs in the packet, if gather
-                * set, also gather list length.
-                */
-               uint64_t segs:6;
-               /* Including L2, but no trailing CRC */
-               uint64_t total_bytes:16;
-       } s;
-} cvmx_pko_command_word0_t;
-
-/* CSR typedefs have been moved to cvmx-csr-*.h */
-
-/**
- * Definition of internal state for Packet output processing
- */
-typedef struct {
-       /* ptr to start of buffer, offset kept in FAU reg */
-       uint64_t *start_ptr;
-} cvmx_pko_state_elem_t;
-
-/**
- * Call before any other calls to initialize the packet
- * output system.
- */
-extern void cvmx_pko_initialize_global(void);
-extern int cvmx_pko_initialize_local(void);
-
-/**
- * Enables the packet output hardware. It must already be
- * configured.
- */
-extern void cvmx_pko_enable(void);
-
-/**
- * Disables the packet output. Does not affect any configuration.
- */
-extern void cvmx_pko_disable(void);
-
-/**
- * Shutdown and free resources required by packet output.
- */
-
-extern void cvmx_pko_shutdown(void);
-
-/**
- * Configure a output port and the associated queues for use.
- *
- * @port:       Port to configure.
- * @base_queue: First queue number to associate with this port.
- * @num_queues: Number of queues t oassociate with this port
- * @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.
- */
-extern cvmx_pko_status_t cvmx_pko_config_port(uint64_t port,
-                                             uint64_t base_queue,
-                                             uint64_t num_queues,
-                                             const uint64_t 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.
- *
- * @port:   Port the packet is for
- * @queue:  Queue the packet is for
- * @len:    Length of the command in 64 bit words
- */
-static inline void cvmx_pko_doorbell(uint64_t port, uint64_t queue,
-                                    uint64_t 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 = 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.
- *
- * @port:   Port to send it on
- * @queue:  Queue to use
- * @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(uint64_t port, uint64_t 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.
-                */
-               uint32_t 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);
-       }
-}
-
-/**
- * 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().
- *
- * @port:   Port to send it on
- * @queue:  Queue to use
- * @pko_command:
- *               PKO HW command word
- * @packet: Packet to send
- * @use_locking: CVMX_PKO_LOCK_NONE, CVMX_PKO_LOCK_ATOMIC_TAG, or
- *               CVMX_PKO_LOCK_CMD_QUEUE
- *
- * Returns returns CVMX_PKO_SUCCESS on success, or error code on
- * failure of output
- */
-static inline cvmx_pko_status_t cvmx_pko_send_packet_finish(
-       uint64_t port,
-       uint64_t queue,
-       cvmx_pko_command_word0_t pko_command,
-       union cvmx_buf_ptr 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 (likely(result == CVMX_CMD_QUEUE_SUCCESS)) {
-               cvmx_pko_doorbell(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().
- *
- * @port:   Port to send it on
- * @queue:  Queue to use
- * @pko_command:
- *               PKO HW command word
- * @packet: Packet to send
- * @addr: Plysical address of a work queue entry or physical address
- *        to zero on complete.
- * @use_locking: CVMX_PKO_LOCK_NONE, CVMX_PKO_LOCK_ATOMIC_TAG, or
- *               CVMX_PKO_LOCK_CMD_QUEUE
- *
- * Returns returns CVMX_PKO_SUCCESS on success, or error code on
- * failure of output
- */
-static inline cvmx_pko_status_t cvmx_pko_send_packet_finish3(
-       uint64_t port,
-       uint64_t queue,
-       cvmx_pko_command_word0_t pko_command,
-       union cvmx_buf_ptr packet,
-       uint64_t 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 (likely(result == CVMX_CMD_QUEUE_SUCCESS)) {
-               cvmx_pko_doorbell(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;
-       }
-}
-
-/**
- * Return the pko output queue associated with a port and a specific core.
- * In normal mode (PKO lockless operation is disabled), the value returned
- * is the base queue.
- *
- * @port:   Port number
- * @core:   Core to get queue for
- *
- * Returns Core-specific output queue
- */
-static inline int cvmx_pko_get_base_queue_per_core(int port, int core)
-{
-#ifndef CVMX_HELPER_PKO_MAX_PORTS_INTERFACE0
-#define CVMX_HELPER_PKO_MAX_PORTS_INTERFACE0 16
-#endif
-#ifndef CVMX_HELPER_PKO_MAX_PORTS_INTERFACE1
-#define CVMX_HELPER_PKO_MAX_PORTS_INTERFACE1 16
-#endif
-
-       if (port < CVMX_PKO_MAX_PORTS_INTERFACE0)
-               return port * CVMX_PKO_QUEUES_PER_PORT_INTERFACE0 + core;
-       else if (port >= 16 && port < 16 + CVMX_PKO_MAX_PORTS_INTERFACE1)
-               return CVMX_PKO_MAX_PORTS_INTERFACE0 *
-                   CVMX_PKO_QUEUES_PER_PORT_INTERFACE0 + (port -
-                                                          16) *
-                   CVMX_PKO_QUEUES_PER_PORT_INTERFACE1 + core;
-       else if ((port >= 32) && (port < 36))
-               return CVMX_PKO_MAX_PORTS_INTERFACE0 *
-                   CVMX_PKO_QUEUES_PER_PORT_INTERFACE0 +
-                   CVMX_PKO_MAX_PORTS_INTERFACE1 *
-                   CVMX_PKO_QUEUES_PER_PORT_INTERFACE1 + (port -
-                                                          32) *
-                   CVMX_PKO_QUEUES_PER_PORT_PCI;
-       else if ((port >= 36) && (port < 40))
-               return CVMX_PKO_MAX_PORTS_INTERFACE0 *
-                   CVMX_PKO_QUEUES_PER_PORT_INTERFACE0 +
-                   CVMX_PKO_MAX_PORTS_INTERFACE1 *
-                   CVMX_PKO_QUEUES_PER_PORT_INTERFACE1 +
-                   4 * CVMX_PKO_QUEUES_PER_PORT_PCI + (port -
-                                                       36) *
-                   CVMX_PKO_QUEUES_PER_PORT_LOOP;
-       else
-               /* Given the limit on the number of ports we can map to
-                * CVMX_MAX_OUTPUT_QUEUES_STATIC queues (currently 256,
-                * divided among all cores), the remaining unmapped ports
-                * are assigned an illegal queue number */
-               return CVMX_PKO_ILLEGAL_QUEUE;
-}
-
-/**
- * For a given port number, return the base pko output queue
- * for the port.
- *
- * @port:   Port number
- * Returns Base output queue
- */
-static inline int cvmx_pko_get_base_queue(int port)
-{
-       return cvmx_pko_get_base_queue_per_core(port, 0);
-}
-
-/**
- * For a given port number, return the number of pko output queues.
- *
- * @port:   Port number
- * Returns Number of output queues
- */
-static inline int cvmx_pko_get_num_queues(int port)
-{
-       if (port < 16)
-               return CVMX_PKO_QUEUES_PER_PORT_INTERFACE0;
-       else if (port < 32)
-               return CVMX_PKO_QUEUES_PER_PORT_INTERFACE1;
-       else if (port < 36)
-               return CVMX_PKO_QUEUES_PER_PORT_PCI;
-       else if (port < 40)
-               return CVMX_PKO_QUEUES_PER_PORT_LOOP;
-       else
-               return 0;
-}
-
-/**
- * Get the status counters for a port.
- *
- * @port_num: Port number to get statistics for.
- * @clear:    Set to 1 to clear the counters after they are read
- * @status:   Where to put the results.
- */
-static inline void cvmx_pko_get_port_status(uint64_t port_num, uint64_t clear,
-                                           cvmx_pko_port_status_t *status)
-{
-       union cvmx_pko_reg_read_idx pko_reg_read_idx;
-       union cvmx_pko_mem_count0 pko_mem_count0;
-       union cvmx_pko_mem_count1 pko_mem_count1;
-
-       pko_reg_read_idx.u64 = 0;
-       pko_reg_read_idx.s.index = port_num;
-       cvmx_write_csr(CVMX_PKO_REG_READ_IDX, pko_reg_read_idx.u64);
-
-       pko_mem_count0.u64 = cvmx_read_csr(CVMX_PKO_MEM_COUNT0);
-       status->packets = pko_mem_count0.s.count;
-       if (clear) {
-               pko_mem_count0.s.count = port_num;
-               cvmx_write_csr(CVMX_PKO_MEM_COUNT0, pko_mem_count0.u64);
-       }
-
-       pko_mem_count1.u64 = cvmx_read_csr(CVMX_PKO_MEM_COUNT1);
-       status->octets = pko_mem_count1.s.count;
-       if (clear) {
-               pko_mem_count1.s.count = port_num;
-               cvmx_write_csr(CVMX_PKO_MEM_COUNT1, pko_mem_count1.u64);
-       }
-
-       if (OCTEON_IS_MODEL(OCTEON_CN3XXX)) {
-               union cvmx_pko_mem_debug9 debug9;
-               pko_reg_read_idx.s.index = cvmx_pko_get_base_queue(port_num);
-               cvmx_write_csr(CVMX_PKO_REG_READ_IDX, pko_reg_read_idx.u64);
-               debug9.u64 = cvmx_read_csr(CVMX_PKO_MEM_DEBUG9);
-               status->doorbell = debug9.cn38xx.doorbell;
-       } else {
-               union cvmx_pko_mem_debug8 debug8;
-               pko_reg_read_idx.s.index = cvmx_pko_get_base_queue(port_num);
-               cvmx_write_csr(CVMX_PKO_REG_READ_IDX, pko_reg_read_idx.u64);
-               debug8.u64 = cvmx_read_csr(CVMX_PKO_MEM_DEBUG8);
-               status->doorbell = debug8.cn58xx.doorbell;
-       }
-}
-
-/**
- * Rate limit a PKO port to a max packets/sec. This function is only
- * supported on CN57XX, CN56XX, CN55XX, and CN54XX.
- *
- * @port:      Port to rate limit
- * @packets_s: Maximum packet/sec
- * @burst:     Maximum number of packets to burst in a row before rate
- *                  limiting cuts in.
- *
- * Returns Zero on success, negative on failure
- */
-extern 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.
- *
- * @port:   Port to rate limit
- * @bits_s: PKO rate limit in bits/sec
- * @burst:  Maximum number of bits to burst before rate
- *               limiting cuts in.
- *
- * Returns Zero on success, negative on failure
- */
-extern int cvmx_pko_rate_limit_bits(int port, uint64_t bits_s, int burst);
-
-#endif /* __CVMX_PKO_H__ */
diff --git a/drivers/staging/octeon/cvmx-pow.h b/drivers/staging/octeon/cvmx-pow.h
deleted file mode 100644 (file)
index 999aefe..0000000
+++ /dev/null
@@ -1,1982 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/**
- * Interface to the hardware Packet Order / Work 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 <asm/octeon/cvmx-pow-defs.h>
-
-#include "cvmx-scratch.h"
-#include "cvmx-wqe.h"
-
-/* Default to having all POW constancy checks turned on */
-#ifndef CVMX_ENABLE_POW_CHECKS
-#define CVMX_ENABLE_POW_CHECKS 1
-#endif
-
-enum cvmx_pow_tag_type {
-       /* Tag ordering is maintained */
-       CVMX_POW_TAG_TYPE_ORDERED   = 0L,
-       /* Tag ordering is maintained, and at most one PP has the tag */
-       CVMX_POW_TAG_TYPE_ATOMIC    = 1L,
-       /*
-        * The work queue entry from the order - NEVER tag switch from
-        * NULL to NULL
-        */
-       CVMX_POW_TAG_TYPE_NULL      = 2L,
-       /* A tag switch to NULL, and there is no space reserved in POW
-        * - NEVER tag switch to NULL_NULL
-        * - NEVER tag switch from NULL_NULL
-        * - NULL_NULL is entered at the beginning of time and on a deschedule.
-        * - NULL_NULL can be exited by a new work request. A NULL_SWITCH
-        * load can also switch the state to NULL
-        */
-       CVMX_POW_TAG_TYPE_NULL_NULL = 3L
-};
-
-/**
- * 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 {
-       /*
-        * switch the tag (only) for this PP
-        * - the previous tag should be non-NULL in this case
-        * - tag switch response required
-        * - fields used: op, type, tag
-        */
-       CVMX_POW_TAG_OP_SWTAG = 0L,
-       /*
-        * switch the tag for this PP, with full information
-        * - this should be used when the previous tag is NULL
-        * - tag switch response required
-        * - fields used: address, op, grp, type, tag
-        */
-       CVMX_POW_TAG_OP_SWTAG_FULL = 1L,
-       /*
-        * switch the tag (and/or group) for this PP and de-schedule
-        * - OK to keep the tag the same and only change the group
-        * - fields used: op, no_sched, grp, type, tag
-        */
-       CVMX_POW_TAG_OP_SWTAG_DESCH = 2L,
-       /*
-        * just de-schedule
-        * - fields used: op, no_sched
-        */
-       CVMX_POW_TAG_OP_DESCH = 3L,
-       /*
-        * create an entirely new work queue entry
-        * - fields used: address, op, qos, grp, type, tag
-        */
-       CVMX_POW_TAG_OP_ADDWQ = 4L,
-       /*
-        * just update the work queue pointer and grp for this PP
-        * - fields used: address, op, grp
-        */
-       CVMX_POW_TAG_OP_UPDATE_WQP_GRP = 5L,
-       /*
-        * set the no_sched bit on the de-schedule list
-        *
-        * - does nothing if the selected entry is not on the
-        *   de-schedule list
-        *
-        * - does nothing if the stored work queue pointer does not
-        *   match the address field
-        *
-        * - fields used: address, index, op
-        *
-        *  Before issuing a *_NSCHED operation, SW must guarantee
-        *  that all prior deschedules and set/clr NSCHED operations
-        *  are complete and all prior switches are complete. The
-        *  hardware provides the opsdone bit and swdone bit for SW
-        *  polling. After issuing a *_NSCHED operation, SW must
-        *  guarantee that the set/clr NSCHED is complete before any
-        *  subsequent operations.
-        */
-       CVMX_POW_TAG_OP_SET_NSCHED = 6L,
-       /*
-        * clears the no_sched bit on the de-schedule list
-        *
-        * - does nothing if the selected entry is not on the
-        *   de-schedule list
-        *
-        * - does nothing if the stored work queue pointer does not
-        *   match the address field
-        *
-        * - fields used: address, index, op
-        *
-        * Before issuing a *_NSCHED operation, SW must guarantee that
-        * all prior deschedules and set/clr NSCHED operations are
-        * complete and all prior switches are complete. The hardware
-        * provides the opsdone bit and swdone bit for SW
-        * polling. After issuing a *_NSCHED operation, SW must
-        * guarantee that the set/clr NSCHED is complete before any
-        * subsequent operations.
-        */
-       CVMX_POW_TAG_OP_CLR_NSCHED = 7L,
-       /* do nothing */
-       CVMX_POW_TAG_OP_NOP = 15L
-} cvmx_pow_tag_op_t;
-
-/**
- * This structure defines the store data on a store to POW
- */
-typedef union {
-       uint64_t u64;
-       struct {
-               /*
-                * Don't reschedule this entry. no_sched is used for
-                * CVMX_POW_TAG_OP_SWTAG_DESCH and
-                * CVMX_POW_TAG_OP_DESCH
-                */
-               uint64_t no_sched:1;
-               uint64_t unused:2;
-               /* Tontains index of entry for a CVMX_POW_TAG_OP_*_NSCHED */
-               uint64_t index:13;
-               /* The operation to perform */
-               cvmx_pow_tag_op_t op:4;
-               uint64_t unused2:2;
-               /*
-                * The QOS level for the packet. qos is only used for
-                * CVMX_POW_TAG_OP_ADDWQ
-                */
-               uint64_t qos:3;
-               /*
-                * The group that the work queue entry will be
-                * scheduled to grp is used for CVMX_POW_TAG_OP_ADDWQ,
-                * CVMX_POW_TAG_OP_SWTAG_FULL,
-                * CVMX_POW_TAG_OP_SWTAG_DESCH, and
-                * CVMX_POW_TAG_OP_UPDATE_WQP_GRP
-                */
-               uint64_t grp:4;
-               /*
-                * The type of the tag. type is used for everything
-                * except CVMX_POW_TAG_OP_DESCH,
-                * CVMX_POW_TAG_OP_UPDATE_WQP_GRP, and
-                * CVMX_POW_TAG_OP_*_NSCHED
-                */
-               uint64_t type:3;
-               /*
-                * The actual tag. tag is used for everything except
-                * CVMX_POW_TAG_OP_DESCH,
-                * CVMX_POW_TAG_OP_UPDATE_WQP_GRP, and
-                * CVMX_POW_TAG_OP_*_NSCHED
-                */
-               uint64_t tag:32;
-       } s;
-} cvmx_pow_tag_req_t;
-
-/**
- * This structure describes the address to load stuff from POW
- */
-typedef union {
-       uint64_t u64;
-
-    /**
-     * Address for new work request loads (did<2:0> == 0)
-     */
-       struct {
-               /* Mips64 address region. Should be CVMX_IO_SEG */
-               uint64_t mem_region:2;
-               /* Must be zero */
-               uint64_t reserved_49_61:13;
-               /* Must be one */
-               uint64_t is_io:1;
-               /* the ID of POW -- did<2:0> == 0 in this case */
-               uint64_t did:8;
-               /* Must be zero */
-               uint64_t reserved_4_39:36;
-               /*
-                * If set, don't return load response until work is
-                * available.
-                */
-               uint64_t wait:1;
-               /* Must be zero */
-               uint64_t reserved_0_2:3;
-       } swork;
-
-    /**
-     * Address for loads to get POW internal status
-     */
-       struct {
-               /* Mips64 address region. Should be CVMX_IO_SEG */
-               uint64_t mem_region:2;
-               /* Must be zero */
-               uint64_t reserved_49_61:13;
-               /* Must be one */
-               uint64_t is_io:1;
-               /* the ID of POW -- did<2:0> == 1 in this case */
-               uint64_t did:8;
-               /* Must be zero */
-               uint64_t reserved_10_39:30;
-               /* The core id to get status for */
-               uint64_t coreid:4;
-               /*
-                * If set and get_cur is set, return reverse tag-list
-                * pointer rather than forward tag-list pointer.
-                */
-               uint64_t get_rev:1;
-               /*
-                * If set, return current status rather than pending
-                * status.
-                */
-               uint64_t get_cur:1;
-               /*
-                * If set, get the work-queue pointer rather than
-                * tag/type.
-                */
-               uint64_t get_wqp:1;
-               /* Must be zero */
-               uint64_t reserved_0_2:3;
-       } sstatus;
-
-    /**
-     * Address for memory loads to get POW internal state
-     */
-       struct {
-               /* Mips64 address region. Should be CVMX_IO_SEG */
-               uint64_t mem_region:2;
-               /* Must be zero */
-               uint64_t reserved_49_61:13;
-               /* Must be one */
-               uint64_t is_io:1;
-               /* the ID of POW -- did<2:0> == 2 in this case */
-               uint64_t did:8;
-               /* Must be zero */
-               uint64_t reserved_16_39:24;
-               /* POW memory index */
-               uint64_t index:11;
-               /*
-                * If set, return deschedule information rather than
-                * the standard response for work-queue index (invalid
-                * if the work-queue entry is not on the deschedule
-                * list).
-                */
-               uint64_t get_des:1;
-               /*
-                * If set, get the work-queue pointer rather than
-                * tag/type (no effect when get_des set).
-                */
-               uint64_t get_wqp:1;
-               /* Must be zero */
-               uint64_t reserved_0_2:3;
-       } smemload;
-
-    /**
-     * Address for index/pointer loads
-     */
-       struct {
-               /* Mips64 address region. Should be CVMX_IO_SEG */
-               uint64_t mem_region:2;
-               /* Must be zero */
-               uint64_t reserved_49_61:13;
-               /* Must be one */
-               uint64_t is_io:1;
-               /* the ID of POW -- did<2:0> == 3 in this case */
-               uint64_t did:8;
-               /* Must be zero */
-               uint64_t reserved_9_39:31;
-               /*
-                * when {get_rmt ==0 AND get_des_get_tail == 0}, this
-                * field selects one of eight POW internal-input
-                * queues (0-7), one per QOS level; values 8-15 are
-                * illegal in this case; when {get_rmt ==0 AND
-                * get_des_get_tail == 1}, this field selects one of
-                * 16 deschedule lists (per group); when get_rmt ==1,
-                * this field selects one of 16 memory-input queue
-                * lists.  The two memory-input queue lists associated
-                * with each QOS level are:
-                *
-                * - qosgrp = 0, qosgrp = 8:      QOS0
-                * - qosgrp = 1, qosgrp = 9:      QOS1
-                * - qosgrp = 2, qosgrp = 10:     QOS2
-                * - qosgrp = 3, qosgrp = 11:     QOS3
-                * - qosgrp = 4, qosgrp = 12:     QOS4
-                * - qosgrp = 5, qosgrp = 13:     QOS5
-                * - qosgrp = 6, qosgrp = 14:     QOS6
-                * - qosgrp = 7, qosgrp = 15:     QOS7
-                */
-               uint64_t qosgrp:4;
-               /*
-                * If set and get_rmt is clear, return deschedule list
-                * indexes rather than indexes for the specified qos
-                * level; if set and get_rmt is set, return the tail
-                * pointer rather than the head pointer for the
-                * specified qos level.
-                */
-               uint64_t get_des_get_tail:1;
-               /*
-                * If set, return remote pointers rather than the
-                * local indexes for the specified qos level.
-                */
-               uint64_t get_rmt:1;
-               /* Must be zero */
-               uint64_t reserved_0_2:3;
-       } sindexload;
-
-    /**
-     * 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 {
-               /* Mips64 address region. Should be CVMX_IO_SEG */
-               uint64_t mem_region:2;
-               /* Must be zero */
-               uint64_t reserved_49_61:13;
-               /* Must be one */
-               uint64_t is_io:1;
-               /* the ID of POW -- did<2:0> == 4 in this case */
-               uint64_t did:8;
-               /* Must be zero */
-               uint64_t 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 {
-       uint64_t u64;
-
-    /**
-     * Response to new work request loads
-     */
-       struct {
-               /*
-                * Set when no new work queue entry was returned.  *
-                * If there was de-scheduled work, the HW will
-                * definitely return it. When this bit is set, it
-                * could mean either mean:
-                *
-                * - There was no work, or
-                *
-                * - There was no work that the HW could find. This
-                *   case can happen, regardless of the wait bit value
-                *   in the original request, when there is work in
-                *   the IQ's that is too deep down the list.
-                */
-               uint64_t no_work:1;
-               /* Must be zero */
-               uint64_t reserved_40_62:23;
-               /* 36 in O1 -- the work queue pointer */
-               uint64_t addr:40;
-       } s_work;
-
-    /**
-     * Result for a POW Status Load (when get_cur==0 and get_wqp==0)
-     */
-       struct {
-               uint64_t reserved_62_63:2;
-               /* Set when there is a pending non-NULL SWTAG or
-                * SWTAG_FULL, and the POW entry has not left the list
-                * for the original tag. */
-               uint64_t pend_switch:1;
-               /* Set when SWTAG_FULL and pend_switch is set. */
-               uint64_t pend_switch_full:1;
-               /*
-                * Set when there is a pending NULL SWTAG, or an
-                * implicit switch to NULL.
-                */
-               uint64_t pend_switch_null:1;
-               /* Set when there is a pending DESCHED or SWTAG_DESCHED. */
-               uint64_t pend_desched:1;
-               /*
-                * Set when there is a pending SWTAG_DESCHED and
-                * pend_desched is set.
-                */
-               uint64_t pend_desched_switch:1;
-               /* Set when nosched is desired and pend_desched is set. */
-               uint64_t pend_nosched:1;
-               /* Set when there is a pending GET_WORK. */
-               uint64_t pend_new_work:1;
-               /*
-                * When pend_new_work is set, this bit indicates that
-                * the wait bit was set.
-                */
-               uint64_t pend_new_work_wait:1;
-               /* Set when there is a pending NULL_RD. */
-               uint64_t pend_null_rd:1;
-               /* Set when there is a pending CLR_NSCHED. */
-               uint64_t pend_nosched_clr:1;
-               uint64_t reserved_51:1;
-               /* This is the index when pend_nosched_clr is set. */
-               uint64_t pend_index:11;
-               /*
-                * This is the new_grp when (pend_desched AND
-                * pend_desched_switch) is set.
-                */
-               uint64_t pend_grp:4;
-               uint64_t reserved_34_35:2;
-               /*
-                * This is the tag type when pend_switch or
-                * (pend_desched AND pend_desched_switch) are set.
-                */
-               uint64_t pend_type:2;
-               /*
-                * - this is the tag when pend_switch or (pend_desched
-                *    AND pend_desched_switch) are set.
-                */
-               uint64_t pend_tag:32;
-       } s_sstatus0;
-
-    /**
-     * Result for a POW Status Load (when get_cur==0 and get_wqp==1)
-     */
-       struct {
-               uint64_t reserved_62_63:2;
-               /*
-                * Set when there is a pending non-NULL SWTAG or
-                * SWTAG_FULL, and the POW entry has not left the list
-                * for the original tag.
-                */
-               uint64_t pend_switch:1;
-               /* Set when SWTAG_FULL and pend_switch is set. */
-               uint64_t pend_switch_full:1;
-               /*
-                * Set when there is a pending NULL SWTAG, or an
-                * implicit switch to NULL.
-                */
-               uint64_t pend_switch_null:1;
-               /*
-                * Set when there is a pending DESCHED or
-                * SWTAG_DESCHED.
-                */
-               uint64_t pend_desched:1;
-               /*
-                * Set when there is a pending SWTAG_DESCHED and
-                * pend_desched is set.
-                */
-               uint64_t pend_desched_switch:1;
-               /* Set when nosched is desired and pend_desched is set. */
-               uint64_t pend_nosched:1;
-               /* Set when there is a pending GET_WORK. */
-               uint64_t pend_new_work:1;
-               /*
-                * When pend_new_work is set, this bit indicates that
-                * the wait bit was set.
-                */
-               uint64_t pend_new_work_wait:1;
-               /* Set when there is a pending NULL_RD. */
-               uint64_t pend_null_rd:1;
-               /* Set when there is a pending CLR_NSCHED. */
-               uint64_t pend_nosched_clr:1;
-               uint64_t reserved_51:1;
-               /* This is the index when pend_nosched_clr is set. */
-               uint64_t pend_index:11;
-               /*
-                * This is the new_grp when (pend_desched AND
-                * pend_desched_switch) is set.
-                */
-               uint64_t pend_grp:4;
-               /* This is the wqp when pend_nosched_clr is set. */
-               uint64_t pend_wqp:36;
-       } s_sstatus1;
-
-    /**
-     * Result for a POW Status Load (when get_cur==1, get_wqp==0, and
-     * get_rev==0)
-     */
-       struct {
-               uint64_t reserved_62_63:2;
-               /*
-                * Points to the next POW entry in the tag list when
-                * tail == 0 (and tag_type is not NULL or NULL_NULL).
-                */
-               uint64_t link_index:11;
-               /* The POW entry attached to the core. */
-               uint64_t index:11;
-               /*
-                * The group attached to the core (updated when new
-                * tag list entered on SWTAG_FULL).
-                */
-               uint64_t grp:4;
-               /*
-                * Set when this POW entry is at the head of its tag
-                * list (also set when in the NULL or NULL_NULL
-                * state).
-                */
-               uint64_t head:1;
-               /*
-                * Set when this POW entry is at the tail of its tag
-                * list (also set when in the NULL or NULL_NULL
-                * state).
-                */
-               uint64_t tail:1;
-               /*
-                * The tag type attached to the core (updated when new
-                * tag list entered on SWTAG, SWTAG_FULL, or
-                * SWTAG_DESCHED).
-                */
-               uint64_t tag_type:2;
-               /*
-                * The tag attached to the core (updated when new tag
-                * list entered on SWTAG, SWTAG_FULL, or
-                * SWTAG_DESCHED).
-                */
-               uint64_t tag:32;
-       } s_sstatus2;
-
-    /**
-     * Result for a POW Status Load (when get_cur==1, get_wqp==0, and get_rev==1)
-     */
-       struct {
-               uint64_t reserved_62_63:2;
-               /*
-                * Points to the prior POW entry in the tag list when
-                * head == 0 (and tag_type is not NULL or
-                * NULL_NULL). This field is unpredictable when the
-                * core's state is NULL or NULL_NULL.
-                */
-               uint64_t revlink_index:11;
-               /* The POW entry attached to the core. */
-               uint64_t index:11;
-               /*
-                * The group attached to the core (updated when new
-                * tag list entered on SWTAG_FULL).
-                */
-               uint64_t grp:4;
-               /* Set when this POW entry is at the head of its tag
-                * list (also set when in the NULL or NULL_NULL
-                * state).
-                */
-               uint64_t head:1;
-               /*
-                * Set when this POW entry is at the tail of its tag
-                * list (also set when in the NULL or NULL_NULL
-                * state).
-                */
-               uint64_t tail:1;
-               /*
-                * The tag type attached to the core (updated when new
-                * tag list entered on SWTAG, SWTAG_FULL, or
-                * SWTAG_DESCHED).
-                */
-               uint64_t tag_type:2;
-               /*
-                * The tag attached to the core (updated when new tag
-                * list entered on SWTAG, SWTAG_FULL, or
-                * SWTAG_DESCHED).
-                */
-               uint64_t tag:32;
-       } s_sstatus3;
-
-    /**
-     * Result for a POW Status Load (when get_cur==1, get_wqp==1, and
-     * get_rev==0)
-     */
-       struct {
-               uint64_t reserved_62_63:2;
-               /*
-                * Points to the next POW entry in the tag list when
-                * tail == 0 (and tag_type is not NULL or NULL_NULL).
-                */
-               uint64_t link_index:11;
-               /* The POW entry attached to the core. */
-               uint64_t index:11;
-               /*
-                * The group attached to the core (updated when new
-                * tag list entered on SWTAG_FULL).
-                */
-               uint64_t grp:4;
-               /*
-                * The wqp attached to the core (updated when new tag
-                * list entered on SWTAG_FULL).
-                */
-               uint64_t wqp:36;
-       } s_sstatus4;
-
-    /**
-     * Result for a POW Status Load (when get_cur==1, get_wqp==1, and
-     * get_rev==1)
-     */
-       struct {
-               uint64_t reserved_62_63:2;
-               /*
-                * Points to the prior POW entry in the tag list when
-                * head == 0 (and tag_type is not NULL or
-                * NULL_NULL). This field is unpredictable when the
-                * core's state is NULL or NULL_NULL.
-                */
-               uint64_t revlink_index:11;
-               /* The POW entry attached to the core. */
-               uint64_t index:11;
-               /*
-                * The group attached to the core (updated when new
-                * tag list entered on SWTAG_FULL).
-                */
-               uint64_t grp:4;
-               /*
-                * The wqp attached to the core (updated when new tag
-                * list entered on SWTAG_FULL).
-                */
-               uint64_t wqp:36;
-       } s_sstatus5;
-
-    /**
-     * Result For POW Memory Load (get_des == 0 and get_wqp == 0)
-     */
-       struct {
-               uint64_t reserved_51_63:13;
-               /*
-                * The next entry in the input, free, descheduled_head
-                * list (unpredictable if entry is the tail of the
-                * list).
-                */
-               uint64_t next_index:11;
-               /* The group of the POW entry. */
-               uint64_t grp:4;
-               uint64_t reserved_35:1;
-               /*
-                * Set when this POW entry is at the tail of its tag
-                * list (also set when in the NULL or NULL_NULL
-                * state).
-                */
-               uint64_t tail:1;
-               /* The tag type of the POW entry. */
-               uint64_t tag_type:2;
-               /* The tag of the POW entry. */
-               uint64_t tag:32;
-       } s_smemload0;
-
-    /**
-     * Result For POW Memory Load (get_des == 0 and get_wqp == 1)
-     */
-       struct {
-               uint64_t reserved_51_63:13;
-               /*
-                * The next entry in the input, free, descheduled_head
-                * list (unpredictable if entry is the tail of the
-                * list).
-                */
-               uint64_t next_index:11;
-               /* The group of the POW entry. */
-               uint64_t grp:4;
-               /* The WQP held in the POW entry. */
-               uint64_t wqp:36;
-       } s_smemload1;
-
-    /**
-     * Result For POW Memory Load (get_des == 1)
-     */
-       struct {
-               uint64_t reserved_51_63:13;
-               /*
-                * The next entry in the tag list connected to the
-                * descheduled head.
-                */
-               uint64_t fwd_index:11;
-               /* The group of the POW entry. */
-               uint64_t grp:4;
-               /* The nosched bit for the POW entry. */
-               uint64_t nosched:1;
-               /* There is a pending tag switch */
-               uint64_t pend_switch:1;
-               /*
-                * The next tag type for the new tag list when
-                * pend_switch is set.
-                */
-               uint64_t pend_type:2;
-               /*
-                * The next tag for the new tag list when pend_switch
-                * is set.
-                */
-               uint64_t pend_tag:32;
-       } s_smemload2;
-
-    /**
-     * Result For POW Index/Pointer Load (get_rmt == 0/get_des_get_tail == 0)
-     */
-       struct {
-               uint64_t reserved_52_63:12;
-               /*
-                * set when there is one or more POW entries on the
-                * free list.
-                */
-               uint64_t free_val:1;
-               /*
-                * set when there is exactly one POW entry on the free
-                * list.
-                */
-               uint64_t free_one:1;
-               uint64_t reserved_49:1;
-               /*
-                * when free_val is set, indicates the first entry on
-                * the free list.
-                */
-               uint64_t free_head:11;
-               uint64_t reserved_37:1;
-               /*
-                * when free_val is set, indicates the last entry on
-                * the free list.
-                */
-               uint64_t free_tail:11;
-               /*
-                * set when there is one or more POW entries on the
-                * input Q list selected by qosgrp.
-                */
-               uint64_t loc_val:1;
-               /*
-                * set when there is exactly one POW entry on the
-                * input Q list selected by qosgrp.
-                */
-               uint64_t loc_one:1;
-               uint64_t reserved_23:1;
-               /*
-                * when loc_val is set, indicates the first entry on
-                * the input Q list selected by qosgrp.
-                */
-               uint64_t loc_head:11;
-               uint64_t reserved_11:1;
-               /*
-                * when loc_val is set, indicates the last entry on
-                * the input Q list selected by qosgrp.
-                */
-               uint64_t loc_tail:11;
-       } sindexload0;
-
-    /**
-     * Result For POW Index/Pointer Load (get_rmt == 0/get_des_get_tail == 1)
-     */
-       struct {
-               uint64_t reserved_52_63:12;
-               /*
-                * set when there is one or more POW entries on the
-                * nosched list.
-                */
-               uint64_t nosched_val:1;
-               /*
-                * set when there is exactly one POW entry on the
-                * nosched list.
-                */
-               uint64_t nosched_one:1;
-               uint64_t reserved_49:1;
-               /*
-                * when nosched_val is set, indicates the first entry
-                * on the nosched list.
-                */
-               uint64_t nosched_head:11;
-               uint64_t reserved_37:1;
-               /*
-                * when nosched_val is set, indicates the last entry
-                * on the nosched list.
-                */
-               uint64_t nosched_tail:11;
-               /*
-                * set when there is one or more descheduled heads on
-                * the descheduled list selected by qosgrp.
-                */
-               uint64_t des_val:1;
-               /*
-                * set when there is exactly one descheduled head on
-                * the descheduled list selected by qosgrp.
-                */
-               uint64_t des_one:1;
-               uint64_t reserved_23:1;
-               /*
-                * when des_val is set, indicates the first
-                * descheduled head on the descheduled list selected
-                * by qosgrp.
-                */
-               uint64_t des_head:11;
-               uint64_t reserved_11:1;
-               /*
-                * when des_val is set, indicates the last descheduled
-                * head on the descheduled list selected by qosgrp.
-                */
-               uint64_t des_tail:11;
-       } sindexload1;
-
-    /**
-     * Result For POW Index/Pointer Load (get_rmt == 1/get_des_get_tail == 0)
-     */
-       struct {
-               uint64_t reserved_39_63:25;
-               /*
-                * Set when this DRAM list is the current head
-                * (i.e. is the next to be reloaded when the POW
-                * hardware reloads a POW entry from DRAM). The POW
-                * hardware alternates between the two DRAM lists
-                * associated with a QOS level when it reloads work
-                * from DRAM into the POW unit.
-                */
-               uint64_t rmt_is_head:1;
-               /*
-                * Set when the DRAM portion of the input Q list
-                * selected by qosgrp contains one or more pieces of
-                * work.
-                */
-               uint64_t rmt_val:1;
-               /*
-                * Set when the DRAM portion of the input Q list
-                * selected by qosgrp contains exactly one piece of
-                * work.
-                */
-               uint64_t rmt_one:1;
-               /*
-                * When rmt_val is set, indicates the first piece of
-                * work on the DRAM input Q list selected by
-                * qosgrp.
-                */
-               uint64_t rmt_head:36;
-       } sindexload2;
-
-    /**
-     * Result For POW Index/Pointer Load (get_rmt ==
-     * 1/get_des_get_tail == 1)
-     */
-       struct {
-               uint64_t reserved_39_63:25;
-               /*
-                * set when this DRAM list is the current head
-                * (i.e. is the next to be reloaded when the POW
-                * hardware reloads a POW entry from DRAM). The POW
-                * hardware alternates between the two DRAM lists
-                * associated with a QOS level when it reloads work
-                * from DRAM into the POW unit.
-                */
-               uint64_t rmt_is_head:1;
-               /*
-                * set when the DRAM portion of the input Q list
-                * selected by qosgrp contains one or more pieces of
-                * work.
-                */
-               uint64_t rmt_val:1;
-               /*
-                * set when the DRAM portion of the input Q list
-                * selected by qosgrp contains exactly one piece of
-                * work.
-                */
-               uint64_t rmt_one:1;
-               /*
-                * when rmt_val is set, indicates the last piece of
-                * work on the DRAM input Q list selected by
-                * qosgrp.
-                */
-               uint64_t rmt_tail:36;
-       } sindexload3;
-
-    /**
-     * Response to NULL_RD request loads
-     */
-       struct {
-               uint64_t unused:62;
-               /* of type cvmx_pow_tag_type_t. state is one of the
-                * following:
-                *
-                * - CVMX_POW_TAG_TYPE_ORDERED
-                * - CVMX_POW_TAG_TYPE_ATOMIC
-                * - CVMX_POW_TAG_TYPE_NULL
-                * - CVMX_POW_TAG_TYPE_NULL_NULL
-                */
-               uint64_t state:2;
-       } s_null_rd;
-
-} cvmx_pow_tag_load_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 {
-    /**
-     * Unsigned 64 bit integer representation of store address
-     */
-       uint64_t u64;
-
-       struct {
-               /* Memory region.  Should be CVMX_IO_SEG in most cases */
-               uint64_t mem_reg:2;
-               uint64_t reserved_49_61:13;     /* Must be zero */
-               uint64_t is_io:1;       /* Must be one */
-               /* Device ID of POW.  Note that different sub-dids are used. */
-               uint64_t did:8;
-               uint64_t reserved_36_39:4;      /* Must be zero */
-               /* Address field. addr<2:0> must be zero */
-               uint64_t addr:36;
-       } stag;
-} cvmx_pow_tag_store_addr_t;
-
-/**
- * decode of the store data when an IOBDMA SENDSINGLE is sent to POW
- */
-typedef union {
-       uint64_t u64;
-
-       struct {
-               /*
-                * the (64-bit word) location in scratchpad to write
-                * to (if len != 0)
-                */
-               uint64_t scraddr:8;
-               /* the number of words in the response (0 => no response) */
-               uint64_t len:8;
-               /* the ID of the device on the non-coherent bus */
-               uint64_t did:8;
-               uint64_t unused:36;
-               /* if set, don't return load response until work is available */
-               uint64_t wait:1;
-               uint64_t unused2:3;
-       } s;
-
-} cvmx_pow_iobdma_store_t;
-
-/* CSR typedefs have been moved to cvmx-csr-*.h */
-
-/**
- * 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.
- *
- * Returns Current tag
- */
-static inline cvmx_pow_tag_req_t cvmx_pow_get_current_tag(void)
-{
-       cvmx_pow_load_addr_t load_addr;
-       cvmx_pow_tag_load_resp_t load_resp;
-       cvmx_pow_tag_req_t result;
-
-       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 = cvmx_read_csr(load_addr.u64);
-       result.u64 = 0;
-       result.s.grp = load_resp.s_sstatus2.grp;
-       result.s.index = load_resp.s_sstatus2.index;
-       result.s.type = load_resp.s_sstatus2.tag_type;
-       result.s.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.
- *
- * Returns 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;
-
-       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 = cvmx_read_csr(load_addr.u64);
-       return (cvmx_wqe_t *) cvmx_phys_to_ptr(load_resp.s_sstatus4.wqp);
-}
-
-#ifndef CVMX_MF_CHORD
-#define CVMX_MF_CHORD(dest)         CVMX_RDHWR(dest, 30)
-#endif
-
-/**
- * Print a warning if a tag switch is pending for this core
- *
- * @function: Function name checking for a pending tag switch
- */
-static inline void __cvmx_pow_warn_if_pending_switch(const char *function)
-{
-       uint64_t switch_complete;
-       CVMX_MF_CHORD(switch_complete);
-       if (!switch_complete)
-               pr_warning("%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 uint64_t MAX_CYCLES = 1ull << 31;
-       uint64_t switch_complete;
-       uint64_t start_cycle = cvmx_get_cycle();
-       while (1) {
-               CVMX_MF_CHORD(switch_complete);
-               if (unlikely(switch_complete))
-                       break;
-               if (unlikely(cvmx_get_cycle() > start_cycle + MAX_CYCLES)) {
-                       pr_warning("Tag switch is taking a long time, "
-                                  "possible deadlock\n");
-                       start_cycle = -MAX_CYCLES - 1;
-               }
-       }
-}
-
-/**
- * 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.
- *
- * @wait:   When set, call stalls until work becomes avaiable, or times out.
- *               If not set, returns immediately.
- *
- * Returns 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;
-       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 = cvmx_read_csr(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.
- *
- * @wait:   When set, call stalls until work becomes avaiable, or times out.
- *               If not set, returns immediately.
- *
- * Returns 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)
-{
-       if (CVMX_ENABLE_POW_CHECKS)
-               __cvmx_pow_warn_if_pending_switch(__func__);
-
-       /* 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.
- *
- * Returns Returns the POW state of type cvmx_pow_tag_type_t.
- */
-static inline enum cvmx_pow_tag_type cvmx_pow_work_request_null_rd(void)
-{
-       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__);
-
-       /* Must not have a switch pending when requesting work */
-       cvmx_pow_tag_sw_wait();
-
-       ptr.u64 = 0;
-       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 = cvmx_read_csr(ptr.u64);
-
-       return (enum cvmx_pow_tag_type) 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.
- *
- * @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.
- *
- * @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.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.
- *
- * @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.
- *
- * @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)
-{
-       if (CVMX_ENABLE_POW_CHECKS)
-               __cvmx_pow_warn_if_pending_switch(__func__);
-
-       /* 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.
- *
- * @scr_addr: Scratch memory address to get result from Byte address,
- *            must be 8 byte aligned.
- *
- * Returns 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.
- *
- * @wqe_ptr: pointer to a work queue entry returned by the POW
- *
- * Returns 0 if pointer is valid
- *         1 if invalid (no work was returned)
- */
-static inline uint64_t cvmx_pow_work_invalid(cvmx_wqe_t *wqe_ptr)
-{
-       return wqe_ptr == NULL;
-}
-
-/**
- * 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.
- *
- * @tag:      new tag value
- * @tag_type: new tag type (ordered or atomic)
- */
-static inline void cvmx_pow_tag_sw_nocheck(uint32_t tag,
-                                          enum cvmx_pow_tag_type tag_type)
-{
-       cvmx_addr_t ptr;
-       cvmx_pow_tag_req_t tag_req;
-
-       if (CVMX_ENABLE_POW_CHECKS) {
-               cvmx_pow_tag_req_t current_tag;
-               __cvmx_pow_warn_if_pending_switch(__func__);
-               current_tag = cvmx_pow_get_current_tag();
-               if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL_NULL)
-                       pr_warning("%s called with NULL_NULL tag\n",
-                                  __func__);
-               if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL)
-                       pr_warning("%s called with NULL tag\n", __func__);
-               if ((current_tag.s.type == tag_type)
-                  && (current_tag.s.tag == tag))
-                       pr_warning("%s called to perform a tag switch to the "
-                                  "same tag\n",
-                            __func__);
-               if (tag_type == CVMX_POW_TAG_TYPE_NULL)
-                       pr_warning("%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;
-       tag_req.s.op = CVMX_POW_TAG_OP_SWTAG;
-       tag_req.s.tag = tag;
-       tag_req.s.type = tag_type;
-
-       ptr.u64 = 0;
-       ptr.sio.mem_region = CVMX_IO_SEG;
-       ptr.sio.is_io = 1;
-       ptr.sio.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.
- *
- * @tag:      new tag value
- * @tag_type: new tag type (ordered or atomic)
- */
-static inline void cvmx_pow_tag_sw(uint32_t tag,
-                                  enum cvmx_pow_tag_type tag_type)
-{
-       if (CVMX_ENABLE_POW_CHECKS)
-               __cvmx_pow_warn_if_pending_switch(__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.
-        */
-
-       /*
-        * 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.
- *
- * @wqp:      pointer to work queue entry to submit.  This entry is
- *            updated to match the other parameters
- * @tag:      tag value to be assigned to work queue entry
- * @tag_type: type of tag
- * @group:    group value for the work queue entry.
- */
-static inline void cvmx_pow_tag_sw_full_nocheck(cvmx_wqe_t *wqp, uint32_t tag,
-                                               enum cvmx_pow_tag_type tag_type,
-                                               uint64_t group)
-{
-       cvmx_addr_t ptr;
-       cvmx_pow_tag_req_t tag_req;
-
-       if (CVMX_ENABLE_POW_CHECKS) {
-               cvmx_pow_tag_req_t current_tag;
-               __cvmx_pow_warn_if_pending_switch(__func__);
-               current_tag = cvmx_pow_get_current_tag();
-               if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL_NULL)
-                       pr_warning("%s called with NULL_NULL tag\n",
-                                  __func__);
-               if ((current_tag.s.type == tag_type)
-                  && (current_tag.s.tag == tag))
-                       pr_warning("%s called to perform a tag switch to "
-                                  "the same tag\n",
-                            __func__);
-               if (tag_type == CVMX_POW_TAG_TYPE_NULL)
-                       pr_warning("%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))
-                       if (wqp != cvmx_pow_get_current_wqp())
-                               pr_warning("%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;
-       tag_req.s.op = CVMX_POW_TAG_OP_SWTAG_FULL;
-       tag_req.s.tag = tag;
-       tag_req.s.type = tag_type;
-       tag_req.s.grp = group;
-
-       ptr.u64 = 0;
-       ptr.sio.mem_region = CVMX_IO_SEG;
-       ptr.sio.is_io = 1;
-       ptr.sio.did = CVMX_OCT_DID_TAG_SWTAG;
-       ptr.sio.offset = CAST64(wqp);
-
-       /*
-        * 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.
- *
- * @wqp:      pointer to work queue entry to submit.  This entry is updated
- *            to match the other parameters
- * @tag:      tag value to be assigned to work queue entry
- * @tag_type: type of tag
- * @group:      group value for the work queue entry.
- */
-static inline void cvmx_pow_tag_sw_full(cvmx_wqe_t *wqp, uint32_t tag,
-                                       enum cvmx_pow_tag_type tag_type,
-                                       uint64_t group)
-{
-       if (CVMX_ENABLE_POW_CHECKS)
-               __cvmx_pow_warn_if_pending_switch(__func__);
-
-       /*
-        * 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)
-{
-       cvmx_addr_t ptr;
-       cvmx_pow_tag_req_t tag_req;
-
-       if (CVMX_ENABLE_POW_CHECKS) {
-               cvmx_pow_tag_req_t current_tag;
-               __cvmx_pow_warn_if_pending_switch(__func__);
-               current_tag = cvmx_pow_get_current_tag();
-               if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL_NULL)
-                       pr_warning("%s called with NULL_NULL tag\n",
-                                  __func__);
-               if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL)
-                       pr_warning("%s called when we already have a "
-                                  "NULL tag\n",
-                            __func__);
-       }
-
-       tag_req.u64 = 0;
-       tag_req.s.op = CVMX_POW_TAG_OP_SWTAG;
-       tag_req.s.type = CVMX_POW_TAG_TYPE_NULL;
-
-       ptr.u64 = 0;
-       ptr.sio.mem_region = CVMX_IO_SEG;
-       ptr.sio.is_io = 1;
-       ptr.sio.did = CVMX_OCT_DID_TAG_TAG1;
-
-       cvmx_write_io(ptr.u64, tag_req.u64);
-
-       /* switch to NULL completes immediately */
-}
-
-/**
- * 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)
-{
-       if (CVMX_ENABLE_POW_CHECKS)
-               __cvmx_pow_warn_if_pending_switch(__func__);
-
-       /*
-        * 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();
-
-       /* switch to NULL completes immediately */
-}
-
-/**
- * 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.
- *
- * @wqp:      pointer to work queue entry to submit.  This entry is
- *            updated to match the other parameters
- * @tag:      tag value to be assigned to work queue entry
- * @tag_type: type of tag
- * @qos:      Input queue to add to.
- * @grp:      group value for the work queue entry.
- */
-static inline void cvmx_pow_work_submit(cvmx_wqe_t *wqp, uint32_t tag,
-                                       enum cvmx_pow_tag_type tag_type,
-                                       uint64_t qos, uint64_t grp)
-{
-       cvmx_addr_t ptr;
-       cvmx_pow_tag_req_t tag_req;
-
-       wqp->qos = qos;
-       wqp->tag = tag;
-       wqp->tag_type = tag_type;
-       wqp->grp = grp;
-
-       tag_req.u64 = 0;
-       tag_req.s.op = CVMX_POW_TAG_OP_ADDWQ;
-       tag_req.s.type = tag_type;
-       tag_req.s.tag = tag;
-       tag_req.s.qos = qos;
-       tag_req.s.grp = grp;
-
-       ptr.u64 = 0;
-       ptr.sio.mem_region = CVMX_IO_SEG;
-       ptr.sio.is_io = 1;
-       ptr.sio.did = CVMX_OCT_DID_TAG_TAG1;
-       ptr.sio.offset = 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.
- *
- * @core_num:   core to apply mask to
- * @mask:   Group mask. There are 16 groups, so only bits 0-15 are valid,
- *               representing groups 0-15.
- *               Each 1 bit in the mask enables the core to accept work from
- *               the corresponding group.
- */
-static inline void cvmx_pow_set_group_mask(uint64_t core_num, uint64_t mask)
-{
-       union cvmx_pow_pp_grp_mskx grp_msk;
-
-       grp_msk.u64 = cvmx_read_csr(CVMX_POW_PP_GRP_MSKX(core_num));
-       grp_msk.s.grp_msk = mask;
-       cvmx_write_csr(CVMX_POW_PP_GRP_MSKX(core_num), grp_msk.u64);
-}
-
-/**
- * This function sets POW static priorities for a core. Each input queue has
- * an associated priority value.
- *
- * @core_num:   core to apply priorities to
- * @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(uint64_t core_num,
-                                        const uint8_t priority[])
-{
-       /* POW priorities are supported on CN5xxx and later */
-       if (!OCTEON_IS_MODEL(OCTEON_CN3XXX)) {
-               union cvmx_pow_pp_grp_mskx grp_msk;
-
-               grp_msk.u64 = cvmx_read_csr(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];
-
-               /* Detect gaps between priorities and flag error */
-               {
-                       int i;
-                       uint32_t 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)) {
-                               pr_err("POW static priorities should be "
-                                      "contiguous (0x%llx)\n",
-                                    (unsigned long long)prio_mask);
-                               return;
-                       }
-               }
-
-               cvmx_write_csr(CVMX_POW_PP_GRP_MSKX(core_num), grp_msk.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 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.
- *
- * @tag:      New tag value
- * @tag_type: New tag type
- * @group:    New group value
- * @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(
-       uint32_t tag,
-       enum cvmx_pow_tag_type tag_type,
-       uint64_t group,
-       uint64_t no_sched)
-{
-       cvmx_addr_t ptr;
-       cvmx_pow_tag_req_t tag_req;
-
-       if (CVMX_ENABLE_POW_CHECKS) {
-               cvmx_pow_tag_req_t current_tag;
-               __cvmx_pow_warn_if_pending_switch(__func__);
-               current_tag = cvmx_pow_get_current_tag();
-               if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL_NULL)
-                       pr_warning("%s called with NULL_NULL tag\n",
-                                  __func__);
-               if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL)
-                       pr_warning("%s called with NULL tag. Deschedule not "
-                                  "allowed from NULL state\n",
-                            __func__);
-               if ((current_tag.s.type != CVMX_POW_TAG_TYPE_ATOMIC)
-                       && (tag_type != CVMX_POW_TAG_TYPE_ATOMIC))
-                       pr_warning("%s called where neither the before or "
-                                  "after tag is ATOMIC\n",
-                            __func__);
-       }
-
-       tag_req.u64 = 0;
-       tag_req.s.op = CVMX_POW_TAG_OP_SWTAG_DESCH;
-       tag_req.s.tag = tag;
-       tag_req.s.type = tag_type;
-       tag_req.s.grp = group;
-       tag_req.s.no_sched = no_sched;
-
-       ptr.u64 = 0;
-       ptr.sio.mem_region = CVMX_IO_SEG;
-       ptr.sio.is_io = 1;
-       ptr.sio.did = CVMX_OCT_DID_TAG_TAG3;
-       /*
-        * since TAG3 is used, this store will clear the local pending
-        * switch bit.
-        */
-       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.
- *
- * @tag:      New tag value
- * @tag_type: New tag type
- * @group:    New group value
- * @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(uint32_t tag,
-                                          enum cvmx_pow_tag_type tag_type,
-                                          uint64_t group, uint64_t no_sched)
-{
-       if (CVMX_ENABLE_POW_CHECKS)
-               __cvmx_pow_warn_if_pending_switch(__func__);
-
-       /* 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.
- *
- * @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(uint64_t no_sched)
-{
-       cvmx_addr_t ptr;
-       cvmx_pow_tag_req_t tag_req;
-
-       if (CVMX_ENABLE_POW_CHECKS) {
-               cvmx_pow_tag_req_t current_tag;
-               __cvmx_pow_warn_if_pending_switch(__func__);
-               current_tag = cvmx_pow_get_current_tag();
-               if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL_NULL)
-                       pr_warning("%s called with NULL_NULL tag\n",
-                                  __func__);
-               if (current_tag.s.type == CVMX_POW_TAG_TYPE_NULL)
-                       pr_warning("%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;
-       tag_req.s.op = CVMX_POW_TAG_OP_DESCH;
-       tag_req.s.no_sched = no_sched;
-
-       ptr.u64 = 0;
-       ptr.sio.mem_region = CVMX_IO_SEG;
-       ptr.sio.is_io = 1;
-       ptr.sio.did = CVMX_OCT_DID_TAG_TAG3;
-       /*
-        * since TAG3 is used, this store will clear the local pending
-        * switch bit.
-        */
-       cvmx_write_io(ptr.u64, tag_req.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.
- *
- * @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.
- *
- * @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.
- *
- * Returns 32 bit value of the combined hw and sw bits.
- */
-static inline uint32_t cvmx_pow_tag_compose(uint64_t sw_bits, uint64_t 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
- *
- * @tag:    32 bit tag value
- *
- * Returns N bit software tag value, where N is configurable with the
- * CVMX_TAG_SW_BITS define
- */
-static inline uint32_t cvmx_pow_tag_get_sw_bits(uint64_t 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
- *
- * @tag:    32 bit tag value
- *
- * Returns (32 - N) bit software tag value, where N is configurable
- * with the CVMX_TAG_SW_BITS define
- */
-static inline uint32_t cvmx_pow_tag_get_hw_bits(uint64_t tag)
-{
-       return tag & cvmx_build_mask(32 - CVMX_TAG_SW_BITS);
-}
-
-/**
- * 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.
- *
- * @buffer: Buffer to store capture into
- * @buffer_size:
- *               The size of the supplied buffer
- *
- * Returns Zero on success, negative on failure
- */
-extern int cvmx_pow_capture(void *buffer, int buffer_size);
-
-/**
- * Dump a POW capture to the console in a human readable format.
- *
- * @buffer: POW capture from cvmx_pow_capture()
- * @buffer_size:
- *               Size of the buffer
- */
-extern void cvmx_pow_display(void *buffer, int buffer_size);
-
-/**
- * Return the number of POW entries supported by this chip
- *
- * Returns Number of POW entries
- */
-extern int cvmx_pow_get_num_entries(void);
-
-#endif /* __CVMX_POW_H__ */
diff --git a/drivers/staging/octeon/cvmx-scratch.h b/drivers/staging/octeon/cvmx-scratch.h
deleted file mode 100644 (file)
index 96b70cf..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/**
- *
- * 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 */
-
-/**
- * Reads an 8 bit value from the processor local scratchpad memory.
- *
- * @address: byte address to read from
- *
- * Returns value read
- */
-static inline uint8_t cvmx_scratch_read8(uint64_t address)
-{
-       return *CASTPTR(volatile uint8_t, CVMX_SCRATCH_BASE + address);
-}
-
-/**
- * Reads a 16 bit value from the processor local scratchpad memory.
- *
- * @address: byte address to read from
- *
- * Returns value read
- */
-static inline uint16_t cvmx_scratch_read16(uint64_t address)
-{
-       return *CASTPTR(volatile uint16_t, CVMX_SCRATCH_BASE + address);
-}
-
-/**
- * Reads a 32 bit value from the processor local scratchpad memory.
- *
- * @address: byte address to read from
- *
- * Returns value read
- */
-static inline uint32_t cvmx_scratch_read32(uint64_t address)
-{
-       return *CASTPTR(volatile uint32_t, CVMX_SCRATCH_BASE + address);
-}
-
-/**
- * Reads a 64 bit value from the processor local scratchpad memory.
- *
- * @address: byte address to read from
- *
- * Returns value read
- */
-static inline uint64_t cvmx_scratch_read64(uint64_t address)
-{
-       return *CASTPTR(volatile uint64_t, CVMX_SCRATCH_BASE + address);
-}
-
-/**
- * Writes an 8 bit value to the processor local scratchpad memory.
- *
- * @address: byte address to write to
- * @value:   value to write
- */
-static inline void cvmx_scratch_write8(uint64_t address, uint64_t value)
-{
-       *CASTPTR(volatile uint8_t, CVMX_SCRATCH_BASE + address) =
-           (uint8_t) value;
-}
-
-/**
- * Writes a 32 bit value to the processor local scratchpad memory.
- *
- * @address: byte address to write to
- * @value:   value to write
- */
-static inline void cvmx_scratch_write16(uint64_t address, uint64_t value)
-{
-       *CASTPTR(volatile uint16_t, CVMX_SCRATCH_BASE + address) =
-           (uint16_t) value;
-}
-
-/**
- * Writes a 16 bit value to the processor local scratchpad memory.
- *
- * @address: byte address to write to
- * @value:   value to write
- */
-static inline void cvmx_scratch_write32(uint64_t address, uint64_t value)
-{
-       *CASTPTR(volatile uint32_t, CVMX_SCRATCH_BASE + address) =
-           (uint32_t) value;
-}
-
-/**
- * Writes a 64 bit value to the processor local scratchpad memory.
- *
- * @address: byte address to write to
- * @value:   value to write
- */
-static inline void cvmx_scratch_write64(uint64_t address, uint64_t value)
-{
-       *CASTPTR(volatile uint64_t, CVMX_SCRATCH_BASE + address) = value;
-}
-
-#endif /* __CVMX_SCRATCH_H__ */
diff --git a/drivers/staging/octeon/cvmx-smix-defs.h b/drivers/staging/octeon/cvmx-smix-defs.h
deleted file mode 100644 (file)
index 9ae45fc..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-#ifndef __CVMX_SMIX_DEFS_H__
-#define __CVMX_SMIX_DEFS_H__
-
-#define CVMX_SMIX_CLK(offset) \
-        CVMX_ADD_IO_SEG(0x0001180000001818ull + (((offset) & 1) * 256))
-#define CVMX_SMIX_CMD(offset) \
-        CVMX_ADD_IO_SEG(0x0001180000001800ull + (((offset) & 1) * 256))
-#define CVMX_SMIX_EN(offset) \
-        CVMX_ADD_IO_SEG(0x0001180000001820ull + (((offset) & 1) * 256))
-#define CVMX_SMIX_RD_DAT(offset) \
-        CVMX_ADD_IO_SEG(0x0001180000001810ull + (((offset) & 1) * 256))
-#define CVMX_SMIX_WR_DAT(offset) \
-        CVMX_ADD_IO_SEG(0x0001180000001808ull + (((offset) & 1) * 256))
-
-union cvmx_smix_clk {
-       uint64_t u64;
-       struct cvmx_smix_clk_s {
-               uint64_t reserved_25_63:39;
-               uint64_t mode:1;
-               uint64_t reserved_21_23:3;
-               uint64_t sample_hi:5;
-               uint64_t sample_mode:1;
-               uint64_t reserved_14_14:1;
-               uint64_t clk_idle:1;
-               uint64_t preamble:1;
-               uint64_t sample:4;
-               uint64_t phase:8;
-       } s;
-       struct cvmx_smix_clk_cn30xx {
-               uint64_t reserved_21_63:43;
-               uint64_t sample_hi:5;
-               uint64_t reserved_14_15:2;
-               uint64_t clk_idle:1;
-               uint64_t preamble:1;
-               uint64_t sample:4;
-               uint64_t 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_cn50xx {
-               uint64_t reserved_25_63:39;
-               uint64_t mode:1;
-               uint64_t reserved_21_23:3;
-               uint64_t sample_hi:5;
-               uint64_t reserved_14_15:2;
-               uint64_t clk_idle:1;
-               uint64_t preamble:1;
-               uint64_t sample:4;
-               uint64_t phase:8;
-       } cn50xx;
-       struct cvmx_smix_clk_s cn52xx;
-       struct cvmx_smix_clk_cn50xx cn52xxp1;
-       struct cvmx_smix_clk_s cn56xx;
-       struct cvmx_smix_clk_cn50xx cn56xxp1;
-       struct cvmx_smix_clk_cn30xx cn58xx;
-       struct cvmx_smix_clk_cn30xx cn58xxp1;
-};
-
-union cvmx_smix_cmd {
-       uint64_t u64;
-       struct cvmx_smix_cmd_s {
-               uint64_t reserved_18_63:46;
-               uint64_t phy_op:2;
-               uint64_t reserved_13_15:3;
-               uint64_t phy_adr:5;
-               uint64_t reserved_5_7:3;
-               uint64_t reg_adr:5;
-       } s;
-       struct cvmx_smix_cmd_cn30xx {
-               uint64_t reserved_17_63:47;
-               uint64_t phy_op:1;
-               uint64_t reserved_13_15:3;
-               uint64_t phy_adr:5;
-               uint64_t reserved_5_7:3;
-               uint64_t 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;
-};
-
-union cvmx_smix_en {
-       uint64_t u64;
-       struct cvmx_smix_en_s {
-               uint64_t reserved_1_63:63;
-               uint64_t 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;
-};
-
-union cvmx_smix_rd_dat {
-       uint64_t u64;
-       struct cvmx_smix_rd_dat_s {
-               uint64_t reserved_18_63:46;
-               uint64_t pending:1;
-               uint64_t val:1;
-               uint64_t 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;
-};
-
-union cvmx_smix_wr_dat {
-       uint64_t u64;
-       struct cvmx_smix_wr_dat_s {
-               uint64_t reserved_18_63:46;
-               uint64_t pending:1;
-               uint64_t val:1;
-               uint64_t 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;
-};
-
-#endif
diff --git a/drivers/staging/octeon/cvmx-spi.c b/drivers/staging/octeon/cvmx-spi.c
deleted file mode 100644 (file)
index 82794d9..0000000
+++ /dev/null
@@ -1,667 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- *
- * Support library for the SPI
- */
-#include <asm/octeon/octeon.h>
-
-#include "cvmx-config.h"
-
-#include "cvmx-pko.h"
-#include "cvmx-spi.h"
-
-#include "cvmx-spxx-defs.h"
-#include "cvmx-stxx-defs.h"
-#include "cvmx-srxx-defs.h"
-
-#define INVOKE_CB(function_p, args...)         \
-       do {                                    \
-               if (function_p) {               \
-                       res = function_p(args); \
-                       if (res)                \
-                               return res;     \
-               }                               \
-       } while (0)
-
-#if CVMX_ENABLE_DEBUG_PRINTS
-static const char *modes[] =
-    { "UNKNOWN", "TX Halfplex", "Rx Halfplex", "Duplex" };
-#endif
-
-/* Default callbacks, can be overridden
- *  using cvmx_spi_get_callbacks/cvmx_spi_set_callbacks
- */
-static cvmx_spi_callbacks_t cvmx_spi_callbacks = {
-       .reset_cb = cvmx_spi_reset_cb,
-       .calendar_setup_cb = cvmx_spi_calendar_setup_cb,
-       .clock_detect_cb = cvmx_spi_clock_detect_cb,
-       .training_cb = cvmx_spi_training_cb,
-       .calendar_sync_cb = cvmx_spi_calendar_sync_cb,
-       .interface_up_cb = cvmx_spi_interface_up_cb
-};
-
-/**
- * Get current SPI4 initialization callbacks
- *
- * @callbacks:  Pointer to the callbacks structure.to fill
- *
- * Returns Pointer to cvmx_spi_callbacks_t structure.
- */
-void cvmx_spi_get_callbacks(cvmx_spi_callbacks_t *callbacks)
-{
-       memcpy(callbacks, &cvmx_spi_callbacks, sizeof(cvmx_spi_callbacks));
-}
-
-/**
- * Set new SPI4 initialization callbacks
- *
- * @new_callbacks:  Pointer to an updated callbacks structure.
- */
-void cvmx_spi_set_callbacks(cvmx_spi_callbacks_t *new_callbacks)
-{
-       memcpy(&cvmx_spi_callbacks, new_callbacks, sizeof(cvmx_spi_callbacks));
-}
-
-/**
- * Initialize and start the SPI interface.
- *
- * @interface: The identifier of the packet interface to configure and
- *                  use as a SPI interface.
- * @mode:      The operating mode for the SPI interface. The interface
- *                  can operate as a full duplex (both Tx and Rx data paths
- *                  active) or as a halfplex (either the Tx data path is
- *                  active or the Rx data path is active, but not both).
- * @timeout:   Timeout to wait for clock synchronization in seconds
- * @num_ports: Number of SPI ports to configure
- *
- * Returns Zero on success, negative of failure.
- */
-int cvmx_spi_start_interface(int interface, cvmx_spi_mode_t mode, int timeout,
-                            int num_ports)
-{
-       int res = -1;
-
-       if (!(OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX)))
-               return res;
-
-       /* Callback to perform SPI4 reset */
-       INVOKE_CB(cvmx_spi_callbacks.reset_cb, interface, mode);
-
-       /* Callback to perform calendar setup */
-       INVOKE_CB(cvmx_spi_callbacks.calendar_setup_cb, interface, mode,
-                 num_ports);
-
-       /* Callback to perform clock detection */
-       INVOKE_CB(cvmx_spi_callbacks.clock_detect_cb, interface, mode, timeout);
-
-       /* Callback to perform SPI4 link training */
-       INVOKE_CB(cvmx_spi_callbacks.training_cb, interface, mode, timeout);
-
-       /* Callback to perform calendar sync */
-       INVOKE_CB(cvmx_spi_callbacks.calendar_sync_cb, interface, mode,
-                 timeout);
-
-       /* Callback to handle interface coming up */
-       INVOKE_CB(cvmx_spi_callbacks.interface_up_cb, interface, mode);
-
-       return res;
-}
-
-/**
- * This routine restarts the SPI interface after it has lost synchronization
- * with its correspondent system.
- *
- * @interface: The identifier of the packet interface to configure and
- *                  use as a SPI interface.
- * @mode:      The operating mode for the SPI interface. The interface
- *                  can operate as a full duplex (both Tx and Rx data paths
- *                  active) or as a halfplex (either the Tx data path is
- *                  active or the Rx data path is active, but not both).
- * @timeout:   Timeout to wait for clock synchronization in seconds
- *
- * Returns Zero on success, negative of failure.
- */
-int cvmx_spi_restart_interface(int interface, cvmx_spi_mode_t mode, int timeout)
-{
-       int res = -1;
-
-       if (!(OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX)))
-               return res;
-
-       cvmx_dprintf("SPI%d: Restart %s\n", interface, modes[mode]);
-
-       /* Callback to perform SPI4 reset */
-       INVOKE_CB(cvmx_spi_callbacks.reset_cb, interface, mode);
-
-       /* NOTE: Calendar setup is not performed during restart */
-       /*       Refer to cvmx_spi_start_interface() for the full sequence */
-
-       /* Callback to perform clock detection */
-       INVOKE_CB(cvmx_spi_callbacks.clock_detect_cb, interface, mode, timeout);
-
-       /* Callback to perform SPI4 link training */
-       INVOKE_CB(cvmx_spi_callbacks.training_cb, interface, mode, timeout);
-
-       /* Callback to perform calendar sync */
-       INVOKE_CB(cvmx_spi_callbacks.calendar_sync_cb, interface, mode,
-                 timeout);
-
-       /* Callback to handle interface coming up */
-       INVOKE_CB(cvmx_spi_callbacks.interface_up_cb, interface, mode);
-
-       return res;
-}
-
-/**
- * Callback to perform SPI4 reset
- *
- * @interface: The identifier of the packet interface to configure and
- *                  use as a SPI interface.
- * @mode:      The operating mode for the SPI interface. The interface
- *                  can operate as a full duplex (both Tx and Rx data paths
- *                  active) or as a halfplex (either the Tx data path is
- *                  active or the Rx data path is active, but not both).
- *
- * Returns Zero on success, non-zero error code on failure (will cause
- * SPI initialization to abort)
- */
-int cvmx_spi_reset_cb(int interface, cvmx_spi_mode_t mode)
-{
-       union cvmx_spxx_dbg_deskew_ctl spxx_dbg_deskew_ctl;
-       union cvmx_spxx_clk_ctl spxx_clk_ctl;
-       union cvmx_spxx_bist_stat spxx_bist_stat;
-       union cvmx_spxx_int_msk spxx_int_msk;
-       union cvmx_stxx_int_msk stxx_int_msk;
-       union cvmx_spxx_trn4_ctl spxx_trn4_ctl;
-       int index;
-       uint64_t MS = cvmx_sysinfo_get()->cpu_clock_hz / 1000;
-
-       /* Disable SPI error events while we run BIST */
-       spxx_int_msk.u64 = cvmx_read_csr(CVMX_SPXX_INT_MSK(interface));
-       cvmx_write_csr(CVMX_SPXX_INT_MSK(interface), 0);
-       stxx_int_msk.u64 = cvmx_read_csr(CVMX_STXX_INT_MSK(interface));
-       cvmx_write_csr(CVMX_STXX_INT_MSK(interface), 0);
-
-       /* Run BIST in the SPI interface */
-       cvmx_write_csr(CVMX_SRXX_COM_CTL(interface), 0);
-       cvmx_write_csr(CVMX_STXX_COM_CTL(interface), 0);
-       spxx_clk_ctl.u64 = 0;
-       spxx_clk_ctl.s.runbist = 1;
-       cvmx_write_csr(CVMX_SPXX_CLK_CTL(interface), spxx_clk_ctl.u64);
-       cvmx_wait(10 * MS);
-       spxx_bist_stat.u64 = cvmx_read_csr(CVMX_SPXX_BIST_STAT(interface));
-       if (spxx_bist_stat.s.stat0)
-               cvmx_dprintf
-                   ("ERROR SPI%d: BIST failed on receive datapath FIFO\n",
-                    interface);
-       if (spxx_bist_stat.s.stat1)
-               cvmx_dprintf("ERROR SPI%d: BIST failed on RX calendar table\n",
-                            interface);
-       if (spxx_bist_stat.s.stat2)
-               cvmx_dprintf("ERROR SPI%d: BIST failed on TX calendar table\n",
-                            interface);
-
-       /* Clear the calendar table after BIST to fix parity errors */
-       for (index = 0; index < 32; index++) {
-               union cvmx_srxx_spi4_calx srxx_spi4_calx;
-               union cvmx_stxx_spi4_calx stxx_spi4_calx;
-
-               srxx_spi4_calx.u64 = 0;
-               srxx_spi4_calx.s.oddpar = 1;
-               cvmx_write_csr(CVMX_SRXX_SPI4_CALX(index, interface),
-                              srxx_spi4_calx.u64);
-
-               stxx_spi4_calx.u64 = 0;
-               stxx_spi4_calx.s.oddpar = 1;
-               cvmx_write_csr(CVMX_STXX_SPI4_CALX(index, interface),
-                              stxx_spi4_calx.u64);
-       }
-
-       /* Re enable reporting of error interrupts */
-       cvmx_write_csr(CVMX_SPXX_INT_REG(interface),
-                      cvmx_read_csr(CVMX_SPXX_INT_REG(interface)));
-       cvmx_write_csr(CVMX_SPXX_INT_MSK(interface), spxx_int_msk.u64);
-       cvmx_write_csr(CVMX_STXX_INT_REG(interface),
-                      cvmx_read_csr(CVMX_STXX_INT_REG(interface)));
-       cvmx_write_csr(CVMX_STXX_INT_MSK(interface), stxx_int_msk.u64);
-
-       /* Setup the CLKDLY right in the middle */
-       spxx_clk_ctl.u64 = 0;
-       spxx_clk_ctl.s.seetrn = 0;
-       spxx_clk_ctl.s.clkdly = 0x10;
-       spxx_clk_ctl.s.runbist = 0;
-       spxx_clk_ctl.s.statdrv = 0;
-       /* This should always be on the opposite edge as statdrv */
-       spxx_clk_ctl.s.statrcv = 1;
-       spxx_clk_ctl.s.sndtrn = 0;
-       spxx_clk_ctl.s.drptrn = 0;
-       spxx_clk_ctl.s.rcvtrn = 0;
-       spxx_clk_ctl.s.srxdlck = 0;
-       cvmx_write_csr(CVMX_SPXX_CLK_CTL(interface), spxx_clk_ctl.u64);
-       cvmx_wait(100 * MS);
-
-       /* Reset SRX0 DLL */
-       spxx_clk_ctl.s.srxdlck = 1;
-       cvmx_write_csr(CVMX_SPXX_CLK_CTL(interface), spxx_clk_ctl.u64);
-
-       /* Waiting for Inf0 Spi4 RX DLL to lock */
-       cvmx_wait(100 * MS);
-
-       /* Enable dynamic alignment */
-       spxx_trn4_ctl.s.trntest = 0;
-       spxx_trn4_ctl.s.jitter = 1;
-       spxx_trn4_ctl.s.clr_boot = 1;
-       spxx_trn4_ctl.s.set_boot = 0;
-       if (OCTEON_IS_MODEL(OCTEON_CN58XX))
-               spxx_trn4_ctl.s.maxdist = 3;
-       else
-               spxx_trn4_ctl.s.maxdist = 8;
-       spxx_trn4_ctl.s.macro_en = 1;
-       spxx_trn4_ctl.s.mux_en = 1;
-       cvmx_write_csr(CVMX_SPXX_TRN4_CTL(interface), spxx_trn4_ctl.u64);
-
-       spxx_dbg_deskew_ctl.u64 = 0;
-       cvmx_write_csr(CVMX_SPXX_DBG_DESKEW_CTL(interface),
-                      spxx_dbg_deskew_ctl.u64);
-
-       return 0;
-}
-
-/**
- * Callback to setup calendar and miscellaneous settings before clock detection
- *
- * @interface: The identifier of the packet interface to configure and
- *                  use as a SPI interface.
- * @mode:      The operating mode for the SPI interface. The interface
- *                  can operate as a full duplex (both Tx and Rx data paths
- *                  active) or as a halfplex (either the Tx data path is
- *                  active or the Rx data path is active, but not both).
- * @num_ports: Number of ports to configure on SPI
- *
- * Returns Zero on success, non-zero error code on failure (will cause
- * SPI initialization to abort)
- */
-int cvmx_spi_calendar_setup_cb(int interface, cvmx_spi_mode_t mode,
-                              int num_ports)
-{
-       int port;
-       int index;
-       if (mode & CVMX_SPI_MODE_RX_HALFPLEX) {
-               union cvmx_srxx_com_ctl srxx_com_ctl;
-               union cvmx_srxx_spi4_stat srxx_spi4_stat;
-
-               /* SRX0 number of Ports */
-               srxx_com_ctl.u64 = 0;
-               srxx_com_ctl.s.prts = num_ports - 1;
-               srxx_com_ctl.s.st_en = 0;
-               srxx_com_ctl.s.inf_en = 0;
-               cvmx_write_csr(CVMX_SRXX_COM_CTL(interface), srxx_com_ctl.u64);
-
-               /* SRX0 Calendar Table. This round robbins through all ports */
-               port = 0;
-               index = 0;
-               while (port < num_ports) {
-                       union cvmx_srxx_spi4_calx srxx_spi4_calx;
-                       srxx_spi4_calx.u64 = 0;
-                       srxx_spi4_calx.s.prt0 = port++;
-                       srxx_spi4_calx.s.prt1 = port++;
-                       srxx_spi4_calx.s.prt2 = port++;
-                       srxx_spi4_calx.s.prt3 = port++;
-                       srxx_spi4_calx.s.oddpar =
-                           ~(cvmx_dpop(srxx_spi4_calx.u64) & 1);
-                       cvmx_write_csr(CVMX_SRXX_SPI4_CALX(index, interface),
-                                      srxx_spi4_calx.u64);
-                       index++;
-               }
-               srxx_spi4_stat.u64 = 0;
-               srxx_spi4_stat.s.len = num_ports;
-               srxx_spi4_stat.s.m = 1;
-               cvmx_write_csr(CVMX_SRXX_SPI4_STAT(interface),
-                              srxx_spi4_stat.u64);
-       }
-
-       if (mode & CVMX_SPI_MODE_TX_HALFPLEX) {
-               union cvmx_stxx_arb_ctl stxx_arb_ctl;
-               union cvmx_gmxx_tx_spi_max gmxx_tx_spi_max;
-               union cvmx_gmxx_tx_spi_thresh gmxx_tx_spi_thresh;
-               union cvmx_gmxx_tx_spi_ctl gmxx_tx_spi_ctl;
-               union cvmx_stxx_spi4_stat stxx_spi4_stat;
-               union cvmx_stxx_spi4_dat stxx_spi4_dat;
-
-               /* STX0 Config */
-               stxx_arb_ctl.u64 = 0;
-               stxx_arb_ctl.s.igntpa = 0;
-               stxx_arb_ctl.s.mintrn = 0;
-               cvmx_write_csr(CVMX_STXX_ARB_CTL(interface), stxx_arb_ctl.u64);
-
-               gmxx_tx_spi_max.u64 = 0;
-               gmxx_tx_spi_max.s.max1 = 8;
-               gmxx_tx_spi_max.s.max2 = 4;
-               gmxx_tx_spi_max.s.slice = 0;
-               cvmx_write_csr(CVMX_GMXX_TX_SPI_MAX(interface),
-                              gmxx_tx_spi_max.u64);
-
-               gmxx_tx_spi_thresh.u64 = 0;
-               gmxx_tx_spi_thresh.s.thresh = 4;
-               cvmx_write_csr(CVMX_GMXX_TX_SPI_THRESH(interface),
-                              gmxx_tx_spi_thresh.u64);
-
-               gmxx_tx_spi_ctl.u64 = 0;
-               gmxx_tx_spi_ctl.s.tpa_clr = 0;
-               gmxx_tx_spi_ctl.s.cont_pkt = 0;
-               cvmx_write_csr(CVMX_GMXX_TX_SPI_CTL(interface),
-                              gmxx_tx_spi_ctl.u64);
-
-               /* STX0 Training Control */
-               stxx_spi4_dat.u64 = 0;
-               /*Minimum needed by dynamic alignment */
-               stxx_spi4_dat.s.alpha = 32;
-               stxx_spi4_dat.s.max_t = 0xFFFF; /*Minimum interval is 0x20 */
-               cvmx_write_csr(CVMX_STXX_SPI4_DAT(interface),
-                              stxx_spi4_dat.u64);
-
-               /* STX0 Calendar Table. This round robbins through all ports */
-               port = 0;
-               index = 0;
-               while (port < num_ports) {
-                       union cvmx_stxx_spi4_calx stxx_spi4_calx;
-                       stxx_spi4_calx.u64 = 0;
-                       stxx_spi4_calx.s.prt0 = port++;
-                       stxx_spi4_calx.s.prt1 = port++;
-                       stxx_spi4_calx.s.prt2 = port++;
-                       stxx_spi4_calx.s.prt3 = port++;
-                       stxx_spi4_calx.s.oddpar =
-                           ~(cvmx_dpop(stxx_spi4_calx.u64) & 1);
-                       cvmx_write_csr(CVMX_STXX_SPI4_CALX(index, interface),
-                                      stxx_spi4_calx.u64);
-                       index++;
-               }
-               stxx_spi4_stat.u64 = 0;
-               stxx_spi4_stat.s.len = num_ports;
-               stxx_spi4_stat.s.m = 1;
-               cvmx_write_csr(CVMX_STXX_SPI4_STAT(interface),
-                              stxx_spi4_stat.u64);
-       }
-
-       return 0;
-}
-
-/**
- * Callback to perform clock detection
- *
- * @interface: The identifier of the packet interface to configure and
- *                  use as a SPI interface.
- * @mode:      The operating mode for the SPI interface. The interface
- *                  can operate as a full duplex (both Tx and Rx data paths
- *                  active) or as a halfplex (either the Tx data path is
- *                  active or the Rx data path is active, but not both).
- * @timeout:   Timeout to wait for clock synchronization in seconds
- *
- * Returns Zero on success, non-zero error code on failure (will cause
- * SPI initialization to abort)
- */
-int cvmx_spi_clock_detect_cb(int interface, cvmx_spi_mode_t mode, int timeout)
-{
-       int clock_transitions;
-       union cvmx_spxx_clk_stat stat;
-       uint64_t timeout_time;
-       uint64_t MS = cvmx_sysinfo_get()->cpu_clock_hz / 1000;
-
-       /*
-        * Regardless of operating mode, both Tx and Rx clocks must be
-        * present for the SPI interface to operate.
-        */
-       cvmx_dprintf("SPI%d: Waiting to see TsClk...\n", interface);
-       timeout_time = cvmx_get_cycle() + 1000ull * MS * timeout;
-       /*
-        * Require 100 clock transitions in order to avoid any noise
-        * in the beginning.
-        */
-       clock_transitions = 100;
-       do {
-               stat.u64 = cvmx_read_csr(CVMX_SPXX_CLK_STAT(interface));
-               if (stat.s.s4clk0 && stat.s.s4clk1 && clock_transitions) {
-                       /*
-                        * We've seen a clock transition, so decrement
-                        * the number we still need.
-                        */
-                       clock_transitions--;
-                       cvmx_write_csr(CVMX_SPXX_CLK_STAT(interface), stat.u64);
-                       stat.s.s4clk0 = 0;
-                       stat.s.s4clk1 = 0;
-               }
-               if (cvmx_get_cycle() > timeout_time) {
-                       cvmx_dprintf("SPI%d: Timeout\n", interface);
-                       return -1;
-               }
-       } while (stat.s.s4clk0 == 0 || stat.s.s4clk1 == 0);
-
-       cvmx_dprintf("SPI%d: Waiting to see RsClk...\n", interface);
-       timeout_time = cvmx_get_cycle() + 1000ull * MS * timeout;
-       /*
-        * Require 100 clock transitions in order to avoid any noise in the
-        * beginning.
-        */
-       clock_transitions = 100;
-       do {
-               stat.u64 = cvmx_read_csr(CVMX_SPXX_CLK_STAT(interface));
-               if (stat.s.d4clk0 && stat.s.d4clk1 && clock_transitions) {
-                       /*
-                        * We've seen a clock transition, so decrement
-                        * the number we still need
-                        */
-                       clock_transitions--;
-                       cvmx_write_csr(CVMX_SPXX_CLK_STAT(interface), stat.u64);
-                       stat.s.d4clk0 = 0;
-                       stat.s.d4clk1 = 0;
-               }
-               if (cvmx_get_cycle() > timeout_time) {
-                       cvmx_dprintf("SPI%d: Timeout\n", interface);
-                       return -1;
-               }
-       } while (stat.s.d4clk0 == 0 || stat.s.d4clk1 == 0);
-
-       return 0;
-}
-
-/**
- * Callback to perform link training
- *
- * @interface: The identifier of the packet interface to configure and
- *                  use as a SPI interface.
- * @mode:      The operating mode for the SPI interface. The interface
- *                  can operate as a full duplex (both Tx and Rx data paths
- *                  active) or as a halfplex (either the Tx data path is
- *                  active or the Rx data path is active, but not both).
- * @timeout:   Timeout to wait for link to be trained (in seconds)
- *
- * Returns Zero on success, non-zero error code on failure (will cause
- * SPI initialization to abort)
- */
-int cvmx_spi_training_cb(int interface, cvmx_spi_mode_t mode, int timeout)
-{
-       union cvmx_spxx_trn4_ctl spxx_trn4_ctl;
-       union cvmx_spxx_clk_stat stat;
-       uint64_t MS = cvmx_sysinfo_get()->cpu_clock_hz / 1000;
-       uint64_t timeout_time = cvmx_get_cycle() + 1000ull * MS * timeout;
-       int rx_training_needed;
-
-       /* SRX0 & STX0 Inf0 Links are configured - begin training */
-       union cvmx_spxx_clk_ctl spxx_clk_ctl;
-       spxx_clk_ctl.u64 = 0;
-       spxx_clk_ctl.s.seetrn = 0;
-       spxx_clk_ctl.s.clkdly = 0x10;
-       spxx_clk_ctl.s.runbist = 0;
-       spxx_clk_ctl.s.statdrv = 0;
-       /* This should always be on the opposite edge as statdrv */
-       spxx_clk_ctl.s.statrcv = 1;
-       spxx_clk_ctl.s.sndtrn = 1;
-       spxx_clk_ctl.s.drptrn = 1;
-       spxx_clk_ctl.s.rcvtrn = 1;
-       spxx_clk_ctl.s.srxdlck = 1;
-       cvmx_write_csr(CVMX_SPXX_CLK_CTL(interface), spxx_clk_ctl.u64);
-       cvmx_wait(1000 * MS);
-
-       /* SRX0 clear the boot bit */
-       spxx_trn4_ctl.u64 = cvmx_read_csr(CVMX_SPXX_TRN4_CTL(interface));
-       spxx_trn4_ctl.s.clr_boot = 1;
-       cvmx_write_csr(CVMX_SPXX_TRN4_CTL(interface), spxx_trn4_ctl.u64);
-
-       /* Wait for the training sequence to complete */
-       cvmx_dprintf("SPI%d: Waiting for training\n", interface);
-       cvmx_wait(1000 * MS);
-       /* Wait a really long time here */
-       timeout_time = cvmx_get_cycle() + 1000ull * MS * 600;
-       /*
-        * The HRM says we must wait for 34 + 16 * MAXDIST training sequences.
-        * We'll be pessimistic and wait for a lot more.
-        */
-       rx_training_needed = 500;
-       do {
-               stat.u64 = cvmx_read_csr(CVMX_SPXX_CLK_STAT(interface));
-               if (stat.s.srxtrn && rx_training_needed) {
-                       rx_training_needed--;
-                       cvmx_write_csr(CVMX_SPXX_CLK_STAT(interface), stat.u64);
-                       stat.s.srxtrn = 0;
-               }
-               if (cvmx_get_cycle() > timeout_time) {
-                       cvmx_dprintf("SPI%d: Timeout\n", interface);
-                       return -1;
-               }
-       } while (stat.s.srxtrn == 0);
-
-       return 0;
-}
-
-/**
- * Callback to perform calendar data synchronization
- *
- * @interface: The identifier of the packet interface to configure and
- *                  use as a SPI interface.
- * @mode:      The operating mode for the SPI interface. The interface
- *                  can operate as a full duplex (both Tx and Rx data paths
- *                  active) or as a halfplex (either the Tx data path is
- *                  active or the Rx data path is active, but not both).
- * @timeout:   Timeout to wait for calendar data in seconds
- *
- * Returns Zero on success, non-zero error code on failure (will cause
- * SPI initialization to abort)
- */
-int cvmx_spi_calendar_sync_cb(int interface, cvmx_spi_mode_t mode, int timeout)
-{
-       uint64_t MS = cvmx_sysinfo_get()->cpu_clock_hz / 1000;
-       if (mode & CVMX_SPI_MODE_RX_HALFPLEX) {
-               /* SRX0 interface should be good, send calendar data */
-               union cvmx_srxx_com_ctl srxx_com_ctl;
-               cvmx_dprintf
-                   ("SPI%d: Rx is synchronized, start sending calendar data\n",
-                    interface);
-               srxx_com_ctl.u64 = cvmx_read_csr(CVMX_SRXX_COM_CTL(interface));
-               srxx_com_ctl.s.inf_en = 1;
-               srxx_com_ctl.s.st_en = 1;
-               cvmx_write_csr(CVMX_SRXX_COM_CTL(interface), srxx_com_ctl.u64);
-       }
-
-       if (mode & CVMX_SPI_MODE_TX_HALFPLEX) {
-               /* STX0 has achieved sync */
-               /* The corespondant board should be sending calendar data */
-               /* Enable the STX0 STAT receiver. */
-               union cvmx_spxx_clk_stat stat;
-               uint64_t timeout_time;
-               union cvmx_stxx_com_ctl stxx_com_ctl;
-               stxx_com_ctl.u64 = 0;
-               stxx_com_ctl.s.st_en = 1;
-               cvmx_write_csr(CVMX_STXX_COM_CTL(interface), stxx_com_ctl.u64);
-
-               /* Waiting for calendar sync on STX0 STAT */
-               cvmx_dprintf("SPI%d: Waiting to sync on STX[%d] STAT\n",
-                            interface, interface);
-               timeout_time = cvmx_get_cycle() + 1000ull * MS * timeout;
-               /* SPX0_CLK_STAT - SPX0_CLK_STAT[STXCAL] should be 1 (bit10) */
-               do {
-                       stat.u64 = cvmx_read_csr(CVMX_SPXX_CLK_STAT(interface));
-                       if (cvmx_get_cycle() > timeout_time) {
-                               cvmx_dprintf("SPI%d: Timeout\n", interface);
-                               return -1;
-                       }
-               } while (stat.s.stxcal == 0);
-       }
-
-       return 0;
-}
-
-/**
- * Callback to handle interface up
- *
- * @interface: The identifier of the packet interface to configure and
- *                  use as a SPI interface.
- * @mode:      The operating mode for the SPI interface. The interface
- *                  can operate as a full duplex (both Tx and Rx data paths
- *                  active) or as a halfplex (either the Tx data path is
- *                  active or the Rx data path is active, but not both).
- *
- * Returns Zero on success, non-zero error code on failure (will cause
- * SPI initialization to abort)
- */
-int cvmx_spi_interface_up_cb(int interface, cvmx_spi_mode_t mode)
-{
-       union cvmx_gmxx_rxx_frm_min gmxx_rxx_frm_min;
-       union cvmx_gmxx_rxx_frm_max gmxx_rxx_frm_max;
-       union cvmx_gmxx_rxx_jabber gmxx_rxx_jabber;
-
-       if (mode & CVMX_SPI_MODE_RX_HALFPLEX) {
-               union cvmx_srxx_com_ctl srxx_com_ctl;
-               srxx_com_ctl.u64 = cvmx_read_csr(CVMX_SRXX_COM_CTL(interface));
-               srxx_com_ctl.s.inf_en = 1;
-               cvmx_write_csr(CVMX_SRXX_COM_CTL(interface), srxx_com_ctl.u64);
-               cvmx_dprintf("SPI%d: Rx is now up\n", interface);
-       }
-
-       if (mode & CVMX_SPI_MODE_TX_HALFPLEX) {
-               union cvmx_stxx_com_ctl stxx_com_ctl;
-               stxx_com_ctl.u64 = cvmx_read_csr(CVMX_STXX_COM_CTL(interface));
-               stxx_com_ctl.s.inf_en = 1;
-               cvmx_write_csr(CVMX_STXX_COM_CTL(interface), stxx_com_ctl.u64);
-               cvmx_dprintf("SPI%d: Tx is now up\n", interface);
-       }
-
-       gmxx_rxx_frm_min.u64 = 0;
-       gmxx_rxx_frm_min.s.len = 64;
-       cvmx_write_csr(CVMX_GMXX_RXX_FRM_MIN(0, interface),
-                      gmxx_rxx_frm_min.u64);
-       gmxx_rxx_frm_max.u64 = 0;
-       gmxx_rxx_frm_max.s.len = 64 * 1024 - 4;
-       cvmx_write_csr(CVMX_GMXX_RXX_FRM_MAX(0, interface),
-                      gmxx_rxx_frm_max.u64);
-       gmxx_rxx_jabber.u64 = 0;
-       gmxx_rxx_jabber.s.cnt = 64 * 1024 - 4;
-       cvmx_write_csr(CVMX_GMXX_RXX_JABBER(0, interface), gmxx_rxx_jabber.u64);
-
-       return 0;
-}
diff --git a/drivers/staging/octeon/cvmx-spi.h b/drivers/staging/octeon/cvmx-spi.h
deleted file mode 100644 (file)
index e814648..0000000
+++ /dev/null
@@ -1,269 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/*
- *
- * This file contains defines for the SPI interface
- */
-#ifndef __CVMX_SPI_H__
-#define __CVMX_SPI_H__
-
-#include "cvmx-gmxx-defs.h"
-
-/* CSR typedefs have been moved to cvmx-csr-*.h */
-
-typedef enum {
-       CVMX_SPI_MODE_UNKNOWN = 0,
-       CVMX_SPI_MODE_TX_HALFPLEX = 1,
-       CVMX_SPI_MODE_RX_HALFPLEX = 2,
-       CVMX_SPI_MODE_DUPLEX = 3
-} cvmx_spi_mode_t;
-
-/** Callbacks structure to customize SPI4 initialization sequence */
-typedef struct {
-    /** Called to reset SPI4 DLL */
-       int (*reset_cb) (int interface, cvmx_spi_mode_t mode);
-
-    /** Called to setup calendar */
-       int (*calendar_setup_cb) (int interface, cvmx_spi_mode_t mode,
-                                 int num_ports);
-
-    /** Called for Tx and Rx clock detection */
-       int (*clock_detect_cb) (int interface, cvmx_spi_mode_t mode,
-                               int timeout);
-
-    /** Called to perform link training */
-       int (*training_cb) (int interface, cvmx_spi_mode_t mode, int timeout);
-
-    /** Called for calendar data synchronization */
-       int (*calendar_sync_cb) (int interface, cvmx_spi_mode_t mode,
-                                int timeout);
-
-    /** Called when interface is up */
-       int (*interface_up_cb) (int interface, cvmx_spi_mode_t mode);
-
-} cvmx_spi_callbacks_t;
-
-/**
- * Return true if the supplied interface is configured for SPI
- *
- * @interface: Interface to check
- * Returns True if interface is SPI
- */
-static inline int cvmx_spi_is_spi_interface(int interface)
-{
-       uint64_t gmxState = cvmx_read_csr(CVMX_GMXX_INF_MODE(interface));
-       return (gmxState & 0x2) && (gmxState & 0x1);
-}
-
-/**
- * Initialize and start the SPI interface.
- *
- * @interface: The identifier of the packet interface to configure and
- *                  use as a SPI interface.
- * @mode:      The operating mode for the SPI interface. The interface
- *                  can operate as a full duplex (both Tx and Rx data paths
- *                  active) or as a halfplex (either the Tx data path is
- *                  active or the Rx data path is active, but not both).
- * @timeout:   Timeout to wait for clock synchronization in seconds
- * @num_ports: Number of SPI ports to configure
- *
- * Returns Zero on success, negative of failure.
- */
-extern int cvmx_spi_start_interface(int interface, cvmx_spi_mode_t mode,
-                                   int timeout, int num_ports);
-
-/**
- * This routine restarts the SPI interface after it has lost synchronization
- * with its corespondant system.
- *
- * @interface: The identifier of the packet interface to configure and
- *                  use as a SPI interface.
- * @mode:      The operating mode for the SPI interface. The interface
- *                  can operate as a full duplex (both Tx and Rx data paths
- *                  active) or as a halfplex (either the Tx data path is
- *                  active or the Rx data path is active, but not both).
- * @timeout:   Timeout to wait for clock synchronization in seconds
- * Returns Zero on success, negative of failure.
- */
-extern int cvmx_spi_restart_interface(int interface, cvmx_spi_mode_t mode,
-                                     int timeout);
-
-/**
- * Return non-zero if the SPI interface has a SPI4000 attached
- *
- * @interface: SPI interface the SPI4000 is connected to
- *
- * Returns
- */
-static inline int cvmx_spi4000_is_present(int interface)
-{
-       return 0;
-}
-
-/**
- * Initialize the SPI4000 for use
- *
- * @interface: SPI interface the SPI4000 is connected to
- */
-static inline int cvmx_spi4000_initialize(int interface)
-{
-       return 0;
-}
-
-/**
- * Poll all the SPI4000 port and check its speed
- *
- * @interface: Interface the SPI4000 is on
- * @port:      Port to poll (0-9)
- * Returns Status of the port. 0=down. All other values the port is up.
- */
-static inline union cvmx_gmxx_rxx_rx_inbnd cvmx_spi4000_check_speed(
-       int interface,
-       int port)
-{
-       union cvmx_gmxx_rxx_rx_inbnd r;
-       r.u64 = 0;
-       return r;
-}
-
-/**
- * Get current SPI4 initialization callbacks
- *
- * @callbacks:  Pointer to the callbacks structure.to fill
- *
- * Returns Pointer to cvmx_spi_callbacks_t structure.
- */
-extern void cvmx_spi_get_callbacks(cvmx_spi_callbacks_t *callbacks);
-
-/**
- * Set new SPI4 initialization callbacks
- *
- * @new_callbacks:  Pointer to an updated callbacks structure.
- */
-extern void cvmx_spi_set_callbacks(cvmx_spi_callbacks_t *new_callbacks);
-
-/**
- * Callback to perform SPI4 reset
- *
- * @interface: The identifier of the packet interface to configure and
- *                  use as a SPI interface.
- * @mode:      The operating mode for the SPI interface. The interface
- *                  can operate as a full duplex (both Tx and Rx data paths
- *                  active) or as a halfplex (either the Tx data path is
- *                  active or the Rx data path is active, but not both).
- *
- * Returns Zero on success, non-zero error code on failure (will cause
- * SPI initialization to abort)
- */
-extern int cvmx_spi_reset_cb(int interface, cvmx_spi_mode_t mode);
-
-/**
- * Callback to setup calendar and miscellaneous settings before clock
- * detection
- *
- * @interface: The identifier of the packet interface to configure and
- *                  use as a SPI interface.
- * @mode:      The operating mode for the SPI interface. The interface
- *                  can operate as a full duplex (both Tx and Rx data paths
- *                  active) or as a halfplex (either the Tx data path is
- *                  active or the Rx data path is active, but not both).
- * @num_ports: Number of ports to configure on SPI
- *
- * Returns Zero on success, non-zero error code on failure (will cause
- * SPI initialization to abort)
- */
-extern int cvmx_spi_calendar_setup_cb(int interface, cvmx_spi_mode_t mode,
-                                     int num_ports);
-
-/**
- * Callback to perform clock detection
- *
- * @interface: The identifier of the packet interface to configure and
- *                  use as a SPI interface.
- * @mode:      The operating mode for the SPI interface. The interface
- *                  can operate as a full duplex (both Tx and Rx data paths
- *                  active) or as a halfplex (either the Tx data path is
- *                  active or the Rx data path is active, but not both).
- * @timeout:   Timeout to wait for clock synchronization in seconds
- *
- * Returns Zero on success, non-zero error code on failure (will cause
- * SPI initialization to abort)
- */
-extern int cvmx_spi_clock_detect_cb(int interface, cvmx_spi_mode_t mode,
-                                   int timeout);
-
-/**
- * Callback to perform link training
- *
- * @interface: The identifier of the packet interface to configure and
- *                  use as a SPI interface.
- * @mode:      The operating mode for the SPI interface. The interface
- *                  can operate as a full duplex (both Tx and Rx data paths
- *                  active) or as a halfplex (either the Tx data path is
- *                  active or the Rx data path is active, but not both).
- * @timeout:   Timeout to wait for link to be trained (in seconds)
- *
- * Returns Zero on success, non-zero error code on failure (will cause
- * SPI initialization to abort)
- */
-extern int cvmx_spi_training_cb(int interface, cvmx_spi_mode_t mode,
-                               int timeout);
-
-/**
- * Callback to perform calendar data synchronization
- *
- * @interface: The identifier of the packet interface to configure and
- *                  use as a SPI interface.
- * @mode:      The operating mode for the SPI interface. The interface
- *                  can operate as a full duplex (both Tx and Rx data paths
- *                  active) or as a halfplex (either the Tx data path is
- *                  active or the Rx data path is active, but not both).
- * @timeout:   Timeout to wait for calendar data in seconds
- *
- * Returns Zero on success, non-zero error code on failure (will cause
- * SPI initialization to abort)
- */
-extern int cvmx_spi_calendar_sync_cb(int interface, cvmx_spi_mode_t mode,
-                                    int timeout);
-
-/**
- * Callback to handle interface up
- *
- * @interface: The identifier of the packet interface to configure and
- *                  use as a SPI interface.
- * @mode:      The operating mode for the SPI interface. The interface
- *                  can operate as a full duplex (both Tx and Rx data paths
- *                  active) or as a halfplex (either the Tx data path is
- *                  active or the Rx data path is active, but not both).
- *
- * Returns Zero on success, non-zero error code on failure (will cause
- * SPI initialization to abort)
- */
-extern int cvmx_spi_interface_up_cb(int interface, cvmx_spi_mode_t mode);
-
-#endif /* __CVMX_SPI_H__ */
diff --git a/drivers/staging/octeon/cvmx-spxx-defs.h b/drivers/staging/octeon/cvmx-spxx-defs.h
deleted file mode 100644 (file)
index b16940e..0000000
+++ /dev/null
@@ -1,347 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-#ifndef __CVMX_SPXX_DEFS_H__
-#define __CVMX_SPXX_DEFS_H__
-
-#define CVMX_SPXX_BCKPRS_CNT(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000340ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_SPXX_BIST_STAT(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800900007F8ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_SPXX_CLK_CTL(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000348ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_SPXX_CLK_STAT(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000350ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_SPXX_DBG_DESKEW_CTL(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000368ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_SPXX_DBG_DESKEW_STATE(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000370ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_SPXX_DRV_CTL(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000358ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_SPXX_ERR_CTL(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000320ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_SPXX_INT_DAT(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000318ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_SPXX_INT_MSK(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000308ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_SPXX_INT_REG(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000300ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_SPXX_INT_SYNC(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000310ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_SPXX_TPA_ACC(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000338ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_SPXX_TPA_MAX(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000330ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_SPXX_TPA_SEL(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000328ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_SPXX_TRN4_CTL(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000360ull + (((block_id) & 1) * 0x8000000ull))
-
-union cvmx_spxx_bckprs_cnt {
-       uint64_t u64;
-       struct cvmx_spxx_bckprs_cnt_s {
-               uint64_t reserved_32_63:32;
-               uint64_t cnt:32;
-       } s;
-       struct cvmx_spxx_bckprs_cnt_s cn38xx;
-       struct cvmx_spxx_bckprs_cnt_s cn38xxp2;
-       struct cvmx_spxx_bckprs_cnt_s cn58xx;
-       struct cvmx_spxx_bckprs_cnt_s cn58xxp1;
-};
-
-union cvmx_spxx_bist_stat {
-       uint64_t u64;
-       struct cvmx_spxx_bist_stat_s {
-               uint64_t reserved_3_63:61;
-               uint64_t stat2:1;
-               uint64_t stat1:1;
-               uint64_t stat0:1;
-       } s;
-       struct cvmx_spxx_bist_stat_s cn38xx;
-       struct cvmx_spxx_bist_stat_s cn38xxp2;
-       struct cvmx_spxx_bist_stat_s cn58xx;
-       struct cvmx_spxx_bist_stat_s cn58xxp1;
-};
-
-union cvmx_spxx_clk_ctl {
-       uint64_t u64;
-       struct cvmx_spxx_clk_ctl_s {
-               uint64_t reserved_17_63:47;
-               uint64_t seetrn:1;
-               uint64_t reserved_12_15:4;
-               uint64_t clkdly:5;
-               uint64_t runbist:1;
-               uint64_t statdrv:1;
-               uint64_t statrcv:1;
-               uint64_t sndtrn:1;
-               uint64_t drptrn:1;
-               uint64_t rcvtrn:1;
-               uint64_t srxdlck:1;
-       } s;
-       struct cvmx_spxx_clk_ctl_s cn38xx;
-       struct cvmx_spxx_clk_ctl_s cn38xxp2;
-       struct cvmx_spxx_clk_ctl_s cn58xx;
-       struct cvmx_spxx_clk_ctl_s cn58xxp1;
-};
-
-union cvmx_spxx_clk_stat {
-       uint64_t u64;
-       struct cvmx_spxx_clk_stat_s {
-               uint64_t reserved_11_63:53;
-               uint64_t stxcal:1;
-               uint64_t reserved_9_9:1;
-               uint64_t srxtrn:1;
-               uint64_t s4clk1:1;
-               uint64_t s4clk0:1;
-               uint64_t d4clk1:1;
-               uint64_t d4clk0:1;
-               uint64_t reserved_0_3:4;
-       } s;
-       struct cvmx_spxx_clk_stat_s cn38xx;
-       struct cvmx_spxx_clk_stat_s cn38xxp2;
-       struct cvmx_spxx_clk_stat_s cn58xx;
-       struct cvmx_spxx_clk_stat_s cn58xxp1;
-};
-
-union cvmx_spxx_dbg_deskew_ctl {
-       uint64_t u64;
-       struct cvmx_spxx_dbg_deskew_ctl_s {
-               uint64_t reserved_30_63:34;
-               uint64_t fallnop:1;
-               uint64_t fall8:1;
-               uint64_t reserved_26_27:2;
-               uint64_t sstep_go:1;
-               uint64_t sstep:1;
-               uint64_t reserved_22_23:2;
-               uint64_t clrdly:1;
-               uint64_t dec:1;
-               uint64_t inc:1;
-               uint64_t mux:1;
-               uint64_t offset:5;
-               uint64_t bitsel:5;
-               uint64_t offdly:6;
-               uint64_t dllfrc:1;
-               uint64_t dlldis:1;
-       } s;
-       struct cvmx_spxx_dbg_deskew_ctl_s cn38xx;
-       struct cvmx_spxx_dbg_deskew_ctl_s cn38xxp2;
-       struct cvmx_spxx_dbg_deskew_ctl_s cn58xx;
-       struct cvmx_spxx_dbg_deskew_ctl_s cn58xxp1;
-};
-
-union cvmx_spxx_dbg_deskew_state {
-       uint64_t u64;
-       struct cvmx_spxx_dbg_deskew_state_s {
-               uint64_t reserved_9_63:55;
-               uint64_t testres:1;
-               uint64_t unxterm:1;
-               uint64_t muxsel:2;
-               uint64_t offset:5;
-       } s;
-       struct cvmx_spxx_dbg_deskew_state_s cn38xx;
-       struct cvmx_spxx_dbg_deskew_state_s cn38xxp2;
-       struct cvmx_spxx_dbg_deskew_state_s cn58xx;
-       struct cvmx_spxx_dbg_deskew_state_s cn58xxp1;
-};
-
-union cvmx_spxx_drv_ctl {
-       uint64_t u64;
-       struct cvmx_spxx_drv_ctl_s {
-               uint64_t reserved_0_63:64;
-       } s;
-       struct cvmx_spxx_drv_ctl_cn38xx {
-               uint64_t reserved_16_63:48;
-               uint64_t stx4ncmp:4;
-               uint64_t stx4pcmp:4;
-               uint64_t srx4cmp:8;
-       } cn38xx;
-       struct cvmx_spxx_drv_ctl_cn38xx cn38xxp2;
-       struct cvmx_spxx_drv_ctl_cn58xx {
-               uint64_t reserved_24_63:40;
-               uint64_t stx4ncmp:4;
-               uint64_t stx4pcmp:4;
-               uint64_t reserved_10_15:6;
-               uint64_t srx4cmp:10;
-       } cn58xx;
-       struct cvmx_spxx_drv_ctl_cn58xx cn58xxp1;
-};
-
-union cvmx_spxx_err_ctl {
-       uint64_t u64;
-       struct cvmx_spxx_err_ctl_s {
-               uint64_t reserved_9_63:55;
-               uint64_t prtnxa:1;
-               uint64_t dipcls:1;
-               uint64_t dippay:1;
-               uint64_t reserved_4_5:2;
-               uint64_t errcnt:4;
-       } s;
-       struct cvmx_spxx_err_ctl_s cn38xx;
-       struct cvmx_spxx_err_ctl_s cn38xxp2;
-       struct cvmx_spxx_err_ctl_s cn58xx;
-       struct cvmx_spxx_err_ctl_s cn58xxp1;
-};
-
-union cvmx_spxx_int_dat {
-       uint64_t u64;
-       struct cvmx_spxx_int_dat_s {
-               uint64_t reserved_32_63:32;
-               uint64_t mul:1;
-               uint64_t reserved_14_30:17;
-               uint64_t calbnk:2;
-               uint64_t rsvop:4;
-               uint64_t prt:8;
-       } s;
-       struct cvmx_spxx_int_dat_s cn38xx;
-       struct cvmx_spxx_int_dat_s cn38xxp2;
-       struct cvmx_spxx_int_dat_s cn58xx;
-       struct cvmx_spxx_int_dat_s cn58xxp1;
-};
-
-union cvmx_spxx_int_msk {
-       uint64_t u64;
-       struct cvmx_spxx_int_msk_s {
-               uint64_t reserved_12_63:52;
-               uint64_t calerr:1;
-               uint64_t syncerr:1;
-               uint64_t diperr:1;
-               uint64_t tpaovr:1;
-               uint64_t rsverr:1;
-               uint64_t drwnng:1;
-               uint64_t clserr:1;
-               uint64_t spiovr:1;
-               uint64_t reserved_2_3:2;
-               uint64_t abnorm:1;
-               uint64_t prtnxa:1;
-       } s;
-       struct cvmx_spxx_int_msk_s cn38xx;
-       struct cvmx_spxx_int_msk_s cn38xxp2;
-       struct cvmx_spxx_int_msk_s cn58xx;
-       struct cvmx_spxx_int_msk_s cn58xxp1;
-};
-
-union cvmx_spxx_int_reg {
-       uint64_t u64;
-       struct cvmx_spxx_int_reg_s {
-               uint64_t reserved_32_63:32;
-               uint64_t spf:1;
-               uint64_t reserved_12_30:19;
-               uint64_t calerr:1;
-               uint64_t syncerr:1;
-               uint64_t diperr:1;
-               uint64_t tpaovr:1;
-               uint64_t rsverr:1;
-               uint64_t drwnng:1;
-               uint64_t clserr:1;
-               uint64_t spiovr:1;
-               uint64_t reserved_2_3:2;
-               uint64_t abnorm:1;
-               uint64_t prtnxa:1;
-       } s;
-       struct cvmx_spxx_int_reg_s cn38xx;
-       struct cvmx_spxx_int_reg_s cn38xxp2;
-       struct cvmx_spxx_int_reg_s cn58xx;
-       struct cvmx_spxx_int_reg_s cn58xxp1;
-};
-
-union cvmx_spxx_int_sync {
-       uint64_t u64;
-       struct cvmx_spxx_int_sync_s {
-               uint64_t reserved_12_63:52;
-               uint64_t calerr:1;
-               uint64_t syncerr:1;
-               uint64_t diperr:1;
-               uint64_t tpaovr:1;
-               uint64_t rsverr:1;
-               uint64_t drwnng:1;
-               uint64_t clserr:1;
-               uint64_t spiovr:1;
-               uint64_t reserved_2_3:2;
-               uint64_t abnorm:1;
-               uint64_t prtnxa:1;
-       } s;
-       struct cvmx_spxx_int_sync_s cn38xx;
-       struct cvmx_spxx_int_sync_s cn38xxp2;
-       struct cvmx_spxx_int_sync_s cn58xx;
-       struct cvmx_spxx_int_sync_s cn58xxp1;
-};
-
-union cvmx_spxx_tpa_acc {
-       uint64_t u64;
-       struct cvmx_spxx_tpa_acc_s {
-               uint64_t reserved_32_63:32;
-               uint64_t cnt:32;
-       } s;
-       struct cvmx_spxx_tpa_acc_s cn38xx;
-       struct cvmx_spxx_tpa_acc_s cn38xxp2;
-       struct cvmx_spxx_tpa_acc_s cn58xx;
-       struct cvmx_spxx_tpa_acc_s cn58xxp1;
-};
-
-union cvmx_spxx_tpa_max {
-       uint64_t u64;
-       struct cvmx_spxx_tpa_max_s {
-               uint64_t reserved_32_63:32;
-               uint64_t max:32;
-       } s;
-       struct cvmx_spxx_tpa_max_s cn38xx;
-       struct cvmx_spxx_tpa_max_s cn38xxp2;
-       struct cvmx_spxx_tpa_max_s cn58xx;
-       struct cvmx_spxx_tpa_max_s cn58xxp1;
-};
-
-union cvmx_spxx_tpa_sel {
-       uint64_t u64;
-       struct cvmx_spxx_tpa_sel_s {
-               uint64_t reserved_4_63:60;
-               uint64_t prtsel:4;
-       } s;
-       struct cvmx_spxx_tpa_sel_s cn38xx;
-       struct cvmx_spxx_tpa_sel_s cn38xxp2;
-       struct cvmx_spxx_tpa_sel_s cn58xx;
-       struct cvmx_spxx_tpa_sel_s cn58xxp1;
-};
-
-union cvmx_spxx_trn4_ctl {
-       uint64_t u64;
-       struct cvmx_spxx_trn4_ctl_s {
-               uint64_t reserved_13_63:51;
-               uint64_t trntest:1;
-               uint64_t jitter:3;
-               uint64_t clr_boot:1;
-               uint64_t set_boot:1;
-               uint64_t maxdist:5;
-               uint64_t macro_en:1;
-               uint64_t mux_en:1;
-       } s;
-       struct cvmx_spxx_trn4_ctl_s cn38xx;
-       struct cvmx_spxx_trn4_ctl_s cn38xxp2;
-       struct cvmx_spxx_trn4_ctl_s cn58xx;
-       struct cvmx_spxx_trn4_ctl_s cn58xxp1;
-};
-
-#endif
diff --git a/drivers/staging/octeon/cvmx-srxx-defs.h b/drivers/staging/octeon/cvmx-srxx-defs.h
deleted file mode 100644 (file)
index d82b366..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-#ifndef __CVMX_SRXX_DEFS_H__
-#define __CVMX_SRXX_DEFS_H__
-
-#define CVMX_SRXX_COM_CTL(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000200ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_SRXX_IGN_RX_FULL(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000218ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_SRXX_SPI4_CALX(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000000ull + (((offset) & 31) * 8) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_SRXX_SPI4_STAT(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000208ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_SRXX_SW_TICK_CTL(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000220ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_SRXX_SW_TICK_DAT(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000228ull + (((block_id) & 1) * 0x8000000ull))
-
-union cvmx_srxx_com_ctl {
-       uint64_t u64;
-       struct cvmx_srxx_com_ctl_s {
-               uint64_t reserved_8_63:56;
-               uint64_t prts:4;
-               uint64_t st_en:1;
-               uint64_t reserved_1_2:2;
-               uint64_t inf_en:1;
-       } s;
-       struct cvmx_srxx_com_ctl_s cn38xx;
-       struct cvmx_srxx_com_ctl_s cn38xxp2;
-       struct cvmx_srxx_com_ctl_s cn58xx;
-       struct cvmx_srxx_com_ctl_s cn58xxp1;
-};
-
-union cvmx_srxx_ign_rx_full {
-       uint64_t u64;
-       struct cvmx_srxx_ign_rx_full_s {
-               uint64_t reserved_16_63:48;
-               uint64_t ignore:16;
-       } s;
-       struct cvmx_srxx_ign_rx_full_s cn38xx;
-       struct cvmx_srxx_ign_rx_full_s cn38xxp2;
-       struct cvmx_srxx_ign_rx_full_s cn58xx;
-       struct cvmx_srxx_ign_rx_full_s cn58xxp1;
-};
-
-union cvmx_srxx_spi4_calx {
-       uint64_t u64;
-       struct cvmx_srxx_spi4_calx_s {
-               uint64_t reserved_17_63:47;
-               uint64_t oddpar:1;
-               uint64_t prt3:4;
-               uint64_t prt2:4;
-               uint64_t prt1:4;
-               uint64_t prt0:4;
-       } s;
-       struct cvmx_srxx_spi4_calx_s cn38xx;
-       struct cvmx_srxx_spi4_calx_s cn38xxp2;
-       struct cvmx_srxx_spi4_calx_s cn58xx;
-       struct cvmx_srxx_spi4_calx_s cn58xxp1;
-};
-
-union cvmx_srxx_spi4_stat {
-       uint64_t u64;
-       struct cvmx_srxx_spi4_stat_s {
-               uint64_t reserved_16_63:48;
-               uint64_t m:8;
-               uint64_t reserved_7_7:1;
-               uint64_t len:7;
-       } s;
-       struct cvmx_srxx_spi4_stat_s cn38xx;
-       struct cvmx_srxx_spi4_stat_s cn38xxp2;
-       struct cvmx_srxx_spi4_stat_s cn58xx;
-       struct cvmx_srxx_spi4_stat_s cn58xxp1;
-};
-
-union cvmx_srxx_sw_tick_ctl {
-       uint64_t u64;
-       struct cvmx_srxx_sw_tick_ctl_s {
-               uint64_t reserved_14_63:50;
-               uint64_t eop:1;
-               uint64_t sop:1;
-               uint64_t mod:4;
-               uint64_t opc:4;
-               uint64_t adr:4;
-       } s;
-       struct cvmx_srxx_sw_tick_ctl_s cn38xx;
-       struct cvmx_srxx_sw_tick_ctl_s cn58xx;
-       struct cvmx_srxx_sw_tick_ctl_s cn58xxp1;
-};
-
-union cvmx_srxx_sw_tick_dat {
-       uint64_t u64;
-       struct cvmx_srxx_sw_tick_dat_s {
-               uint64_t dat:64;
-       } s;
-       struct cvmx_srxx_sw_tick_dat_s cn38xx;
-       struct cvmx_srxx_sw_tick_dat_s cn58xx;
-       struct cvmx_srxx_sw_tick_dat_s cn58xxp1;
-};
-
-#endif
diff --git a/drivers/staging/octeon/cvmx-stxx-defs.h b/drivers/staging/octeon/cvmx-stxx-defs.h
deleted file mode 100644 (file)
index 4f209b6..0000000
+++ /dev/null
@@ -1,292 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-#ifndef __CVMX_STXX_DEFS_H__
-#define __CVMX_STXX_DEFS_H__
-
-#define CVMX_STXX_ARB_CTL(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000608ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_STXX_BCKPRS_CNT(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000688ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_STXX_COM_CTL(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000600ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_STXX_DIP_CNT(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000690ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_STXX_IGN_CAL(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000610ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_STXX_INT_MSK(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800900006A0ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_STXX_INT_REG(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000698ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_STXX_INT_SYNC(block_id) \
-        CVMX_ADD_IO_SEG(0x00011800900006A8ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_STXX_MIN_BST(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000618ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_STXX_SPI4_CALX(offset, block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000400ull + (((offset) & 31) * 8) + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_STXX_SPI4_DAT(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000628ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_STXX_SPI4_STAT(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000630ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_STXX_STAT_BYTES_HI(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000648ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_STXX_STAT_BYTES_LO(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000680ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_STXX_STAT_CTL(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000638ull + (((block_id) & 1) * 0x8000000ull))
-#define CVMX_STXX_STAT_PKT_XMT(block_id) \
-        CVMX_ADD_IO_SEG(0x0001180090000640ull + (((block_id) & 1) * 0x8000000ull))
-
-union cvmx_stxx_arb_ctl {
-       uint64_t u64;
-       struct cvmx_stxx_arb_ctl_s {
-               uint64_t reserved_6_63:58;
-               uint64_t mintrn:1;
-               uint64_t reserved_4_4:1;
-               uint64_t igntpa:1;
-               uint64_t reserved_0_2:3;
-       } s;
-       struct cvmx_stxx_arb_ctl_s cn38xx;
-       struct cvmx_stxx_arb_ctl_s cn38xxp2;
-       struct cvmx_stxx_arb_ctl_s cn58xx;
-       struct cvmx_stxx_arb_ctl_s cn58xxp1;
-};
-
-union cvmx_stxx_bckprs_cnt {
-       uint64_t u64;
-       struct cvmx_stxx_bckprs_cnt_s {
-               uint64_t reserved_32_63:32;
-               uint64_t cnt:32;
-       } s;
-       struct cvmx_stxx_bckprs_cnt_s cn38xx;
-       struct cvmx_stxx_bckprs_cnt_s cn38xxp2;
-       struct cvmx_stxx_bckprs_cnt_s cn58xx;
-       struct cvmx_stxx_bckprs_cnt_s cn58xxp1;
-};
-
-union cvmx_stxx_com_ctl {
-       uint64_t u64;
-       struct cvmx_stxx_com_ctl_s {
-               uint64_t reserved_4_63:60;
-               uint64_t st_en:1;
-               uint64_t reserved_1_2:2;
-               uint64_t inf_en:1;
-       } s;
-       struct cvmx_stxx_com_ctl_s cn38xx;
-       struct cvmx_stxx_com_ctl_s cn38xxp2;
-       struct cvmx_stxx_com_ctl_s cn58xx;
-       struct cvmx_stxx_com_ctl_s cn58xxp1;
-};
-
-union cvmx_stxx_dip_cnt {
-       uint64_t u64;
-       struct cvmx_stxx_dip_cnt_s {
-               uint64_t reserved_8_63:56;
-               uint64_t frmmax:4;
-               uint64_t dipmax:4;
-       } s;
-       struct cvmx_stxx_dip_cnt_s cn38xx;
-       struct cvmx_stxx_dip_cnt_s cn38xxp2;
-       struct cvmx_stxx_dip_cnt_s cn58xx;
-       struct cvmx_stxx_dip_cnt_s cn58xxp1;
-};
-
-union cvmx_stxx_ign_cal {
-       uint64_t u64;
-       struct cvmx_stxx_ign_cal_s {
-               uint64_t reserved_16_63:48;
-               uint64_t igntpa:16;
-       } s;
-       struct cvmx_stxx_ign_cal_s cn38xx;
-       struct cvmx_stxx_ign_cal_s cn38xxp2;
-       struct cvmx_stxx_ign_cal_s cn58xx;
-       struct cvmx_stxx_ign_cal_s cn58xxp1;
-};
-
-union cvmx_stxx_int_msk {
-       uint64_t u64;
-       struct cvmx_stxx_int_msk_s {
-               uint64_t reserved_8_63:56;
-               uint64_t frmerr:1;
-               uint64_t unxfrm:1;
-               uint64_t nosync:1;
-               uint64_t diperr:1;
-               uint64_t datovr:1;
-               uint64_t ovrbst:1;
-               uint64_t calpar1:1;
-               uint64_t calpar0:1;
-       } s;
-       struct cvmx_stxx_int_msk_s cn38xx;
-       struct cvmx_stxx_int_msk_s cn38xxp2;
-       struct cvmx_stxx_int_msk_s cn58xx;
-       struct cvmx_stxx_int_msk_s cn58xxp1;
-};
-
-union cvmx_stxx_int_reg {
-       uint64_t u64;
-       struct cvmx_stxx_int_reg_s {
-               uint64_t reserved_9_63:55;
-               uint64_t syncerr:1;
-               uint64_t frmerr:1;
-               uint64_t unxfrm:1;
-               uint64_t nosync:1;
-               uint64_t diperr:1;
-               uint64_t datovr:1;
-               uint64_t ovrbst:1;
-               uint64_t calpar1:1;
-               uint64_t calpar0:1;
-       } s;
-       struct cvmx_stxx_int_reg_s cn38xx;
-       struct cvmx_stxx_int_reg_s cn38xxp2;
-       struct cvmx_stxx_int_reg_s cn58xx;
-       struct cvmx_stxx_int_reg_s cn58xxp1;
-};
-
-union cvmx_stxx_int_sync {
-       uint64_t u64;
-       struct cvmx_stxx_int_sync_s {
-               uint64_t reserved_8_63:56;
-               uint64_t frmerr:1;
-               uint64_t unxfrm:1;
-               uint64_t nosync:1;
-               uint64_t diperr:1;
-               uint64_t datovr:1;
-               uint64_t ovrbst:1;
-               uint64_t calpar1:1;
-               uint64_t calpar0:1;
-       } s;
-       struct cvmx_stxx_int_sync_s cn38xx;
-       struct cvmx_stxx_int_sync_s cn38xxp2;
-       struct cvmx_stxx_int_sync_s cn58xx;
-       struct cvmx_stxx_int_sync_s cn58xxp1;
-};
-
-union cvmx_stxx_min_bst {
-       uint64_t u64;
-       struct cvmx_stxx_min_bst_s {
-               uint64_t reserved_9_63:55;
-               uint64_t minb:9;
-       } s;
-       struct cvmx_stxx_min_bst_s cn38xx;
-       struct cvmx_stxx_min_bst_s cn38xxp2;
-       struct cvmx_stxx_min_bst_s cn58xx;
-       struct cvmx_stxx_min_bst_s cn58xxp1;
-};
-
-union cvmx_stxx_spi4_calx {
-       uint64_t u64;
-       struct cvmx_stxx_spi4_calx_s {
-               uint64_t reserved_17_63:47;
-               uint64_t oddpar:1;
-               uint64_t prt3:4;
-               uint64_t prt2:4;
-               uint64_t prt1:4;
-               uint64_t prt0:4;
-       } s;
-       struct cvmx_stxx_spi4_calx_s cn38xx;
-       struct cvmx_stxx_spi4_calx_s cn38xxp2;
-       struct cvmx_stxx_spi4_calx_s cn58xx;
-       struct cvmx_stxx_spi4_calx_s cn58xxp1;
-};
-
-union cvmx_stxx_spi4_dat {
-       uint64_t u64;
-       struct cvmx_stxx_spi4_dat_s {
-               uint64_t reserved_32_63:32;
-               uint64_t alpha:16;
-               uint64_t max_t:16;
-       } s;
-       struct cvmx_stxx_spi4_dat_s cn38xx;
-       struct cvmx_stxx_spi4_dat_s cn38xxp2;
-       struct cvmx_stxx_spi4_dat_s cn58xx;
-       struct cvmx_stxx_spi4_dat_s cn58xxp1;
-};
-
-union cvmx_stxx_spi4_stat {
-       uint64_t u64;
-       struct cvmx_stxx_spi4_stat_s {
-               uint64_t reserved_16_63:48;
-               uint64_t m:8;
-               uint64_t reserved_7_7:1;
-               uint64_t len:7;
-       } s;
-       struct cvmx_stxx_spi4_stat_s cn38xx;
-       struct cvmx_stxx_spi4_stat_s cn38xxp2;
-       struct cvmx_stxx_spi4_stat_s cn58xx;
-       struct cvmx_stxx_spi4_stat_s cn58xxp1;
-};
-
-union cvmx_stxx_stat_bytes_hi {
-       uint64_t u64;
-       struct cvmx_stxx_stat_bytes_hi_s {
-               uint64_t reserved_32_63:32;
-               uint64_t cnt:32;
-       } s;
-       struct cvmx_stxx_stat_bytes_hi_s cn38xx;
-       struct cvmx_stxx_stat_bytes_hi_s cn38xxp2;
-       struct cvmx_stxx_stat_bytes_hi_s cn58xx;
-       struct cvmx_stxx_stat_bytes_hi_s cn58xxp1;
-};
-
-union cvmx_stxx_stat_bytes_lo {
-       uint64_t u64;
-       struct cvmx_stxx_stat_bytes_lo_s {
-               uint64_t reserved_32_63:32;
-               uint64_t cnt:32;
-       } s;
-       struct cvmx_stxx_stat_bytes_lo_s cn38xx;
-       struct cvmx_stxx_stat_bytes_lo_s cn38xxp2;
-       struct cvmx_stxx_stat_bytes_lo_s cn58xx;
-       struct cvmx_stxx_stat_bytes_lo_s cn58xxp1;
-};
-
-union cvmx_stxx_stat_ctl {
-       uint64_t u64;
-       struct cvmx_stxx_stat_ctl_s {
-               uint64_t reserved_5_63:59;
-               uint64_t clr:1;
-               uint64_t bckprs:4;
-       } s;
-       struct cvmx_stxx_stat_ctl_s cn38xx;
-       struct cvmx_stxx_stat_ctl_s cn38xxp2;
-       struct cvmx_stxx_stat_ctl_s cn58xx;
-       struct cvmx_stxx_stat_ctl_s cn58xxp1;
-};
-
-union cvmx_stxx_stat_pkt_xmt {
-       uint64_t u64;
-       struct cvmx_stxx_stat_pkt_xmt_s {
-               uint64_t reserved_32_63:32;
-               uint64_t cnt:32;
-       } s;
-       struct cvmx_stxx_stat_pkt_xmt_s cn38xx;
-       struct cvmx_stxx_stat_pkt_xmt_s cn38xxp2;
-       struct cvmx_stxx_stat_pkt_xmt_s cn58xx;
-       struct cvmx_stxx_stat_pkt_xmt_s cn58xxp1;
-};
-
-#endif
diff --git a/drivers/staging/octeon/cvmx-wqe.h b/drivers/staging/octeon/cvmx-wqe.h
deleted file mode 100644 (file)
index 6536109..0000000
+++ /dev/null
@@ -1,397 +0,0 @@
-/***********************license start***************
- * Author: Cavium Networks
- *
- * Contact: support@caviumnetworks.com
- * This file is part of the OCTEON SDK
- *
- * Copyright (c) 2003-2008 Cavium Networks
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, Version 2, as
- * published by the Free Software Foundation.
- *
- * This file is distributed in the hope that it will be useful, but
- * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
- * NONINFRINGEMENT.  See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- * or visit http://www.gnu.org/licenses/.
- *
- * This file may also be available under a different license from Cavium.
- * Contact Cavium Networks for more information
- ***********************license end**************************************/
-
-/**
- *
- * 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"
-
-
-#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")))
-
-/**
- * HW decode / err_code in work queue entry
- */
-typedef union {
-       uint64_t u64;
-
-       /* Use this struct if the hardware determines that the packet is IP */
-       struct {
-               /* HW sets this to the number of buffers used by this packet */
-               uint64_t bufs:8;
-               /* HW sets to the number of L2 bytes prior to the IP */
-               uint64_t ip_offset:8;
-               /* set to 1 if we found DSA/VLAN in the L2 */
-               uint64_t vlan_valid:1;
-               /* Set to 1 if the DSA/VLAN tag is stacked */
-               uint64_t vlan_stacked:1;
-               uint64_t unassigned:1;
-               /* HW sets to the DSA/VLAN CFI flag (valid when vlan_valid) */
-               uint64_t vlan_cfi:1;
-               /* HW sets to the DSA/VLAN_ID field (valid when vlan_valid) */
-               uint64_t vlan_id:12;
-               /* Ring Identifier (if PCIe). Requires PIP_GBL_CTL[RING_EN]=1 */
-               uint64_t pr:4;
-               uint64_t unassigned2:8;
-               /* the packet needs to be decompressed */
-               uint64_t dec_ipcomp:1;
-               /* the packet is either TCP or UDP */
-               uint64_t tcp_or_udp:1;
-               /* the packet needs to be decrypted (ESP or AH) */
-               uint64_t dec_ipsec:1;
-               /* the packet is IPv6 */
-               uint64_t is_v6:1;
-
-               /*
-                * (rcv_error, not_IP, IP_exc, is_frag, L4_error,
-                * software, etc.).
-                */
-
-               /*
-                * reserved for software use, hardware will clear on
-                * packet creation.
-                */
-               uint64_t software:1;
-               /* exceptional conditions below */
-               /* the receive interface hardware detected an L4 error
-                * (only applies if !is_frag) (only applies if
-                * !rcv_error && !not_IP && !IP_exc && !is_frag)
-                * failure indicated in err_code below, decode:
-                *
-                * - 1 = Malformed L4
-                * - 2 = L4 Checksum Error: the L4 checksum value is
-                * - 3 = UDP Length Error: The UDP length field would
-                *       make the UDP data longer than what remains in
-                *       the IP packet (as defined by the IP header
-                *       length field).
-                * - 4 = Bad L4 Port: either the source or destination
-                *       TCP/UDP port is 0.
-                * - 8 = TCP FIN Only: the packet is TCP and only the
-                *       FIN flag set.
-                * - 9 = TCP No Flags: the packet is TCP and no flags
-                *       are set.
-                * - 10 = TCP FIN RST: the packet is TCP and both FIN
-                *        and RST are set.
-                * - 11 = TCP SYN URG: the packet is TCP and both SYN
-                *        and URG are set.
-                * - 12 = TCP SYN RST: the packet is TCP and both SYN
-                *        and RST are set.
-                * - 13 = TCP SYN FIN: the packet is TCP and both SYN
-                *        and FIN are set.
-                */
-               uint64_t L4_error:1;
-               /* set if the packet is a fragment */
-               uint64_t is_frag:1;
-               /* the receive interface hardware detected an IP error
-                * / exception (only applies if !rcv_error && !not_IP)
-                * failure indicated in err_code below, decode:
-                *
-                * - 1 = Not IP: the IP version field is neither 4 nor
-                *       6.
-                * - 2 = IPv4 Header Checksum Error: the IPv4 header
-                *       has a checksum violation.
-                * - 3 = IP Malformed Header: the packet is not long
-                *       enough to contain the IP header.
-                * - 4 = IP Malformed: the packet is not long enough
-                *       to contain the bytes indicated by the IP
-                *       header. Pad is allowed.
-                * - 5 = IP TTL Hop: the IPv4 TTL field or the IPv6
-                *       Hop Count field are zero.
-                * - 6 = IP Options
-                */
-               uint64_t IP_exc:1;
-               /*
-                * Set if the hardware determined that the packet is a
-                * broadcast.
-                */
-               uint64_t is_bcast:1;
-               /*
-                * St if the hardware determined that the packet is a
-                * multi-cast.
-                */
-               uint64_t is_mcast:1;
-               /*
-                * Set if the packet may not be IP (must be zero in
-                * this case).
-                */
-               uint64_t not_IP:1;
-               /*
-                * The receive interface hardware detected a receive
-                * error (must be zero in this case).
-                */
-               uint64_t rcv_error:1;
-               /* lower err_code = first-level descriptor of the
-                * work */
-               /* zero for packet submitted by hardware that isn't on
-                * the slow path */
-               /* type is cvmx_pip_err_t */
-               uint64_t err_code:8;
-       } s;
-
-       /* use this to get at the 16 vlan bits */
-       struct {
-               uint64_t unused1:16;
-               uint64_t vlan:16;
-               uint64_t unused2:32;
-       } svlan;
-
-       /*
-        * use this struct if the hardware could not determine that
-        * the packet is ip.
-        */
-       struct {
-               /*
-                * HW sets this to the number of buffers used by this
-                * packet.
-                */
-               uint64_t bufs:8;
-               uint64_t unused:8;
-               /* set to 1 if we found DSA/VLAN in the L2 */
-               uint64_t vlan_valid:1;
-               /* Set to 1 if the DSA/VLAN tag is stacked */
-               uint64_t vlan_stacked:1;
-               uint64_t unassigned:1;
-               /*
-                * HW sets to the DSA/VLAN CFI flag (valid when
-                * vlan_valid)
-                */
-               uint64_t vlan_cfi:1;
-               /*
-                * HW sets to the DSA/VLAN_ID field (valid when
-                * vlan_valid).
-                */
-               uint64_t vlan_id:12;
-               /*
-                * Ring Identifier (if PCIe). Requires
-                * PIP_GBL_CTL[RING_EN]=1
-                */
-               uint64_t pr:4;
-               uint64_t unassigned2:12;
-               /*
-                * reserved for software use, hardware will clear on
-                * packet creation.
-                */
-               uint64_t software:1;
-               uint64_t unassigned3:1;
-               /*
-                * set if the hardware determined that the packet is
-                * rarp.
-                */
-               uint64_t is_rarp:1;
-               /*
-                * set if the hardware determined that the packet is
-                * arp
-                */
-               uint64_t is_arp:1;
-               /*
-                * set if the hardware determined that the packet is a
-                * broadcast.
-                */
-               uint64_t is_bcast:1;
-               /*
-                * set if the hardware determined that the packet is a
-                * multi-cast
-                */
-               uint64_t is_mcast:1;
-               /*
-                * set if the packet may not be IP (must be one in
-                * this case)
-                */
-               uint64_t not_IP:1;
-               /* The receive interface hardware detected a receive
-                * error.  Failure indicated in err_code below,
-                * decode:
-                *
-                * - 1 = partial error: a packet was partially
-                *       received, but internal buffering / bandwidth
-                *       was not adequate to receive the entire
-                *       packet.
-                * - 2 = jabber error: the RGMII packet was too large
-                *       and is truncated.
-                * - 3 = overrun error: the RGMII packet is longer
-                *       than allowed and had an FCS error.
-                * - 4 = oversize error: the RGMII packet is longer
-                *       than allowed.
-                * - 5 = alignment error: the RGMII packet is not an
-                *       integer number of bytes
-                *       and had an FCS error (100M and 10M only).
-                * - 6 = fragment error: the RGMII packet is shorter
-                *       than allowed and had an FCS error.
-                * - 7 = GMX FCS error: the RGMII packet had an FCS
-                *       error.
-                * - 8 = undersize error: the RGMII packet is shorter
-                *       than allowed.
-                * - 9 = extend error: the RGMII packet had an extend
-                *       error.
-                * - 10 = length mismatch error: the RGMII packet had
-                *        a length that did not match the length field
-                *        in the L2 HDR.
-                * - 11 = RGMII RX error/SPI4 DIP4 Error: the RGMII
-                *        packet had one or more data reception errors
-                *        (RXERR) or the SPI4 packet had one or more
-                *        DIP4 errors.
-                * - 12 = RGMII skip error/SPI4 Abort Error: the RGMII
-                *        packet was not large enough to cover the
-                *        skipped bytes or the SPI4 packet was
-                *        terminated with an About EOPS.
-                * - 13 = RGMII nibble error/SPI4 Port NXA Error: the
-                *        RGMII packet had a studder error (data not
-                *        repeated - 10/100M only) or the SPI4 packet
-                *        was sent to an NXA.
-                * - 16 = FCS error: a SPI4.2 packet had an FCS error.
-                * - 17 = Skip error: a packet was not large enough to
-                *        cover the skipped bytes.
-                * - 18 = L2 header malformed: the packet is not long
-                *        enough to contain the L2.
-                */
-
-               uint64_t rcv_error:1;
-               /*
-                * lower err_code = first-level descriptor of the
-                * work
-                */
-               /*
-                * zero for packet submitted by hardware that isn't on
-                * the slow path
-                */
-               /* type is cvmx_pip_err_t (union, so can't use directly */
-               uint64_t err_code:8;
-       } snoip;
-
-} cvmx_pip_wqe_word2;
-
-/**
- * Work queue entry format
- *
- * must be 8-byte aligned
- */
-typedef struct {
-
-    /*****************************************************************
-     * WORD 0
-     *  HW WRITE: the following 64 bits are filled by HW when a packet arrives
-     */
-
-    /**
-     * raw chksum result generated by the HW
-     */
-       uint16_t hw_chksum;
-    /**
-     * Field unused by hardware - available for software
-     */
-       uint8_t unused;
-    /**
-     * Next pointer used by hardware for list maintenance.
-     * May be written/read by HW before the work queue
-     *           entry is scheduled to a PP
-     * (Only 36 bits used in Octeon 1)
-     */
-       uint64_t next_ptr:40;
-
-    /*****************************************************************
-     * WORD 1
-     *  HW WRITE: the following 64 bits are filled by HW when a packet arrives
-     */
-
-    /**
-     * HW sets to the total number of bytes in the packet
-     */
-       uint64_t len:16;
-    /**
-     * HW sets this to input physical port
-     */
-       uint64_t ipprt:6;
-
-    /**
-     * HW sets this to what it thought the priority of the input packet was
-     */
-       uint64_t qos:3;
-
-    /**
-     * the group that the work queue entry will be scheduled to
-     */
-       uint64_t grp:4;
-    /**
-     * the type of the tag (ORDERED, ATOMIC, NULL)
-     */
-       uint64_t tag_type:3;
-    /**
-     * the synchronization/ordering tag
-     */
-       uint64_t tag:32;
-
-    /**
-     * 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 word2;
-
-    /**
-     * Pointer to the first segment of the packet.
-     */
-       union cvmx_buf_ptr 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.
-     */
-       uint8_t 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;
-
-#endif /* __CVMX_WQE_H__ */
index 6a2cd50a17dfe0e4f76747ea67d10f6285c597c2..bdaec8d2ca0c18f0562c76fb8fbaaa8e45d4aa2e 100644 (file)
@@ -59,7 +59,7 @@
 #ifndef __ETHERNET_DEFINES_H__
 #define __ETHERNET_DEFINES_H__
 
-#include "cvmx-config.h"
+#include <asm/octeon/cvmx-config.h>
 
 
 #define OCTEON_ETHERNET_VERSION "1.9"
index f18e3e140413c4a0a5b5a48197c5a1e08557c134..63800ba71d06534f4ff7ff8cc8bfa064738e96ee 100644 (file)
@@ -38,9 +38,9 @@
 #include "ethernet-mdio.h"
 #include "ethernet-util.h"
 
-#include "cvmx-helper-board.h"
+#include <asm/octeon/cvmx-helper-board.h>
 
-#include "cvmx-smix-defs.h"
+#include <asm/octeon/cvmx-smix-defs.h>
 
 static void cvm_oct_get_drvinfo(struct net_device *dev,
                                struct ethtool_drvinfo *info)
index 635bb86cdcff38297e7d9a2201f3b35544977c20..78b6cb7437695a2f36a3d04adcb338346596b37c 100644 (file)
@@ -32,7 +32,7 @@
 
 #include "ethernet-defines.h"
 
-#include "cvmx-fpa.h"
+#include <asm/octeon/cvmx-fpa.h>
 
 /**
  * cvm_oct_fill_hw_skbuff - fill the supplied hardware pool with skbuffs
index c3d73f8431ae88f3cc7604ac603aabd36ae26a29..d8f5f694ec35532055781ff48b6edd79f4e502cd 100644 (file)
 #include "octeon-ethernet.h"
 #include "ethernet-util.h"
 
-#include "cvmx-helper.h"
+#include <asm/octeon/cvmx-helper.h>
 
 #include <asm/octeon/cvmx-ipd-defs.h>
 #include <asm/octeon/cvmx-npi-defs.h>
-#include "cvmx-gmxx-defs.h"
+#include <asm/octeon/cvmx-gmxx-defs.h>
 
 DEFINE_SPINLOCK(global_register_lock);
 
index 8b307b428791915799f06298ce746b5ce002ecf5..400df8cbee538b55a50e7baa92ceb18cae9e28c5 100644 (file)
 #include "octeon-ethernet.h"
 #include "ethernet-util.h"
 
-#include "cvmx-helper.h"
-#include "cvmx-wqe.h"
-#include "cvmx-fau.h"
-#include "cvmx-pow.h"
-#include "cvmx-pip.h"
-#include "cvmx-scratch.h"
-
-#include "cvmx-gmxx-defs.h"
+#include <asm/octeon/cvmx-helper.h>
+#include <asm/octeon/cvmx-wqe.h>
+#include <asm/octeon/cvmx-fau.h>
+#include <asm/octeon/cvmx-pow.h>
+#include <asm/octeon/cvmx-pip.h>
+#include <asm/octeon/cvmx-scratch.h>
+
+#include <asm/octeon/cvmx-gmxx-defs.h>
 
 struct cvm_napi_wrapper {
        struct napi_struct napi;
index a0743b85d54e754aa05014645f2f1e55678da7e2..9240c85ce24178e5a6d7f0199ac503f0e32af8c1 100644 (file)
@@ -24,7 +24,7 @@
  * This file may also be available under a different license from Cavium.
  * Contact Cavium Networks for more information
 *********************************************************************/
-#include "cvmx-fau.h"
+#include <asm/octeon/cvmx-fau.h>
 
 void cvm_oct_poll_controller(struct net_device *dev);
 void cvm_oct_rx_initialize(void);
index 5e148b512c97590ece781be25c61801731a18696..d3e82430eba6e081f9b19348fb8363cec41c911b 100644 (file)
@@ -35,9 +35,9 @@
 #include "octeon-ethernet.h"
 #include "ethernet-util.h"
 
-#include "cvmx-helper.h"
+#include <asm/octeon/cvmx-helper.h>
 
-#include "cvmx-gmxx-defs.h"
+#include <asm/octeon/cvmx-gmxx-defs.h>
 
 int cvm_oct_sgmii_open(struct net_device *dev)
 {
index d0e2d514968a6f864f5fbda312a854e2a1cc414c..af8d62818f13b56e05ada09aedd9f64c4d1da1f0 100644 (file)
 #include "octeon-ethernet.h"
 #include "ethernet-util.h"
 
-#include "cvmx-spi.h"
+#include <asm/octeon/cvmx-spi.h>
 
 #include <asm/octeon/cvmx-npi-defs.h>
-#include "cvmx-spxx-defs.h"
-#include "cvmx-stxx-defs.h"
+#include <asm/octeon/cvmx-spxx-defs.h>
+#include <asm/octeon/cvmx-stxx-defs.h>
 
 static int number_spi_ports;
 static int need_retrain[2] = { 0, 0 };
index 2542c37439049e8e878f29600b8d08c7f6635cd3..56d74dc2fbd5b5f3b7122371554d51647b5effb9 100644 (file)
 #include "ethernet-tx.h"
 #include "ethernet-util.h"
 
-#include "cvmx-wqe.h"
-#include "cvmx-fau.h"
-#include "cvmx-pip.h"
-#include "cvmx-pko.h"
-#include "cvmx-helper.h"
+#include <asm/octeon/cvmx-wqe.h>
+#include <asm/octeon/cvmx-fau.h>
+#include <asm/octeon/cvmx-pip.h>
+#include <asm/octeon/cvmx-pko.h>
+#include <asm/octeon/cvmx-helper.h>
 
-#include "cvmx-gmxx-defs.h"
+#include <asm/octeon/cvmx-gmxx-defs.h>
 
 #define CVM_OCT_SKB_CB(skb)    ((u64 *)((skb)->cb))
 
index 861a4b3fe8576db59088fe0d4f8191a6c43f80b4..419f8c34ecdf1cbbba2a33431d827656867d64dd 100644 (file)
@@ -35,9 +35,9 @@
 #include "octeon-ethernet.h"
 #include "ethernet-util.h"
 
-#include "cvmx-helper.h"
+#include <asm/octeon/cvmx-helper.h>
 
-#include "cvmx-gmxx-defs.h"
+#include <asm/octeon/cvmx-gmxx-defs.h>
 
 int cvm_oct_xaui_open(struct net_device *dev)
 {
index 076f86675ce68878d61acae0271ff76f0c380186..9112cd8821540f692acfd5559183ad125459f73c 100644 (file)
 #include "ethernet-mdio.h"
 #include "ethernet-util.h"
 
-#include "cvmx-pip.h"
-#include "cvmx-pko.h"
-#include "cvmx-fau.h"
-#include "cvmx-ipd.h"
-#include "cvmx-helper.h"
-
-#include "cvmx-gmxx-defs.h"
-#include "cvmx-smix-defs.h"
+#include <asm/octeon/cvmx-pip.h>
+#include <asm/octeon/cvmx-pko.h>
+#include <asm/octeon/cvmx-fau.h>
+#include <asm/octeon/cvmx-ipd.h>
+#include <asm/octeon/cvmx-helper.h>
+
+#include <asm/octeon/cvmx-gmxx-defs.h>
+#include <asm/octeon/cvmx-smix-defs.h>
 
 #if defined(CONFIG_CAVIUM_OCTEON_NUM_PACKET_BUFFERS) \
        && CONFIG_CAVIUM_OCTEON_NUM_PACKET_BUFFERS
index 925a1e547a834f10942ab878357a0568254b6ae8..95a0f5fe7d4222495074c76efa23f882212b4d70 100644 (file)
@@ -1610,4 +1610,27 @@ config SERIAL_XILINX_PS_UART_CONSOLE
        help
          Enable a Xilinx PS UART port to be the system console.
 
+config SERIAL_AR933X
+       bool "AR933X serial port support"
+       depends on SOC_AR933X
+       select SERIAL_CORE
+       help
+         If you have an Atheros AR933X SOC based board and want to use the
+         built-in UART of the SoC, say Y to this option.
+
+config SERIAL_AR933X_CONSOLE
+       bool "Console on AR933X serial port"
+       depends on SERIAL_AR933X=y
+       select SERIAL_CORE_CONSOLE
+       help
+         Enable a built-in UART port of the AR933X to be the system console.
+
+config SERIAL_AR933X_NR_UARTS
+       int "Maximum number of AR933X serial ports"
+       depends on SERIAL_AR933X
+       default "2"
+       help
+         Set this to the number of serial ports you want the driver
+         to support.
+
 endmenu
index e10cf5b54b6dbc70109b29c447bbe5668048a0d2..76811cc58591d98fc830663371c2441e03a5c87a 100644 (file)
@@ -94,3 +94,4 @@ obj-$(CONFIG_SERIAL_MSM_SMD)  += msm_smd_tty.o
 obj-$(CONFIG_SERIAL_MXS_AUART) += mxs-auart.o
 obj-$(CONFIG_SERIAL_LANTIQ)    += lantiq.o
 obj-$(CONFIG_SERIAL_XILINX_PS_UART) += xilinx_uartps.o
+obj-$(CONFIG_SERIAL_AR933X)   += ar933x_uart.o
diff --git a/drivers/tty/serial/ar933x_uart.c b/drivers/tty/serial/ar933x_uart.c
new file mode 100644 (file)
index 0000000..e4f60e2
--- /dev/null
@@ -0,0 +1,688 @@
+/*
+ *  Atheros AR933X SoC built-in UART driver
+ *
+ *  Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org>
+ *
+ *  Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License version 2 as published
+ *  by the Free Software Foundation.
+ */
+
+#include <linux/module.h>
+#include <linux/ioport.h>
+#include <linux/init.h>
+#include <linux/console.h>
+#include <linux/sysrq.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+#include <linux/tty.h>
+#include <linux/tty_flip.h>
+#include <linux/serial_core.h>
+#include <linux/serial.h>
+#include <linux/slab.h>
+#include <linux/io.h>
+#include <linux/irq.h>
+
+#include <asm/mach-ath79/ar933x_uart.h>
+#include <asm/mach-ath79/ar933x_uart_platform.h>
+
+#define DRIVER_NAME "ar933x-uart"
+
+#define AR933X_DUMMY_STATUS_RD 0x01
+
+static struct uart_driver ar933x_uart_driver;
+
+struct ar933x_uart_port {
+       struct uart_port        port;
+       unsigned int            ier;    /* shadow Interrupt Enable Register */
+};
+
+static inline unsigned int ar933x_uart_read(struct ar933x_uart_port *up,
+                                           int offset)
+{
+       return readl(up->port.membase + offset);
+}
+
+static inline void ar933x_uart_write(struct ar933x_uart_port *up,
+                                    int offset, unsigned int value)
+{
+       writel(value, up->port.membase + offset);
+}
+
+static inline void ar933x_uart_rmw(struct ar933x_uart_port *up,
+                                 unsigned int offset,
+                                 unsigned int mask,
+                                 unsigned int val)
+{
+       unsigned int t;
+
+       t = ar933x_uart_read(up, offset);
+       t &= ~mask;
+       t |= val;
+       ar933x_uart_write(up, offset, t);
+}
+
+static inline void ar933x_uart_rmw_set(struct ar933x_uart_port *up,
+                                      unsigned int offset,
+                                      unsigned int val)
+{
+       ar933x_uart_rmw(up, offset, 0, val);
+}
+
+static inline void ar933x_uart_rmw_clear(struct ar933x_uart_port *up,
+                                        unsigned int offset,
+                                        unsigned int val)
+{
+       ar933x_uart_rmw(up, offset, val, 0);
+}
+
+static inline void ar933x_uart_start_tx_interrupt(struct ar933x_uart_port *up)
+{
+       up->ier |= AR933X_UART_INT_TX_EMPTY;
+       ar933x_uart_write(up, AR933X_UART_INT_EN_REG, up->ier);
+}
+
+static inline void ar933x_uart_stop_tx_interrupt(struct ar933x_uart_port *up)
+{
+       up->ier &= ~AR933X_UART_INT_TX_EMPTY;
+       ar933x_uart_write(up, AR933X_UART_INT_EN_REG, up->ier);
+}
+
+static inline void ar933x_uart_putc(struct ar933x_uart_port *up, int ch)
+{
+       unsigned int rdata;
+
+       rdata = ch & AR933X_UART_DATA_TX_RX_MASK;
+       rdata |= AR933X_UART_DATA_TX_CSR;
+       ar933x_uart_write(up, AR933X_UART_DATA_REG, rdata);
+}
+
+static unsigned int ar933x_uart_tx_empty(struct uart_port *port)
+{
+       struct ar933x_uart_port *up = (struct ar933x_uart_port *) port;
+       unsigned long flags;
+       unsigned int rdata;
+
+       spin_lock_irqsave(&up->port.lock, flags);
+       rdata = ar933x_uart_read(up, AR933X_UART_DATA_REG);
+       spin_unlock_irqrestore(&up->port.lock, flags);
+
+       return (rdata & AR933X_UART_DATA_TX_CSR) ? 0 : TIOCSER_TEMT;
+}
+
+static unsigned int ar933x_uart_get_mctrl(struct uart_port *port)
+{
+       return TIOCM_CAR;
+}
+
+static void ar933x_uart_set_mctrl(struct uart_port *port, unsigned int mctrl)
+{
+}
+
+static void ar933x_uart_start_tx(struct uart_port *port)
+{
+       struct ar933x_uart_port *up = (struct ar933x_uart_port *) port;
+
+       ar933x_uart_start_tx_interrupt(up);
+}
+
+static void ar933x_uart_stop_tx(struct uart_port *port)
+{
+       struct ar933x_uart_port *up = (struct ar933x_uart_port *) port;
+
+       ar933x_uart_stop_tx_interrupt(up);
+}
+
+static void ar933x_uart_stop_rx(struct uart_port *port)
+{
+       struct ar933x_uart_port *up = (struct ar933x_uart_port *) port;
+
+       up->ier &= ~AR933X_UART_INT_RX_VALID;
+       ar933x_uart_write(up, AR933X_UART_INT_EN_REG, up->ier);
+}
+
+static void ar933x_uart_break_ctl(struct uart_port *port, int break_state)
+{
+       struct ar933x_uart_port *up = (struct ar933x_uart_port *) port;
+       unsigned long flags;
+
+       spin_lock_irqsave(&up->port.lock, flags);
+       if (break_state == -1)
+               ar933x_uart_rmw_set(up, AR933X_UART_CS_REG,
+                                   AR933X_UART_CS_TX_BREAK);
+       else
+               ar933x_uart_rmw_clear(up, AR933X_UART_CS_REG,
+                                     AR933X_UART_CS_TX_BREAK);
+       spin_unlock_irqrestore(&up->port.lock, flags);
+}
+
+static void ar933x_uart_enable_ms(struct uart_port *port)
+{
+}
+
+static void ar933x_uart_set_termios(struct uart_port *port,
+                                   struct ktermios *new,
+                                   struct ktermios *old)
+{
+       struct ar933x_uart_port *up = (struct ar933x_uart_port *) port;
+       unsigned int cs;
+       unsigned long flags;
+       unsigned int baud, scale;
+
+       /* Only CS8 is supported */
+       new->c_cflag &= ~CSIZE;
+       new->c_cflag |= CS8;
+
+       /* Only one stop bit is supported */
+       new->c_cflag &= ~CSTOPB;
+
+       cs = 0;
+       if (new->c_cflag & PARENB) {
+               if (!(new->c_cflag & PARODD))
+                       cs |= AR933X_UART_CS_PARITY_EVEN;
+               else
+                       cs |= AR933X_UART_CS_PARITY_ODD;
+       } else {
+               cs |= AR933X_UART_CS_PARITY_NONE;
+       }
+
+       /* Mark/space parity is not supported */
+       new->c_cflag &= ~CMSPAR;
+
+       baud = uart_get_baud_rate(port, new, old, 0, port->uartclk / 16);
+       scale = (port->uartclk / (16 * baud)) - 1;
+
+       /*
+        * Ok, we're now changing the port state. Do it with
+        * interrupts disabled.
+        */
+       spin_lock_irqsave(&up->port.lock, flags);
+
+       /* Update the per-port timeout. */
+       uart_update_timeout(port, new->c_cflag, baud);
+
+       up->port.ignore_status_mask = 0;
+
+       /* ignore all characters if CREAD is not set */
+       if ((new->c_cflag & CREAD) == 0)
+               up->port.ignore_status_mask |= AR933X_DUMMY_STATUS_RD;
+
+       ar933x_uart_write(up, AR933X_UART_CLOCK_REG,
+                         scale << AR933X_UART_CLOCK_SCALE_S | 8192);
+
+       /* setup configuration register */
+       ar933x_uart_rmw(up, AR933X_UART_CS_REG, AR933X_UART_CS_PARITY_M, cs);
+
+       /* enable host interrupt */
+       ar933x_uart_rmw_set(up, AR933X_UART_CS_REG,
+                           AR933X_UART_CS_HOST_INT_EN);
+
+       spin_unlock_irqrestore(&up->port.lock, flags);
+
+       if (tty_termios_baud_rate(new))
+               tty_termios_encode_baud_rate(new, baud, baud);
+}
+
+static void ar933x_uart_rx_chars(struct ar933x_uart_port *up)
+{
+       struct tty_struct *tty;
+       int max_count = 256;
+
+       tty = tty_port_tty_get(&up->port.state->port);
+       do {
+               unsigned int rdata;
+               unsigned char ch;
+
+               rdata = ar933x_uart_read(up, AR933X_UART_DATA_REG);
+               if ((rdata & AR933X_UART_DATA_RX_CSR) == 0)
+                       break;
+
+               /* remove the character from the FIFO */
+               ar933x_uart_write(up, AR933X_UART_DATA_REG,
+                                 AR933X_UART_DATA_RX_CSR);
+
+               if (!tty) {
+                       /* discard the data if no tty available */
+                       continue;
+               }
+
+               up->port.icount.rx++;
+               ch = rdata & AR933X_UART_DATA_TX_RX_MASK;
+
+               if (uart_handle_sysrq_char(&up->port, ch))
+                       continue;
+
+               if ((up->port.ignore_status_mask & AR933X_DUMMY_STATUS_RD) == 0)
+                       tty_insert_flip_char(tty, ch, TTY_NORMAL);
+       } while (max_count-- > 0);
+
+       if (tty) {
+               tty_flip_buffer_push(tty);
+               tty_kref_put(tty);
+       }
+}
+
+static void ar933x_uart_tx_chars(struct ar933x_uart_port *up)
+{
+       struct circ_buf *xmit = &up->port.state->xmit;
+       int count;
+
+       if (uart_tx_stopped(&up->port))
+               return;
+
+       count = up->port.fifosize;
+       do {
+               unsigned int rdata;
+
+               rdata = ar933x_uart_read(up, AR933X_UART_DATA_REG);
+               if ((rdata & AR933X_UART_DATA_TX_CSR) == 0)
+                       break;
+
+               if (up->port.x_char) {
+                       ar933x_uart_putc(up, up->port.x_char);
+                       up->port.icount.tx++;
+                       up->port.x_char = 0;
+                       continue;
+               }
+
+               if (uart_circ_empty(xmit))
+                       break;
+
+               ar933x_uart_putc(up, xmit->buf[xmit->tail]);
+
+               xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
+               up->port.icount.tx++;
+       } while (--count > 0);
+
+       if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
+               uart_write_wakeup(&up->port);
+
+       if (!uart_circ_empty(xmit))
+               ar933x_uart_start_tx_interrupt(up);
+}
+
+static irqreturn_t ar933x_uart_interrupt(int irq, void *dev_id)
+{
+       struct ar933x_uart_port *up = dev_id;
+       unsigned int status;
+
+       status = ar933x_uart_read(up, AR933X_UART_CS_REG);
+       if ((status & AR933X_UART_CS_HOST_INT) == 0)
+               return IRQ_NONE;
+
+       spin_lock(&up->port.lock);
+
+       status = ar933x_uart_read(up, AR933X_UART_INT_REG);
+       status &= ar933x_uart_read(up, AR933X_UART_INT_EN_REG);
+
+       if (status & AR933X_UART_INT_RX_VALID) {
+               ar933x_uart_write(up, AR933X_UART_INT_REG,
+                                 AR933X_UART_INT_RX_VALID);
+               ar933x_uart_rx_chars(up);
+       }
+
+       if (status & AR933X_UART_INT_TX_EMPTY) {
+               ar933x_uart_write(up, AR933X_UART_INT_REG,
+                                 AR933X_UART_INT_TX_EMPTY);
+               ar933x_uart_stop_tx_interrupt(up);
+               ar933x_uart_tx_chars(up);
+       }
+
+       spin_unlock(&up->port.lock);
+
+       return IRQ_HANDLED;
+}
+
+static int ar933x_uart_startup(struct uart_port *port)
+{
+       struct ar933x_uart_port *up = (struct ar933x_uart_port *) port;
+       unsigned long flags;
+       int ret;
+
+       ret = request_irq(up->port.irq, ar933x_uart_interrupt,
+                         up->port.irqflags, dev_name(up->port.dev), up);
+       if (ret)
+               return ret;
+
+       spin_lock_irqsave(&up->port.lock, flags);
+
+       /* Enable HOST interrupts */
+       ar933x_uart_rmw_set(up, AR933X_UART_CS_REG,
+                           AR933X_UART_CS_HOST_INT_EN);
+
+       /* Enable RX interrupts */
+       up->ier = AR933X_UART_INT_RX_VALID;
+       ar933x_uart_write(up, AR933X_UART_INT_EN_REG, up->ier);
+
+       spin_unlock_irqrestore(&up->port.lock, flags);
+
+       return 0;
+}
+
+static void ar933x_uart_shutdown(struct uart_port *port)
+{
+       struct ar933x_uart_port *up = (struct ar933x_uart_port *) port;
+
+       /* Disable all interrupts */
+       up->ier = 0;
+       ar933x_uart_write(up, AR933X_UART_INT_EN_REG, up->ier);
+
+       /* Disable break condition */
+       ar933x_uart_rmw_clear(up, AR933X_UART_CS_REG,
+                             AR933X_UART_CS_TX_BREAK);
+
+       free_irq(up->port.irq, up);
+}
+
+static const char *ar933x_uart_type(struct uart_port *port)
+{
+       return (port->type == PORT_AR933X) ? "AR933X UART" : NULL;
+}
+
+static void ar933x_uart_release_port(struct uart_port *port)
+{
+       /* Nothing to release ... */
+}
+
+static int ar933x_uart_request_port(struct uart_port *port)
+{
+       /* UARTs always present */
+       return 0;
+}
+
+static void ar933x_uart_config_port(struct uart_port *port, int flags)
+{
+       if (flags & UART_CONFIG_TYPE)
+               port->type = PORT_AR933X;
+}
+
+static int ar933x_uart_verify_port(struct uart_port *port,
+                                  struct serial_struct *ser)
+{
+       if (ser->type != PORT_UNKNOWN &&
+           ser->type != PORT_AR933X)
+               return -EINVAL;
+
+       if (ser->irq < 0 || ser->irq >= NR_IRQS)
+               return -EINVAL;
+
+       if (ser->baud_base < 28800)
+               return -EINVAL;
+
+       return 0;
+}
+
+static struct uart_ops ar933x_uart_ops = {
+       .tx_empty       = ar933x_uart_tx_empty,
+       .set_mctrl      = ar933x_uart_set_mctrl,
+       .get_mctrl      = ar933x_uart_get_mctrl,
+       .stop_tx        = ar933x_uart_stop_tx,
+       .start_tx       = ar933x_uart_start_tx,
+       .stop_rx        = ar933x_uart_stop_rx,
+       .enable_ms      = ar933x_uart_enable_ms,
+       .break_ctl      = ar933x_uart_break_ctl,
+       .startup        = ar933x_uart_startup,
+       .shutdown       = ar933x_uart_shutdown,
+       .set_termios    = ar933x_uart_set_termios,
+       .type           = ar933x_uart_type,
+       .release_port   = ar933x_uart_release_port,
+       .request_port   = ar933x_uart_request_port,
+       .config_port    = ar933x_uart_config_port,
+       .verify_port    = ar933x_uart_verify_port,
+};
+
+#ifdef CONFIG_SERIAL_AR933X_CONSOLE
+
+static struct ar933x_uart_port *
+ar933x_console_ports[CONFIG_SERIAL_AR933X_NR_UARTS];
+
+static void ar933x_uart_wait_xmitr(struct ar933x_uart_port *up)
+{
+       unsigned int status;
+       unsigned int timeout = 60000;
+
+       /* Wait up to 60ms for the character(s) to be sent. */
+       do {
+               status = ar933x_uart_read(up, AR933X_UART_DATA_REG);
+               if (--timeout == 0)
+                       break;
+               udelay(1);
+       } while ((status & AR933X_UART_DATA_TX_CSR) == 0);
+}
+
+static void ar933x_uart_console_putchar(struct uart_port *port, int ch)
+{
+       struct ar933x_uart_port *up = (struct ar933x_uart_port *) port;
+
+       ar933x_uart_wait_xmitr(up);
+       ar933x_uart_putc(up, ch);
+}
+
+static void ar933x_uart_console_write(struct console *co, const char *s,
+                                     unsigned int count)
+{
+       struct ar933x_uart_port *up = ar933x_console_ports[co->index];
+       unsigned long flags;
+       unsigned int int_en;
+       int locked = 1;
+
+       local_irq_save(flags);
+
+       if (up->port.sysrq)
+               locked = 0;
+       else if (oops_in_progress)
+               locked = spin_trylock(&up->port.lock);
+       else
+               spin_lock(&up->port.lock);
+
+       /*
+        * First save the IER then disable the interrupts
+        */
+       int_en = ar933x_uart_read(up, AR933X_UART_INT_EN_REG);
+       ar933x_uart_write(up, AR933X_UART_INT_EN_REG, 0);
+
+       uart_console_write(&up->port, s, count, ar933x_uart_console_putchar);
+
+       /*
+        * Finally, wait for transmitter to become empty
+        * and restore the IER
+        */
+       ar933x_uart_wait_xmitr(up);
+       ar933x_uart_write(up, AR933X_UART_INT_EN_REG, int_en);
+
+       ar933x_uart_write(up, AR933X_UART_INT_REG, AR933X_UART_INT_ALLINTS);
+
+       if (locked)
+               spin_unlock(&up->port.lock);
+
+       local_irq_restore(flags);
+}
+
+static int ar933x_uart_console_setup(struct console *co, char *options)
+{
+       struct ar933x_uart_port *up;
+       int baud = 115200;
+       int bits = 8;
+       int parity = 'n';
+       int flow = 'n';
+
+       if (co->index < 0 || co->index >= CONFIG_SERIAL_AR933X_NR_UARTS)
+               return -EINVAL;
+
+       up = ar933x_console_ports[co->index];
+       if (!up)
+               return -ENODEV;
+
+       if (options)
+               uart_parse_options(options, &baud, &parity, &bits, &flow);
+
+       return uart_set_options(&up->port, co, baud, parity, bits, flow);
+}
+
+static struct console ar933x_uart_console = {
+       .name           = "ttyATH",
+       .write          = ar933x_uart_console_write,
+       .device         = uart_console_device,
+       .setup          = ar933x_uart_console_setup,
+       .flags          = CON_PRINTBUFFER,
+       .index          = -1,
+       .data           = &ar933x_uart_driver,
+};
+
+static void ar933x_uart_add_console_port(struct ar933x_uart_port *up)
+{
+       ar933x_console_ports[up->port.line] = up;
+}
+
+#define AR933X_SERIAL_CONSOLE  (&ar933x_uart_console)
+
+#else
+
+static inline void ar933x_uart_add_console_port(struct ar933x_uart_port *up) {}
+
+#define AR933X_SERIAL_CONSOLE  NULL
+
+#endif /* CONFIG_SERIAL_AR933X_CONSOLE */
+
+static struct uart_driver ar933x_uart_driver = {
+       .owner          = THIS_MODULE,
+       .driver_name    = DRIVER_NAME,
+       .dev_name       = "ttyATH",
+       .nr             = CONFIG_SERIAL_AR933X_NR_UARTS,
+       .cons           = AR933X_SERIAL_CONSOLE,
+};
+
+static int __devinit ar933x_uart_probe(struct platform_device *pdev)
+{
+       struct ar933x_uart_platform_data *pdata;
+       struct ar933x_uart_port *up;
+       struct uart_port *port;
+       struct resource *mem_res;
+       struct resource *irq_res;
+       int id;
+       int ret;
+
+       pdata = pdev->dev.platform_data;
+       if (!pdata)
+               return -EINVAL;
+
+       id = pdev->id;
+       if (id == -1)
+               id = 0;
+
+       if (id > CONFIG_SERIAL_AR933X_NR_UARTS)
+               return -EINVAL;
+
+       mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!mem_res) {
+               dev_err(&pdev->dev, "no MEM resource\n");
+               return -EINVAL;
+       }
+
+       irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+       if (!irq_res) {
+               dev_err(&pdev->dev, "no IRQ resource\n");
+               return -EINVAL;
+       }
+
+       up = kzalloc(sizeof(struct ar933x_uart_port), GFP_KERNEL);
+       if (!up)
+               return -ENOMEM;
+
+       port = &up->port;
+       port->mapbase = mem_res->start;
+
+       port->membase = ioremap(mem_res->start, AR933X_UART_REGS_SIZE);
+       if (!port->membase) {
+               ret = -ENOMEM;
+               goto err_free_up;
+       }
+
+       port->line = id;
+       port->irq = irq_res->start;
+       port->dev = &pdev->dev;
+       port->type = PORT_AR933X;
+       port->iotype = UPIO_MEM32;
+       port->uartclk = pdata->uartclk;
+
+       port->regshift = 2;
+       port->fifosize = AR933X_UART_FIFO_SIZE;
+       port->ops = &ar933x_uart_ops;
+
+       ar933x_uart_add_console_port(up);
+
+       ret = uart_add_one_port(&ar933x_uart_driver, &up->port);
+       if (ret)
+               goto err_unmap;
+
+       platform_set_drvdata(pdev, up);
+       return 0;
+
+err_unmap:
+       iounmap(up->port.membase);
+err_free_up:
+       kfree(up);
+       return ret;
+}
+
+static int __devexit ar933x_uart_remove(struct platform_device *pdev)
+{
+       struct ar933x_uart_port *up;
+
+       up = platform_get_drvdata(pdev);
+       platform_set_drvdata(pdev, NULL);
+
+       if (up) {
+               uart_remove_one_port(&ar933x_uart_driver, &up->port);
+               iounmap(up->port.membase);
+               kfree(up);
+       }
+
+       return 0;
+}
+
+static struct platform_driver ar933x_uart_platform_driver = {
+       .probe          = ar933x_uart_probe,
+       .remove         = __devexit_p(ar933x_uart_remove),
+       .driver         = {
+               .name           = DRIVER_NAME,
+               .owner          = THIS_MODULE,
+       },
+};
+
+static int __init ar933x_uart_init(void)
+{
+       int ret;
+
+       ar933x_uart_driver.nr = CONFIG_SERIAL_AR933X_NR_UARTS;
+       ret = uart_register_driver(&ar933x_uart_driver);
+       if (ret)
+               goto err_out;
+
+       ret = platform_driver_register(&ar933x_uart_platform_driver);
+       if (ret)
+               goto err_unregister_uart_driver;
+
+       return 0;
+
+err_unregister_uart_driver:
+       uart_unregister_driver(&ar933x_uart_driver);
+err_out:
+       return ret;
+}
+
+static void __exit ar933x_uart_exit(void)
+{
+       platform_driver_unregister(&ar933x_uart_platform_driver);
+       uart_unregister_driver(&ar933x_uart_driver);
+}
+
+module_init(ar933x_uart_init);
+module_exit(ar933x_uart_exit);
+
+MODULE_DESCRIPTION("Atheros AR933X UART driver");
+MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:" DRIVER_NAME);
index 060e0e2b1ae62330d5fb0c77540eeded603bd161..8b094b4f6531cb9d1d44560d7e157bb7ba1e0710 100644 (file)
@@ -210,7 +210,7 @@ config USB_CNS3XXX_EHCI
 
 config USB_EHCI_ATH79
        bool "EHCI support for AR7XXX/AR9XXX SoCs"
-       depends on USB_EHCI_HCD && (SOC_AR71XX || SOC_AR724X || SOC_AR913X)
+       depends on USB_EHCI_HCD && (SOC_AR71XX || SOC_AR724X || SOC_AR913X || SOC_AR933X)
        select USB_EHCI_ROOT_HUB_TT
        default y
        ---help---
index b4192c964d0df6b4c9936b389316e50aec8ecc51..936af8359fb2007f024b0dfa6b0499afe6983241 100644 (file)
                                 USBCFG_EBE | USBCFG_EME | USBCFG_OBE |        \
                                 USBCFG_OME)
 
+/* Au1300 USB config registers */
+#define USB_DWC_CTRL1          0x00
+#define USB_DWC_CTRL2          0x04
+#define USB_VBUS_TIMER         0x10
+#define USB_SBUS_CTRL          0x14
+#define USB_MSR_ERR            0x18
+#define USB_DWC_CTRL3          0x1C
+#define USB_DWC_CTRL4          0x20
+#define USB_OTG_STATUS         0x28
+#define USB_DWC_CTRL5          0x2C
+#define USB_DWC_CTRL6          0x30
+#define USB_DWC_CTRL7          0x34
+#define USB_PHY_STATUS         0xC0
+#define USB_INT_STATUS         0xC4
+#define USB_INT_ENABLE         0xC8
+
+#define USB_DWC_CTRL1_OTGD     0x04 /* set to DISable OTG */
+#define USB_DWC_CTRL1_HSTRS    0x02 /* set to ENable EHCI */
+#define USB_DWC_CTRL1_DCRS     0x01 /* set to ENable UDC */
+
+#define USB_DWC_CTRL2_PHY1RS   0x04 /* set to enable PHY1 */
+#define USB_DWC_CTRL2_PHY0RS   0x02 /* set to enable PHY0 */
+#define USB_DWC_CTRL2_PHYRS    0x01 /* set to enable PHY */
+
+#define USB_DWC_CTRL3_OHCI1_CKEN       (1 << 19)
+#define USB_DWC_CTRL3_OHCI0_CKEN       (1 << 18)
+#define USB_DWC_CTRL3_EHCI0_CKEN       (1 << 17)
+#define USB_DWC_CTRL3_OTG0_CKEN                (1 << 16)
+
+#define USB_SBUS_CTRL_SBCA             0x04 /* coherent access */
+
+#define USB_INTEN_FORCE                        0x20
+#define USB_INTEN_PHY                  0x10
+#define USB_INTEN_UDC                  0x08
+#define USB_INTEN_EHCI                 0x04
+#define USB_INTEN_OHCI1                        0x02
+#define USB_INTEN_OHCI0                        0x01
 
 static DEFINE_SPINLOCK(alchemy_usb_lock);
 
+static inline void __au1300_usb_phyctl(void __iomem *base, int enable)
+{
+       unsigned long r, s;
+
+       r = __raw_readl(base + USB_DWC_CTRL2);
+       s = __raw_readl(base + USB_DWC_CTRL3);
+
+       s &= USB_DWC_CTRL3_OHCI1_CKEN | USB_DWC_CTRL3_OHCI0_CKEN |
+               USB_DWC_CTRL3_EHCI0_CKEN | USB_DWC_CTRL3_OTG0_CKEN;
+
+       if (enable) {
+               /* simply enable all PHYs */
+               r |= USB_DWC_CTRL2_PHY1RS | USB_DWC_CTRL2_PHY0RS |
+                    USB_DWC_CTRL2_PHYRS;
+               __raw_writel(r, base + USB_DWC_CTRL2);
+               wmb();
+       } else if (!s) {
+               /* no USB block active, do disable all PHYs */
+               r &= ~(USB_DWC_CTRL2_PHY1RS | USB_DWC_CTRL2_PHY0RS |
+                      USB_DWC_CTRL2_PHYRS);
+               __raw_writel(r, base + USB_DWC_CTRL2);
+               wmb();
+       }
+}
+
+static inline void __au1300_ohci_control(void __iomem *base, int enable, int id)
+{
+       unsigned long r;
+
+       if (enable) {
+               __raw_writel(1, base + USB_DWC_CTRL7);  /* start OHCI clock */
+               wmb();
+
+               r = __raw_readl(base + USB_DWC_CTRL3);  /* enable OHCI block */
+               r |= (id == 0) ? USB_DWC_CTRL3_OHCI0_CKEN
+                              : USB_DWC_CTRL3_OHCI1_CKEN;
+               __raw_writel(r, base + USB_DWC_CTRL3);
+               wmb();
+
+               __au1300_usb_phyctl(base, enable);      /* power up the PHYs */
+
+               r = __raw_readl(base + USB_INT_ENABLE);
+               r |= (id == 0) ? USB_INTEN_OHCI0 : USB_INTEN_OHCI1;
+               __raw_writel(r, base + USB_INT_ENABLE);
+               wmb();
+
+               /* reset the OHCI start clock bit */
+               __raw_writel(0, base + USB_DWC_CTRL7);
+               wmb();
+       } else {
+               r = __raw_readl(base + USB_INT_ENABLE);
+               r &= ~((id == 0) ? USB_INTEN_OHCI0 : USB_INTEN_OHCI1);
+               __raw_writel(r, base + USB_INT_ENABLE);
+               wmb();
+
+               r = __raw_readl(base + USB_DWC_CTRL3);
+               r &= ~((id == 0) ? USB_DWC_CTRL3_OHCI0_CKEN
+                                : USB_DWC_CTRL3_OHCI1_CKEN);
+               __raw_writel(r, base + USB_DWC_CTRL3);
+               wmb();
+
+               __au1300_usb_phyctl(base, enable);
+       }
+}
+
+static inline void __au1300_ehci_control(void __iomem *base, int enable)
+{
+       unsigned long r;
+
+       if (enable) {
+               r = __raw_readl(base + USB_DWC_CTRL3);
+               r |= USB_DWC_CTRL3_EHCI0_CKEN;
+               __raw_writel(r, base + USB_DWC_CTRL3);
+               wmb();
+
+               r = __raw_readl(base + USB_DWC_CTRL1);
+               r |= USB_DWC_CTRL1_HSTRS;
+               __raw_writel(r, base + USB_DWC_CTRL1);
+               wmb();
+
+               __au1300_usb_phyctl(base, enable);
+
+               r = __raw_readl(base + USB_INT_ENABLE);
+               r |= USB_INTEN_EHCI;
+               __raw_writel(r, base + USB_INT_ENABLE);
+               wmb();
+       } else {
+               r = __raw_readl(base + USB_INT_ENABLE);
+               r &= ~USB_INTEN_EHCI;
+               __raw_writel(r, base + USB_INT_ENABLE);
+               wmb();
+
+               r = __raw_readl(base + USB_DWC_CTRL1);
+               r &= ~USB_DWC_CTRL1_HSTRS;
+               __raw_writel(r, base + USB_DWC_CTRL1);
+               wmb();
+
+               r = __raw_readl(base + USB_DWC_CTRL3);
+               r &= ~USB_DWC_CTRL3_EHCI0_CKEN;
+               __raw_writel(r, base + USB_DWC_CTRL3);
+               wmb();
+
+               __au1300_usb_phyctl(base, enable);
+       }
+}
+
+static inline void __au1300_udc_control(void __iomem *base, int enable)
+{
+       unsigned long r;
+
+       if (enable) {
+               r = __raw_readl(base + USB_DWC_CTRL1);
+               r |= USB_DWC_CTRL1_DCRS;
+               __raw_writel(r, base + USB_DWC_CTRL1);
+               wmb();
+
+               __au1300_usb_phyctl(base, enable);
+
+               r = __raw_readl(base + USB_INT_ENABLE);
+               r |= USB_INTEN_UDC;
+               __raw_writel(r, base + USB_INT_ENABLE);
+               wmb();
+       } else {
+               r = __raw_readl(base + USB_INT_ENABLE);
+               r &= ~USB_INTEN_UDC;
+               __raw_writel(r, base + USB_INT_ENABLE);
+               wmb();
+
+               r = __raw_readl(base + USB_DWC_CTRL1);
+               r &= ~USB_DWC_CTRL1_DCRS;
+               __raw_writel(r, base + USB_DWC_CTRL1);
+               wmb();
+
+               __au1300_usb_phyctl(base, enable);
+       }
+}
+
+static inline void __au1300_otg_control(void __iomem *base, int enable)
+{
+       unsigned long r;
+       if (enable) {
+               r = __raw_readl(base + USB_DWC_CTRL3);
+               r |= USB_DWC_CTRL3_OTG0_CKEN;
+               __raw_writel(r, base + USB_DWC_CTRL3);
+               wmb();
+
+               r = __raw_readl(base + USB_DWC_CTRL1);
+               r &= ~USB_DWC_CTRL1_OTGD;
+               __raw_writel(r, base + USB_DWC_CTRL1);
+               wmb();
+
+               __au1300_usb_phyctl(base, enable);
+       } else {
+               r = __raw_readl(base + USB_DWC_CTRL1);
+               r |= USB_DWC_CTRL1_OTGD;
+               __raw_writel(r, base + USB_DWC_CTRL1);
+               wmb();
+
+               r = __raw_readl(base + USB_DWC_CTRL3);
+               r &= ~USB_DWC_CTRL3_OTG0_CKEN;
+               __raw_writel(r, base + USB_DWC_CTRL3);
+               wmb();
+
+               __au1300_usb_phyctl(base, enable);
+       }
+}
+
+static inline int au1300_usb_control(int block, int enable)
+{
+       void __iomem *base =
+               (void __iomem *)KSEG1ADDR(AU1300_USB_CTL_PHYS_ADDR);
+       int ret = 0;
+
+       switch (block) {
+       case ALCHEMY_USB_OHCI0:
+               __au1300_ohci_control(base, enable, 0);
+               break;
+       case ALCHEMY_USB_OHCI1:
+               __au1300_ohci_control(base, enable, 1);
+               break;
+       case ALCHEMY_USB_EHCI0:
+               __au1300_ehci_control(base, enable);
+               break;
+       case ALCHEMY_USB_UDC0:
+               __au1300_udc_control(base, enable);
+               break;
+       case ALCHEMY_USB_OTG0:
+               __au1300_otg_control(base, enable);
+               break;
+       default:
+               ret = -ENODEV;
+       }
+       return ret;
+}
+
+static inline void au1300_usb_init(void)
+{
+       void __iomem *base =
+               (void __iomem *)KSEG1ADDR(AU1300_USB_CTL_PHYS_ADDR);
+
+       /* set some sane defaults.  Note: we don't fiddle with DWC_CTRL4
+        * here at all: Port 2 routing (EHCI or UDC) must be set either
+        * by boot firmware or platform init code; I can't autodetect
+        * a sane setting.
+        */
+       __raw_writel(0, base + USB_INT_ENABLE); /* disable all USB irqs */
+       wmb();
+       __raw_writel(0, base + USB_DWC_CTRL3); /* disable all clocks */
+       wmb();
+       __raw_writel(~0, base + USB_MSR_ERR); /* clear all errors */
+       wmb();
+       __raw_writel(~0, base + USB_INT_STATUS); /* clear int status */
+       wmb();
+       /* set coherent access bit */
+       __raw_writel(USB_SBUS_CTRL_SBCA, base + USB_SBUS_CTRL);
+       wmb();
+}
 
 static inline void __au1200_ohci_control(void __iomem *base, int enable)
 {
@@ -233,6 +487,9 @@ int alchemy_usb_control(int block, int enable)
        case ALCHEMY_CPU_AU1200:
                ret = au1200_usb_control(block, enable);
                break;
+       case ALCHEMY_CPU_AU1300:
+               ret = au1300_usb_control(block, enable);
+               break;
        default:
                ret = -ENODEV;
        }
@@ -281,6 +538,20 @@ static void au1200_usb_pm(int susp)
        }
 }
 
+static void au1300_usb_pm(int susp)
+{
+       void __iomem *base =
+                       (void __iomem *)KSEG1ADDR(AU1300_USB_CTL_PHYS_ADDR);
+       /* remember Port2 routing */
+       if (susp) {
+               alchemy_usb_pmdata[0] = __raw_readl(base + USB_DWC_CTRL4);
+       } else {
+               au1300_usb_init();
+               __raw_writel(alchemy_usb_pmdata[0], base + USB_DWC_CTRL4);
+               wmb();
+       }
+}
+
 static void alchemy_usb_pm(int susp)
 {
        switch (alchemy_get_cputype()) {
@@ -295,6 +566,9 @@ static void alchemy_usb_pm(int susp)
        case ALCHEMY_CPU_AU1200:
                au1200_usb_pm(susp);
                break;
+       case ALCHEMY_CPU_AU1300:
+               au1300_usb_pm(susp);
+               break;
        }
 }
 
@@ -328,6 +602,9 @@ static int __init alchemy_usb_init(void)
        case ALCHEMY_CPU_AU1200:
                au1200_usb_init();
                break;
+       case ALCHEMY_CPU_AU1300:
+               au1300_usb_init();
+               break;
        }
 
        register_syscore_ops(&alchemy_usb_pm_ops);
index afb6743cf09401876bea18affd21f07b2c3f394c..f1424f9bc363d4edaac0fdce5b60a9f81ec447cb 100644 (file)
@@ -32,6 +32,10 @@ static const struct platform_device_id ehci_ath79_id_table[] = {
                .name           = "ar913x-ehci",
                .driver_data    = EHCI_ATH79_IP_V2,
        },
+       {
+               .name           = "ar933x-ehci",
+               .driver_data    = EHCI_ATH79_IP_V2,
+       },
        {
                /* terminating entry */
        },
index 9b66df8278f3816e04931c07cecb6a146e873566..95d1a71dccad45862c7b6b94d115c8193debe173 100644 (file)
@@ -89,7 +89,7 @@ static const struct hc_driver ohci_au1xxx_hc_driver = {
 
 static int ohci_hcd_au1xxx_drv_probe(struct platform_device *pdev)
 {
-       int ret;
+       int ret, unit;
        struct usb_hcd *hcd;
 
        if (usb_disabled())
@@ -120,7 +120,9 @@ static int ohci_hcd_au1xxx_drv_probe(struct platform_device *pdev)
                goto err2;
        }
 
-       if (alchemy_usb_control(ALCHEMY_USB_OHCI0, 1)) {
+       unit = (hcd->rsrc_start == AU1300_USB_OHCI1_PHYS_ADDR) ?
+                       ALCHEMY_USB_OHCI1 : ALCHEMY_USB_OHCI0;
+       if (alchemy_usb_control(unit, 1)) {
                printk(KERN_INFO "%s: controller init failed!\n", pdev->name);
                ret = -ENODEV;
                goto err3;
@@ -135,7 +137,7 @@ static int ohci_hcd_au1xxx_drv_probe(struct platform_device *pdev)
                return ret;
        }
 
-       alchemy_usb_control(ALCHEMY_USB_OHCI0, 0);
+       alchemy_usb_control(unit, 0);
 err3:
        iounmap(hcd->regs);
 err2:
@@ -148,9 +150,12 @@ err1:
 static int ohci_hcd_au1xxx_drv_remove(struct platform_device *pdev)
 {
        struct usb_hcd *hcd = platform_get_drvdata(pdev);
+       int unit;
 
+       unit = (hcd->rsrc_start == AU1300_USB_OHCI1_PHYS_ADDR) ?
+                       ALCHEMY_USB_OHCI1 : ALCHEMY_USB_OHCI0;
        usb_remove_hcd(hcd);
-       alchemy_usb_control(ALCHEMY_USB_OHCI0, 0);
+       alchemy_usb_control(unit, 0);
        iounmap(hcd->regs);
        release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
        usb_put_hcd(hcd);
index d83e967e4e15b6380fa1dc94584aac871b6a4b1d..acd4ba555e3a5df1570d57eed24e18d2303a098f 100644 (file)
@@ -1763,16 +1763,16 @@ config FB_AU1100
          au1100fb:panel=<name>.
 
 config FB_AU1200
-       bool "Au1200 LCD Driver"
+       bool "Au1200/Au1300 LCD Driver"
        depends on (FB = y) && MIPS_ALCHEMY
        select FB_SYS_FILLRECT
        select FB_SYS_COPYAREA
        select FB_SYS_IMAGEBLIT
        select FB_SYS_FOPS
        help
-         This is the framebuffer driver for the AMD Au1200 SOC.  It can drive
-         various panels and CRTs by passing in kernel cmd line option
-         au1200fb:panel=<name>.
+         This is the framebuffer driver for the Au1200/Au1300 SOCs.
+         It can drive various panels and CRTs by passing in kernel cmd line
+         option au1200fb:panel=<name>.
 
 config FB_VT8500
        bool "VT8500 LCD Driver"
index 649cb35de4ed401d2ffce0e1c5abcaeb71f4037a..de9da6774fd9e51f237ba7adc0aa8319ae8b6eec 100644 (file)
 
 #include "au1100fb.h"
 
-/*
- * Sanity check. If this is a new Au1100 based board, search for
- * the PB1100 ifdefs to make sure you modify the code accordingly.
- */
-#if defined(CONFIG_MIPS_PB1100)
-  #include <asm/mach-pb1x00/pb1100.h>
-#elif defined(CONFIG_MIPS_DB1100)
-  #include <asm/mach-db1x00/db1x00.h>
-#else
-  #error "Unknown Au1100 board, Au1100 FB driver not supported"
-#endif
-
 #define DRIVER_NAME "au1100fb"
 #define DRIVER_DESC "LCD controller driver for AU1100 processors"
 
index 72005598040f0668762c0a8288865c8e809c01de..04e4479d5afd70291a86497ec7e48118b2cf75cb 100644 (file)
@@ -44,6 +44,7 @@
 #include <linux/slab.h>
 
 #include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-au1x00/au1200fb.h>  /* platform_data */
 #include "au1200fb.h"
 
 #define DRIVER_NAME "au1200fb"
@@ -143,6 +144,7 @@ struct au1200_lcd_iodata_t {
 /* Private, per-framebuffer management information (independent of the panel itself) */
 struct au1200fb_device {
        struct fb_info *fb_info;                /* FB driver info record */
+       struct au1200fb_platdata *pd;
 
        int                                     plane;
        unsigned char*          fb_mem;         /* FrameBuffer memory map */
@@ -201,9 +203,6 @@ struct window_settings {
 #define LCD_WINCTRL1_PO_16BPP LCD_WINCTRL1_PO_01
 #endif
 
-extern int board_au1200fb_panel_init (void);
-extern int board_au1200fb_panel_shutdown (void);
-
 /*
  * Default window configurations
  */
@@ -334,8 +333,6 @@ struct panel_settings
        uint32 mode_toyclksrc;
        uint32 mode_backlight;
        uint32 mode_auxpll;
-       int (*device_init)(void);
-       int (*device_shutdown)(void);
 #define Xres min_xres
 #define Yres min_yres
        u32     min_xres;               /* Minimum horizontal resolution */
@@ -385,8 +382,6 @@ static struct panel_settings known_lcd_panels[] =
                .mode_toyclksrc = 0x00000004, /* AUXPLL directly */
                .mode_backlight = 0x00000000,
                .mode_auxpll            = 8, /* 96MHz AUXPLL */
-               .device_init            = NULL,
-               .device_shutdown        = NULL,
                320, 320,
                240, 240,
        },
@@ -415,8 +410,6 @@ static struct panel_settings known_lcd_panels[] =
                .mode_toyclksrc = 0x00000004, /* AUXPLL directly */
                .mode_backlight = 0x00000000,
                .mode_auxpll            = 8, /* 96MHz AUXPLL */
-               .device_init            = NULL,
-               .device_shutdown        = NULL,
                640, 480,
                640, 480,
        },
@@ -445,8 +438,6 @@ static struct panel_settings known_lcd_panels[] =
                .mode_toyclksrc = 0x00000004, /* AUXPLL directly */
                .mode_backlight = 0x00000000,
                .mode_auxpll            = 8, /* 96MHz AUXPLL */
-               .device_init            = NULL,
-               .device_shutdown        = NULL,
                800, 800,
                600, 600,
        },
@@ -475,8 +466,6 @@ static struct panel_settings known_lcd_panels[] =
                .mode_toyclksrc = 0x00000004, /* AUXPLL directly */
                .mode_backlight = 0x00000000,
                .mode_auxpll            = 6, /* 72MHz AUXPLL */
-               .device_init            = NULL,
-               .device_shutdown        = NULL,
                1024, 1024,
                768, 768,
        },
@@ -505,8 +494,6 @@ static struct panel_settings known_lcd_panels[] =
                .mode_toyclksrc = 0x00000004, /* AUXPLL directly */
                .mode_backlight = 0x00000000,
                .mode_auxpll            = 10, /* 120MHz AUXPLL */
-               .device_init            = NULL,
-               .device_shutdown        = NULL,
                1280, 1280,
                1024, 1024,
        },
@@ -535,8 +522,6 @@ static struct panel_settings known_lcd_panels[] =
                .mode_toyclksrc = 0x00000004, /* AUXPLL directly */
                .mode_backlight = 0x00000000,
                .mode_auxpll            = 8, /* 96MHz AUXPLL */
-               .device_init            = board_au1200fb_panel_init,
-               .device_shutdown        = board_au1200fb_panel_shutdown,
                1024, 1024,
                768, 768,
        },
@@ -568,8 +553,6 @@ static struct panel_settings known_lcd_panels[] =
                .mode_toyclksrc = 0x00000004, /* AUXPLL directly */
                .mode_backlight = 0x00000000,
                .mode_auxpll            = 8, /* 96MHz AUXPLL */
-               .device_init            = board_au1200fb_panel_init,
-               .device_shutdown        = board_au1200fb_panel_shutdown,
                640, 480,
                640, 480,
        },
@@ -601,8 +584,6 @@ static struct panel_settings known_lcd_panels[] =
                .mode_toyclksrc = 0x00000004, /* AUXPLL directly */
                .mode_backlight = 0x00000000,
                .mode_auxpll            = 8, /* 96MHz AUXPLL */
-               .device_init            = board_au1200fb_panel_init,
-               .device_shutdown        = board_au1200fb_panel_shutdown,
                320, 320,
                240, 240,
        },
@@ -634,11 +615,43 @@ static struct panel_settings known_lcd_panels[] =
                .mode_toyclksrc = 0x00000004, /* AUXPLL directly */
                .mode_backlight = 0x00000000,
                .mode_auxpll            = 8, /* 96MHz AUXPLL */
-               .device_init            = board_au1200fb_panel_init,
-               .device_shutdown        = board_au1200fb_panel_shutdown,
                856, 856,
                480, 480,
        },
+       [9] = {
+               .name = "DB1300_800x480",
+               .monspecs = {
+                       .modedb = NULL,
+                       .modedb_len = 0,
+                       .hfmin = 30000,
+                       .hfmax = 70000,
+                       .vfmin = 60,
+                       .vfmax = 60,
+                       .dclkmin = 6000000,
+                       .dclkmax = 28000000,
+                       .input = FB_DISP_RGB,
+               },
+               .mode_screen            = LCD_SCREEN_SX_N(800) |
+                                         LCD_SCREEN_SY_N(480),
+               .mode_horztiming        = LCD_HORZTIMING_HPW_N(5) |
+                                         LCD_HORZTIMING_HND1_N(16) |
+                                         LCD_HORZTIMING_HND2_N(8),
+               .mode_verttiming        = LCD_VERTTIMING_VPW_N(4) |
+                                         LCD_VERTTIMING_VND1_N(8) |
+                                         LCD_VERTTIMING_VND2_N(5),
+               .mode_clkcontrol        = LCD_CLKCONTROL_PCD_N(1) |
+                                         LCD_CLKCONTROL_IV |
+                                         LCD_CLKCONTROL_IH,
+               .mode_pwmdiv            = 0x00000000,
+               .mode_pwmhi             = 0x00000000,
+               .mode_outmask           = 0x00FFFFFF,
+               .mode_fifoctrl          = 0x2f2f2f2f,
+               .mode_toyclksrc         = 0x00000004, /* AUXPLL directly */
+               .mode_backlight         = 0x00000000,
+               .mode_auxpll            = (48/12) * 2,
+               800, 800,
+               480, 480,
+       },
 };
 
 #define NUM_PANELS (ARRAY_SIZE(known_lcd_panels))
@@ -764,7 +777,8 @@ static int au1200_setlocation (struct au1200fb_device *fbdev, int plane,
        return 0;
 }
 
-static void au1200_setpanel (struct panel_settings *newpanel)
+static void au1200_setpanel(struct panel_settings *newpanel,
+                           struct au1200fb_platdata *pd)
 {
        /*
         * Perform global setup/init of LCD controller
@@ -798,8 +812,8 @@ static void au1200_setpanel (struct panel_settings *newpanel)
                    the controller, the clock cannot be turned off before first
                        shutting down the controller.
                 */
-               if (panel->device_shutdown != NULL)
-                       panel->device_shutdown();
+               if (pd->panel_shutdown)
+                       pd->panel_shutdown();
        }
 
        /* Newpanel == NULL indicates a shutdown operation only */
@@ -852,7 +866,8 @@ static void au1200_setpanel (struct panel_settings *newpanel)
        au_sync();
 
        /* Call init of panel */
-       if (panel->device_init != NULL) panel->device_init();
+       if (pd->panel_init)
+               pd->panel_init();
 
        /* FIX!!!! not appropriate on panel change!!! Global setup/init */
        lcd->intenable = 0;
@@ -1185,6 +1200,8 @@ static int au1200fb_fb_setcolreg(unsigned regno, unsigned red, unsigned green,
  */
 static int au1200fb_fb_blank(int blank_mode, struct fb_info *fbi)
 {
+       struct au1200fb_device *fbdev = fbi->par;
+
        /* Short-circuit screen blanking */
        if (noblanking)
                return 0;
@@ -1194,13 +1211,13 @@ static int au1200fb_fb_blank(int blank_mode, struct fb_info *fbi)
        case FB_BLANK_UNBLANK:
        case FB_BLANK_NORMAL:
                /* printk("turn on panel\n"); */
-               au1200_setpanel(panel);
+               au1200_setpanel(panel, fbdev->pd);
                break;
        case FB_BLANK_VSYNC_SUSPEND:
        case FB_BLANK_HSYNC_SUSPEND:
        case FB_BLANK_POWERDOWN:
                /* printk("turn off panel\n"); */
-               au1200_setpanel(NULL);
+               au1200_setpanel(NULL, fbdev->pd);
                break;
        default:
                break;
@@ -1428,6 +1445,7 @@ static void get_window(unsigned int plane,
 static int au1200fb_ioctl(struct fb_info *info, unsigned int cmd,
                           unsigned long arg)
 {
+       struct au1200fb_device *fbdev = info->par;
        int plane;
        int val;
 
@@ -1472,7 +1490,7 @@ static int au1200fb_ioctl(struct fb_info *info, unsigned int cmd,
                                struct panel_settings *newpanel;
                                panel_index = iodata.global.panel_choice;
                                newpanel = &known_lcd_panels[panel_index];
-                               au1200_setpanel(newpanel);
+                               au1200_setpanel(newpanel, fbdev->pd);
                        }
                        break;
 
@@ -1588,22 +1606,102 @@ static int au1200fb_init_fbinfo(struct au1200fb_device *fbdev)
 
 /*-------------------------------------------------------------------------*/
 
-/* AU1200 LCD controller device driver */
 
+static int au1200fb_setup(struct au1200fb_platdata *pd)
+{
+       char *options = NULL;
+       char *this_opt, *endptr;
+       int num_panels = ARRAY_SIZE(known_lcd_panels);
+       int panel_idx = -1;
+
+       fb_get_options(DRIVER_NAME, &options);
+
+       if (!options)
+               goto out;
+
+       while ((this_opt = strsep(&options, ",")) != NULL) {
+               /* Panel option - can be panel name,
+                * "bs" for board-switch, or number/index */
+               if (!strncmp(this_opt, "panel:", 6)) {
+                       int i;
+                       long int li;
+                       char *endptr;
+                       this_opt += 6;
+                       /* First check for index, which allows
+                        * to short circuit this mess */
+                       li = simple_strtol(this_opt, &endptr, 0);
+                       if (*endptr == '\0')
+                               panel_idx = (int)li;
+                       else if (strcmp(this_opt, "bs") == 0)
+                               panel_idx = pd->panel_index();
+                       else {
+                               for (i = 0; i < num_panels; i++) {
+                                       if (!strcmp(this_opt,
+                                                   known_lcd_panels[i].name)) {
+                                               panel_idx = i;
+                                               break;
+                                       }
+                               }
+                       }
+                       if ((panel_idx < 0) || (panel_idx >= num_panels))
+                               print_warn("Panel %s not supported!", this_opt);
+                       else
+                               panel_index = panel_idx;
+
+               } else if (strncmp(this_opt, "nohwcursor", 10) == 0)
+                       nohwcursor = 1;
+               else if (strncmp(this_opt, "devices:", 8) == 0) {
+                       this_opt += 8;
+                       device_count = simple_strtol(this_opt, &endptr, 0);
+                       if ((device_count < 0) ||
+                           (device_count > MAX_DEVICE_COUNT))
+                               device_count = MAX_DEVICE_COUNT;
+               } else if (strncmp(this_opt, "wincfg:", 7) == 0) {
+                       this_opt += 7;
+                       window_index = simple_strtol(this_opt, &endptr, 0);
+                       if ((window_index < 0) ||
+                           (window_index >= ARRAY_SIZE(windows)))
+                               window_index = DEFAULT_WINDOW_INDEX;
+               } else if (strncmp(this_opt, "off", 3) == 0)
+                       return 1;
+               else
+                       print_warn("Unsupported option \"%s\"", this_opt);
+       }
+
+out:
+       return 0;
+}
+
+/* AU1200 LCD controller device driver */
 static int __devinit au1200fb_drv_probe(struct platform_device *dev)
 {
        struct au1200fb_device *fbdev;
+       struct au1200fb_platdata *pd;
        struct fb_info *fbi = NULL;
        unsigned long page;
        int bpp, plane, ret, irq;
 
+       print_info("" DRIVER_DESC "");
+
+       pd = dev->dev.platform_data;
+       if (!pd)
+               return -ENODEV;
+
+       /* Setup driver with options */
+       if (au1200fb_setup(pd))
+               return -ENODEV;
+
+       /* Point to the panel selected */
+       panel = &known_lcd_panels[panel_index];
+       win = &windows[window_index];
+
+       printk(DRIVER_NAME ": Panel %d %s\n", panel_index, panel->name);
+       printk(DRIVER_NAME ": Win %d %s\n", window_index, win->name);
+
        /* shut gcc up */
        ret = 0;
        fbdev = NULL;
 
-       /* Kickstart the panel */
-       au1200_setpanel(panel);
-
        for (plane = 0; plane < device_count; ++plane) {
                bpp = winbpp(win->w[plane].mode_winctrl1);
                if (win->w[plane].xres == 0)
@@ -1619,6 +1717,7 @@ static int __devinit au1200fb_drv_probe(struct platform_device *dev)
                _au1200fb_infos[plane] = fbi;
                fbdev = fbi->par;
                fbdev->fb_info = fbi;
+               fbdev->pd = pd;
 
                fbdev->plane = plane;
 
@@ -1680,6 +1779,11 @@ static int __devinit au1200fb_drv_probe(struct platform_device *dev)
                goto failed;
        }
 
+       platform_set_drvdata(dev, pd);
+
+       /* Kickstart the panel */
+       au1200_setpanel(panel, pd);
+
        return 0;
 
 failed:
@@ -1699,12 +1803,13 @@ failed:
 
 static int __devexit au1200fb_drv_remove(struct platform_device *dev)
 {
+       struct au1200fb_platdata *pd = platform_get_drvdata(dev);
        struct au1200fb_device *fbdev;
        struct fb_info *fbi;
        int plane;
 
        /* Turn off the panel */
-       au1200_setpanel(NULL);
+       au1200_setpanel(NULL, pd);
 
        for (plane = 0; plane < device_count; ++plane)  {
                fbi = _au1200fb_infos[plane];
@@ -1732,7 +1837,8 @@ static int __devexit au1200fb_drv_remove(struct platform_device *dev)
 #ifdef CONFIG_PM
 static int au1200fb_drv_suspend(struct device *dev)
 {
-       au1200_setpanel(NULL);
+       struct au1200fb_platdata *pd = dev_get_drvdata(dev);
+       au1200_setpanel(NULL, pd);
 
        lcd->outmask = 0;
        au_sync();
@@ -1742,11 +1848,12 @@ static int au1200fb_drv_suspend(struct device *dev)
 
 static int au1200fb_drv_resume(struct device *dev)
 {
+       struct au1200fb_platdata *pd = dev_get_drvdata(dev);
        struct fb_info *fbi;
        int i;
 
        /* Kickstart the panel */
-       au1200_setpanel(panel);
+       au1200_setpanel(panel, pd);
 
        for (i = 0; i < device_count; i++) {
                fbi = _au1200fb_infos[i];
@@ -1781,100 +1888,8 @@ static struct platform_driver au1200fb_driver = {
 
 /*-------------------------------------------------------------------------*/
 
-/* Kernel driver */
-
-static int au1200fb_setup(void)
-{
-       char *options = NULL;
-       char *this_opt, *endptr;
-       int num_panels = ARRAY_SIZE(known_lcd_panels);
-       int panel_idx = -1;
-
-       fb_get_options(DRIVER_NAME, &options);
-
-       if (options) {
-               while ((this_opt = strsep(&options,",")) != NULL) {
-                       /* Panel option - can be panel name,
-                        * "bs" for board-switch, or number/index */
-                       if (!strncmp(this_opt, "panel:", 6)) {
-                               int i;
-                               long int li;
-                               char *endptr;
-                               this_opt += 6;
-                               /* First check for index, which allows
-                                * to short circuit this mess */
-                               li = simple_strtol(this_opt, &endptr, 0);
-                               if (*endptr == '\0') {
-                                       panel_idx = (int)li;
-                               }
-                               else if (strcmp(this_opt, "bs") == 0) {
-                                       extern int board_au1200fb_panel(void);
-                                       panel_idx = board_au1200fb_panel();
-                               }
-
-                               else
-                               for (i = 0; i < num_panels; i++) {
-                                       if (!strcmp(this_opt, known_lcd_panels[i].name)) {
-                                               panel_idx = i;
-                                               break;
-                                       }
-                               }
-
-                               if ((panel_idx < 0) || (panel_idx >= num_panels)) {
-                                               print_warn("Panel %s not supported!", this_opt);
-                               }
-                               else
-                                       panel_index = panel_idx;
-                       }
-
-                       else if (strncmp(this_opt, "nohwcursor", 10) == 0) {
-                               nohwcursor = 1;
-                       }
-
-                       else if (strncmp(this_opt, "devices:", 8) == 0) {
-                               this_opt += 8;
-                               device_count = simple_strtol(this_opt,
-                                                            &endptr, 0);
-                               if ((device_count < 0) ||
-                                   (device_count > MAX_DEVICE_COUNT))
-                                       device_count = MAX_DEVICE_COUNT;
-                       }
-
-                       else if (strncmp(this_opt, "wincfg:", 7) == 0) {
-                               this_opt += 7;
-                               window_index = simple_strtol(this_opt,
-                                                            &endptr, 0);
-                               if ((window_index < 0) ||
-                                   (window_index >= ARRAY_SIZE(windows)))
-                                       window_index = DEFAULT_WINDOW_INDEX;
-                       }
-
-                       else if (strncmp(this_opt, "off", 3) == 0)
-                               return 1;
-                       /* Unsupported option */
-                       else {
-                               print_warn("Unsupported option \"%s\"", this_opt);
-                       }
-               }
-       }
-       return 0;
-}
-
 static int __init au1200fb_init(void)
 {
-       print_info("" DRIVER_DESC "");
-
-       /* Setup driver with options */
-       if (au1200fb_setup())
-               return -ENODEV;
-
-       /* Point to the panel selected */
-       panel = &known_lcd_panels[panel_index];
-       win = &windows[window_index];
-
-       printk(DRIVER_NAME ": Panel %d %s\n", panel_index, panel->name);
-       printk(DRIVER_NAME ": Win %d %s\n", window_index, win->name);
-
        return platform_driver_register(&au1200fb_driver);
 }
 
index eadf33d0abba4b936d8ddd5421ad68a05c2b5dc6..3c35fb2f688fa6fcf1fcf93f616213b65ebb2026 100644 (file)
 /* Xilinx PSS UART */
 #define PORT_XUARTPS   98
 
+/* Atheros AR933X SoC */
+#define PORT_AR933X    99
+
+
 #ifdef __KERNEL__
 
 #include <linux/compiler.h>
index e908a8123110d8011ffa5a3ed8a595a118dd862b..a56104040e83e8f0870d8e8a04db4a1c7a1ec98f 100644 (file)
@@ -1,13 +1,13 @@
 ##
-## Au1200/Au1550 PSC + DBDMA
+## Au1200/Au1550/Au1300 PSC + DBDMA
 ##
 config SND_SOC_AU1XPSC
-       tristate "SoC Audio for Au1200/Au1250/Au1550"
+       tristate "SoC Audio for Au12xx/Au13xx/Au1550"
        depends on MIPS_ALCHEMY
        help
          This option enables support for the Programmable Serial
          Controllers in AC97 and I2S mode, and the Descriptor-Based DMA
-         Controller (DBDMA) as found on the Au1200/Au1250/Au1550 SoC.
+         Controller (DBDMA) as found on the Au12xx/Au13xx/Au1550 SoC.
 
 config SND_SOC_AU1XPSC_I2S
        tristate
@@ -51,12 +51,14 @@ config SND_SOC_DB1000
          of boards (DB1000/DB1500/DB1100).
 
 config SND_SOC_DB1200
-       tristate "DB1200 AC97+I2S audio support"
+       tristate "DB1200/DB1300/DB1550 Audio support"
        depends on SND_SOC_AU1XPSC
        select SND_SOC_AU1XPSC_AC97
        select SND_SOC_AC97_CODEC
+       select SND_SOC_WM9712
        select SND_SOC_AU1XPSC_I2S
        select SND_SOC_WM8731
        help
-         Select this option to enable audio (AC97 or I2S) on the
-         Alchemy/AMD/RMI DB1200 demoboard.
+         Select this option to enable audio (AC97 and I2S) on the
+         Alchemy/AMD/RMI/NetLogic Db1200, Db1550 and Db1300 evaluation boards.
+         If you need Db1300 touchscreen support, you definitely want to say Y.
index 289312c14b99bf62d13355e7ae5e585bf297991f..44ad118273644b32f7110132cbd409a182f53c26 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * DB1200 ASoC audio fabric support code.
+ * DB1200/DB1300/DB1550 ASoC audio fabric support code.
  *
  * (c) 2008-2011 Manuel Lauss <manuel.lauss@googlemail.com>
  *
@@ -28,6 +28,18 @@ static struct platform_device_id db1200_pids[] = {
        }, {
                .name           = "db1200-i2s",
                .driver_data    = 1,
+       }, {
+               .name           = "db1300-ac97",
+               .driver_data    = 2,
+       }, {
+               .name           = "db1300-i2s",
+               .driver_data    = 3,
+       }, {
+               .name           = "db1550-ac97",
+               .driver_data    = 4,
+       }, {
+               .name           = "db1550-i2s",
+               .driver_data    = 5,
        },
        {},
 };
@@ -49,6 +61,27 @@ static struct snd_soc_card db1200_ac97_machine = {
        .num_links      = 1,
 };
 
+static struct snd_soc_dai_link db1300_ac97_dai = {
+       .name           = "AC97",
+       .stream_name    = "AC97 HiFi",
+       .codec_dai_name = "wm9712-hifi",
+       .cpu_dai_name   = "au1xpsc_ac97.1",
+       .platform_name  = "au1xpsc-pcm.1",
+       .codec_name     = "wm9712-codec.1",
+};
+
+static struct snd_soc_card db1300_ac97_machine = {
+       .name           = "DB1300_AC97",
+       .dai_link       = &db1300_ac97_dai,
+       .num_links      = 1,
+};
+
+static struct snd_soc_card db1550_ac97_machine = {
+       .name           = "DB1550_AC97",
+       .dai_link       = &db1200_ac97_dai,
+       .num_links      = 1,
+};
+
 /*-------------------------  I2S PART  ---------------------------*/
 
 static int db1200_i2s_startup(struct snd_pcm_substream *substream)
@@ -98,11 +131,47 @@ static struct snd_soc_card db1200_i2s_machine = {
        .num_links      = 1,
 };
 
+static struct snd_soc_dai_link db1300_i2s_dai = {
+       .name           = "WM8731",
+       .stream_name    = "WM8731 PCM",
+       .codec_dai_name = "wm8731-hifi",
+       .cpu_dai_name   = "au1xpsc_i2s.2",
+       .platform_name  = "au1xpsc-pcm.2",
+       .codec_name     = "wm8731.0-001b",
+       .ops            = &db1200_i2s_wm8731_ops,
+};
+
+static struct snd_soc_card db1300_i2s_machine = {
+       .name           = "DB1300_I2S",
+       .dai_link       = &db1300_i2s_dai,
+       .num_links      = 1,
+};
+
+static struct snd_soc_dai_link db1550_i2s_dai = {
+       .name           = "WM8731",
+       .stream_name    = "WM8731 PCM",
+       .codec_dai_name = "wm8731-hifi",
+       .cpu_dai_name   = "au1xpsc_i2s.3",
+       .platform_name  = "au1xpsc-pcm.3",
+       .codec_name     = "wm8731.0-001b",
+       .ops            = &db1200_i2s_wm8731_ops,
+};
+
+static struct snd_soc_card db1550_i2s_machine = {
+       .name           = "DB1550_I2S",
+       .dai_link       = &db1550_i2s_dai,
+       .num_links      = 1,
+};
+
 /*-------------------------  COMMON PART  ---------------------------*/
 
 static struct snd_soc_card *db1200_cards[] __devinitdata = {
        &db1200_ac97_machine,
        &db1200_i2s_machine,
+       &db1300_ac97_machine,
+       &db1300_i2s_machine,
+       &db1550_ac97_machine,
+       &db1550_i2s_machine,
 };
 
 static int __devinit db1200_audio_probe(struct platform_device *pdev)
@@ -147,5 +216,5 @@ module_init(db1200_audio_load);
 module_exit(db1200_audio_unload);
 
 MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("DB1200 ASoC audio support");
+MODULE_DESCRIPTION("DB1200/DB1300/DB1550 ASoC audio support");
 MODULE_AUTHOR("Manuel Lauss");
This page took 0.943768 seconds and 5 git commands to generate.