diff options
Diffstat (limited to 'arch/mips/include/asm')
82 files changed, 24059 insertions, 576 deletions
diff --git a/arch/mips/include/asm/bmips.h b/arch/mips/include/asm/bmips.h new file mode 100644 index 00000000000..552a65a0cf2 --- /dev/null +++ b/arch/mips/include/asm/bmips.h @@ -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 */ diff --git a/arch/mips/include/asm/branch.h b/arch/mips/include/asm/branch.h index 37c6857c8d4..888766ae1f8 100644 --- a/arch/mips/include/asm/branch.h +++ b/arch/mips/include/asm/branch.h @@ -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)  { diff --git a/arch/mips/include/asm/cpu.h b/arch/mips/include/asm/cpu.h index 79e4a0dad0d..f9fa2a479dd 100644 --- a/arch/mips/include/asm/cpu.h +++ b/arch/mips/include/asm/cpu.h @@ -171,6 +171,9 @@  #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   */ @@ -264,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  }; diff --git a/arch/mips/include/asm/hazards.h b/arch/mips/include/asm/hazards.h index 4e332165d7b..b4c20e4f87c 100644 --- a/arch/mips/include/asm/hazards.h +++ b/arch/mips/include/asm/hazards.h @@ -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. diff --git a/arch/mips/include/asm/kprobes.h b/arch/mips/include/asm/kprobes.h index e6ea4d4d720..1fbbca01e68 100644 --- a/arch/mips/include/asm/kprobes.h +++ b/arch/mips/include/asm/kprobes.h @@ -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;  }; diff --git a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h index cda1c8070b2..2f0becb4ec8 100644 --- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h +++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h @@ -20,6 +20,10 @@  #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) @@ -34,9 +40,26 @@  #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   */ @@ -63,6 +86,11 @@  #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   */ @@ -104,6 +132,30 @@  #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   */ @@ -130,6 +182,13 @@  #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) @@ -158,14 +217,29 @@  #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 @@ -173,6 +247,8 @@  #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 @@ -187,6 +263,8 @@  #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  /* @@ -229,5 +307,6 @@  #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 index 00000000000..52730555937 --- /dev/null +++ b/arch/mips/include/asm/mach-ath79/ar933x_uart.h @@ -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 index 00000000000..6cb30f2b719 --- /dev/null +++ b/arch/mips/include/asm/mach-ath79/ar933x_uart_platform.h @@ -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 */ diff --git a/arch/mips/include/asm/mach-ath79/ath79.h b/arch/mips/include/asm/mach-ath79/ath79.h index 6a9f168506f..6d0c6c9d562 100644 --- a/arch/mips/include/asm/mach-ath79/ath79.h +++ b/arch/mips/include/asm/mach-ath79/ath79.h @@ -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; diff --git a/arch/mips/include/asm/mach-ath79/irq.h b/arch/mips/include/asm/mach-ath79/irq.h index 189bc6eb9c1..519958fe4e3 100644 --- a/arch/mips/include/asm/mach-ath79/irq.h +++ b/arch/mips/include/asm/mach-ath79/irq.h @@ -10,10 +10,10 @@  #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) @@ -30,6 +30,10 @@  #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 index 00000000000..454885fa30c --- /dev/null +++ b/arch/mips/include/asm/mach-ath79/pci-ath724x.h @@ -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 */ diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_cpu.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_cpu.h index 96a2391ad85..5b8d15bb5fe 100644 --- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_cpu.h +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_cpu.h @@ -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_ */ diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h index 3999ec0aa7f..3d5de96d403 100644 --- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h @@ -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; diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_io.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_io.h index 91180fac6ed..72477a6441d 100644 --- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_io.h +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_io.h @@ -49,9 +49,11 @@  #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 diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_irq.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_irq.h index 5f95577c821..0c3074b871b 100644 --- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_irq.h +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_irq.h @@ -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_ */ diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h index 0ed5230243c..94d4faad29a 100644 --- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h @@ -83,30 +83,86 @@  					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 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 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 -#define EXTIRQ_CFG_CLEAR_ALL		(0xf << 10) -#define EXTIRQ_CFG_MASK_ALL		(0xf << 15) +/* 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 + 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) @@ -147,6 +203,15 @@  				  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 @@ -372,6 +437,7 @@  #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 @@ -402,6 +468,44 @@  #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 @@ -548,6 +652,56 @@  /************************************************************************* + * _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   *************************************************************************/ @@ -562,7 +716,9 @@   * _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 @@ -572,7 +728,13 @@  #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) +  /************************************************************************* @@ -734,6 +896,8 @@  #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) @@ -768,4 +932,45 @@  #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 index 00000000000..ef94ba73646 --- /dev/null +++ b/arch/mips/include/asm/mach-bcm63xx/ioremap.h @@ -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 index 00000000000..9332e788a5c --- /dev/null +++ b/arch/mips/include/asm/mach-bcm63xx/irq.h @@ -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 diff --git a/arch/mips/include/asm/mach-netlogic/cpu-feature-overrides.h b/arch/mips/include/asm/mach-netlogic/cpu-feature-overrides.h index 3b728275b9b..d193fb68cf2 100644 --- a/arch/mips/include/asm/mach-netlogic/cpu-feature-overrides.h +++ b/arch/mips/include/asm/mach-netlogic/cpu-feature-overrides.h @@ -24,24 +24,33 @@  #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/mipsregs.h b/arch/mips/include/asm/mipsregs.h index 2ea7b817feb..7f87d824eeb 100644 --- a/arch/mips/include/asm/mipsregs.h +++ b/arch/mips/include/asm/mipsregs.h @@ -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__ */ diff --git a/arch/mips/include/asm/module.h b/arch/mips/include/asm/module.h index bc01a02cacd..7467d1d933d 100644 --- a/arch/mips/include/asm/module.h +++ b/arch/mips/include/asm/module.h @@ -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 index 00000000000..fdd2f44c7b5 --- /dev/null +++ b/arch/mips/include/asm/netlogic/common.h @@ -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 index 00000000000..72a0c788b47 --- /dev/null +++ b/arch/mips/include/asm/netlogic/haldefs.h @@ -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 index 00000000000..ca95133f1ad --- /dev/null +++ b/arch/mips/include/asm/netlogic/xlp-hal/bridge.h @@ -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 index 00000000000..bf7d41deb9b --- /dev/null +++ b/arch/mips/include/asm/netlogic/xlp-hal/cpucontrol.h @@ -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 index 00000000000..86cc3391e50 --- /dev/null +++ b/arch/mips/include/asm/netlogic/xlp-hal/iomap.h @@ -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 index 00000000000..b6628f7ccf7 --- /dev/null +++ b/arch/mips/include/asm/netlogic/xlp-hal/pic.h @@ -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 index 00000000000..21432f7d89b --- /dev/null +++ b/arch/mips/include/asm/netlogic/xlp-hal/sys.h @@ -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 index 00000000000..6a7046ca094 --- /dev/null +++ b/arch/mips/include/asm/netlogic/xlp-hal/uart.h @@ -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 index 00000000000..1540588e396 --- /dev/null +++ b/arch/mips/include/asm/netlogic/xlp-hal/xlp.h @@ -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 */ diff --git a/arch/mips/include/asm/netlogic/xlr/iomap.h b/arch/mips/include/asm/netlogic/xlr/iomap.h index 2e3a4dd5304..2e768f032e8 100644 --- a/arch/mips/include/asm/netlogic/xlr/iomap.h +++ b/arch/mips/include/asm/netlogic/xlr/iomap.h @@ -106,26 +106,4 @@  #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 index 00000000000..7e39d40be4f --- /dev/null +++ b/arch/mips/include/asm/netlogic/xlr/msidef.h @@ -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 */ diff --git a/arch/mips/include/asm/netlogic/xlr/pic.h b/arch/mips/include/asm/netlogic/xlr/pic.h index 5cceb746f08..868013e62f3 100644 --- a/arch/mips/include/asm/netlogic/xlr/pic.h +++ b/arch/mips/include/asm/netlogic/xlr/pic.h @@ -193,39 +193,72 @@  /* 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 */ diff --git a/arch/mips/include/asm/netlogic/xlr/xlr.h b/arch/mips/include/asm/netlogic/xlr/xlr.h index 3e6372692a0..ff4a17b0bf7 100644 --- a/arch/mips/include/asm/netlogic/xlr/xlr.h +++ b/arch/mips/include/asm/netlogic/xlr/xlr.h @@ -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 index 00000000000..3c74d826e2e --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-address.h @@ -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 index 00000000000..91415a85e8d --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-asxx-defs.h @@ -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 diff --git a/arch/mips/include/asm/octeon/cvmx-bootinfo.h b/arch/mips/include/asm/octeon/cvmx-bootinfo.h index 4e4c3a8282d..1db1dc2724c 100644 --- a/arch/mips/include/asm/octeon/cvmx-bootinfo.h +++ b/arch/mips/include/asm/octeon/cvmx-bootinfo.h @@ -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 index 00000000000..614653b686a --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-cmd-queue.h @@ -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 index 00000000000..26835d1b43b --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-config.h @@ -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 index 00000000000..abbf42d05e5 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-dbg-defs.h @@ -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 index 00000000000..c34ad04789c --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-dpi-defs.h @@ -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 index 00000000000..a6939fc8ba1 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-fau.h @@ -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 index 00000000000..bf5546b9011 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-fpa-defs.h @@ -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 index 00000000000..1f04f965873 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-fpa.h @@ -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 index 00000000000..946a43a73fd --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-gmxx-defs.h @@ -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 index 00000000000..88527fa835c --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-helper-board.h @@ -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 index 00000000000..5ff8c93198d --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-helper-fpa.h @@ -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 index 00000000000..077f0e9d3b2 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-helper-loop.h @@ -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 index 00000000000..8df4c7fafdb --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-helper-npi.h @@ -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 index 00000000000..78295ba0050 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-helper-rgmii.h @@ -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 index 00000000000..9a9b6c103ed --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-helper-sgmii.h @@ -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 index 00000000000..9f1c6b968f9 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-helper-spi.h @@ -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 index 00000000000..6a6e52fc22c --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-helper-util.h @@ -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 index 00000000000..f6fbc4f45b5 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-helper-xaui.h @@ -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 index 00000000000..3169cd79f2a --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-helper.h @@ -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 index 00000000000..115a552c5c7 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-ipd.h @@ -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 index 00000000000..d88ab8d8e37 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-mdio.h @@ -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 diff --git a/arch/mips/include/asm/octeon/cvmx-mio-defs.h b/arch/mips/include/asm/octeon/cvmx-mio-defs.h index 52b14a333ad..b1774126736 100644 --- a/arch/mips/include/asm/octeon/cvmx-mio-defs.h +++ b/arch/mips/include/asm/octeon/cvmx-mio-defs.h @@ -43,6 +43,22 @@  #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)) @@ -68,14 +85,25 @@  #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 { diff --git a/arch/mips/include/asm/octeon/cvmx-npei-defs.h b/arch/mips/include/asm/octeon/cvmx-npei-defs.h index 9899a9d2ba7..a3075f733ca 100644 --- a/arch/mips/include/asm/octeon/cvmx-npei-defs.h +++ b/arch/mips/include/asm/octeon/cvmx-npei-defs.h @@ -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) diff --git a/arch/mips/include/asm/octeon/cvmx-pciercx-defs.h b/arch/mips/include/asm/octeon/cvmx-pciercx-defs.h index f8cb88902ef..7b1dc8b74e5 100644 --- a/arch/mips/include/asm/octeon/cvmx-pciercx-defs.h +++ b/arch/mips/include/asm/octeon/cvmx-pciercx-defs.h @@ -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 index 00000000000..d45952df5f5 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-pcsx-defs.h @@ -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 index 00000000000..55d120fe8ae --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-pcsxx-defs.h @@ -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 index 00000000000..be189a2585e --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-pemx-defs.h @@ -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 diff --git a/arch/mips/include/asm/octeon/cvmx-pexp-defs.h b/arch/mips/include/asm/octeon/cvmx-pexp-defs.h index 5ab8679d89a..4438d211988 100644 --- a/arch/mips/include/asm/octeon/cvmx-pexp-defs.h +++ b/arch/mips/include/asm/octeon/cvmx-pexp-defs.h @@ -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 @@ -25,13 +25,6 @@   * 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__ @@ -139,7 +132,7 @@  #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)) @@ -152,7 +145,10 @@  #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)) @@ -206,6 +202,7 @@  #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)) @@ -214,12 +211,14 @@  #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 index 00000000000..5a369100ca6 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-pip-defs.h @@ -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 index 00000000000..78dbce8f2c5 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-pip.h @@ -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 index 00000000000..50e779cf1ad --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-pko-defs.h @@ -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 index 00000000000..de3412aada5 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-pko.h @@ -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 index 00000000000..999aefe3274 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-pow.h @@ -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 index 00000000000..96b70cfd624 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-scratch.h @@ -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 index 00000000000..7c6c901d3d2 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-sli-defs.h @@ -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 index 00000000000..e814648953a --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-spi.h @@ -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 index 00000000000..b16940e32c8 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-spxx-defs.h @@ -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 index 00000000000..7be7e9ed746 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-sriox-defs.h @@ -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 index 00000000000..d82b366c279 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-srxx-defs.h @@ -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 index 00000000000..4f209b62cae --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-stxx-defs.h @@ -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 index 00000000000..653610953d2 --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-wqe.h @@ -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__ */ diff --git a/arch/mips/include/asm/octeon/cvmx.h b/arch/mips/include/asm/octeon/cvmx.h index 7e1286706d4..740be97a325 100644 --- a/arch/mips/include/asm/octeon/cvmx.h +++ b/arch/mips/include/asm/octeon/cvmx.h @@ -31,6 +31,27 @@  #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 diff --git a/arch/mips/include/asm/octeon/octeon-feature.h b/arch/mips/include/asm/octeon/octeon-feature.h index cba6fbed9f4..8008da2f877 100644 --- a/arch/mips/include/asm/octeon/octeon-feature.h +++ b/arch/mips/include/asm/octeon/octeon-feature.h @@ -31,8 +31,14 @@  #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;  } diff --git a/arch/mips/include/asm/octeon/octeon-model.h b/arch/mips/include/asm/octeon/octeon-model.h index 700f88e31ca..4e338a4d942 100644 --- a/arch/mips/include/asm/octeon/octeon-model.h +++ b/arch/mips/include/asm/octeon/octeon-model.h @@ -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 @@ -24,14 +24,6 @@   * 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 @@ -63,21 +57,48 @@  #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   */ @@ -90,10 +111,8 @@  #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 @@ -103,10 +122,8 @@  #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 @@ -125,8 +142,7 @@  #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  /* @@ -138,10 +154,8 @@  #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 @@ -174,28 +188,23 @@  #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) @@ -221,90 +230,55 @@  #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 diff --git a/arch/mips/include/asm/octeon/pci-octeon.h b/arch/mips/include/asm/octeon/pci-octeon.h index fba2ba200f5..c66734bd338 100644 --- a/arch/mips/include/asm/octeon/pci-octeon.h +++ b/arch/mips/include/asm/octeon/pci-octeon.h @@ -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  };  /* diff --git a/arch/mips/include/asm/traps.h b/arch/mips/include/asm/traps.h index 90ff2f497c5..ff74aec3561 100644 --- a/arch/mips/include/asm/traps.h +++ b/arch/mips/include/asm/traps.h @@ -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 */  |