net/axgbe: add minimal dev init and uninit support
Subsystems (2)
PATCH 1/16 net/axgbe: add minimal dev init and uninit support
--- MAINTAINERS | 7 + config/common_base | 6 + drivers/net/Makefile | 1 + drivers/net/axgbe/Makefile | 146 +++++++++++++++++++ drivers/net/axgbe/axgbe_common.h | 172 ++++++++++++++++++++++ drivers/net/axgbe/axgbe_ethdev.c | 216 ++++++++++++++++++++++++++++ drivers/net/axgbe/axgbe_ethdev.h | 145 +++++++++++++++++++ drivers/net/axgbe/axgbe_logs.h | 145 +++++++++++++++++++ drivers/net/axgbe/rte_pmd_axgbe_version.map | 4 + mk/rte.app.mk | 1 + 10 files changed, 843 insertions(+) create mode 100644 drivers/net/axgbe/Makefile create mode 100644 drivers/net/axgbe/axgbe_common.h create mode 100644 drivers/net/axgbe/axgbe_ethdev.c create mode 100644 drivers/net/axgbe/axgbe_ethdev.h create mode 100644 drivers/net/axgbe/axgbe_logs.h create mode 100644 drivers/net/axgbe/rte_pmd_axgbe_version.map
MAINTAINERS +7 -0
@@ -347,6 +347,13 @@ F: drivers/net/ena/ F: doc/guides/nics/ena.rst F: doc/guides/nics/features/ena.ini +AMD AXGBE PMD +M: Ravi Kumar <[email protected]> +F: drivers/net/axgbe/ +F: doc/guides/nics/axgbe.rst +F: doc/guides/nics/features/axgbe.ini + + Atomic Rules ARK M: Shepard Siegel <[email protected]> M: Ed Czeck <[email protected]>
config/common_base +6 -0
@@ -445,6 +445,12 @@ CONFIG_RTE_LIBRTE_AVP_DEBUG_DRIVER=y CONFIG_RTE_LIBRTE_AVP_DEBUG_BUFFERS=n # +# Compile AMD PMD +# +CONFIG_RTE_LIBRTE_AXGBE_PMD=n +CONFIG_RTE_LIBRTE_AXGBE_DEBUG_INIT=n + +# # Compile the TAP PMD # It is enabled by default for Linux only. #
drivers/net/Makefile +1 -0
@@ -39,6 +39,7 @@ endif DIRS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += af_packet DIRS-$(CONFIG_RTE_LIBRTE_ARK_PMD) += ark DIRS-$(CONFIG_RTE_LIBRTE_AVP_PMD) += avp +DIRS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe DIRS-$(CONFIG_RTE_LIBRTE_BNX2X_PMD) += bnx2x DIRS-$(CONFIG_RTE_LIBRTE_PMD_BOND) += bonding DIRS-$(CONFIG_RTE_LIBRTE_CXGBE_PMD) += cxgbe
drivers/net/axgbe/Makefile new file +146 -0
146 lines not on this page · raw message
drivers/net/axgbe/axgbe_common.h new file +172 -0
172 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.c new file +216 -0
216 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.h new file +145 -0
145 lines not on this page · raw message
drivers/net/axgbe/axgbe_logs.h new file +145 -0
145 lines not on this page · raw message
drivers/net/axgbe/rte_pmd_axgbe_version.map new file +4 -0
@@ -0,0 +1,4 @@ +DPDK_17.11 { + + local: *; +};
mk/rte.app.mk +1 -0
@@ -120,6 +120,7 @@ _LDLIBS-$(CONFIG_RTE_DRIVER_MEMPOOL_STACK) += -lrte_mempool_stack _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += -lrte_pmd_af_packet _LDLIBS-$(CONFIG_RTE_LIBRTE_ARK_PMD) += -lrte_pmd_ark _LDLIBS-$(CONFIG_RTE_LIBRTE_AVP_PMD) += -lrte_pmd_avp +_LDLIBS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += -lrte_pmd_axgbe _LDLIBS-$(CONFIG_RTE_LIBRTE_BNX2X_PMD) += -lrte_pmd_bnx2x -lz _LDLIBS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += -lrte_pmd_bnxt _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_BOND) += -lrte_pmd_bond
Signature · 1 line
2.7.4
PATCH 2/16 net/axgbe: add register map and related macros
--- drivers/net/axgbe/axgbe_common.h | 1645 +++++++++++++++++++++++++++++++++++++- 1 file changed, 1644 insertions(+), 1 deletion(-)
drivers/net/axgbe/axgbe_common.h +1644 -1
@@ -167,6 +167,1649 @@#define ARRAY_SIZE (arr) (sizeof(arr) / sizeof((arr)[0]))#endif -#define HZ 250 +#define AXGBE_HZ 250 +/* DMA register offsets */ +#define DMA_MR 0x3000 +#define DMA_SBMR 0x3004 +#define DMA_ISR 0x3008 +#define DMA_AXIARCR 0x3010 +#define DMA_AXIAWCR 0x3018 +#define DMA_AXIAWRCR 0x301c +#define DMA_DSR0 0x3020 +#define DMA_DSR1 0x3024 +#define EDMA_TX_CONTROL 0x3040 +#define EDMA_RX_CONTROL 0x3044 + +/* DMA register entry bit positions and sizes */ +#define DMA_AXIARCR_DRC_INDEX 0 +#define DMA_AXIARCR_DRC_WIDTH 4 +#define DMA_AXIARCR_DRD_INDEX 4 +#define DMA_AXIARCR_DRD_WIDTH 2 +#define DMA_AXIARCR_TEC_INDEX 8 +#define DMA_AXIARCR_TEC_WIDTH 4 +#define DMA_AXIARCR_TED_INDEX 12 +#define DMA_AXIARCR_TED_WIDTH 2 +#define DMA_AXIARCR_THC_INDEX 16 +#define DMA_AXIARCR_THC_WIDTH 4 +#define DMA_AXIARCR_THD_INDEX 20 +#define DMA_AXIARCR_THD_WIDTH 2 +#define DMA_AXIAWCR_DWC_INDEX 0 +#define DMA_AXIAWCR_DWC_WIDTH 4 +#define DMA_AXIAWCR_DWD_INDEX 4 +#define DMA_AXIAWCR_DWD_WIDTH 2 +#define DMA_AXIAWCR_RPC_INDEX 8 +#define DMA_AXIAWCR_RPC_WIDTH 4 +#define DMA_AXIAWCR_RPD_INDEX 12 +#define DMA_AXIAWCR_RPD_WIDTH 2 +#define DMA_AXIAWCR_RHC_INDEX 16 +#define DMA_AXIAWCR_RHC_WIDTH 4 +#define DMA_AXIAWCR_RHD_INDEX 20 +#define DMA_AXIAWCR_RHD_WIDTH 2 +#define DMA_AXIAWCR_RDC_INDEX 24 +#define DMA_AXIAWCR_RDC_WIDTH 4 +#define DMA_AXIAWCR_RDD_INDEX 28 +#define DMA_AXIAWCR_RDD_WIDTH 2 +#define DMA_AXIAWRCR_TDWC_INDEX 0 +#define DMA_AXIAWRCR_TDWC_WIDTH 4 +#define DMA_AXIAWRCR_TDWD_INDEX 4 +#define DMA_AXIAWRCR_TDWD_WIDTH 4 +#define DMA_AXIAWRCR_RDRC_INDEX 8 +#define DMA_AXIAWRCR_RDRC_WIDTH 4 +#define DMA_ISR_MACIS_INDEX 17 +#define DMA_ISR_MACIS_WIDTH 1 +#define DMA_ISR_MTLIS_INDEX 16 +#define DMA_ISR_MTLIS_WIDTH 1 +#define DMA_MR_INTM_INDEX 12 +#define DMA_MR_INTM_WIDTH 2 +#define DMA_MR_SWR_INDEX 0 +#define DMA_MR_SWR_WIDTH 1 +#define DMA_SBMR_WR_OSR_INDEX 24 +#define DMA_SBMR_WR_OSR_WIDTH 6 +#define DMA_SBMR_RD_OSR_INDEX 16 +#define DMA_SBMR_RD_OSR_WIDTH 6 +#define DMA_SBMR_AAL_INDEX 12 +#define DMA_SBMR_AAL_WIDTH 1 +#define DMA_SBMR_EAME_INDEX 11 +#define DMA_SBMR_EAME_WIDTH 1 +#define DMA_SBMR_BLEN_256_INDEX 7 +#define DMA_SBMR_BLEN_256_WIDTH 1 +#define DMA_SBMR_BLEN_32_INDEX 4 +#define DMA_SBMR_BLEN_32_WIDTH 1 +#define DMA_SBMR_UNDEF_INDEX 0 +#define DMA_SBMR_UNDEF_WIDTH 1 + +/* DMA register values */ +#define DMA_DSR_RPS_WIDTH 4 +#define DMA_DSR_TPS_WIDTH 4 +#define DMA_DSR_Q_WIDTH (DMA_DSR_RPS_WIDTH + DMA_DSR_TPS_WIDTH) +#define DMA_DSR0_RPS_START 8 +#define DMA_DSR0_TPS_START 12 +#define DMA_DSRX_FIRST_QUEUE 3 +#define DMA_DSRX_INC 4 +#define DMA_DSRX_QPR 4 +#define DMA_DSRX_RPS_START 0 +#define DMA_DSRX_TPS_START 4 +#define DMA_TPS_STOPPED 0x00 +#define DMA_TPS_SUSPENDED 0x06 + +/* DMA channel register offsets +* Multiple channels can be active. The first channel has registers +* that begin at 0x3100. Each subsequent channel has registers that +* are accessed using an offset of 0x80 from the previous channel. +*/ +#define DMA_CH_BASE 0x3100 +#define DMA_CH_INC 0x80 + +#define DMA_CH_CR 0x00 +#define DMA_CH_TCR 0x04 +#define DMA_CH_RCR 0x08 +#define DMA_CH_TDLR_HI 0x10 +#define DMA_CH_TDLR_LO 0x14 +#define DMA_CH_RDLR_HI 0x18 +#define DMA_CH_RDLR_LO 0x1c +#define DMA_CH_TDTR_LO 0x24 +#define DMA_CH_RDTR_LO 0x2c +#define DMA_CH_TDRLR 0x30 +#define DMA_CH_RDRLR 0x34 +#define DMA_CH_IER 0x38 +#define DMA_CH_RIWT 0x3c +#define DMA_CH_CATDR_LO 0x44 +#define DMA_CH_CARDR_LO 0x4c +#define DMA_CH_CATBR_HI 0x50 +#define DMA_CH_CATBR_LO 0x54 +#define DMA_CH_CARBR_HI 0x58 +#define DMA_CH_CARBR_LO 0x5c +#define DMA_CH_SR 0x60 + +/* DMA channel register entry bit positions and sizes */ +#define DMA_CH_CR_PBLX8_INDEX 16 +#define DMA_CH_CR_PBLX8_WIDTH 1 +#define DMA_CH_CR_SPH_INDEX 24 +#define DMA_CH_CR_SPH_WIDTH 1 +#define DMA_CH_IER_AIE_INDEX 14 +#define DMA_CH_IER_AIE_WIDTH 1 +#define DMA_CH_IER_FBEE_INDEX 12 +#define DMA_CH_IER_FBEE_WIDTH 1 +#define DMA_CH_IER_NIE_INDEX 15 +#define DMA_CH_IER_NIE_WIDTH 1 +#define DMA_CH_IER_RBUE_INDEX 7 +#define DMA_CH_IER_RBUE_WIDTH 1 +#define DMA_CH_IER_RIE_INDEX 6 +#define DMA_CH_IER_RIE_WIDTH 1 +#define DMA_CH_IER_RSE_INDEX 8 +#define DMA_CH_IER_RSE_WIDTH 1 +#define DMA_CH_IER_TBUE_INDEX 2 +#define DMA_CH_IER_TBUE_WIDTH 1 +#define DMA_CH_IER_TIE_INDEX 0 +#define DMA_CH_IER_TIE_WIDTH 1 +#define DMA_CH_IER_TXSE_INDEX 1 +#define DMA_CH_IER_TXSE_WIDTH 1 +#define DMA_CH_RCR_PBL_INDEX 16 +#define DMA_CH_RCR_PBL_WIDTH 6 +#define DMA_CH_RCR_RBSZ_INDEX 1 +#define DMA_CH_RCR_RBSZ_WIDTH 14 +#define DMA_CH_RCR_SR_INDEX 0 +#define DMA_CH_RCR_SR_WIDTH 1 +#define DMA_CH_RIWT_RWT_INDEX 0 +#define DMA_CH_RIWT_RWT_WIDTH 8 +#define DMA_CH_SR_FBE_INDEX 12 +#define DMA_CH_SR_FBE_WIDTH 1 +#define DMA_CH_SR_RBU_INDEX 7 +#define DMA_CH_SR_RBU_WIDTH 1 +#define DMA_CH_SR_RI_INDEX 6 +#define DMA_CH_SR_RI_WIDTH 1 +#define DMA_CH_SR_RPS_INDEX 8 +#define DMA_CH_SR_RPS_WIDTH 1 +#define DMA_CH_SR_TBU_INDEX 2 +#define DMA_CH_SR_TBU_WIDTH 1 +#define DMA_CH_SR_TI_INDEX 0 +#define DMA_CH_SR_TI_WIDTH 1 +#define DMA_CH_SR_TPS_INDEX 1 +#define DMA_CH_SR_TPS_WIDTH 1 +#define DMA_CH_TCR_OSP_INDEX 4 +#define DMA_CH_TCR_OSP_WIDTH 1 +#define DMA_CH_TCR_PBL_INDEX 16 +#define DMA_CH_TCR_PBL_WIDTH 6 +#define DMA_CH_TCR_ST_INDEX 0 +#define DMA_CH_TCR_ST_WIDTH 1 +#define DMA_CH_TCR_TSE_INDEX 12 +#define DMA_CH_TCR_TSE_WIDTH 1 + +/* DMA channel register values */ +#define DMA_OSP_DISABLE 0x00 +#define DMA_OSP_ENABLE 0x01 +#define DMA_PBL_1 1 +#define DMA_PBL_2 2 +#define DMA_PBL_4 4 +#define DMA_PBL_8 8 +#define DMA_PBL_16 16 +#define DMA_PBL_32 32 +#define DMA_PBL_64 64/* 8 x 8 */ +#define DMA_PBL_128 128/* 8 x 16 */ +#define DMA_PBL_256 256/* 8 x 32 */ +#define DMA_PBL_X8_DISABLE 0x00 +#define DMA_PBL_X8_ENABLE 0x01 + +/* MAC register offsets */ +#define MAC_TCR 0x0000 +#define MAC_RCR 0x0004 +#define MAC_PFR 0x0008 +#define MAC_WTR 0x000c +#define MAC_HTR0 0x0010 +#define MAC_VLANTR 0x0050 +#define MAC_VLANHTR 0x0058 +#define MAC_VLANIR 0x0060 +#define MAC_IVLANIR 0x0064 +#define MAC_RETMR 0x006c +#define MAC_Q0TFCR 0x0070 +#define MAC_RFCR 0x0090 +#define MAC_RQC0R 0x00a0 +#define MAC_RQC1R 0x00a4 +#define MAC_RQC2R 0x00a8 +#define MAC_RQC3R 0x00ac +#define MAC_ISR 0x00b0 +#define MAC_IER 0x00b4 +#define MAC_RTSR 0x00b8 +#define MAC_PMTCSR 0x00c0 +#define MAC_RWKPFR 0x00c4 +#define MAC_LPICSR 0x00d0 +#define MAC_LPITCR 0x00d4 +#define MAC_VR 0x0110 +#define MAC_DR 0x0114 +#define MAC_HWF0R 0x011c +#define MAC_HWF1R 0x0120 +#define MAC_HWF2R 0x0124 +#define MAC_MDIOSCAR 0x0200 +#define MAC_MDIOSCCDR 0x0204 +#define MAC_MDIOISR 0x0214 +#define MAC_MDIOIER 0x0218 +#define MAC_MDIOCL22R 0x0220 +#define MAC_GPIOCR 0x0278 +#define MAC_GPIOSR 0x027c +#define MAC_MACA0HR 0x0300 +#define MAC_MACA0LR 0x0304 +#define MAC_MACA1HR 0x0308 +#define MAC_MACA1LR 0x030c +#define MAC_RSSCR 0x0c80 +#define MAC_RSSAR 0x0c88 +#define MAC_RSSDR 0x0c8c +#define MAC_TSCR 0x0d00 +#define MAC_SSIR 0x0d04 +#define MAC_STSR 0x0d08 +#define MAC_STNR 0x0d0c +#define MAC_STSUR 0x0d10 +#define MAC_STNUR 0x0d14 +#define MAC_TSAR 0x0d18 +#define MAC_TSSR 0x0d20 +#define MAC_TXSNR 0x0d30 +#define MAC_TXSSR 0x0d34 + +#define MAC_QTFCR_INC 4 +#define MAC_MACA_INC 4 +#define MAC_HTR_INC 4 + +#define MAC_RQC2_INC 4 +#define MAC_RQC2_Q_PER_REG 4 + +/* MAC register entry bit positions and sizes */ +#define MAC_HWF0R_ADDMACADRSEL_INDEX 18 +#define MAC_HWF0R_ADDMACADRSEL_WIDTH 5 +#define MAC_HWF0R_ARPOFFSEL_INDEX 9 +#define MAC_HWF0R_ARPOFFSEL_WIDTH 1 +#define MAC_HWF0R_EEESEL_INDEX 13 +#define MAC_HWF0R_EEESEL_WIDTH 1 +#define MAC_HWF0R_GMIISEL_INDEX 1 +#define MAC_HWF0R_GMIISEL_WIDTH 1 +#define MAC_HWF0R_MGKSEL_INDEX 7 +#define MAC_HWF0R_MGKSEL_WIDTH 1 +#define MAC_HWF0R_MMCSEL_INDEX 8 +#define MAC_HWF0R_MMCSEL_WIDTH 1 +#define MAC_HWF0R_RWKSEL_INDEX 6 +#define MAC_HWF0R_RWKSEL_WIDTH 1 +#define MAC_HWF0R_RXCOESEL_INDEX 16 +#define MAC_HWF0R_RXCOESEL_WIDTH 1 +#define MAC_HWF0R_SAVLANINS_INDEX 27 +#define MAC_HWF0R_SAVLANINS_WIDTH 1 +#define MAC_HWF0R_SMASEL_INDEX 5 +#define MAC_HWF0R_SMASEL_WIDTH 1 +#define MAC_HWF0R_TSSEL_INDEX 12 +#define MAC_HWF0R_TSSEL_WIDTH 1 +#define MAC_HWF0R_TSSTSSEL_INDEX 25 +#define MAC_HWF0R_TSSTSSEL_WIDTH 2 +#define MAC_HWF0R_TXCOESEL_INDEX 14 +#define MAC_HWF0R_TXCOESEL_WIDTH 1 +#define MAC_HWF0R_VLHASH_INDEX 4 +#define MAC_HWF0R_VLHASH_WIDTH 1 +#define MAC_HWF1R_ADDR64_INDEX 14 +#define MAC_HWF1R_ADDR64_WIDTH 2 +#define MAC_HWF1R_ADVTHWORD_INDEX 13 +#define MAC_HWF1R_ADVTHWORD_WIDTH 1 +#define MAC_HWF1R_DBGMEMA_INDEX 19 +#define MAC_HWF1R_DBGMEMA_WIDTH 1 +#define MAC_HWF1R_DCBEN_INDEX 16 +#define MAC_HWF1R_DCBEN_WIDTH 1 +#define MAC_HWF1R_HASHTBLSZ_INDEX 24 +#define MAC_HWF1R_HASHTBLSZ_WIDTH 3 +#define MAC_HWF1R_L3L4FNUM_INDEX 27 +#define MAC_HWF1R_L3L4FNUM_WIDTH 4 +#define MAC_HWF1R_NUMTC_INDEX 21 +#define MAC_HWF1R_NUMTC_WIDTH 3 +#define MAC_HWF1R_RSSEN_INDEX 20 +#define MAC_HWF1R_RSSEN_WIDTH 1 +#define MAC_HWF1R_RXFIFOSIZE_INDEX 0 +#define MAC_HWF1R_RXFIFOSIZE_WIDTH 5 +#define MAC_HWF1R_SPHEN_INDEX 17 +#define MAC_HWF1R_SPHEN_WIDTH 1 +#define MAC_HWF1R_TSOEN_INDEX 18 +#define MAC_HWF1R_TSOEN_WIDTH 1 +#define MAC_HWF1R_TXFIFOSIZE_INDEX 6 +#define MAC_HWF1R_TXFIFOSIZE_WIDTH 5 +#define MAC_HWF2R_AUXSNAPNUM_INDEX 28 +#define MAC_HWF2R_AUXSNAPNUM_WIDTH 3 +#define MAC_HWF2R_PPSOUTNUM_INDEX 24 +#define MAC_HWF2R_PPSOUTNUM_WIDTH 3 +#define MAC_HWF2R_RXCHCNT_INDEX 12 +#define MAC_HWF2R_RXCHCNT_WIDTH 4 +#define MAC_HWF2R_RXQCNT_INDEX 0 +#define MAC_HWF2R_RXQCNT_WIDTH 4 +#define MAC_HWF2R_TXCHCNT_INDEX 18 +#define MAC_HWF2R_TXCHCNT_WIDTH 4 +#define MAC_HWF2R_TXQCNT_INDEX 6 +#define MAC_HWF2R_TXQCNT_WIDTH 4 +#define MAC_IER_TSIE_INDEX 12 +#define MAC_IER_TSIE_WIDTH 1 +#define MAC_ISR_MMCRXIS_INDEX 9 +#define MAC_ISR_MMCRXIS_WIDTH 1 +#define MAC_ISR_MMCTXIS_INDEX 10 +#define MAC_ISR_MMCTXIS_WIDTH 1 +#define MAC_ISR_PMTIS_INDEX 4 +#define MAC_ISR_PMTIS_WIDTH 1 +#define MAC_ISR_SMI_INDEX 1 +#define MAC_ISR_SMI_WIDTH 1 +#define MAC_ISR_LSI_INDEX 0 +#define MAC_ISR_LSI_WIDTH 1 +#define MAC_ISR_LS_INDEX 24 +#define MAC_ISR_LS_WIDTH 2 +#define MAC_ISR_TSIS_INDEX 12 +#define MAC_ISR_TSIS_WIDTH 1 +#define MAC_MACA1HR_AE_INDEX 31 +#define MAC_MACA1HR_AE_WIDTH 1 +#define MAC_MDIOIER_SNGLCOMPIE_INDEX 12 +#define MAC_MDIOIER_SNGLCOMPIE_WIDTH 1 +#define MAC_MDIOISR_SNGLCOMPINT_INDEX 12 +#define MAC_MDIOISR_SNGLCOMPINT_WIDTH 1 +#define MAC_MDIOSCAR_DA_INDEX 21 +#define MAC_MDIOSCAR_DA_WIDTH 5 +#define MAC_MDIOSCAR_PA_INDEX 16 +#define MAC_MDIOSCAR_PA_WIDTH 5 +#define MAC_MDIOSCAR_RA_INDEX 0 +#define MAC_MDIOSCAR_RA_WIDTH 16 +#define MAC_MDIOSCAR_REG_INDEX 0 +#define MAC_MDIOSCAR_REG_WIDTH 21 +#define MAC_MDIOSCCDR_BUSY_INDEX 22 +#define MAC_MDIOSCCDR_BUSY_WIDTH 1 +#define MAC_MDIOSCCDR_CMD_INDEX 16 +#define MAC_MDIOSCCDR_CMD_WIDTH 2 +#define MAC_MDIOSCCDR_CR_INDEX 19 +#define MAC_MDIOSCCDR_CR_WIDTH 3 +#define MAC_MDIOSCCDR_DATA_INDEX 0 +#define MAC_MDIOSCCDR_DATA_WIDTH 16 +#define MAC_MDIOSCCDR_SADDR_INDEX 18 +#define MAC_MDIOSCCDR_SADDR_WIDTH 1 +#define MAC_PFR_HMC_INDEX 2 +#define MAC_PFR_HMC_WIDTH 1 +#define MAC_PFR_HPF_INDEX 10 +#define MAC_PFR_HPF_WIDTH 1 +#define MAC_PFR_HUC_INDEX 1 +#define MAC_PFR_HUC_WIDTH 1 +#define MAC_PFR_PM_INDEX 4 +#define MAC_PFR_PM_WIDTH 1 +#define MAC_PFR_PR_INDEX 0 +#define MAC_PFR_PR_WIDTH 1 +#define MAC_PFR_VTFE_INDEX 16 +#define MAC_PFR_VTFE_WIDTH 1 +#define MAC_PMTCSR_MGKPKTEN_INDEX 1 +#define MAC_PMTCSR_MGKPKTEN_WIDTH 1 +#define MAC_PMTCSR_PWRDWN_INDEX 0 +#define MAC_PMTCSR_PWRDWN_WIDTH 1 +#define MAC_PMTCSR_RWKFILTRST_INDEX 31 +#define MAC_PMTCSR_RWKFILTRST_WIDTH 1 +#define MAC_PMTCSR_RWKPKTEN_INDEX 2 +#define MAC_PMTCSR_RWKPKTEN_WIDTH 1 +#define MAC_Q0TFCR_PT_INDEX 16 +#define MAC_Q0TFCR_PT_WIDTH 16 +#define MAC_Q0TFCR_TFE_INDEX 1 +#define MAC_Q0TFCR_TFE_WIDTH 1 +#define MAC_RCR_ACS_INDEX 1 +#define MAC_RCR_ACS_WIDTH 1 +#define MAC_RCR_CST_INDEX 2 +#define MAC_RCR_CST_WIDTH 1 +#define MAC_RCR_DCRCC_INDEX 3 +#define MAC_RCR_DCRCC_WIDTH 1 +#define MAC_RCR_HDSMS_INDEX 12 +#define MAC_RCR_HDSMS_WIDTH 3 +#define MAC_RCR_IPC_INDEX 9 +#define MAC_RCR_IPC_WIDTH 1 +#define MAC_RCR_JE_INDEX 8 +#define MAC_RCR_JE_WIDTH 1 +#define MAC_RCR_LM_INDEX 10 +#define MAC_RCR_LM_WIDTH 1 +#define MAC_RCR_RE_INDEX 0 +#define MAC_RCR_RE_WIDTH 1 +#define MAC_RFCR_PFCE_INDEX 8 +#define MAC_RFCR_PFCE_WIDTH 1 +#define MAC_RFCR_RFE_INDEX 0 +#define MAC_RFCR_RFE_WIDTH 1 +#define MAC_RFCR_UP_INDEX 1 +#define MAC_RFCR_UP_WIDTH 1 +#define MAC_RQC0R_RXQ0EN_INDEX 0 +#define MAC_RQC0R_RXQ0EN_WIDTH 2 +#define MAC_RSSAR_ADDRT_INDEX 2 +#define MAC_RSSAR_ADDRT_WIDTH 1 +#define MAC_RSSAR_CT_INDEX 1 +#define MAC_RSSAR_CT_WIDTH 1 +#define MAC_RSSAR_OB_INDEX 0 +#define MAC_RSSAR_OB_WIDTH 1 +#define MAC_RSSAR_RSSIA_INDEX 8 +#define MAC_RSSAR_RSSIA_WIDTH 8 +#define MAC_RSSCR_IP2TE_INDEX 1 +#define MAC_RSSCR_IP2TE_WIDTH 1 +#define MAC_RSSCR_RSSE_INDEX 0 +#define MAC_RSSCR_RSSE_WIDTH 1 +#define MAC_RSSCR_TCP4TE_INDEX 2 +#define MAC_RSSCR_TCP4TE_WIDTH 1 +#define MAC_RSSCR_UDP4TE_INDEX 3 +#define MAC_RSSCR_UDP4TE_WIDTH 1 +#define MAC_RSSDR_DMCH_INDEX 0 +#define MAC_RSSDR_DMCH_WIDTH 4 +#define MAC_SSIR_SNSINC_INDEX 8 +#define MAC_SSIR_SNSINC_WIDTH 8 +#define MAC_SSIR_SSINC_INDEX 16 +#define MAC_SSIR_SSINC_WIDTH 8 +#define MAC_TCR_SS_INDEX 29 +#define MAC_TCR_SS_WIDTH 2 +#define MAC_TCR_TE_INDEX 0 +#define MAC_TCR_TE_WIDTH 1 +#define MAC_TSCR_AV8021ASMEN_INDEX 28 +#define MAC_TSCR_AV8021ASMEN_WIDTH 1 +#define MAC_TSCR_SNAPTYPSEL_INDEX 16 +#define MAC_TSCR_SNAPTYPSEL_WIDTH 2 +#define MAC_TSCR_TSADDREG_INDEX 5 +#define MAC_TSCR_TSADDREG_WIDTH 1 +#define MAC_TSCR_TSCFUPDT_INDEX 1 +#define MAC_TSCR_TSCFUPDT_WIDTH 1 +#define MAC_TSCR_TSCTRLSSR_INDEX 9 +#define MAC_TSCR_TSCTRLSSR_WIDTH 1 +#define MAC_TSCR_TSENA_INDEX 0 +#define MAC_TSCR_TSENA_WIDTH 1 +#define MAC_TSCR_TSENALL_INDEX 8 +#define MAC_TSCR_TSENALL_WIDTH 1 +#define MAC_TSCR_TSEVNTENA_INDEX 14 +#define MAC_TSCR_TSEVNTENA_WIDTH 1 +#define MAC_TSCR_TSINIT_INDEX 2 +#define MAC_TSCR_TSINIT_WIDTH 1 +#define MAC_TSCR_TSIPENA_INDEX 11 +#define MAC_TSCR_TSIPENA_WIDTH 1 +#define MAC_TSCR_TSIPV4ENA_INDEX 13 +#define MAC_TSCR_TSIPV4ENA_WIDTH 1 +#define MAC_TSCR_TSIPV6ENA_INDEX 12 +#define MAC_TSCR_TSIPV6ENA_WIDTH 1 +#define MAC_TSCR_TSMSTRENA_INDEX 15 +#define MAC_TSCR_TSMSTRENA_WIDTH 1 +#define MAC_TSCR_TSVER2ENA_INDEX 10 +#define MAC_TSCR_TSVER2ENA_WIDTH 1 +#define MAC_TSCR_TXTSSTSM_INDEX 24 +#define MAC_TSCR_TXTSSTSM_WIDTH 1 +#define MAC_TSSR_TXTSC_INDEX 15 +#define MAC_TSSR_TXTSC_WIDTH 1 +#define MAC_TXSNR_TXTSSTSMIS_INDEX 31 +#define MAC_TXSNR_TXTSSTSMIS_WIDTH 1 +#define MAC_VLANHTR_VLHT_INDEX 0 +#define MAC_VLANHTR_VLHT_WIDTH 16 +#define MAC_VLANIR_VLTI_INDEX 20 +#define MAC_VLANIR_VLTI_WIDTH 1 +#define MAC_VLANIR_CSVL_INDEX 19 +#define MAC_VLANIR_CSVL_WIDTH 1 +#define MAC_VLANTR_DOVLTC_INDEX 20 +#define MAC_VLANTR_DOVLTC_WIDTH 1 +#define MAC_VLANTR_ERSVLM_INDEX 19 +#define MAC_VLANTR_ERSVLM_WIDTH 1 +#define MAC_VLANTR_ESVL_INDEX 18 +#define MAC_VLANTR_ESVL_WIDTH 1 +#define MAC_VLANTR_ETV_INDEX 16 +#define MAC_VLANTR_ETV_WIDTH 1 +#define MAC_VLANTR_EVLS_INDEX 21 +#define MAC_VLANTR_EVLS_WIDTH 2 +#define MAC_VLANTR_EVLRXS_INDEX 24 +#define MAC_VLANTR_EVLRXS_WIDTH 1 +#define MAC_VLANTR_VL_INDEX 0 +#define MAC_VLANTR_VL_WIDTH 16 +#define MAC_VLANTR_VTHM_INDEX 25 +#define MAC_VLANTR_VTHM_WIDTH 1 +#define MAC_VLANTR_VTIM_INDEX 17 +#define MAC_VLANTR_VTIM_WIDTH 1 +#define MAC_VR_DEVID_INDEX 8 +#define MAC_VR_DEVID_WIDTH 8 +#define MAC_VR_SNPSVER_INDEX 0 +#define MAC_VR_SNPSVER_WIDTH 8 +#define MAC_VR_USERVER_INDEX 16 +#define MAC_VR_USERVER_WIDTH 8 + +/* MMC register offsets */ +#define MMC_CR 0x0800 +#define MMC_RISR 0x0804 +#define MMC_TISR 0x0808 +#define MMC_RIER 0x080c +#define MMC_TIER 0x0810 +#define MMC_TXOCTETCOUNT_GB_LO 0x0814 +#define MMC_TXOCTETCOUNT_GB_HI 0x0818 +#define MMC_TXFRAMECOUNT_GB_LO 0x081c +#define MMC_TXFRAMECOUNT_GB_HI 0x0820 +#define MMC_TXBROADCASTFRAMES_G_LO 0x0824 +#define MMC_TXBROADCASTFRAMES_G_HI 0x0828 +#define MMC_TXMULTICASTFRAMES_G_LO 0x082c +#define MMC_TXMULTICASTFRAMES_G_HI 0x0830 +#define MMC_TX64OCTETS_GB_LO 0x0834 +#define MMC_TX64OCTETS_GB_HI 0x0838 +#define MMC_TX65TO127OCTETS_GB_LO 0x083c +#define MMC_TX65TO127OCTETS_GB_HI 0x0840 +#define MMC_TX128TO255OCTETS_GB_LO 0x0844 +#define MMC_TX128TO255OCTETS_GB_HI 0x0848 +#define MMC_TX256TO511OCTETS_GB_LO 0x084c +#define MMC_TX256TO511OCTETS_GB_HI 0x0850 +#define MMC_TX512TO1023OCTETS_GB_LO 0x0854 +#define MMC_TX512TO1023OCTETS_GB_HI 0x0858 +#define MMC_TX1024TOMAXOCTETS_GB_LO 0x085c +#define MMC_TX1024TOMAXOCTETS_GB_HI 0x0860 +#define MMC_TXUNICASTFRAMES_GB_LO 0x0864 +#define MMC_TXUNICASTFRAMES_GB_HI 0x0868 +#define MMC_TXMULTICASTFRAMES_GB_LO 0x086c +#define MMC_TXMULTICASTFRAMES_GB_HI 0x0870 +#define MMC_TXBROADCASTFRAMES_GB_LO 0x0874 +#define MMC_TXBROADCASTFRAMES_GB_HI 0x0878 +#define MMC_TXUNDERFLOWERROR_LO 0x087c +#define MMC_TXUNDERFLOWERROR_HI 0x0880 +#define MMC_TXOCTETCOUNT_G_LO 0x0884 +#define MMC_TXOCTETCOUNT_G_HI 0x0888 +#define MMC_TXFRAMECOUNT_G_LO 0x088c +#define MMC_TXFRAMECOUNT_G_HI 0x0890 +#define MMC_TXPAUSEFRAMES_LO 0x0894 +#define MMC_TXPAUSEFRAMES_HI 0x0898 +#define MMC_TXVLANFRAMES_G_LO 0x089c +#define MMC_TXVLANFRAMES_G_HI 0x08a0 +#define MMC_RXFRAMECOUNT_GB_LO 0x0900 +#define MMC_RXFRAMECOUNT_GB_HI 0x0904 +#define MMC_RXOCTETCOUNT_GB_LO 0x0908 +#define MMC_RXOCTETCOUNT_GB_HI 0x090c +#define MMC_RXOCTETCOUNT_G_LO 0x0910 +#define MMC_RXOCTETCOUNT_G_HI 0x0914 +#define MMC_RXBROADCASTFRAMES_G_LO 0x0918 +#define MMC_RXBROADCASTFRAMES_G_HI 0x091c +#define MMC_RXMULTICASTFRAMES_G_LO 0x0920 +#define MMC_RXMULTICASTFRAMES_G_HI 0x0924 +#define MMC_RXCRCERROR_LO 0x0928 +#define MMC_RXCRCERROR_HI 0x092c +#define MMC_RXRUNTERROR 0x0930 +#define MMC_RXJABBERERROR 0x0934 +#define MMC_RXUNDERSIZE_G 0x0938 +#define MMC_RXOVERSIZE_G 0x093c +#define MMC_RX64OCTETS_GB_LO 0x0940 +#define MMC_RX64OCTETS_GB_HI 0x0944 +#define MMC_RX65TO127OCTETS_GB_LO 0x0948 +#define MMC_RX65TO127OCTETS_GB_HI 0x094c +#define MMC_RX128TO255OCTETS_GB_LO 0x0950 +#define MMC_RX128TO255OCTETS_GB_HI 0x0954 +#define MMC_RX256TO511OCTETS_GB_LO 0x0958 +#define MMC_RX256TO511OCTETS_GB_HI 0x095c +#define MMC_RX512TO1023OCTETS_GB_LO 0x0960 +#define MMC_RX512TO1023OCTETS_GB_HI 0x0964 +#define MMC_RX1024TOMAXOCTETS_GB_LO 0x0968 +#define MMC_RX1024TOMAXOCTETS_GB_HI 0x096c +#define MMC_RXUNICASTFRAMES_G_LO 0x0970 +#define MMC_RXUNICASTFRAMES_G_HI 0x0974 +#define MMC_RXLENGTHERROR_LO 0x0978 +#define MMC_RXLENGTHERROR_HI 0x097c +#define MMC_RXOUTOFRANGETYPE_LO 0x0980 +#define MMC_RXOUTOFRANGETYPE_HI 0x0984 +#define MMC_RXPAUSEFRAMES_LO 0x0988 +#define MMC_RXPAUSEFRAMES_HI 0x098c +#define MMC_RXFIFOOVERFLOW_LO 0x0990 +#define MMC_RXFIFOOVERFLOW_HI 0x0994 +#define MMC_RXVLANFRAMES_GB_LO 0x0998 +#define MMC_RXVLANFRAMES_GB_HI 0x099c +#define MMC_RXWATCHDOGERROR 0x09a0 + +/* MMC register entry bit positions and sizes */ +#define MMC_CR_CR_INDEX 0 +#define MMC_CR_CR_WIDTH 1 +#define MMC_CR_CSR_INDEX 1 +#define MMC_CR_CSR_WIDTH 1 +#define MMC_CR_ROR_INDEX 2 +#define MMC_CR_ROR_WIDTH 1 +#define MMC_CR_MCF_INDEX 3 +#define MMC_CR_MCF_WIDTH 1 +#define MMC_CR_MCT_INDEX 4 +#define MMC_CR_MCT_WIDTH 2 +#define MMC_RIER_ALL_INTERRUPTS_INDEX 0 +#define MMC_RIER_ALL_INTERRUPTS_WIDTH 23 +#define MMC_RISR_RXFRAMECOUNT_GB_INDEX 0 +#define MMC_RISR_RXFRAMECOUNT_GB_WIDTH 1 +#define MMC_RISR_RXOCTETCOUNT_GB_INDEX 1 +#define MMC_RISR_RXOCTETCOUNT_GB_WIDTH 1 +#define MMC_RISR_RXOCTETCOUNT_G_INDEX 2 +#define MMC_RISR_RXOCTETCOUNT_G_WIDTH 1 +#define MMC_RISR_RXBROADCASTFRAMES_G_INDEX 3 +#define MMC_RISR_RXBROADCASTFRAMES_G_WIDTH 1 +#define MMC_RISR_RXMULTICASTFRAMES_G_INDEX 4 +#define MMC_RISR_RXMULTICASTFRAMES_G_WIDTH 1 +#define MMC_RISR_RXCRCERROR_INDEX 5 +#define MMC_RISR_RXCRCERROR_WIDTH 1 +#define MMC_RISR_RXRUNTERROR_INDEX 6 +#define MMC_RISR_RXRUNTERROR_WIDTH 1 +#define MMC_RISR_RXJABBERERROR_INDEX 7 +#define MMC_RISR_RXJABBERERROR_WIDTH 1 +#define MMC_RISR_RXUNDERSIZE_G_INDEX 8 +#define MMC_RISR_RXUNDERSIZE_G_WIDTH 1 +#define MMC_RISR_RXOVERSIZE_G_INDEX 9 +#define MMC_RISR_RXOVERSIZE_G_WIDTH 1 +#define MMC_RISR_RX64OCTETS_GB_INDEX 10 +#define MMC_RISR_RX64OCTETS_GB_WIDTH 1 +#define MMC_RISR_RX65TO127OCTETS_GB_INDEX 11 +#define MMC_RISR_RX65TO127OCTETS_GB_WIDTH 1 +#define MMC_RISR_RX128TO255OCTETS_GB_INDEX 12 +#define MMC_RISR_RX128TO255OCTETS_GB_WIDTH 1 +#define MMC_RISR_RX256TO511OCTETS_GB_INDEX 13 +#define MMC_RISR_RX256TO511OCTETS_GB_WIDTH 1 +#define MMC_RISR_RX512TO1023OCTETS_GB_INDEX 14 +#define MMC_RISR_RX512TO1023OCTETS_GB_WIDTH 1 +#define MMC_RISR_RX1024TOMAXOCTETS_GB_INDEX 15 +#define MMC_RISR_RX1024TOMAXOCTETS_GB_WIDTH 1 +#define MMC_RISR_RXUNICASTFRAMES_G_INDEX 16 +#define MMC_RISR_RXUNICASTFRAMES_G_WIDTH 1 +#define MMC_RISR_RXLENGTHERROR_INDEX 17 +#define MMC_RISR_RXLENGTHERROR_WIDTH 1 +#define MMC_RISR_RXOUTOFRANGETYPE_INDEX 18 +#define MMC_RISR_RXOUTOFRANGETYPE_WIDTH 1 +#define MMC_RISR_RXPAUSEFRAMES_INDEX 19 +#define MMC_RISR_RXPAUSEFRAMES_WIDTH 1 +#define MMC_RISR_RXFIFOOVERFLOW_INDEX 20 +#define MMC_RISR_RXFIFOOVERFLOW_WIDTH 1 +#define MMC_RISR_RXVLANFRAMES_GB_INDEX 21 +#define MMC_RISR_RXVLANFRAMES_GB_WIDTH 1 +#define MMC_RISR_RXWATCHDOGERROR_INDEX 22 +#define MMC_RISR_RXWATCHDOGERROR_WIDTH 1 +#define MMC_TIER_ALL_INTERRUPTS_INDEX 0 +#define MMC_TIER_ALL_INTERRUPTS_WIDTH 18 +#define MMC_TISR_TXOCTETCOUNT_GB_INDEX 0 +#define MMC_TISR_TXOCTETCOUNT_GB_WIDTH 1 +#define MMC_TISR_TXFRAMECOUNT_GB_INDEX 1 +#define MMC_TISR_TXFRAMECOUNT_GB_WIDTH 1 +#define MMC_TISR_TXBROADCASTFRAMES_G_INDEX 2 +#define MMC_TISR_TXBROADCASTFRAMES_G_WIDTH 1 +#define MMC_TISR_TXMULTICASTFRAMES_G_INDEX 3 +#define MMC_TISR_TXMULTICASTFRAMES_G_WIDTH 1 +#define MMC_TISR_TX64OCTETS_GB_INDEX 4 +#define MMC_TISR_TX64OCTETS_GB_WIDTH 1 +#define MMC_TISR_TX65TO127OCTETS_GB_INDEX 5 +#define MMC_TISR_TX65TO127OCTETS_GB_WIDTH 1 +#define MMC_TISR_TX128TO255OCTETS_GB_INDEX 6 +#define MMC_TISR_TX128TO255OCTETS_GB_WIDTH 1 +#define MMC_TISR_TX256TO511OCTETS_GB_INDEX 7 +#define MMC_TISR_TX256TO511OCTETS_GB_WIDTH 1 +#define MMC_TISR_TX512TO1023OCTETS_GB_INDEX 8 +#define MMC_TISR_TX512TO1023OCTETS_GB_WIDTH 1 +#define MMC_TISR_TX1024TOMAXOCTETS_GB_INDEX 9 +#define MMC_TISR_TX1024TOMAXOCTETS_GB_WIDTH 1 +#define MMC_TISR_TXUNICASTFRAMES_GB_INDEX 10 +#define MMC_TISR_TXUNICASTFRAMES_GB_WIDTH 1 +#define MMC_TISR_TXMULTICASTFRAMES_GB_INDEX 11 +#define MMC_TISR_TXMULTICASTFRAMES_GB_WIDTH 1 +#define MMC_TISR_TXBROADCASTFRAMES_GB_INDEX 12 +#define MMC_TISR_TXBROADCASTFRAMES_GB_WIDTH 1 +#define MMC_TISR_TXUNDERFLOWERROR_INDEX 13 +#define MMC_TISR_TXUNDERFLOWERROR_WIDTH 1 +#define MMC_TISR_TXOCTETCOUNT_G_INDEX 14 +#define MMC_TISR_TXOCTETCOUNT_G_WIDTH 1 +#define MMC_TISR_TXFRAMECOUNT_G_INDEX 15 +#define MMC_TISR_TXFRAMECOUNT_G_WIDTH 1 +#define MMC_TISR_TXPAUSEFRAMES_INDEX 16 +#define MMC_TISR_TXPAUSEFRAMES_WIDTH 1 +#define MMC_TISR_TXVLANFRAMES_G_INDEX 17 +#define MMC_TISR_TXVLANFRAMES_G_WIDTH 1 + +/* MTL register offsets */ +#define MTL_OMR 0x1000 +#define MTL_FDCR 0x1008 +#define MTL_FDSR 0x100c +#define MTL_FDDR 0x1010 +#define MTL_ISR 0x1020 +#define MTL_RQDCM0R 0x1030 +#define MTL_TCPM0R 0x1040 +#define MTL_TCPM1R 0x1044 + +#define MTL_RQDCM_INC 4 +#define MTL_RQDCM_Q_PER_REG 4 +#define MTL_TCPM_INC 4 +#define MTL_TCPM_TC_PER_REG 4 + +/* MTL register entry bit positions and sizes */ +#define MTL_OMR_ETSALG_INDEX 5 +#define MTL_OMR_ETSALG_WIDTH 2 +#define MTL_OMR_RAA_INDEX 2 +#define MTL_OMR_RAA_WIDTH 1 + +/* MTL queue register offsets +* Multiple queues can be active. The first queue has registers +* that begin at 0x1100. Each subsequent queue has registers that +* are accessed using an offset of 0x80 from the previous queue. +*/ +#define MTL_Q_BASE 0x1100 +#define MTL_Q_INC 0x80 + +#define MTL_Q_TQOMR 0x00 +#define MTL_Q_TQUR 0x04 +#define MTL_Q_TQDR 0x08 +#define MTL_Q_RQOMR 0x40 +#define MTL_Q_RQMPOCR 0x44 +#define MTL_Q_RQDR 0x48 +#define MTL_Q_RQFCR 0x50 +#define MTL_Q_IER 0x70 +#define MTL_Q_ISR 0x74 + +/* MTL queue register entry bit positions and sizes */ +#define MTL_Q_RQDR_PRXQ_INDEX 16 +#define MTL_Q_RQDR_PRXQ_WIDTH 14 +#define MTL_Q_RQDR_RXQSTS_INDEX 4 +#define MTL_Q_RQDR_RXQSTS_WIDTH 2 +#define MTL_Q_RQFCR_RFA_INDEX 1 +#define MTL_Q_RQFCR_RFA_WIDTH 6 +#define MTL_Q_RQFCR_RFD_INDEX 17 +#define MTL_Q_RQFCR_RFD_WIDTH 6 +#define MTL_Q_RQOMR_EHFC_INDEX 7 +#define MTL_Q_RQOMR_EHFC_WIDTH 1 +#define MTL_Q_RQOMR_RQS_INDEX 16 +#define MTL_Q_RQOMR_RQS_WIDTH 9 +#define MTL_Q_RQOMR_RSF_INDEX 5 +#define MTL_Q_RQOMR_RSF_WIDTH 1 +#define MTL_Q_RQOMR_RTC_INDEX 0 +#define MTL_Q_RQOMR_RTC_WIDTH 2 +#define MTL_Q_TQDR_TRCSTS_INDEX 1 +#define MTL_Q_TQDR_TRCSTS_WIDTH 2 +#define MTL_Q_TQDR_TXQSTS_INDEX 4 +#define MTL_Q_TQDR_TXQSTS_WIDTH 1 +#define MTL_Q_TQOMR_FTQ_INDEX 0 +#define MTL_Q_TQOMR_FTQ_WIDTH 1 +#define MTL_Q_TQOMR_Q2TCMAP_INDEX 8 +#define MTL_Q_TQOMR_Q2TCMAP_WIDTH 3 +#define MTL_Q_TQOMR_TQS_INDEX 16 +#define MTL_Q_TQOMR_TQS_WIDTH 10 +#define MTL_Q_TQOMR_TSF_INDEX 1 +#define MTL_Q_TQOMR_TSF_WIDTH 1 +#define MTL_Q_TQOMR_TTC_INDEX 4 +#define MTL_Q_TQOMR_TTC_WIDTH 3 +#define MTL_Q_TQOMR_TXQEN_INDEX 2 +#define MTL_Q_TQOMR_TXQEN_WIDTH 2 + +/* MTL queue register value */ +#define MTL_RSF_DISABLE 0x00 +#define MTL_RSF_ENABLE 0x01 +#define MTL_TSF_DISABLE 0x00 +#define MTL_TSF_ENABLE 0x01 + +#define MTL_RX_THRESHOLD_64 0x00 +#define MTL_RX_THRESHOLD_96 0x02 +#define MTL_RX_THRESHOLD_128 0x03 +#define MTL_TX_THRESHOLD_32 0x01 +#define MTL_TX_THRESHOLD_64 0x00 +#define MTL_TX_THRESHOLD_96 0x02 +#define MTL_TX_THRESHOLD_128 0x03 +#define MTL_TX_THRESHOLD_192 0x04 +#define MTL_TX_THRESHOLD_256 0x05 +#define MTL_TX_THRESHOLD_384 0x06 +#define MTL_TX_THRESHOLD_512 0x07 + +#define MTL_ETSALG_WRR 0x00 +#define MTL_ETSALG_WFQ 0x01 +#define MTL_ETSALG_DWRR 0x02 +#define MTL_RAA_SP 0x00 +#define MTL_RAA_WSP 0x01 + +#define MTL_Q_DISABLED 0x00 +#define MTL_Q_ENABLED 0x02 + +/* MTL traffic class register offsets +* Multiple traffic classes can be active. The first class has registers +* that begin at 0x1100. Each subsequent queue has registers that +* are accessed using an offset of 0x80 from the previous queue. +*/ +#define MTL_TC_BASE MTL_Q_BASE +#define MTL_TC_INC MTL_Q_INC + +#define MTL_TC_ETSCR 0x10 +#define MTL_TC_ETSSR 0x14 +#define MTL_TC_QWR 0x18 + +/* MTL traffic class register entry bit positions and sizes */ +#define MTL_TC_ETSCR_TSA_INDEX 0 +#define MTL_TC_ETSCR_TSA_WIDTH 2 +#define MTL_TC_QWR_QW_INDEX 0 +#define MTL_TC_QWR_QW_WIDTH 21 + +/* MTL traffic class register value */ +#define MTL_TSA_SP 0x00 +#define MTL_TSA_ETS 0x02 + +/* PCS register offsets */ +#define PCS_V1_WINDOW_SELECT 0x03fc +#define PCS_V2_WINDOW_DEF 0x9060 +#define PCS_V2_WINDOW_SELECT 0x9064 + +/* PCS register entry bit positions and sizes */ +#define PCS_V2_WINDOW_DEF_OFFSET_INDEX 6 +#define PCS_V2_WINDOW_DEF_OFFSET_WIDTH 14 +#define PCS_V2_WINDOW_DEF_SIZE_INDEX 2 +#define PCS_V2_WINDOW_DEF_SIZE_WIDTH 4 + +/* SerDes integration register offsets */ +#define SIR0_KR_RT_1 0x002c +#define SIR0_STATUS 0x0040 +#define SIR1_SPEED 0x0000 + +/* SerDes integration register entry bit positions and sizes */ +#define SIR0_KR_RT_1_RESET_INDEX 11 +#define SIR0_KR_RT_1_RESET_WIDTH 1 +#define SIR0_STATUS_RX_READY_INDEX 0 +#define SIR0_STATUS_RX_READY_WIDTH 1 +#define SIR0_STATUS_TX_READY_INDEX 8 +#define SIR0_STATUS_TX_READY_WIDTH 1 +#define SIR1_SPEED_CDR_RATE_INDEX 12 +#define SIR1_SPEED_CDR_RATE_WIDTH 4 +#define SIR1_SPEED_DATARATE_INDEX 4 +#define SIR1_SPEED_DATARATE_WIDTH 2 +#define SIR1_SPEED_PLLSEL_INDEX 3 +#define SIR1_SPEED_PLLSEL_WIDTH 1 +#define SIR1_SPEED_RATECHANGE_INDEX 6 +#define SIR1_SPEED_RATECHANGE_WIDTH 1 +#define SIR1_SPEED_TXAMP_INDEX 8 +#define SIR1_SPEED_TXAMP_WIDTH 4 +#define SIR1_SPEED_WORDMODE_INDEX 0 +#define SIR1_SPEED_WORDMODE_WIDTH 3 + +/* SerDes RxTx register offsets */ +#define RXTX_REG6 0x0018 +#define RXTX_REG20 0x0050 +#define RXTX_REG22 0x0058 +#define RXTX_REG114 0x01c8 +#define RXTX_REG129 0x0204 + +/* SerDes RxTx register entry bit positions and sizes */ +#define RXTX_REG6_RESETB_RXD_INDEX 8 +#define RXTX_REG6_RESETB_RXD_WIDTH 1 +#define RXTX_REG20_BLWC_ENA_INDEX 2 +#define RXTX_REG20_BLWC_ENA_WIDTH 1 +#define RXTX_REG114_PQ_REG_INDEX 9 +#define RXTX_REG114_PQ_REG_WIDTH 7 +#define RXTX_REG129_RXDFE_CONFIG_INDEX 14 +#define RXTX_REG129_RXDFE_CONFIG_WIDTH 2 + +/* MAC Control register offsets */ +#define XP_PROP_0 0x0000 +#define XP_PROP_1 0x0004 +#define XP_PROP_2 0x0008 +#define XP_PROP_3 0x000c +#define XP_PROP_4 0x0010 +#define XP_PROP_5 0x0014 +#define XP_MAC_ADDR_LO 0x0020 +#define XP_MAC_ADDR_HI 0x0024 +#define XP_ECC_ISR 0x0030 +#define XP_ECC_IER 0x0034 +#define XP_ECC_CNT0 0x003c +#define XP_ECC_CNT1 0x0040 +#define XP_DRIVER_INT_REQ 0x0060 +#define XP_DRIVER_INT_RO 0x0064 +#define XP_DRIVER_SCRATCH_0 0x0068 +#define XP_DRIVER_SCRATCH_1 0x006c +#define XP_INT_EN 0x0078 +#define XP_I2C_MUTEX 0x0080 +#define XP_MDIO_MUTEX 0x0084 + +/* MAC Control register entry bit positions and sizes */ +#define XP_DRIVER_INT_REQ_REQUEST_INDEX 0 +#define XP_DRIVER_INT_REQ_REQUEST_WIDTH 1 +#define XP_DRIVER_INT_RO_STATUS_INDEX 0 +#define XP_DRIVER_INT_RO_STATUS_WIDTH 1 +#define XP_DRIVER_SCRATCH_0_COMMAND_INDEX 0 +#define XP_DRIVER_SCRATCH_0_COMMAND_WIDTH 8 +#define XP_DRIVER_SCRATCH_0_SUB_COMMAND_INDEX 8 +#define XP_DRIVER_SCRATCH_0_SUB_COMMAND_WIDTH 8 +#define XP_ECC_CNT0_RX_DED_INDEX 24 +#define XP_ECC_CNT0_RX_DED_WIDTH 8 +#define XP_ECC_CNT0_RX_SEC_INDEX 16 +#define XP_ECC_CNT0_RX_SEC_WIDTH 8 +#define XP_ECC_CNT0_TX_DED_INDEX 8 +#define XP_ECC_CNT0_TX_DED_WIDTH 8 +#define XP_ECC_CNT0_TX_SEC_INDEX 0 +#define XP_ECC_CNT0_TX_SEC_WIDTH 8 +#define XP_ECC_CNT1_DESC_DED_INDEX 8 +#define XP_ECC_CNT1_DESC_DED_WIDTH 8 +#define XP_ECC_CNT1_DESC_SEC_INDEX 0 +#define XP_ECC_CNT1_DESC_SEC_WIDTH 8 +#define XP_ECC_IER_DESC_DED_INDEX 0 +#define XP_ECC_IER_DESC_DED_WIDTH 1 +#define XP_ECC_IER_DESC_SEC_INDEX 1 +#define XP_ECC_IER_DESC_SEC_WIDTH 1 +#define XP_ECC_IER_RX_DED_INDEX 2 +#define XP_ECC_IER_RX_DED_WIDTH 1 +#define XP_ECC_IER_RX_SEC_INDEX 3 +#define XP_ECC_IER_RX_SEC_WIDTH 1 +#define XP_ECC_IER_TX_DED_INDEX 4 +#define XP_ECC_IER_TX_DED_WIDTH 1 +#define XP_ECC_IER_TX_SEC_INDEX 5 +#define XP_ECC_IER_TX_SEC_WIDTH 1 +#define XP_ECC_ISR_DESC_DED_INDEX 0 +#define XP_ECC_ISR_DESC_DED_WIDTH 1 +#define XP_ECC_ISR_DESC_SEC_INDEX 1 +#define XP_ECC_ISR_DESC_SEC_WIDTH 1 +#define XP_ECC_ISR_RX_DED_INDEX 2 +#define XP_ECC_ISR_RX_DED_WIDTH 1 +#define XP_ECC_ISR_RX_SEC_INDEX 3 +#define XP_ECC_ISR_RX_SEC_WIDTH 1 +#define XP_ECC_ISR_TX_DED_INDEX 4 +#define XP_ECC_ISR_TX_DED_WIDTH 1 +#define XP_ECC_ISR_TX_SEC_INDEX 5 +#define XP_ECC_ISR_TX_SEC_WIDTH 1 +#define XP_I2C_MUTEX_BUSY_INDEX 31 +#define XP_I2C_MUTEX_BUSY_WIDTH 1 +#define XP_I2C_MUTEX_ID_INDEX 29 +#define XP_I2C_MUTEX_ID_WIDTH 2 +#define XP_I2C_MUTEX_ACTIVE_INDEX 0 +#define XP_I2C_MUTEX_ACTIVE_WIDTH 1 +#define XP_MAC_ADDR_HI_VALID_INDEX 31 +#define XP_MAC_ADDR_HI_VALID_WIDTH 1 +#define XP_PROP_0_CONN_TYPE_INDEX 28 +#define XP_PROP_0_CONN_TYPE_WIDTH 3 +#define XP_PROP_0_MDIO_ADDR_INDEX 16 +#define XP_PROP_0_MDIO_ADDR_WIDTH 5 +#define XP_PROP_0_PORT_ID_INDEX 0 +#define XP_PROP_0_PORT_ID_WIDTH 8 +#define XP_PROP_0_PORT_MODE_INDEX 8 +#define XP_PROP_0_PORT_MODE_WIDTH 4 +#define XP_PROP_0_PORT_SPEEDS_INDEX 23 +#define XP_PROP_0_PORT_SPEEDS_WIDTH 4 +#define XP_PROP_1_MAX_RX_DMA_INDEX 24 +#define XP_PROP_1_MAX_RX_DMA_WIDTH 5 +#define XP_PROP_1_MAX_RX_QUEUES_INDEX 8 +#define XP_PROP_1_MAX_RX_QUEUES_WIDTH 5 +#define XP_PROP_1_MAX_TX_DMA_INDEX 16 +#define XP_PROP_1_MAX_TX_DMA_WIDTH 5 +#define XP_PROP_1_MAX_TX_QUEUES_INDEX 0 +#define XP_PROP_1_MAX_TX_QUEUES_WIDTH 5 +#define XP_PROP_2_RX_FIFO_SIZE_INDEX 16 +#define XP_PROP_2_RX_FIFO_SIZE_WIDTH 16 +#define XP_PROP_2_TX_FIFO_SIZE_INDEX 0 +#define XP_PROP_2_TX_FIFO_SIZE_WIDTH 16 +#define XP_PROP_3_GPIO_MASK_INDEX 28 +#define XP_PROP_3_GPIO_MASK_WIDTH 4 +#define XP_PROP_3_GPIO_MOD_ABS_INDEX 20 +#define XP_PROP_3_GPIO_MOD_ABS_WIDTH 4 +#define XP_PROP_3_GPIO_RATE_SELECT_INDEX 16 +#define XP_PROP_3_GPIO_RATE_SELECT_WIDTH 4 +#define XP_PROP_3_GPIO_RX_LOS_INDEX 24 +#define XP_PROP_3_GPIO_RX_LOS_WIDTH 4 +#define XP_PROP_3_GPIO_TX_FAULT_INDEX 12 +#define XP_PROP_3_GPIO_TX_FAULT_WIDTH 4 +#define XP_PROP_3_GPIO_ADDR_INDEX 8 +#define XP_PROP_3_GPIO_ADDR_WIDTH 3 +#define XP_PROP_3_MDIO_RESET_INDEX 0 +#define XP_PROP_3_MDIO_RESET_WIDTH 2 +#define XP_PROP_3_MDIO_RESET_I2C_ADDR_INDEX 8 +#define XP_PROP_3_MDIO_RESET_I2C_ADDR_WIDTH 3 +#define XP_PROP_3_MDIO_RESET_I2C_GPIO_INDEX 12 +#define XP_PROP_3_MDIO_RESET_I2C_GPIO_WIDTH 4 +#define XP_PROP_3_MDIO_RESET_INT_GPIO_INDEX 4 +#define XP_PROP_3_MDIO_RESET_INT_GPIO_WIDTH 2 +#define XP_PROP_4_MUX_ADDR_HI_INDEX 8 +#define XP_PROP_4_MUX_ADDR_HI_WIDTH 5 +#define XP_PROP_4_MUX_ADDR_LO_INDEX 0 +#define XP_PROP_4_MUX_ADDR_LO_WIDTH 3 +#define XP_PROP_4_MUX_CHAN_INDEX 4 +#define XP_PROP_4_MUX_CHAN_WIDTH 3 +#define XP_PROP_4_REDRV_ADDR_INDEX 16 +#define XP_PROP_4_REDRV_ADDR_WIDTH 7 +#define XP_PROP_4_REDRV_IF_INDEX 23 +#define XP_PROP_4_REDRV_IF_WIDTH 1 +#define XP_PROP_4_REDRV_LANE_INDEX 24 +#define XP_PROP_4_REDRV_LANE_WIDTH 3 +#define XP_PROP_4_REDRV_MODEL_INDEX 28 +#define XP_PROP_4_REDRV_MODEL_WIDTH 3 +#define XP_PROP_4_REDRV_PRESENT_INDEX 31 +#define XP_PROP_4_REDRV_PRESENT_WIDTH 1 + +/* I2C Control register offsets */ +#define IC_CON 0x0000 +#define IC_TAR 0x0004 +#define IC_DATA_CMD 0x0010 +#define IC_INTR_STAT 0x002c +#define IC_INTR_MASK 0x0030 +#define IC_RAW_INTR_STAT 0x0034 +#define IC_CLR_INTR 0x0040 +#define IC_CLR_TX_ABRT 0x0054 +#define IC_CLR_STOP_DET 0x0060 +#define IC_ENABLE 0x006c +#define IC_TXFLR 0x0074 +#define IC_RXFLR 0x0078 +#define IC_TX_ABRT_SOURCE 0x0080 +#define IC_ENABLE_STATUS 0x009c +#define IC_COMP_PARAM_1 0x00f4 + +/* I2C Control register entry bit positions and sizes */ +#define IC_COMP_PARAM_1_MAX_SPEED_MODE_INDEX 2 +#define IC_COMP_PARAM_1_MAX_SPEED_MODE_WIDTH 2 +#define IC_COMP_PARAM_1_RX_BUFFER_DEPTH_INDEX 8 +#define IC_COMP_PARAM_1_RX_BUFFER_DEPTH_WIDTH 8 +#define IC_COMP_PARAM_1_TX_BUFFER_DEPTH_INDEX 16 +#define IC_COMP_PARAM_1_TX_BUFFER_DEPTH_WIDTH 8 +#define IC_CON_MASTER_MODE_INDEX 0 +#define IC_CON_MASTER_MODE_WIDTH 1 +#define IC_CON_RESTART_EN_INDEX 5 +#define IC_CON_RESTART_EN_WIDTH 1 +#define IC_CON_RX_FIFO_FULL_HOLD_INDEX 9 +#define IC_CON_RX_FIFO_FULL_HOLD_WIDTH 1 +#define IC_CON_SLAVE_DISABLE_INDEX 6 +#define IC_CON_SLAVE_DISABLE_WIDTH 1 +#define IC_CON_SPEED_INDEX 1 +#define IC_CON_SPEED_WIDTH 2 +#define IC_DATA_CMD_CMD_INDEX 8 +#define IC_DATA_CMD_CMD_WIDTH 1 +#define IC_DATA_CMD_STOP_INDEX 9 +#define IC_DATA_CMD_STOP_WIDTH 1 +#define IC_ENABLE_ABORT_INDEX 1 +#define IC_ENABLE_ABORT_WIDTH 1 +#define IC_ENABLE_EN_INDEX 0 +#define IC_ENABLE_EN_WIDTH 1 +#define IC_ENABLE_STATUS_EN_INDEX 0 +#define IC_ENABLE_STATUS_EN_WIDTH 1 +#define IC_INTR_MASK_TX_EMPTY_INDEX 4 +#define IC_INTR_MASK_TX_EMPTY_WIDTH 1 +#define IC_RAW_INTR_STAT_RX_FULL_INDEX 2 +#define IC_RAW_INTR_STAT_RX_FULL_WIDTH 1 +#define IC_RAW_INTR_STAT_STOP_DET_INDEX 9 +#define IC_RAW_INTR_STAT_STOP_DET_WIDTH 1 +#define IC_RAW_INTR_STAT_TX_ABRT_INDEX 6 +#define IC_RAW_INTR_STAT_TX_ABRT_WIDTH 1 +#define IC_RAW_INTR_STAT_TX_EMPTY_INDEX 4 +#define IC_RAW_INTR_STAT_TX_EMPTY_WIDTH 1 + +/* I2C Control register value */ +#define IC_TX_ABRT_7B_ADDR_NOACK 0x0001 +#define IC_TX_ABRT_ARB_LOST 0x1000 + +/* Descriptor/Packet entry bit positions and sizes */ +#define RX_PACKET_ERRORS_CRC_INDEX 2 +#define RX_PACKET_ERRORS_CRC_WIDTH 1 +#define RX_PACKET_ERRORS_FRAME_INDEX 3 +#define RX_PACKET_ERRORS_FRAME_WIDTH 1 +#define RX_PACKET_ERRORS_LENGTH_INDEX 0 +#define RX_PACKET_ERRORS_LENGTH_WIDTH 1 +#define RX_PACKET_ERRORS_OVERRUN_INDEX 1 +#define RX_PACKET_ERRORS_OVERRUN_WIDTH 1 + +#define RX_PACKET_ATTRIBUTES_CSUM_DONE_INDEX 0 +#define RX_PACKET_ATTRIBUTES_CSUM_DONE_WIDTH 1 +#define RX_PACKET_ATTRIBUTES_VLAN_CTAG_INDEX 1 +#define RX_PACKET_ATTRIBUTES_VLAN_CTAG_WIDTH 1 +#define RX_PACKET_ATTRIBUTES_INCOMPLETE_INDEX 2 +#define RX_PACKET_ATTRIBUTES_INCOMPLETE_WIDTH 1 +#define RX_PACKET_ATTRIBUTES_CONTEXT_NEXT_INDEX 3 +#define RX_PACKET_ATTRIBUTES_CONTEXT_NEXT_WIDTH 1 +#define RX_PACKET_ATTRIBUTES_CONTEXT_INDEX 4 +#define RX_PACKET_ATTRIBUTES_CONTEXT_WIDTH 1 +#define RX_PACKET_ATTRIBUTES_RX_TSTAMP_INDEX 5 +#define RX_PACKET_ATTRIBUTES_RX_TSTAMP_WIDTH 1 +#define RX_PACKET_ATTRIBUTES_RSS_HASH_INDEX 6 +#define RX_PACKET_ATTRIBUTES_RSS_HASH_WIDTH 1 + +#define RX_NORMAL_DESC0_OVT_INDEX 0 +#define RX_NORMAL_DESC0_OVT_WIDTH 16 +#define RX_NORMAL_DESC2_HL_INDEX 0 +#define RX_NORMAL_DESC2_HL_WIDTH 10 +#define RX_NORMAL_DESC3_CDA_INDEX 27 +#define RX_NORMAL_DESC3_CDA_WIDTH 1 +#define RX_NORMAL_DESC3_CTXT_INDEX 30 +#define RX_NORMAL_DESC3_CTXT_WIDTH 1 +#define RX_NORMAL_DESC3_ES_INDEX 15 +#define RX_NORMAL_DESC3_ES_WIDTH 1 +#define RX_NORMAL_DESC3_ETLT_INDEX 16 +#define RX_NORMAL_DESC3_ETLT_WIDTH 4 +#define RX_NORMAL_DESC3_FD_INDEX 29 +#define RX_NORMAL_DESC3_FD_WIDTH 1 +#define RX_NORMAL_DESC3_INTE_INDEX 30 +#define RX_NORMAL_DESC3_INTE_WIDTH 1 +#define RX_NORMAL_DESC3_L34T_INDEX 20 +#define RX_NORMAL_DESC3_L34T_WIDTH 4 +#define RX_NORMAL_DESC3_LD_INDEX 28 +#define RX_NORMAL_DESC3_LD_WIDTH 1 +#define RX_NORMAL_DESC3_OWN_INDEX 31 +#define RX_NORMAL_DESC3_OWN_WIDTH 1 +#define RX_NORMAL_DESC3_PL_INDEX 0 +#define RX_NORMAL_DESC3_PL_WIDTH 14 +#define RX_NORMAL_DESC3_RSV_INDEX 26 +#define RX_NORMAL_DESC3_RSV_WIDTH 1 + +#define RX_DESC3_L34T_IPV4_TCP 1 +#define RX_DESC3_L34T_IPV4_UDP 2 +#define RX_DESC3_L34T_IPV4_ICMP 3 +#define RX_DESC3_L34T_IPV6_TCP 9 +#define RX_DESC3_L34T_IPV6_UDP 10 +#define RX_DESC3_L34T_IPV6_ICMP 11 + +#define RX_CONTEXT_DESC3_TSA_INDEX 4 +#define RX_CONTEXT_DESC3_TSA_WIDTH 1 +#define RX_CONTEXT_DESC3_TSD_INDEX 6 +#define RX_CONTEXT_DESC3_TSD_WIDTH 1 + +#define TX_PACKET_ATTRIBUTES_CSUM_ENABLE_INDEX 0 +#define TX_PACKET_ATTRIBUTES_CSUM_ENABLE_WIDTH 1 +#define TX_PACKET_ATTRIBUTES_TSO_ENABLE_INDEX 1 +#define TX_PACKET_ATTRIBUTES_TSO_ENABLE_WIDTH 1 +#define TX_PACKET_ATTRIBUTES_VLAN_CTAG_INDEX 2 +#define TX_PACKET_ATTRIBUTES_VLAN_CTAG_WIDTH 1 +#define TX_PACKET_ATTRIBUTES_PTP_INDEX 3 +#define TX_PACKET_ATTRIBUTES_PTP_WIDTH 1 + +#define TX_CONTEXT_DESC2_MSS_INDEX 0 +#define TX_CONTEXT_DESC2_MSS_WIDTH 15 +#define TX_CONTEXT_DESC3_CTXT_INDEX 30 +#define TX_CONTEXT_DESC3_CTXT_WIDTH 1 +#define TX_CONTEXT_DESC3_TCMSSV_INDEX 26 +#define TX_CONTEXT_DESC3_TCMSSV_WIDTH 1 +#define TX_CONTEXT_DESC3_VLTV_INDEX 16 +#define TX_CONTEXT_DESC3_VLTV_WIDTH 1 +#define TX_CONTEXT_DESC3_VT_INDEX 0 +#define TX_CONTEXT_DESC3_VT_WIDTH 16 + +#define TX_NORMAL_DESC2_HL_B1L_INDEX 0 +#define TX_NORMAL_DESC2_HL_B1L_WIDTH 14 +#define TX_NORMAL_DESC2_IC_INDEX 31 +#define TX_NORMAL_DESC2_IC_WIDTH 1 +#define TX_NORMAL_DESC2_TTSE_INDEX 30 +#define TX_NORMAL_DESC2_TTSE_WIDTH 1 +#define TX_NORMAL_DESC2_VTIR_INDEX 14 +#define TX_NORMAL_DESC2_VTIR_WIDTH 2 +#define TX_NORMAL_DESC3_CIC_INDEX 16 +#define TX_NORMAL_DESC3_CIC_WIDTH 2 +#define TX_NORMAL_DESC3_CPC_INDEX 26 +#define TX_NORMAL_DESC3_CPC_WIDTH 2 +#define TX_NORMAL_DESC3_CTXT_INDEX 30 +#define TX_NORMAL_DESC3_CTXT_WIDTH 1 +#define TX_NORMAL_DESC3_FD_INDEX 29 +#define TX_NORMAL_DESC3_FD_WIDTH 1 +#define TX_NORMAL_DESC3_FL_INDEX 0 +#define TX_NORMAL_DESC3_FL_WIDTH 15 +#define TX_NORMAL_DESC3_LD_INDEX 28 +#define TX_NORMAL_DESC3_LD_WIDTH 1 +#define TX_NORMAL_DESC3_OWN_INDEX 31 +#define TX_NORMAL_DESC3_OWN_WIDTH 1 +#define TX_NORMAL_DESC3_TCPHDRLEN_INDEX 19 +#define TX_NORMAL_DESC3_TCPHDRLEN_WIDTH 4 +#define TX_NORMAL_DESC3_TCPPL_INDEX 0 +#define TX_NORMAL_DESC3_TCPPL_WIDTH 18 +#define TX_NORMAL_DESC3_TSE_INDEX 18 +#define TX_NORMAL_DESC3_TSE_WIDTH 1 + +#define TX_NORMAL_DESC2_VLAN_INSERT 0x2 + +/* MDIO undefined or vendor specific registers */ +#ifndef MDIO_PMA_10GBR_PMD_CTRL +#define MDIO_PMA_10GBR_PMD_CTRL 0x0096 +#endif + +#ifndef MDIO_PMA_10GBR_FECCTRL +#define MDIO_PMA_10GBR_FECCTRL 0x00ab +#endif + +#ifndef MDIO_PCS_DIG_CTRL +#define MDIO_PCS_DIG_CTRL 0x8000 +#endif + +#ifndef MDIO_AN_XNP +#define MDIO_AN_XNP 0x0016 +#endif + +#ifndef MDIO_AN_LPX +#define MDIO_AN_LPX 0x0019 +#endif + +#ifndef MDIO_AN_COMP_STAT +#define MDIO_AN_COMP_STAT 0x0030 +#endif + +#ifndef MDIO_AN_INTMASK +#define MDIO_AN_INTMASK 0x8001 +#endif + +#ifndef MDIO_AN_INT +#define MDIO_AN_INT 0x8002 +#endif + +#ifndef MDIO_VEND2_AN_ADVERTISE +#define MDIO_VEND2_AN_ADVERTISE 0x0004 +#endif + +#ifndef MDIO_VEND2_AN_LP_ABILITY +#define MDIO_VEND2_AN_LP_ABILITY 0x0005 +#endif + +#ifndef MDIO_VEND2_AN_CTRL +#define MDIO_VEND2_AN_CTRL 0x8001 +#endif + +#ifndef MDIO_VEND2_AN_STAT +#define MDIO_VEND2_AN_STAT 0x8002 +#endif + +#ifndef MDIO_CTRL1_SPEED1G +#define MDIO_CTRL1_SPEED1G (MDIO_CTRL1_SPEED10G & ~BMCR_SPEED100) +#endif + +#ifndef MDIO_VEND2_CTRL1_AN_ENABLE +#define MDIO_VEND2_CTRL1_AN_ENABLE BIT(12) +#endif + +#ifndef MDIO_VEND2_CTRL1_AN_RESTART +#define MDIO_VEND2_CTRL1_AN_RESTART BIT(9) +#endif + +#ifndef MDIO_VEND2_CTRL1_SS6 +#define MDIO_VEND2_CTRL1_SS6 BIT(6) +#endif + +#ifndef MDIO_VEND2_CTRL1_SS13 +#define MDIO_VEND2_CTRL1_SS13 BIT(13) +#endif + +/* MDIO mask values */ +#define AXGBE_AN_CL73_INT_CMPLT BIT(0) +#define AXGBE_AN_CL73_INC_LINK BIT(1) +#define AXGBE_AN_CL73_PG_RCV BIT(2) +#define AXGBE_AN_CL73_INT_MASK 0x07 + +#define AXGBE_XNP_MCF_NULL_MESSAGE 0x001 +#define AXGBE_XNP_ACK_PROCESSED BIT(12) +#define AXGBE_XNP_MP_FORMATTED BIT(13) +#define AXGBE_XNP_NP_EXCHANGE BIT(15) + +#define AXGBE_KR_TRAINING_START BIT(0) +#define AXGBE_KR_TRAINING_ENABLE BIT(1) + +#define AXGBE_PCS_CL37_BP BIT(12) + +#define AXGBE_AN_CL37_INT_CMPLT BIT(0) +#define AXGBE_AN_CL37_INT_MASK 0x01 + +#define AXGBE_AN_CL37_HD_MASK 0x40 +#define AXGBE_AN_CL37_FD_MASK 0x20 + +#define AXGBE_AN_CL37_PCS_MODE_MASK 0x06 +#define AXGBE_AN_CL37_PCS_MODE_BASEX 0x00 +#define AXGBE_AN_CL37_PCS_MODE_SGMII 0x04 +#define AXGBE_AN_CL37_TX_CONFIG_MASK 0x08 + +/*generic*/ +#define __iomem + +#define rmb () rte_rmb()/* dpdk rte provided rmb */ +#define wmb () rte_wmb()/* dpdk rte provided wmb */ + +#define __le16 u16 +#define __le32 u32 +#define __le64 u64 + +typedef unsigned char u8 ; +typedef unsigned short u16 ; +typedef unsigned int u32 ; +typedef unsigned long long u64 ; +typedef unsigned long long dma_addr_t ; + +static inline uint32_t low32_value (uint64_t addr) +{ +return (addr) &0x0ffffffff ; +} + +static inline uint32_t high32_value (uint64_t addr) +{ +return (addr >>32 ) &0x0ffffffff ; +} + +/*END*/ + +/* Bit setting and getting macros +* The get macro will extract the current bit field value from within +* the variable +* +* The set macro will clear the current bit field value within the +* variable and then set the bit field of the variable to the +* specified value +*/ +#define GET_BITS (_var, _index, _width) \ + (((_var) >> (_index)) & ((0x1 << (_width)) - 1)) + +#define SET_BITS (_var, _index, _width, _val) \ +do { \ + (_var) &= ~(((0x1 << (_width)) - 1) << (_index)); \ + (_var) |= (((_val) & ((0x1 << (_width)) - 1)) << (_index)); \ +} while (0) + +#define GET_BITS_LE (_var, _index, _width) \ + ((rte_le_to_cpu_32((_var)) >> (_index)) & ((0x1 << (_width)) - 1)) + +#define SET_BITS_LE (_var, _index, _width, _val) \ +do { \ + (_var) &= rte_cpu_to_le_32(~(((0x1 << (_width)) - 1) << (_index)));\ + (_var) |= rte_cpu_to_le_32((((_val) & \ + ((0x1 << (_width)) - 1)) << (_index))); \ +} while (0) + +/* Bit setting and getting macros based on register fields +* The get macro uses the bit field definitions formed using the input +* names to extract the current bit field value from within the +* variable +* +* The set macro uses the bit field definitions formed using the input +* names to set the bit field of the variable to the specified value +*/ +#define AXGMAC_GET_BITS (_var, _prefix, _field) \ + GET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH) + +#define AXGMAC_SET_BITS (_var, _prefix, _field, _val) \ + SET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH, (_val)) + +#define AXGMAC_GET_BITS_LE (_var, _prefix, _field) \ + GET_BITS_LE((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH) + +#define AXGMAC_SET_BITS_LE (_var, _prefix, _field, _val) \ + SET_BITS_LE((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH, (_val)) + +/* Macros for reading or writing registers +* The ioread macros will get bit fields or full values using the +* register definitions formed using the input names +* +* The iowrite macros will set bit fields or full values using the +* register definitions formed using the input names +*/ +#define AXGMAC_IOREAD (_pdata, _reg) \ + rte_read32((void *)((_pdata)->xgmac_regs + (_reg))) + +#define AXGMAC_IOREAD_BITS (_pdata, _reg, _field) \ + GET_BITS(AXGMAC_IOREAD((_pdata), _reg), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define AXGMAC_IOWRITE (_pdata, _reg, _val) \ + rte_write32((_val), (void *)((_pdata)->xgmac_regs + (_reg))) + +#define AXGMAC_IOWRITE_BITS (_pdata, _reg, _field, _val) \ +do { \ + u32 reg_val = AXGMAC_IOREAD((_pdata), _reg); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + AXGMAC_IOWRITE((_pdata), _reg, reg_val); \ +} while (0) + +/* Macros for reading or writing MTL queue or traffic class registers +* Similar to the standard read and write macros except that the +* base register value is calculated by the queue or traffic class number +*/ +#define AXGMAC_MTL_IOREAD (_pdata, _n, _reg) \ + rte_read32((void *)((_pdata)->xgmac_regs + \ + MTL_Q_BASE + ((_n) * MTL_Q_INC) + (_reg))) + +#define AXGMAC_MTL_IOREAD_BITS (_pdata, _n, _reg, _field) \ + GET_BITS(AXGMAC_MTL_IOREAD((_pdata), (_n), (_reg)), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define AXGMAC_MTL_IOWRITE (_pdata, _n, _reg, _val) \ + rte_write32((_val), (void *)((_pdata)->xgmac_regs + \ + MTL_Q_BASE + ((_n) * MTL_Q_INC) + (_reg))) + +#define AXGMAC_MTL_IOWRITE_BITS (_pdata, _n, _reg, _field, _val) \ +do { \ + u32 reg_val = AXGMAC_MTL_IOREAD((_pdata), (_n), _reg); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + AXGMAC_MTL_IOWRITE((_pdata), (_n), _reg, reg_val); \ +} while (0) + +/* Macros for reading or writing DMA channel registers +* Similar to the standard read and write macros except that the +* base register value is obtained from the ring +*/ +#define AXGMAC_DMA_IOREAD (_channel, _reg) \ + rte_read32((void *)((_channel)->dma_regs + (_reg))) + +#define AXGMAC_DMA_IOREAD_BITS (_channel, _reg, _field) \ + GET_BITS(AXGMAC_DMA_IOREAD((_channel), _reg), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define AXGMAC_DMA_IOWRITE (_channel, _reg, _val) \ + rte_write32((_val), (void *)((_channel)->dma_regs + (_reg))) + +#define AXGMAC_DMA_IOWRITE_BITS (_channel, _reg, _field, _val) \ +do { \ + u32 reg_val = AXGMAC_DMA_IOREAD((_channel), _reg); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + AXGMAC_DMA_IOWRITE((_channel), _reg, reg_val); \ +} while (0) + +/* Macros for building, reading or writing register values or bits +* within the register values of XPCS registers. +*/ +#define XPCS_GET_BITS (_var, _prefix, _field) \ + GET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH) + +#define XPCS_SET_BITS (_var, _prefix, _field, _val) \ + SET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH, (_val)) + +#define XPCS32_IOWRITE (_pdata, _off, _val) \ + rte_write32(_val, (void *)((_pdata)->xpcs_regs + (_off))) + +#define XPCS32_IOREAD (_pdata, _off) \ + rte_read32((void *)((_pdata)->xpcs_regs + (_off))) + +#define XPCS16_IOWRITE (_pdata, _off, _val) \ + rte_write16(_val, (void *)((_pdata)->xpcs_regs + (_off))) + +#define XPCS16_IOREAD (_pdata, _off) \ + rte_read16((void *)((_pdata)->xpcs_regs + (_off))) + +/* Macros for building, reading or writing register values or bits +* within the register values of SerDes integration registers. +*/ +#define XSIR_GET_BITS (_var, _prefix, _field) \ + GET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH) + +#define XSIR_SET_BITS (_var, _prefix, _field, _val) \ + SET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH, (_val)) + +#define XSIR0_IOREAD (_pdata, _reg) \ + rte_read16((void *)((_pdata)->sir0_regs + (_reg))) + +#define XSIR0_IOREAD_BITS (_pdata, _reg, _field) \ + GET_BITS(XSIR0_IOREAD((_pdata), _reg), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define XSIR0_IOWRITE (_pdata, _reg, _val) \ + rte_read16((_val), (void *)((_pdata)->sir0_regs + (_reg))) + +#define XSIR0_IOWRITE_BITS (_pdata, _reg, _field, _val) \ +do { \ + u16 reg_val = XSIR0_IOREAD((_pdata), _reg); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + XSIR0_IOWRITE((_pdata), _reg, reg_val); \ +} while (0) + +#define XSIR1_IOREAD (_pdata, _reg) \ + rte_read16((void *)((_pdata)->sir1_regs + _reg)) + +#define XSIR1_IOREAD_BITS (_pdata, _reg, _field) \ + GET_BITS(XSIR1_IOREAD((_pdata), _reg), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define XSIR1_IOWRITE (_pdata, _reg, _val) \ + rte_read16((_val), (void *)((_pdata)->sir1_regs + (_reg))) + +#define XSIR1_IOWRITE_BITS (_pdata, _reg, _field, _val) \ +do { \ + u16 reg_val = XSIR1_IOREAD((_pdata), _reg); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + XSIR1_IOWRITE((_pdata), _reg, reg_val); \ +} while (0) + +/* Macros for building, reading or writing register values or bits +* within the register values of SerDes RxTx registers. +*/ +#define XRXTX_IOREAD (_pdata, _reg) \ + rte_read16((void *)((_pdata)->rxtx_regs + (_reg))) + +#define XRXTX_IOREAD_BITS (_pdata, _reg, _field) \ + GET_BITS(XRXTX_IOREAD((_pdata), _reg), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define XRXTX_IOWRITE (_pdata, _reg, _val) \ + rte_write16((_val), (void *)((_pdata)->rxtx_regs + (_reg))) + +#define XRXTX_IOWRITE_BITS (_pdata, _reg, _field, _val) \ +do { \ + u16 reg_val = XRXTX_IOREAD((_pdata), _reg); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + XRXTX_IOWRITE((_pdata), _reg, reg_val); \ +} while (0) + +/* Macros for building, reading or writing register values or bits +* within the register values of MAC Control registers. +*/ +#define XP_GET_BITS (_var, _prefix, _field) \ + GET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH) + +#define XP_SET_BITS (_var, _prefix, _field, _val) \ + SET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH, (_val)) + +#define XP_IOREAD (_pdata, _reg) \ + rte_read32((void *)((_pdata)->xprop_regs + (_reg))) + +#define XP_IOREAD_BITS (_pdata, _reg, _field) \ + GET_BITS(XP_IOREAD((_pdata), (_reg)), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define XP_IOWRITE (_pdata, _reg, _val) \ + rte_write32((_val), (void *)((_pdata)->xprop_regs + (_reg))) + +#define XP_IOWRITE_BITS (_pdata, _reg, _field, _val) \ +do { \ + u32 reg_val = XP_IOREAD((_pdata), (_reg)); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + XP_IOWRITE((_pdata), (_reg), reg_val); \ +} while (0) + +/* Macros for building, reading or writing register values or bits +* within the register values of I2C Control registers. +*/ +#define XI2C_GET_BITS (_var, _prefix, _field) \ + GET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH) + +#define XI2C_SET_BITS (_var, _prefix, _field, _val) \ + SET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH, (_val)) + +#define XI2C_IOREAD (_pdata, _reg) \ + rte_read32((void *)((_pdata)->xi2c_regs + (_reg))) + +#define XI2C_IOREAD_BITS (_pdata, _reg, _field) \ + GET_BITS(XI2C_IOREAD((_pdata), (_reg)), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define XI2C_IOWRITE (_pdata, _reg, _val) \ + rte_write32((_val), (void *)((_pdata)->xi2c_regs + (_reg))) + +#define XI2C_IOWRITE_BITS (_pdata, _reg, _field, _val) \ +do { \ + u32 reg_val = XI2C_IOREAD((_pdata), (_reg)); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + XI2C_IOWRITE((_pdata), (_reg), reg_val); \ +} while (0) + +/* Macros for building, reading or writing register values or bits +* using MDIO. Different from above because of the use of standardized +* Linux include values. No shifting is performed with the bit +* operations, everything works on mask values. +*/ +#define XMDIO_READ (_pdata, _mmd, _reg) \ + ((_pdata)->hw_if.read_mmd_regs((_pdata), 0, \ + MII_ADDR_C45 | ((_mmd) << 16) | ((_reg) & 0xffff))) + +#define XMDIO_READ_BITS (_pdata, _mmd, _reg, _mask) \ + (XMDIO_READ((_pdata), _mmd, _reg) & _mask) + +#define XMDIO_WRITE (_pdata, _mmd, _reg, _val) \ + ((_pdata)->hw_if.write_mmd_regs((_pdata), 0, \ + MII_ADDR_C45 | ((_mmd) << 16) | ((_reg) & 0xffff), (_val))) + +#define XMDIO_WRITE_BITS (_pdata, _mmd, _reg, _mask, _val) \ +do { \ + u32 mmd_val = XMDIO_READ((_pdata), (_mmd), (_reg)); \ + mmd_val &= ~(_mask); \ + mmd_val |= (_val); \ + XMDIO_WRITE((_pdata), (_mmd), (_reg), (mmd_val)); \ +} while (0) + +/* +* time_after(a,b) returns true if the time a is after time b. +* +* Do this with "<0" and ">=0" to only test the sign of the result. A +* good compiler would generate better code (and a really good compiler +* wouldn't care). Gcc is currently neither. +*/ +#define time_after (a, b) ((long)((b) - (a)) < 0) +#define time_before (a, b) time_after(b, a) + +#define time_after_eq (a, b) ((long)((a) - (b)) >= 0) +#define time_before_eq (a, b) time_after_eq(b, a) + +/*---bitmap support apis---*/ +static inline int axgbe_test_bit (int nr,volatile unsigned long *addr) +{ +int res; + +rte_mb (); + res = ((*addr) & (1UL << nr)) !=0 ; +rte_mb (); +return res; +} + +static inline void axgbe_set_bit (unsigned int nr,volatile unsigned long *addr) +{ +__sync_fetch_and_or (addr, (1UL << nr)); +} + +static inline void axgbe_clear_bit (int nr,volatile unsigned long *addr) +{ +__sync_fetch_and_and (addr, ~(1UL << nr)); +} + +static inline int axgbe_test_and_clear_bit (int nr,volatile unsigned long *addr) +{ +unsigned long mask = (1UL << nr); + +return __sync_fetch_and_and (addr, ~mask) & mask; +} + +static inline unsigned long msecs_to_timer_cycles (unsigned int m) +{ +return rte_get_timer_hz () * (m /1000 ); +}#endif /* __AXGBE_COMMON_H__ */
Signature · 1 line
2.7.4
Re: [PATCH 02/16] net/axgbe: add register map and related macros
Quoted 1 line · Ravi Kumar
Signed-off-by Ravi Kumar <[email protected]>
<...>
drivers/net/axgbe/axgbe_common.h line 170
Quoted 2 lines
drivers/net/axgbe/axgbe_common.h +1
-1-#define HZ 250 +#define AXGBE_HZ 250
Why not add the correct one in prev patch?
<...>
Re: [PATCH 02/16] net/axgbe: add register map and related macros
In reply to Ravi KumarQuoted 9 lines · Ravi Kumar
Signed-off-by Ravi Kumar <[email protected]>--- drivers/net/axgbe/axgbe_common.h | 1645 +++++++++++++++++++++++++++++++++++++- 1 file changed, 1644 insertions(+), 1 deletion(-)drivers/net/axgbe/axgbe_common.h +0
-0
...
Quoted 13 lines
drivers/net/axgbe/axgbe_common.h +13
-0+/* Macros for building, reading or writing register values or bits +* within the register values of SerDes integration registers. +*/ +#define XSIR_GET_BITS (_var, _prefix, _field) \ + GET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH) + +#define XSIR_SET_BITS (_var, _prefix, _field, _val) \ + SET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH, (_val)) +
drivers/net/axgbe/axgbe_common.h line 1625
Quoted 10 lines
drivers/net/axgbe/axgbe_common.h +10
-0+#define XSIR0_IOREAD (_pdata, _reg) \ + rte_read16((void *)((_pdata)->sir0_regs + (_reg))) + +#define XSIR0_IOREAD_BITS (_pdata, _reg, _field) \ + GET_BITS(XSIR0_IOREAD((_pdata), _reg), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define XSIR0_IOWRITE (_pdata, _reg, _val) \ + rte_read16((_val), (void *)((_pdata)->sir0_regs + (_reg)))
rte_write16?
Quoted 10 lines
drivers/net/axgbe/axgbe_common.h +10
-0+ +#define XSIR0_IOWRITE_BITS (_pdata, _reg, _field, _val) \ +do { \ + u16 reg_val = XSIR0_IOREAD((_pdata), _reg); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + XSIR0_IOWRITE((_pdata), _reg, reg_val); \ +} while (0) +
drivers/net/axgbe/axgbe_common.h line 1645
Quoted 10 lines
drivers/net/axgbe/axgbe_common.h +10
-0+#define XSIR1_IOREAD (_pdata, _reg) \ + rte_read16((void *)((_pdata)->sir1_regs + _reg)) + +#define XSIR1_IOREAD_BITS (_pdata, _reg, _field) \ + GET_BITS(XSIR1_IOREAD((_pdata), _reg), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define XSIR1_IOWRITE (_pdata, _reg, _val) \ + rte_read16((_val), (void *)((_pdata)->sir1_regs + (_reg)))
rte_write16?
drivers/net/axgbe/axgbe_common.h line 1655
Quoted 10 lines
drivers/net/axgbe/axgbe_common.h +10
-0+ +#define XSIR1_IOWRITE_BITS (_pdata, _reg, _field, _val) \ +do { \ + u16 reg_val = XSIR1_IOREAD((_pdata), _reg); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + XSIR1_IOWRITE((_pdata), _reg, reg_val); \ +} while (0) +
....
IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.
PATCH 3/16 net/axgbe: add phy register map and helper macros
In reply to Ravi Kumar--- drivers/net/axgbe/axgbe_phy.h | 314 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 314 insertions(+) create mode 100644 drivers/net/axgbe/axgbe_phy.h
drivers/net/axgbe/axgbe_phy.h new file +314 -0
@@ -0,0 +1,314 @@ +/*- +* Copyright(c) 2017 Advanced Micro Devices, Inc. +* All rights reserved. +* +* AMD 10Gb Ethernet driver +* +* This file is available to you under your choice of the following two +* licenses: +* +* License 1: GPLv2 +* +* Copyright (c) 2017 Advanced Micro Devices, Inc. +* +* This file is free software; you may copy, redistribute and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 2 of the License, or +* (at your option) any later version. +* +* This file is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +* +* This file incorporates work covered by the following copyright and +* permission notice: +* +* Copyright (c) 2013 Synopsys, Inc. +* +* The Synopsys DWC ETHER XGMAC Software Driver and documentation +* (hereinafter "Software") is an unsupported proprietary work of Synopsys, +* Inc. unless otherwise expressly agreed to in writing between Synopsys +* and you. +* +* The Software IS NOT an item of Licensed Software or Licensed Product +* under any End User Software License Agreement or Agreement for Licensed +* Product with Synopsys or any supplement thereto. Permission is hereby +* granted, free of charge, to any person obtaining a copy of this software +* annotated with this license and the Software, to deal in the Software +* without restriction, including without limitation the rights to use, +* copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* of the Software, and to permit persons to whom the Software is furnished +* to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" +* BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +* PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS +* 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. +* +* License 2: Modified BSD +* +* Copyright (c) 2017 Advanced Micro Devices, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * 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. +* * Neither the name of Advanced Micro Devices, Inc. nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "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 +* <COPYRIGHT HOLDER> 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. +* +* This file incorporates work covered by the following copyright and +* permission notice: +* +* Copyright (c) 2013 Synopsys, Inc. +* +* The Synopsys DWC ETHER XGMAC Software Driver and documentation +* (hereinafter "Software") is an unsupported proprietary work of Synopsys, +* Inc. unless otherwise expressly agreed to in writing between Synopsys +* and you. +* +* The Software IS NOT an item of Licensed Software or Licensed Product +* under any End User Software License Agreement or Agreement for Licensed +* Product with Synopsys or any supplement thereto. Permission is hereby +* granted, free of charge, to any person obtaining a copy of this software +* annotated with this license and the Software, to deal in the Software +* without restriction, including without limitation the rights to use, +* copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* of the Software, and to permit persons to whom the Software is furnished +* to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" +* BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +* PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS +* 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 __AXGBE_PHY_H__ +#define __AXGBE_PHY_H__ + +#define SPEED_10 10 +#define SPEED_100 100 +#define SPEED_1000 1000 +#define SPEED_2500 2500 +#define SPEED_10000 10000 + + +/* Or MII_ADDR_C45 into regnum for read/write on mii_bus to enable the 21 bit +* IEEE 802.3ae clause 45 addressing mode used by 10GIGE phy chips. +*/ +#define MII_ADDR_C45 (1 << 30) + +/* Basic mode status register. */ +#define BMSR_LSTATUS 0x0004/* Link status */ + +/* Status register 1. */ +#define MDIO_STAT1_LSTATUS BMSR_LSTATUS + +/* Generic MII registers. */ +#define MII_BMCR 0x00/* Basic mode control register */ +#define MII_BMSR 0x01/* Basic mode status register */ +#define MII_PHYSID1 0x02/* PHYS ID 1 */ +#define MII_PHYSID2 0x03/* PHYS ID 2 */ +#define MII_ADVERTISE 0x04/* Advertisement control reg */ +#define MII_LPA 0x05/* Link partner ability reg */ +#define MII_EXPANSION 0x06/* Expansion register */ +#define MII_CTRL1000 0x09/* 1000BASE-T control */ +#define MII_STAT1000 0x0a/* 1000BASE-T status */ +#define MII_MMD_CTRL 0x0d/* MMD Access Control Register */ +#define MII_MMD_DATA 0x0e/* MMD Access Data Register */ +#define MII_ESTATUS 0x0f/* Extended Status */ +#define MII_DCOUNTER 0x12/* Disconnect counter */ +#define MII_FCSCOUNTER 0x13/* False carrier counter */ +#define MII_NWAYTEST 0x14/* N-way auto-neg test reg */ +#define MII_RERRCOUNTER 0x15/* Receive error counter */ +#define MII_SREVISION 0x16/* Silicon revision */ +#define MII_RESV1 0x17/* Reserved... */ +#define MII_LBRERROR 0x18/* Lpback, rx, bypass error */ +#define MII_PHYADDR 0x19/* PHY address */ +#define MII_RESV2 0x1a/* Reserved... */ +#define MII_TPISTATUS 0x1b/* TPI status for 10mbps */ +#define MII_NCONFIG 0x1c/* Network interface config */ + +/* Basic mode control register. */ +#define BMCR_RESV 0x003f/* Unused... */ +#define BMCR_SPEED1000 0x0040/* MSB of Speed (1000) */ +#define BMCR_CTST 0x0080/* Collision test */ +#define BMCR_FULLDPLX 0x0100/* Full duplex */ +#define BMCR_ANRESTART 0x0200/* Auto negotiation restart */ +#define BMCR_ISOLATE 0x0400/* Isolate data paths from MII */ +#define BMCR_PDOWN 0x0800/* Enable low power state */ +#define BMCR_ANENABLE 0x1000/* Enable auto negotiation */ +#define BMCR_SPEED100 0x2000/* Select 100Mbps */ +#define BMCR_LOOPBACK 0x4000/* TXD loopback bits */ +#define BMCR_RESET 0x8000/* Reset to default state */ +#define BMCR_SPEED10 0x0000/* Select 10Mbps */ + + +/* MDIO Manageable Devices (MMDs). */ +#define MDIO_MMD_PMAPMD 1/* Physical Medium Attachment +* Physical Medium Dependent +*/ +#define MDIO_MMD_WIS 2/* WAN Interface Sublayer */ +#define MDIO_MMD_PCS 3/* Physical Coding Sublayer */ +#define MDIO_MMD_PHYXS 4/* PHY Extender Sublayer */ +#define MDIO_MMD_DTEXS 5/* DTE Extender Sublayer */ +#define MDIO_MMD_TC 6/* Transmission Convergence */ +#define MDIO_MMD_AN 7/* Auto-Negotiation */ +#define MDIO_MMD_C22EXT 29/* Clause 22 extension */ +#define MDIO_MMD_VEND1 30/* Vendor specific 1 */ +#define MDIO_MMD_VEND2 31/* Vendor specific 2 */ + +/* Generic MDIO registers. */ +#define MDIO_CTRL1 MII_BMCR +#define MDIO_STAT1 MII_BMSR +#define MDIO_DEVID1 MII_PHYSID1 +#define MDIO_DEVID2 MII_PHYSID2 +#define MDIO_SPEED 4/* Speed ability */ +#define MDIO_DEVS1 5/* Devices in package */ +#define MDIO_DEVS2 6 +#define MDIO_CTRL2 7/* 10G control 2 */ +#define MDIO_STAT2 8/* 10G status 2 */ +#define MDIO_PMA_TXDIS 9/* 10G PMA/PMD transmit disable */ +#define MDIO_PMA_RXDET 10/* 10G PMA/PMD receive signal detect */ +#define MDIO_PMA_EXTABLE 11/* 10G PMA/PMD extended ability */ +#define MDIO_PKGID1 14/* Package identifier */ +#define MDIO_PKGID2 15 +#define MDIO_AN_ADVERTISE 16/* AN advertising (base page) */ +#define MDIO_AN_LPA 19/* AN LP abilities (base page) */ +#define MDIO_PCS_EEE_ABLE 20/* EEE Capability register */ +#define MDIO_PCS_EEE_WK_ERR 22/* EEE wake error counter */ +#define MDIO_PHYXS_LNSTAT 24/* PHY XGXS lane state */ +#define MDIO_AN_EEE_ADV 60/* EEE advertisement */ +#define MDIO_AN_EEE_LPABLE 61/* EEE link partner ability */ + +/* Media-dependent registers. */ +#define MDIO_PMA_10GBT_SWAPPOL 130/* 10GBASE-T pair swap & polarity */ +#define MDIO_PMA_10GBT_TXPWR 131/* 10GBASE-T TX power control */ +#define MDIO_PMA_10GBT_SNR 133/* 10GBASE-T SNR margin, lane A. +* Lanes B-D are numbered 134-136. +*/ +#define MDIO_PMA_10GBR_FECABLE 170/* 10GBASE-R FEC ability */ +#define MDIO_PCS_10GBX_STAT1 24/* 10GBASE-X PCS status 1 */ +#define MDIO_PCS_10GBRT_STAT1 32/* 10GBASE-R/-T PCS status 1 */ +#define MDIO_PCS_10GBRT_STAT2 33/* 10GBASE-R/-T PCS status 2 */ +#define MDIO_AN_10GBT_CTRL 32/* 10GBASE-T auto-negotiation control */ +#define MDIO_AN_10GBT_STAT 33/* 10GBASE-T auto-negotiation status */ + +/* Control register 1. */ +/* Enable extended speed selection */ +#define MDIO_CTRL1_SPEEDSELEXT (BMCR_SPEED1000 | BMCR_SPEED100) +/* All speed selection bits */ +#define MDIO_CTRL1_SPEEDSEL (MDIO_CTRL1_SPEEDSELEXT | 0x003c) +#define MDIO_CTRL1_FULLDPLX BMCR_FULLDPLX +#define MDIO_CTRL1_LPOWER BMCR_PDOWN +#define MDIO_CTRL1_RESET BMCR_RESET +#define MDIO_PMA_CTRL1_LOOPBACK 0x0001 +#define MDIO_PMA_CTRL1_SPEED1000 BMCR_SPEED1000 +#define MDIO_PMA_CTRL1_SPEED100 BMCR_SPEED100 +#define MDIO_PCS_CTRL1_LOOPBACK BMCR_LOOPBACK +#define MDIO_PHYXS_CTRL1_LOOPBACK BMCR_LOOPBACK +#define MDIO_AN_CTRL1_RESTART BMCR_ANRESTART +#define MDIO_AN_CTRL1_ENABLE BMCR_ANENABLE +#define MDIO_AN_CTRL1_XNP 0x2000/* Enable extended next page */ +#define MDIO_PCS_CTRL1_CLKSTOP_EN 0x400/* Stop the clock during LPI */ + + + + + +/* PMA 10GBASE-R FEC ability register. */ +#define MDIO_PMA_10GBR_FECABLE_ABLE 0x0001/* FEC ability */ +#define MDIO_PMA_10GBR_FECABLE_ERRABLE 0x0002/* FEC error indic. ability */ + + +/* Autoneg related */ +#define ADVERTISED_Autoneg (1 << 6) +#define SUPPORTED_Autoneg (1 << 6) +#define AUTONEG_DISABLE 0x00 +#define AUTONEG_ENABLE 0x01 + +#define ADVERTISED_Pause (1 << 13) +#define ADVERTISED_Asym_Pause (1 << 14) + +#define SUPPORTED_Pause (1 << 13) +#define SUPPORTED_Asym_Pause (1 << 14) + +#define SUPPORTED_Backplane (1 << 16) +#define SUPPORTED_TP (1 << 7) + +#define ADVERTISED_10000baseR_FEC (1 << 20) + +#define SUPPORTED_10000baseR_FEC (1 << 20) + +#define SUPPORTED_FIBRE (1 << 10) + +#define ADVERTISED_10000baseKR_Full (1 << 19) +#define ADVERTISED_10000baseT_Full (1 << 12) +#define ADVERTISED_2500baseX_Full (1 << 15) +#define ADVERTISED_1000baseKX_Full (1 << 17) +#define ADVERTISED_1000baseT_Full (1 << 5) +#define ADVERTISED_100baseT_Full (1 << 3) +#define ADVERTISED_TP (1 << 7) +#define ADVERTISED_FIBRE (1 << 10) +#define ADVERTISED_Backplane (1 << 16) + +#define SUPPORTED_1000baseKX_Full (1 << 17) +#define SUPPORTED_10000baseKR_Full (1 << 19) +#define SUPPORTED_2500baseX_Full (1 << 15) +#define SUPPORTED_100baseT_Full (1 << 2) +#define SUPPORTED_1000baseT_Full (1 << 5) +#define SUPPORTED_10000baseT_Full (1 << 12) +#define SUPPORTED_2500baseX_Full (1 << 15) + + +#define SPEED_UNKNOWN -1 + +/* Duplex, half or full. */ +#define DUPLEX_HALF 0x00 +#define DUPLEX_FULL 0x01 +#define DUPLEX_UNKNOWN 0xff + +#endif +/* PHY */
Signature · 1 line
2.7.4
PATCH 4/16 net/axgbe: add structures for MAC initialization and reset
In reply to Ravi Kumar--- drivers/net/axgbe/Makefile | 1 + drivers/net/axgbe/axgbe_dev.c | 167 +++++++++++++++++++ drivers/net/axgbe/axgbe_ethdev.c | 291 ++++++++++++++++++++++++++++++++ drivers/net/axgbe/axgbe_ethdev.h | 349 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 808 insertions(+) create mode 100644 drivers/net/axgbe/axgbe_dev.c
drivers/net/axgbe/Makefile +1 -0
@@ -142,5 +142,6 @@ LIBABIVER := 1 # all source are stored in SRCS-y # SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_ethdev.c +SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_dev.c include $(RTE_SDK)/mk/rte.lib.mk
drivers/net/axgbe/axgbe_dev.c new file +167 -0
167 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.c +291 -0
317 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.h +349 -0
361 lines not on this page · raw message
Signature · 1 line
2.7.4
Re: [PATCH 04/16] net/axgbe: add structures for MAC initialization and reset
Quoted 1 line · Ravi Kumar
Signed-off-by Ravi Kumar <[email protected]>
<...>
drivers/net/axgbe/axgbe_ethdev.c eth_axgbe_dev_init(struct rte_eth_dev *eth_dev) · line 397
Quoted 3 lines
drivers/net/axgbe/axgbe_ethdev.c +3
-0+ + eth_dev->data->mac_addrs =rte_zmalloc ("axgbe_mac_addr" , +ETHER_ADDR_LEN ,0 );
Can you please add equivalent free() function for this in eth_axgbe_dev_uninit()?
<...>
PATCH 5/16 net/axgbe: add phy initialization and related apis
In reply to Ravi Kumar--- drivers/net/axgbe/Makefile | 3 + drivers/net/axgbe/axgbe_dev.c | 188 +++++++++ drivers/net/axgbe/axgbe_ethdev.c | 11 + drivers/net/axgbe/axgbe_ethdev.h | 172 ++++++++ drivers/net/axgbe/axgbe_i2c.c | 453 +++++++++++++++++++++ drivers/net/axgbe/axgbe_mdio.c | 203 ++++++++++ drivers/net/axgbe/axgbe_phy_impl.c | 799 +++++++++++++++++++++++++++++++++++++ 7 files changed, 1829 insertions(+) create mode 100644 drivers/net/axgbe/axgbe_i2c.c create mode 100644 drivers/net/axgbe/axgbe_mdio.c create mode 100644 drivers/net/axgbe/axgbe_phy_impl.c
drivers/net/axgbe/Makefile +3 -0
@@ -143,5 +143,8 @@ LIBABIVER := 1 # SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_ethdev.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_dev.c +SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_mdio.c +SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_phy_impl.c +SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_i2c.c include $(RTE_SDK)/mk/rte.lib.mk
drivers/net/axgbe/axgbe_dev.c +188 -0
198 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.c +11 -0
@@ -144,6 +144,7 @@ static const struct rte_pci_id pci_id_axgbe_map[] = { };static struct axgbe_version_data axgbe_v2a = { + .init_function_ptrs_phy_impl = axgbe_init_function_ptrs_phy_v2, .xpcs_access =AXGBE_XPCS_ACCESS_V2 , .mmc_64bit =1 , .tx_max_fifo_size =229376 ,
@@ -154,6 +155,7 @@ static struct axgbe_version_data axgbe_v2a = { };static struct axgbe_version_data axgbe_v2b = { + .init_function_ptrs_phy_impl = axgbe_init_function_ptrs_phy_v2, .xpcs_access =AXGBE_XPCS_ACCESS_V2 , .mmc_64bit =1 , .tx_max_fifo_size =65536 ,
@@ -268,6 +270,9 @@ static void axgbe_get_all_hw_features(struct axgbe_port *pdata)static void axgbe_init_all_fptrs (struct axgbe_port *pdata) {axgbe_init_function_ptrs_dev (&pdata->hw_if); +axgbe_init_function_ptrs_phy (&pdata->phy_if); +axgbe_init_function_ptrs_i2c (&pdata->i2c_if); + pdata->vdata->init_function_ptrs_phy_impl (&pdata->phy_if); }static void axgbe_set_counts (struct axgbe_port *pdata)
@@ -457,6 +462,12 @@ eth_axgbe_dev_init(struct rte_eth_dev *eth_dev)pthread_mutex_init (&pdata->an_mutex,NULL );pthread_mutex_init (&pdata->phy_mutex,NULL ); + ret = pdata->phy_if.phy_init (pdata); +if (ret) { +rte_free (eth_dev->data->mac_addrs); +return ret; + } +PMD_INIT_LOG (DEBUG ,"port %d vendorID=0x%x deviceID=0x%x" , eth_dev->data->port_id, pci_dev->id.vendor_id, pci_dev->id.device_id);
drivers/net/axgbe/axgbe_ethdev.h +172 -0
203 lines not on this page · raw message
drivers/net/axgbe/axgbe_i2c.c new file +453 -0
453 lines not on this page · raw message
drivers/net/axgbe/axgbe_mdio.c new file +203 -0
203 lines not on this page · raw message
drivers/net/axgbe/axgbe_phy_impl.c new file +799 -0
799 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH 6/16 net/axgbe: add phy programming apis
In reply to Ravi Kumar--- drivers/net/axgbe/axgbe_dev.c | 27 + drivers/net/axgbe/axgbe_mdio.c | 963 +++++++++++++++++++++++++ drivers/net/axgbe/axgbe_phy_impl.c | 1397 ++++++++++++++++++++++++++++++++++++ 3 files changed, 2387 insertions(+)
drivers/net/axgbe/axgbe_dev.c +27 -0
@@ -310,6 +310,30 @@ static void axgbe_write_mmd_regs(struct axgbe_port *pdata, int prtad, } } +static int axgbe_set_speed (struct axgbe_port *pdata,int speed) +{ +unsigned int ss; + +switch (speed) { +case SPEED_1000 : + ss =0x03 ; +break ; +case SPEED_2500 : + ss =0x02 ; +break ; +case SPEED_10000 : + ss =0x00 ; +break ; +default : +return -EINVAL ; + } + +if (AXGMAC_IOREAD_BITS (pdata,MAC_TCR ,SS ) != ss) +AXGMAC_IOWRITE_BITS (pdata,MAC_TCR ,SS , ss); + +return 0 ; +} +static int __axgbe_exit (struct axgbe_port *pdata) {unsigned int count =2000 ;
@@ -346,9 +370,12 @@ void axgbe_init_function_ptrs_dev(struct axgbe_hw_if *hw_if) { hw_if->exit = axgbe_exit; + hw_if->read_mmd_regs = axgbe_read_mmd_regs; hw_if->write_mmd_regs = axgbe_write_mmd_regs; + hw_if->set_speed = axgbe_set_speed; + hw_if->set_ext_mii_mode = axgbe_set_ext_mii_mode; hw_if->read_ext_mii_regs = axgbe_read_ext_mii_regs; hw_if->write_ext_mii_regs = axgbe_write_ext_mii_regs;
drivers/net/axgbe/axgbe_mdio.c +963 -0
973 lines not on this page · raw message
drivers/net/axgbe/axgbe_phy_impl.c +1397 -0
1,413 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH 7/16 net/axgbe: add interrupt handler for autonegotiation
In reply to Ravi Kumar--- drivers/net/axgbe/axgbe_ethdev.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+)
drivers/net/axgbe/axgbe_ethdev.c +37 -0
@@ -131,6 +131,7 @@static int eth_axgbe_dev_init (struct rte_eth_dev *eth_dev);static int eth_axgbe_dev_uninit (struct rte_eth_dev *eth_dev); +static void axgbe_dev_interrupt_handler (void *param);/* The set of PCI devices this driver supports */ #define AMD_PCI_VENDOR_ID 0x1022
@@ -165,6 +166,29 @@ static struct axgbe_version_data axgbe_v2b = { .i2c_support = 1, }; +/* +* Interrupt handler triggered by NIC for handling +* specific interrupt. +* +* @param handle +* Pointer to interrupt handle. +* @param param +* The address of parameter (struct rte_eth_dev *) regsitered before. +* +* @return +* void +*/ +static void +axgbe_dev_interrupt_handler (void *param) +{ +struct rte_eth_dev *dev = (struct rte_eth_dev *)param; +struct axgbe_port *pdata = dev->data->dev_private; + + pdata->phy_if.an_isr (pdata); + +rte_intr_enable (&pdata->pci_dev->intr_handle); +} +static void axgbe_get_all_hw_features (struct axgbe_port *pdata) {unsigned int mac_hfr0, mac_hfr1, mac_hfr2;
@@ -468,6 +492,9 @@ eth_axgbe_dev_init(struct rte_eth_dev *eth_dev)return ret; } +rte_intr_callback_register (&pci_dev->intr_handle, + axgbe_dev_interrupt_handler, + (void *)eth_dev);PMD_INIT_LOG (DEBUG ,"port %d vendorID=0x%x deviceID=0x%x" , eth_dev->data->port_id, pci_dev->id.vendor_id, pci_dev->id.device_id);
@@ -478,15 +505,25 @@ eth_axgbe_dev_init(struct rte_eth_dev *eth_dev)static int eth_axgbe_dev_uninit (struct rte_eth_dev *eth_dev) { +struct rte_pci_device *pci_dev; +PMD_INIT_FUNC_TRACE ();if (rte_eal_process_type () !=RTE_PROC_PRIMARY )return -EPERM ; + pci_dev =RTE_DEV_TO_PCI (eth_dev->device); + eth_dev->dev_ops =NULL ; eth_dev->rx_pkt_burst =NULL ; eth_dev->tx_pkt_burst =NULL ; +/* disable uio intr before callback unregister */ +rte_intr_disable (&pci_dev->intr_handle); +rte_intr_callback_unregister (&pci_dev->intr_handle, + axgbe_dev_interrupt_handler, + (void *)eth_dev); +/*Clear macaddres at time of dev init*/ eth_dev->data->mac_addrs =NULL ; eth_dev->data->hash_mac_addrs =NULL ;
Signature · 1 line
2.7.4
Re: [PATCH 07/16] net/axgbe: add interrupt handler for autonegotiation
Quoted 1 line · Ravi Kumar
Signed-off-by Ravi Kumar <[email protected]>
<...>
drivers/net/axgbe/axgbe_ethdev.c static struct axgbe_version_data axgbe_v2b = { · line 189
Quoted 9 lines
drivers/net/axgbe/axgbe_ethdev.c +9
-0+static void +axgbe_dev_interrupt_handler (void *param) +{ +struct rte_eth_dev *dev = (struct rte_eth_dev *)param; +struct axgbe_port *pdata = dev->data->dev_private; + + pdata->phy_if.an_isr (pdata); + +rte_intr_enable (&pdata->pci_dev->intr_handle);
This is already inside the interrupt handler, shouldn't interrupts needs to be enabled somewhere else to reach this point at first place.
And I have seen a few drivers does the same but do we need to call rte_intr_enable() in interrupt handler? Will interrupts disabled after each fire?
<...>
PATCH 8/16 net/axgbe: add transmit and receive queue setup apis
In reply to Ravi Kumar--- drivers/net/axgbe/Makefile | 1 + drivers/net/axgbe/axgbe_ethdev.c | 82 +++++++++ drivers/net/axgbe/axgbe_ethdev.h | 36 ++++ drivers/net/axgbe/axgbe_rxtx.c | 363 +++++++++++++++++++++++++++++++++++++++ drivers/net/axgbe/axgbe_rxtx.h | 283 ++++++++++++++++++++++++++++++ 5 files changed, 765 insertions(+) create mode 100644 drivers/net/axgbe/axgbe_rxtx.c create mode 100644 drivers/net/axgbe/axgbe_rxtx.h
drivers/net/axgbe/Makefile +1 -0
@@ -146,5 +146,6 @@ SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_dev.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_mdio.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_phy_impl.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_i2c.c +SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_rxtx.c include $(RTE_SDK)/mk/rte.lib.mk
drivers/net/axgbe/axgbe_ethdev.c +82 -0
124 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.h +36 -0
@@ -132,6 +132,16 @@#include <rte_lcore.h> #include "axgbe_common.h" +#define IRQ 0xff +#define VLAN_HLEN 4 + +#define AXGBE_TX_MAX_BUF_SIZE (0x3fff & ~(64 - 1)) +#define AXGBE_RX_MAX_BUF_SIZE (0x3fff & ~(64 - 1)) +#define AXGBE_RX_MIN_BUF_SIZE (ETHER_MAX_LEN + VLAN_HLEN) +#define AXGBE_MAX_MAC_ADDRS 1 + +#define AXGBE_RX_BUF_ALIGN 64 +#define AXGBE_MAX_DMA_CHANNELS 16#define AXGBE_MAX_QUEUES 16#define AXGBE_PRIORITY_QUEUES 8
@@ -147,6 +157,23 @@#define AXGBE_DMA_SYS_ARCACHE 0x0#define AXGBE_DMA_SYS_AWCACHE 0x0 +/* DMA channel interrupt modes */ +#define AXGBE_IRQ_MODE_EDGE 0 +#define AXGBE_IRQ_MODE_LEVEL 1 + +#define AXGBE_DMA_INTERRUPT_MASK 0x31c7 + +#define AXGMAC_MIN_PACKET 60 +#define AXGMAC_STD_PACKET_MTU 1500 +#define AXGMAC_MAX_STD_PACKET 1518 +#define AXGMAC_JUMBO_PACKET_MTU 9000 +#define AXGMAC_MAX_JUMBO_PACKET 9018 +/* Inter-frame gap + preamble */ +#define AXGMAC_ETH_PREAMBLE (12 + 8) + +#define AXGMAC_PFC_DATA_LEN 46 +#define AXGMAC_PFC_DELAYS 14000 +/* PCI BAR mapping */ #define AXGBE_AXGMAC_BAR 0#define AXGBE_XPCS_BAR 1
@@ -630,6 +657,10 @@ struct axgbe_port {struct ether_addr mac_addr; +/* Software Tx/Rx structure pointers*/ +void **rx_queues; +void **tx_queues; +/* MDIO/PHY related settings */ unsigned int phy_started;void *phy_data;
@@ -656,6 +687,11 @@ struct axgbe_port {/* I2C support */ struct axgbe_i2c i2c;volatile int i2c_complete; + +/* CRC stripping by H/w for Rx packet*/ +int crc_strip_enable; +/* csum enable to hardware */ +int rx_csum_enable; };void axgbe_init_function_ptrs_dev (struct axgbe_hw_if *hw_if);
drivers/net/axgbe/axgbe_rxtx.c new file +363 -0
363 lines not on this page · raw message
drivers/net/axgbe/axgbe_rxtx.h new file +283 -0
283 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH 9/16 net/axgbe: add DMA programming and dev start and stop apis
In reply to Ravi Kumar--- drivers/net/axgbe/axgbe_dev.c | 844 +++++++++++++++++++++++++++++++++++++++ drivers/net/axgbe/axgbe_ethdev.c | 97 ++++- 2 files changed, 940 insertions(+), 1 deletion(-)
drivers/net/axgbe/axgbe_dev.c +844 -0
@@ -128,6 +128,13 @@#include "axgbe_ethdev.h" #include "axgbe_common.h" #include "axgbe_phy.h" +#include "axgbe_rxtx.h" + +static inline unsigned int axgbe_get_max_frame (struct axgbe_port *pdata) +{ +return pdata->eth_dev->data->mtu +ETHER_HDR_LEN + +ETHER_CRC_LEN +VLAN_HLEN ; +}/* query busy bit */ static int mdio_complete (struct axgbe_port *pdata)
@@ -334,6 +341,191 @@ static int axgbe_set_speed(struct axgbe_port *pdata, int speed)return 0 ; } +static int axgbe_disable_tx_flow_control (struct axgbe_port *pdata) +{ +unsigned int max_q_count, q_count; +unsigned int reg, reg_val; +unsigned int i; + +/* Clear MTL flow control */ +for (i =0 ; i < pdata->rx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQOMR ,EHFC ,0 ); + +/* Clear MAC flow control */ + max_q_count =AXGMAC_MAX_FLOW_CONTROL_QUEUES ; + q_count =RTE_MIN (pdata->tx_q_count, + max_q_count); + reg =MAC_Q0TFCR ; +for (i =0 ; i < q_count; i++) { + reg_val =AXGMAC_IOREAD (pdata, reg); +AXGMAC_SET_BITS (reg_val,MAC_Q0TFCR ,TFE ,0 ); +AXGMAC_IOWRITE (pdata, reg, reg_val); + + reg +=MAC_QTFCR_INC ; + } + +return 0 ; +} + +static int axgbe_enable_tx_flow_control (struct axgbe_port *pdata) +{ +unsigned int max_q_count, q_count; +unsigned int reg, reg_val; +unsigned int i; + +/* Set MTL flow control */ +for (i =0 ; i < pdata->rx_q_count; i++) { +unsigned int ehfc =0 ; + +/* Flow control thresholds are established */ +if (pdata->rx_rfd[i]) + ehfc =1 ; + +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQOMR ,EHFC , ehfc); + } + +/* Set MAC flow control */ + max_q_count =AXGMAC_MAX_FLOW_CONTROL_QUEUES ; + q_count =RTE_MIN (pdata->tx_q_count, + max_q_count); + reg =MAC_Q0TFCR ; +for (i =0 ; i < q_count; i++) { + reg_val =AXGMAC_IOREAD (pdata, reg); + +/* Enable transmit flow control */ +AXGMAC_SET_BITS (reg_val,MAC_Q0TFCR ,TFE ,1 ); +/* Set pause time */ +AXGMAC_SET_BITS (reg_val,MAC_Q0TFCR ,PT ,0xffff ); + +AXGMAC_IOWRITE (pdata, reg, reg_val); + + reg +=MAC_QTFCR_INC ; + } + +return 0 ; +} + +static int axgbe_disable_rx_flow_control (struct axgbe_port *pdata) +{ +AXGMAC_IOWRITE_BITS (pdata,MAC_RFCR ,RFE ,0 ); + +return 0 ; +} + +static int axgbe_enable_rx_flow_control (struct axgbe_port *pdata) +{ +AXGMAC_IOWRITE_BITS (pdata,MAC_RFCR ,RFE ,1 ); + +return 0 ; +} + +static int axgbe_config_tx_flow_control (struct axgbe_port *pdata) +{ +if (pdata->tx_pause) +axgbe_enable_tx_flow_control (pdata); +else +axgbe_disable_tx_flow_control (pdata); + +return 0 ; +} + +static int axgbe_config_rx_flow_control (struct axgbe_port *pdata) +{ +if (pdata->rx_pause) +axgbe_enable_rx_flow_control (pdata); +else +axgbe_disable_rx_flow_control (pdata); + +return 0 ; +} + +static void axgbe_config_flow_control (struct axgbe_port *pdata) +{ +axgbe_config_tx_flow_control (pdata); +axgbe_config_rx_flow_control (pdata); + +AXGMAC_IOWRITE_BITS (pdata,MAC_RFCR ,PFCE ,0 ); +} + +static void axgbe_queue_flow_control_threshold (struct axgbe_port *pdata, +unsigned int queue, +unsigned int q_fifo_size) +{ +unsigned int frame_fifo_size; +unsigned int rfa, rfd; + + frame_fifo_size =AXGMAC_FLOW_CONTROL_ALIGN (axgbe_get_max_frame (pdata)); + +/* This path deals with just maximum frame sizes which are +* limited to a jumbo frame of 9,000 (plus headers, etc.) +* so we can never exceed the maximum allowable RFA/RFD +* values. +*/ +if (q_fifo_size <=2048 ) { +/* rx_rfd to zero to signal no flow control */ + pdata->rx_rfa[queue] =0 ; + pdata->rx_rfd[queue] =0 ; +return ; + } + +if (q_fifo_size <=4096 ) { +/* Between 2048 and 4096 */ + pdata->rx_rfa[queue] =0 ;/* Full - 1024 bytes */ + pdata->rx_rfd[queue] =1 ;/* Full - 1536 bytes */ +return ; + } + +if (q_fifo_size <= frame_fifo_size) { +/* Between 4096 and max-frame */ + pdata->rx_rfa[queue] =2 ;/* Full - 2048 bytes */ + pdata->rx_rfd[queue] =5 ;/* Full - 3584 bytes */ +return ; + } + +if (q_fifo_size <= (frame_fifo_size *3 )) { +/* Between max-frame and 3 max-frames, +* trigger if we get just over a frame of data and +* resume when we have just under half a frame left. +*/ + rfa = q_fifo_size - frame_fifo_size; + rfd = rfa + (frame_fifo_size /2 ); + }else { +/* Above 3 max-frames - trigger when just over +* 2 frames of space available +*/ + rfa = frame_fifo_size *2 ; + rfa +=AXGMAC_FLOW_CONTROL_UNIT ; + rfd = rfa + frame_fifo_size; + } + + pdata->rx_rfa[queue] =AXGMAC_FLOW_CONTROL_VALUE (rfa); + pdata->rx_rfd[queue] =AXGMAC_FLOW_CONTROL_VALUE (rfd); +} + +static void axgbe_calculate_flow_control_threshold (struct axgbe_port *pdata) +{ +unsigned int q_fifo_size; +unsigned int i; + +for (i =0 ; i < pdata->rx_q_count; i++) { + q_fifo_size = (pdata->fifo +1 ) *AXGMAC_FIFO_UNIT ; + +axgbe_queue_flow_control_threshold (pdata, i, q_fifo_size); + } +} + +static void axgbe_config_flow_control_threshold (struct axgbe_port *pdata) +{ +unsigned int i; + +for (i =0 ; i < pdata->rx_q_count; i++) { +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQFCR ,RFA , + pdata->rx_rfa[i]); +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQFCR ,RFD , + pdata->rx_rfd[i]); + } +} +static int __axgbe_exit (struct axgbe_port *pdata) {unsigned int count =2000 ;
@@ -366,10 +558,659 @@ static int axgbe_exit(struct axgbe_port *pdata)return __axgbe_exit (pdata); } +static int axgbe_flush_tx_queues (struct axgbe_port *pdata) +{ +unsigned int i, count; + +if (AXGMAC_GET_BITS (pdata->hw_feat.version,MAC_VR ,SNPSVER ) <0x21 ) +return 0 ; + +for (i =0 ; i < pdata->tx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_TQOMR ,FTQ ,1 ); + +/* Poll Until Poll Condition */ +for (i =0 ; i < pdata->tx_q_count; i++) { + count =2000 ; +while (--count &&AXGMAC_MTL_IOREAD_BITS (pdata, i, +MTL_Q_TQOMR ,FTQ )) +rte_delay_us (500 ); + +if (!count) +return -EBUSY ; + } + +return 0 ; +} + +static void axgbe_config_dma_bus (struct axgbe_port *pdata) +{ +/* Set enhanced addressing mode */ +AXGMAC_IOWRITE_BITS (pdata,DMA_SBMR ,EAME ,1 ); + +/* Out standing read/write requests*/ +AXGMAC_IOWRITE_BITS (pdata,DMA_SBMR ,RD_OSR ,0x3f ); +AXGMAC_IOWRITE_BITS (pdata,DMA_SBMR ,WR_OSR ,0x3f ); + +/* Set the System Bus mode */ +AXGMAC_IOWRITE_BITS (pdata,DMA_SBMR ,UNDEF ,1 ); +AXGMAC_IOWRITE_BITS (pdata,DMA_SBMR ,BLEN_32 ,1 ); +AXGMAC_IOWRITE_BITS (pdata,DMA_SBMR ,AAL ,1 ); +} + +static void axgbe_config_dma_cache (struct axgbe_port *pdata) +{ +unsigned int arcache, awcache, arwcache; + + arcache =0 ; +AXGMAC_SET_BITS (arcache,DMA_AXIARCR ,DRC ,0x3 ); +AXGMAC_IOWRITE (pdata,DMA_AXIARCR , arcache); + + awcache =0 ; +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,DWC ,0x3 ); +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,RPC ,0x3 ); +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,RPD ,0x1 ); +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,RHC ,0x3 ); +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,RHD ,0x1 ); +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,RDC ,0x3 ); +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,RDD ,0x1 ); +AXGMAC_IOWRITE (pdata,DMA_AXIAWCR , awcache); + + arwcache =0 ; +AXGMAC_SET_BITS (arwcache,DMA_AXIAWRCR ,TDWD ,0x1 ); +AXGMAC_SET_BITS (arwcache,DMA_AXIAWRCR ,TDWC ,0x3 ); +AXGMAC_SET_BITS (arwcache,DMA_AXIAWRCR ,RDRC ,0x3 ); +AXGMAC_IOWRITE (pdata,DMA_AXIAWRCR , arwcache); +} + +static void axgbe_config_edma_control (struct axgbe_port *pdata) +{ +AXGMAC_IOWRITE (pdata,EDMA_TX_CONTROL ,0x5 ); +AXGMAC_IOWRITE (pdata,EDMA_RX_CONTROL ,0x5 ); +} + +static int axgbe_config_osp_mode (struct axgbe_port *pdata) +{ +/* Force DMA to operate on second packet before closing descriptors +* of first packet +*/ +struct axgbe_tx_queue *txq; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_tx_queues; i++) { + txq = pdata->eth_dev->data->tx_queues[i]; +AXGMAC_DMA_IOWRITE_BITS (txq,DMA_CH_TCR ,OSP , + pdata->tx_osp_mode); + } + +return 0 ; +} + +static int axgbe_config_pblx8 (struct axgbe_port *pdata) +{ +struct axgbe_tx_queue *txq; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_tx_queues; i++) { + txq = pdata->eth_dev->data->tx_queues[i]; +AXGMAC_DMA_IOWRITE_BITS (txq,DMA_CH_CR ,PBLX8 , + pdata->pblx8); + } +return 0 ; +} + +static int axgbe_config_tx_pbl_val (struct axgbe_port *pdata) +{ +struct axgbe_tx_queue *txq; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_tx_queues; i++) { + txq = pdata->eth_dev->data->tx_queues[i]; +AXGMAC_DMA_IOWRITE_BITS (txq,DMA_CH_TCR ,PBL , + pdata->tx_pbl); + } + +return 0 ; +} + +static int axgbe_config_rx_pbl_val (struct axgbe_port *pdata) +{ +struct axgbe_rx_queue *rxq; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_rx_queues; i++) { + rxq = pdata->eth_dev->data->rx_queues[i]; +AXGMAC_DMA_IOWRITE_BITS (rxq,DMA_CH_RCR ,PBL , + pdata->rx_pbl); + } + +return 0 ; +} + +static void axgbe_config_rx_buffer_size (struct axgbe_port *pdata) +{ +struct axgbe_rx_queue *rxq; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_rx_queues; i++) { + rxq = pdata->eth_dev->data->rx_queues[i]; + + rxq->buf_size =rte_pktmbuf_data_room_size (rxq->mb_pool) - +RTE_PKTMBUF_HEADROOM ; + rxq->buf_size = (rxq->buf_size +AXGBE_RX_BUF_ALIGN -1 ) & + ~(AXGBE_RX_BUF_ALIGN -1 ); + +if (rxq->buf_size > pdata->rx_buf_size) + pdata->rx_buf_size = rxq->buf_size; + +AXGMAC_DMA_IOWRITE_BITS (rxq,DMA_CH_RCR ,RBSZ , + rxq->buf_size); + } +} + +static int axgbe_write_rss_reg (struct axgbe_port *pdata,unsigned int type, +unsigned int index,unsigned int val) +{ +unsigned int wait; + +if (AXGMAC_IOREAD_BITS (pdata,MAC_RSSAR ,OB )) +return -EBUSY ; + +AXGMAC_IOWRITE (pdata,MAC_RSSDR , val); + +AXGMAC_IOWRITE_BITS (pdata,MAC_RSSAR ,RSSIA , index); +AXGMAC_IOWRITE_BITS (pdata,MAC_RSSAR ,ADDRT , type); +AXGMAC_IOWRITE_BITS (pdata,MAC_RSSAR ,CT ,0 ); +AXGMAC_IOWRITE_BITS (pdata,MAC_RSSAR ,OB ,1 ); + + wait =1000 ; +while (wait--) { +if (!AXGMAC_IOREAD_BITS (pdata,MAC_RSSAR ,OB )) +return 0 ; + +rte_delay_us (1500 ); + } + +return -EBUSY ; +} + +static int axgbe_write_rss_hash_key (struct axgbe_port *pdata) +{ +struct rte_eth_rss_conf *rss_conf; +unsigned int key_regs =sizeof (pdata->rss_key) /sizeof (u32); +unsigned int *key; +int ret; + + rss_conf = &pdata->eth_dev->data->dev_conf.rx_adv_conf.rss_conf; + +if (!rss_conf->rss_key) + key = (unsigned int *)&pdata->rss_key; +else + key = (unsigned int *)&rss_conf->rss_key; + +while (key_regs--) { + ret =axgbe_write_rss_reg (pdata,AXGBE_RSS_HASH_KEY_TYPE , + key_regs, *key++); +if (ret) +return ret; + } + +return 0 ; +} + +static int axgbe_write_rss_lookup_table (struct axgbe_port *pdata) +{ +unsigned int i; +int ret; + +for (i =0 ; i <ARRAY_SIZE (pdata->rss_table); i++) { + ret =axgbe_write_rss_reg (pdata, +AXGBE_RSS_LOOKUP_TABLE_TYPE , i, + pdata->rss_table[i]); +if (ret) +return ret; + } + +return 0 ; +} + +static int axgbe_enable_rss (struct axgbe_port *pdata) +{ +int ret; + +/* Program the hash key */ + ret =axgbe_write_rss_hash_key (pdata); +if (ret) +return ret; + +/* Program the lookup table */ + ret =axgbe_write_rss_lookup_table (pdata); +if (ret) +return ret; + +/* Set the RSS options */ +AXGMAC_IOWRITE (pdata,MAC_RSSCR , pdata->rss_options); + +/* Enable RSS */ +AXGMAC_IOWRITE_BITS (pdata,MAC_RSSCR ,RSSE ,1 ); + +return 0 ; +} + +static void axgbe_rss_options (struct axgbe_port *pdata) +{ +struct rte_eth_rss_conf *rss_conf; +uint64_t rss_hf; + + rss_conf = &pdata->eth_dev->data->dev_conf.rx_adv_conf.rss_conf; + rss_hf = rss_conf->rss_hf; + +if (rss_hf & (ETH_RSS_IPV4 |ETH_RSS_IPV6 )) +AXGMAC_SET_BITS (pdata->rss_options,MAC_RSSCR ,IP2TE ,1 ); +if (rss_hf & (ETH_RSS_NONFRAG_IPV4_TCP |ETH_RSS_NONFRAG_IPV6_TCP )) +AXGMAC_SET_BITS (pdata->rss_options,MAC_RSSCR ,TCP4TE ,1 ); +if (rss_hf & (ETH_RSS_NONFRAG_IPV4_UDP |ETH_RSS_NONFRAG_IPV6_UDP )) +AXGMAC_SET_BITS (pdata->rss_options,MAC_RSSCR ,UDP4TE ,1 ); +} + +static int axgbe_config_rss (struct axgbe_port *pdata) +{ +uint32_t i; + +if (pdata->rss_enable) { +/* Initialize RSS hash key and lookup table */ +uint32_t *key = (uint32_t *)pdata->rss_key; + +for (i =0 ; i <sizeof (pdata->rss_key) /4 ; i++) + *key++ = (uint32_t )rte_rand (); +for (i =0 ; i <AXGBE_RSS_MAX_TABLE_SIZE ; i++) +AXGMAC_SET_BITS (pdata->rss_table[i],MAC_RSSDR ,DMCH , + i % pdata->eth_dev->data->nb_rx_queues); +axgbe_rss_options (pdata); +if (axgbe_enable_rss (pdata)) { +PMD_DRV_LOG (ERR ,"Error in enabling RSS support" ); +return -1 ; + } + }else { +AXGMAC_IOWRITE_BITS (pdata,MAC_RSSCR ,RSSE ,0 ); + } + +return 0 ; +} + +static void axgbe_enable_dma_interrupts (struct axgbe_port *pdata) +{ +struct axgbe_tx_queue *txq; +unsigned int dma_ch_isr, dma_ch_ier; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_tx_queues; i++) { + txq = pdata->eth_dev->data->tx_queues[i]; + +/* Clear all the interrupts which are set */ + dma_ch_isr =AXGMAC_DMA_IOREAD (txq,DMA_CH_SR ); +AXGMAC_DMA_IOWRITE (txq,DMA_CH_SR , dma_ch_isr); + +/* Clear all interrupt enable bits */ + dma_ch_ier =0 ; + +/* Enable following interrupts +* NIE - Normal Interrupt Summary Enable +* AIE - Abnormal Interrupt Summary Enable +* FBEE - Fatal Bus Error Enable +*/ +AXGMAC_SET_BITS (dma_ch_ier,DMA_CH_IER ,NIE ,0 ); +AXGMAC_SET_BITS (dma_ch_ier,DMA_CH_IER ,AIE ,1 ); +AXGMAC_SET_BITS (dma_ch_ier,DMA_CH_IER ,FBEE ,1 ); + +/* Enable following Rx interrupts +* RBUE - Receive Buffer Unavailable Enable +* RIE - Receive Interrupt Enable (unless using +* per channel interrupts in edge triggered +* mode) +*/ +AXGMAC_SET_BITS (dma_ch_ier,DMA_CH_IER ,RBUE ,0 ); + +AXGMAC_DMA_IOWRITE (txq,DMA_CH_IER , dma_ch_ier); + } +} + +static void wrapper_tx_desc_init (struct axgbe_port *pdata) +{ +struct axgbe_tx_queue *txq; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_tx_queues; i++) { + txq = pdata->eth_dev->data->tx_queues[i]; + txq->cur =0 ; + txq->dirty =0 ; +/* Update the total number of Tx descriptors */ +AXGMAC_DMA_IOWRITE (txq,DMA_CH_TDRLR , txq->nb_desc -1 ); +/* Update the starting address of descriptor ring */ +AXGMAC_DMA_IOWRITE (txq,DMA_CH_TDLR_HI , +high32_value (txq->ring_phys_addr)); +AXGMAC_DMA_IOWRITE (txq,DMA_CH_TDLR_LO , +low32_value (txq->ring_phys_addr)); + } +} + +static int wrapper_rx_desc_init (struct axgbe_port *pdata) +{ +struct axgbe_rx_queue *rxq; +struct rte_mbuf *mbuf; +volatile union axgbe_rx_desc *desc; +unsigned int i, j; + +for (i =0 ; i < pdata->eth_dev->data->nb_rx_queues; i++) { + rxq = pdata->eth_dev->data->rx_queues[i]; + +/* Initialize software ring entries */ + rxq->mbuf_alloc =0 ; + rxq->cur =0 ; + rxq->dirty =0 ; + desc =AXGBE_GET_DESC_PT (rxq,0 ); + +for (j =0 ; j < rxq->nb_desc; j++) { + mbuf =rte_mbuf_raw_alloc (rxq->mb_pool); +if (mbuf ==NULL ) { +PMD_DRV_LOG (ERR ,"RX mbuf alloc failed queue_id = %u, idx = %d" , + (unsigned int )rxq->queue_id, j); +axgbe_dev_rx_queue_release (rxq); +return -ENOMEM ; + } + rxq->sw_ring[j] = mbuf; +/* Mbuf populate */ + mbuf->next =NULL ; + mbuf->data_off =RTE_PKTMBUF_HEADROOM ; + mbuf->nb_segs =1 ; + mbuf->port = rxq->port_id; + desc->read.baddr = +rte_cpu_to_le_64 ( +rte_mbuf_data_iova_default (mbuf)); +rte_wmb (); +AXGMAC_SET_BITS_LE (desc->read.desc3, +RX_NORMAL_DESC3 ,OWN ,1 ); +rte_wmb (); + rxq->mbuf_alloc++; + desc++; + } +/* Update the total number of Rx descriptors */ +AXGMAC_DMA_IOWRITE (rxq,DMA_CH_RDRLR , + rxq->nb_desc -1 ); +/* Update the starting address of descriptor ring */ +AXGMAC_DMA_IOWRITE (rxq,DMA_CH_RDLR_HI , +high32_value (rxq->ring_phys_addr)); +AXGMAC_DMA_IOWRITE (rxq,DMA_CH_RDLR_LO , +low32_value (rxq->ring_phys_addr)); +/* Update the Rx Descriptor Tail Pointer */ +AXGMAC_DMA_IOWRITE (rxq,DMA_CH_RDTR_LO , +low32_value (rxq->ring_phys_addr + + (rxq->nb_desc -1 ) * +sizeof (union axgbe_rx_desc ))); + } +return 0 ; +} + +static void axgbe_config_mtl_mode (struct axgbe_port *pdata) +{ +unsigned int i; + +/* Set Tx to weighted round robin scheduling algorithm */ +AXGMAC_IOWRITE_BITS (pdata,MTL_OMR ,ETSALG ,MTL_ETSALG_WRR ); + +/* Set Tx traffic classes to use WRR algorithm with equal weights */ +for (i =0 ; i < pdata->hw_feat.tc_cnt; i++) { +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_TC_ETSCR ,TSA , +MTL_TSA_ETS ); +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_TC_QWR ,QW ,1 ); + } + +/* Set Rx to strict priority algorithm */ +AXGMAC_IOWRITE_BITS (pdata,MTL_OMR ,RAA ,MTL_RAA_SP ); +} + +static int axgbe_config_tsf_mode (struct axgbe_port *pdata,unsigned int val) +{ +unsigned int i; + +for (i =0 ; i < pdata->tx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_TQOMR ,TSF , val); + +return 0 ; +} + +static int axgbe_config_rsf_mode (struct axgbe_port *pdata,unsigned int val) +{ +unsigned int i; + +for (i =0 ; i < pdata->rx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQOMR ,RSF , val); + +return 0 ; +} + +static int axgbe_config_tx_threshold (struct axgbe_port *pdata, +unsigned int val) +{ +unsigned int i; + +for (i =0 ; i < pdata->tx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_TQOMR ,TTC , val); + +return 0 ; +} + +static int axgbe_config_rx_threshold (struct axgbe_port *pdata, +unsigned int val) +{ +unsigned int i; + +for (i =0 ; i < pdata->rx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQOMR ,RTC , val); + +return 0 ; +} + +/*Distrubting fifo size */ +static void axgbe_config_rx_fifo_size (struct axgbe_port *pdata) +{ +unsigned int fifo_size; +unsigned int q_fifo_size; +unsigned int p_fifo, i; + + fifo_size =RTE_MIN (pdata->rx_max_fifo_size, + pdata->hw_feat.rx_fifo_size); + q_fifo_size = fifo_size / pdata->rx_q_count; + +/* Calculate the fifo setting by dividing the queue's fifo size +* by the fifo allocation increment (with 0 representing the +* base allocation increment so decrement the result +* by 1). +*/ + p_fifo = q_fifo_size /AXGMAC_FIFO_UNIT ; +if (p_fifo) + p_fifo--; + +for (i =0 ; i < pdata->rx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQOMR ,RQS , p_fifo); + pdata->fifo = p_fifo; + +/*Calculate and config Flow control threshold*/ +axgbe_calculate_flow_control_threshold (pdata); +axgbe_config_flow_control_threshold (pdata); +} + +static void axgbe_config_tx_fifo_size (struct axgbe_port *pdata) +{ +unsigned int fifo_size; +unsigned int q_fifo_size; +unsigned int p_fifo, i; + + fifo_size =RTE_MIN (pdata->tx_max_fifo_size, + pdata->hw_feat.tx_fifo_size); + q_fifo_size = fifo_size / pdata->tx_q_count; + +/* Calculate the fifo setting by dividing the queue's fifo size +* by the fifo allocation increment (with 0 representing the +* base allocation increment so decrement the result +* by 1). +*/ + p_fifo = q_fifo_size /AXGMAC_FIFO_UNIT ; +if (p_fifo) + p_fifo--; + +for (i =0 ; i < pdata->tx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_TQOMR ,TQS , p_fifo); +} + +static void axgbe_config_queue_mapping (struct axgbe_port *pdata) +{ +unsigned int qptc, qptc_extra, queue; +unsigned int i, j, reg, reg_val; + +/* Map the MTL Tx Queues to Traffic Classes +* Note: Tx Queues >= Traffic Classes +*/ + qptc = pdata->tx_q_count / pdata->hw_feat.tc_cnt; + qptc_extra = pdata->tx_q_count % pdata->hw_feat.tc_cnt; + +for (i =0 , queue =0 ; i < pdata->hw_feat.tc_cnt; i++) { +for (j =0 ; j < qptc; j++) +AXGMAC_MTL_IOWRITE_BITS (pdata, queue,MTL_Q_TQOMR , +Q2TCMAP , i); +if (i < qptc_extra) +AXGMAC_MTL_IOWRITE_BITS (pdata, queue,MTL_Q_TQOMR , +Q2TCMAP , i); + } + +if (pdata->rss_enable) { +/* Select dynamic mapping of MTL Rx queue to DMA Rx channel */ + reg =MTL_RQDCM0R ; + reg_val =0 ; +for (i =0 ; i < pdata->rx_q_count;) { + reg_val |= (0x80 << ((i++ %MTL_RQDCM_Q_PER_REG ) <<3 )); + +if ((i %MTL_RQDCM_Q_PER_REG ) && + (i != pdata->rx_q_count)) +continue ; + +AXGMAC_IOWRITE (pdata, reg, reg_val); + + reg +=MTL_RQDCM_INC ; + reg_val =0 ; + } + } +} + +static void axgbe_enable_mtl_interrupts (struct axgbe_port *pdata) +{ +unsigned int mtl_q_isr; +unsigned int q_count, i; + + q_count =RTE_MAX (pdata->hw_feat.tx_q_cnt, pdata->hw_feat.rx_q_cnt); +for (i =0 ; i < q_count; i++) { +/* Clear all the interrupts which are set */ + mtl_q_isr =AXGMAC_MTL_IOREAD (pdata, i,MTL_Q_ISR ); +AXGMAC_MTL_IOWRITE (pdata, i,MTL_Q_ISR , mtl_q_isr); + +/* No MTL interrupts to be enabled */ +AXGMAC_MTL_IOWRITE (pdata, i,MTL_Q_IER ,0 ); + } +} + +static int axgbe_set_mac_address (struct axgbe_port *pdata,u8 *addr) +{ +unsigned int mac_addr_hi, mac_addr_lo; + + mac_addr_hi = (addr[5 ] <<8 ) | (addr[4 ] <<0 ); + mac_addr_lo = (addr[3 ] <<24 ) | (addr[2 ] <<16 ) | + (addr[1 ] <<8 ) | (addr[0 ] <<0 ); + +AXGMAC_IOWRITE (pdata,MAC_MACA0HR , mac_addr_hi); +AXGMAC_IOWRITE (pdata,MAC_MACA0LR , mac_addr_lo); + +return 0 ; +} + +static void axgbe_config_mac_address (struct axgbe_port *pdata) +{ +axgbe_set_mac_address (pdata, pdata->mac_addr.addr_bytes); +} + +static void axgbe_config_jumbo_enable (struct axgbe_port *pdata) +{ +unsigned int val; + + val = (pdata->rx_buf_size >AXGMAC_STD_PACKET_MTU ) ?1 :0 ; + val =1 ; + +AXGMAC_IOWRITE_BITS (pdata,MAC_RCR ,JE , val); +} + +static void axgbe_config_mac_speed (struct axgbe_port *pdata) +{ +axgbe_set_speed (pdata, pdata->phy_speed); +} + +static void axgbe_config_checksum_offload (struct axgbe_port *pdata) +{ +if (pdata->rx_csum_enable) +AXGMAC_IOWRITE_BITS (pdata,MAC_RCR ,IPC ,1 ); +else +AXGMAC_IOWRITE_BITS (pdata,MAC_RCR ,IPC ,0 ); +} + +static int axgbe_init (struct axgbe_port *pdata) +{ +int ret; + +/* Flush Tx queues */ + ret =axgbe_flush_tx_queues (pdata); +if (ret) +return ret; +/* Initialize DMA related features */ +axgbe_config_dma_bus (pdata); +axgbe_config_dma_cache (pdata); +axgbe_config_edma_control (pdata); +axgbe_config_osp_mode (pdata); +axgbe_config_pblx8 (pdata); +axgbe_config_tx_pbl_val (pdata); +axgbe_config_rx_pbl_val (pdata); +axgbe_config_rx_buffer_size (pdata); +axgbe_config_rss (pdata); +wrapper_tx_desc_init (pdata); + ret =wrapper_rx_desc_init (pdata); +if (ret) +return ret; +axgbe_enable_dma_interrupts (pdata); + +/* Initialize MTL related features */ +axgbe_config_mtl_mode (pdata); +axgbe_config_queue_mapping (pdata); +axgbe_config_tsf_mode (pdata, pdata->tx_sf_mode); +axgbe_config_rsf_mode (pdata, pdata->rx_sf_mode); +axgbe_config_tx_threshold (pdata, pdata->tx_threshold); +axgbe_config_rx_threshold (pdata, pdata->rx_threshold); +axgbe_config_tx_fifo_size (pdata); +axgbe_config_rx_fifo_size (pdata); + +axgbe_enable_mtl_interrupts (pdata); + +/* Initialize MAC related features */ +axgbe_config_mac_address (pdata); +axgbe_config_jumbo_enable (pdata); +axgbe_config_flow_control (pdata); +axgbe_config_mac_speed (pdata); +axgbe_config_checksum_offload (pdata); + +return 0 ; +} +void axgbe_init_function_ptrs_dev (struct axgbe_hw_if *hw_if) { hw_if->exit = axgbe_exit; + hw_if->config_flow_control = axgbe_config_flow_control; + hw_if->init = axgbe_init; hw_if->read_mmd_regs = axgbe_read_mmd_regs; hw_if->write_mmd_regs = axgbe_write_mmd_regs;
@@ -379,4 +1220,7 @@ void axgbe_init_function_ptrs_dev(struct axgbe_hw_if *hw_if) hw_if->set_ext_mii_mode = axgbe_set_ext_mii_mode; hw_if->read_ext_mii_regs = axgbe_read_ext_mii_regs; hw_if->write_ext_mii_regs = axgbe_write_ext_mii_regs; +/* For FLOW ctrl */ + hw_if->config_tx_flow_control = axgbe_config_tx_flow_control; + hw_if->config_rx_flow_control = axgbe_config_rx_flow_control; }
drivers/net/axgbe/axgbe_ethdev.c +96 -1
124 lines not on this page · raw message
Signature · 1 line
2.7.4
Re: [PATCH 09/16] net/axgbe: add DMA programming and dev start and stop apis
Quoted 1 line · Ravi Kumar
Signed-off-by Ravi Kumar <[email protected]>
<...>
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_interrupt_handler(void *param) · line 239
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +10
-0+/* +* Configure device link speed and setup link. +* It returns 0 on success. +*/ +static int +axgbe_dev_configure (struct rte_eth_dev *dev) +{ +struct axgbe_port *pdata = dev->data->dev_private; +/* Checksum offload to hardware */ + pdata->rx_csum_enable = dev->data->dev_conf.rxmode.hw_ip_checksum;
There is a new method to get offload requests from user, since this is new PMD I believe it would be better to implement new method.
Shahaf cc'ed for more support if required.
<...>
PATCH 10/16 net/axgbe: add transmit and receive data path apis
In reply to Ravi Kumar--- drivers/net/axgbe/Makefile | 1 + drivers/net/axgbe/axgbe_ethdev.c | 56 ++++- drivers/net/axgbe/axgbe_rxtx.c | 427 +++++++++++++++++++++++++++++++++++++ drivers/net/axgbe/axgbe_rxtx.h | 19 ++ drivers/net/axgbe/axgbe_rxtx_vec.c | 215 +++++++++++++++++++ 5 files changed, 715 insertions(+), 3 deletions(-) create mode 100644 drivers/net/axgbe/axgbe_rxtx_vec.c
drivers/net/axgbe/Makefile +1 -0
@@ -147,5 +147,6 @@ SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_mdio.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_phy_impl.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_i2c.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_rxtx.c +SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_rxtx_vec.c include $(RTE_SDK)/mk/rte.lib.mk
drivers/net/axgbe/axgbe_ethdev.c +53 -3
100 lines not on this page · raw message
drivers/net/axgbe/axgbe_rxtx.c +427 -0
448 lines not on this page · raw message
drivers/net/axgbe/axgbe_rxtx.h +19 -0
@@ -272,12 +272,31 @@ void axgbe_dev_tx_queue_release(void *txq);int axgbe_dev_tx_queue_setup (struct rte_eth_dev *dev,uint16_t tx_queue_id,uint16_t nb_tx_desc,unsigned int socket_id,const struct rte_eth_txconf *tx_conf); +void axgbe_dev_enable_tx (struct rte_eth_dev *dev); +void axgbe_dev_disable_tx (struct rte_eth_dev *dev); +int axgbe_dev_tx_queue_start (struct rte_eth_dev *dev,uint16_t tx_queue_id); +int axgbe_dev_tx_queue_stop (struct rte_eth_dev *dev,uint16_t tx_queue_id); + +uint16_t axgbe_xmit_pkts (void *tx_queue,struct rte_mbuf **tx_pkts, +uint16_t nb_pkts); +uint16_t axgbe_xmit_pkts_vec (void *tx_queue,struct rte_mbuf **tx_pkts, +uint16_t nb_pkts); +void axgbe_dev_rx_queue_release (void *rxq);int axgbe_dev_rx_queue_setup (struct rte_eth_dev *dev,uint16_t rx_queue_id,uint16_t nb_rx_desc,unsigned int socket_id,const struct rte_eth_rxconf *rx_conf,struct rte_mempool *mb_pool); +void axgbe_dev_enable_rx (struct rte_eth_dev *dev); +void axgbe_dev_disable_rx (struct rte_eth_dev *dev); +int axgbe_dev_rx_queue_start (struct rte_eth_dev *dev,uint16_t rx_queue_id); +int axgbe_dev_rx_queue_stop (struct rte_eth_dev *dev,uint16_t rx_queue_id); +uint16_t axgbe_recv_pkts (void *rx_queue,struct rte_mbuf **rx_pkts, +uint16_t nb_pkts); +uint16_t axgbe_recv_pkts_threshold_refresh (void *rx_queue, +struct rte_mbuf **rx_pkts, +uint16_t nb_pkts);void axgbe_dev_clear_queues (struct rte_eth_dev *dev);#endif /* _AXGBE_RXTX_H_ */
drivers/net/axgbe/axgbe_rxtx_vec.c new file +215 -0
215 lines not on this page · raw message
Signature · 1 line
2.7.4
Re: [PATCH 10/16] net/axgbe: add transmit and receive data path apis
Quoted 7 lines · Ravi Kumar
Signed-off-by Ravi Kumar <[email protected]>--- drivers/net/axgbe/Makefile | 1 + drivers/net/axgbe/axgbe_ethdev.c | 56 ++++- drivers/net/axgbe/axgbe_rxtx.c | 427 +++++++++++++++++++++++++++++++++++++ drivers/net/axgbe/axgbe_rxtx.h | 19 ++ drivers/net/axgbe/axgbe_rxtx_vec.c | 215 +++++++++++++++++++
You may rename this as axgbe_rxtx_vec_sse.c to clarify which arch it is for.
<...>
drivers/net/axgbe/axgbe_ethdev.c static const struct eth_dev_ops axgbe_eth_dev_ops = { · line 195
Quoted 5 lines
drivers/net/axgbe/axgbe_ethdev.c +1
-0@@ -190,6 +192,7 @@ static const struct eth_dev_ops axgbe_eth_dev_ops = { .dev_start = axgbe_dev_start, .dev_stop = axgbe_dev_stop, .dev_close = axgbe_dev_close, + .link_update = axgbe_dev_link_update,
Can you please separate this into its own patch.
<...>
drivers/net/axgbe/axgbe_ethdev.c eth_axgbe_dev_init(struct rte_eth_dev *eth_dev) · line 599
Quoted 8 lines
drivers/net/axgbe/axgbe_ethdev.c +2
-2@@ -545,8 +595,8 @@ eth_axgbe_dev_init(struct rte_eth_dev *eth_dev)axgbe_set_bit (AXGBE_STOPPED , &pdata->dev_state); pdata->eth_dev = eth_dev; eth_dev->dev_ops = &axgbe_eth_dev_ops; - eth_dev->rx_pkt_burst =NULL ; - eth_dev->tx_pkt_burst =NULL ; + eth_dev->rx_pkt_burst = &axgbe_recv_pkts; + eth_dev->tx_pkt_burst = &axgbe_xmit_pkts_vec;
It can be helpful to comment axgbe_dev_tx_queue_setup() can set non-vector Tx path.
<...>
PATCH 11/16 net/axgbe: add configure flow control while link adjustment
In reply to Ravi Kumar--- drivers/net/axgbe/axgbe_mdio.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
drivers/net/axgbe/axgbe_mdio.c +13 -0
@@ -796,6 +796,19 @@ static void axgbe_an_init(struct axgbe_port *pdata)static void axgbe_phy_adjust_link (struct axgbe_port *pdata) {if (pdata->phy.link) { +/* Flow control support */ + pdata->pause_autoneg = pdata->phy.pause_autoneg; + +if (pdata->tx_pause != (unsigned int )pdata->phy.tx_pause) { + pdata->hw_if.config_tx_flow_control (pdata); + pdata->tx_pause = pdata->phy.tx_pause; + } + +if (pdata->rx_pause != (unsigned int )pdata->phy.rx_pause) { + pdata->hw_if.config_rx_flow_control (pdata); + pdata->rx_pause = pdata->phy.rx_pause; + } +/* Speed support */ if (pdata->phy_speed != pdata->phy.speed) pdata->phy_speed = pdata->phy.speed;
Signature · 1 line
2.7.4
PATCH 12/16 net/axgbe: add promiscuous mode support
In reply to Ravi Kumar--- drivers/net/axgbe/axgbe_ethdev.c | 48 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+)
drivers/net/axgbe/axgbe_ethdev.c +48 -0
@@ -136,6 +136,10 @@ static int axgbe_dev_configure(struct rte_eth_dev *dev);static int axgbe_dev_start (struct rte_eth_dev *dev);static void axgbe_dev_stop (struct rte_eth_dev *dev);static void axgbe_dev_close (struct rte_eth_dev *dev); +static void axgbe_dev_promiscuous_enable (struct rte_eth_dev *dev); +static void axgbe_dev_promiscuous_disable (struct rte_eth_dev *dev); +static void axgbe_dev_allmulticast_enable (struct rte_eth_dev *dev); +static void axgbe_dev_allmulticast_disable (struct rte_eth_dev *dev);static int axgbe_dev_link_update (struct rte_eth_dev *dev,int wait_to_complete); static void axgbe_dev_info_get(struct rte_eth_dev *dev,
@@ -192,6 +196,10 @@ static const struct eth_dev_ops axgbe_eth_dev_ops = { .dev_start = axgbe_dev_start, .dev_stop = axgbe_dev_stop, .dev_close = axgbe_dev_close, + .promiscuous_enable = axgbe_dev_promiscuous_enable, + .promiscuous_disable = axgbe_dev_promiscuous_disable, + .allmulticast_enable = axgbe_dev_allmulticast_enable, + .allmulticast_disable = axgbe_dev_allmulticast_disable, .link_update = axgbe_dev_link_update, .dev_infos_get = axgbe_dev_info_get, .rx_queue_setup = axgbe_dev_rx_queue_setup,
@@ -336,6 +344,46 @@ axgbe_dev_close(struct rte_eth_dev *dev)axgbe_dev_clear_queues (dev); } +static void +axgbe_dev_promiscuous_enable (struct rte_eth_dev *dev) +{ +PMD_INIT_FUNC_TRACE (); +struct axgbe_port *pdata = dev->data->dev_private; + +AXGMAC_IOWRITE_BITS (pdata,MAC_PFR ,PR ,1 ); +} + +static void +axgbe_dev_promiscuous_disable (struct rte_eth_dev *dev) +{ +PMD_INIT_FUNC_TRACE (); +struct axgbe_port *pdata = dev->data->dev_private; + +AXGMAC_IOWRITE_BITS (pdata,MAC_PFR ,PR ,0 ); +} + +static void +axgbe_dev_allmulticast_enable (struct rte_eth_dev *dev) +{ +PMD_INIT_FUNC_TRACE (); +struct axgbe_port *pdata = dev->data->dev_private; + +if (AXGMAC_IOREAD_BITS (pdata,MAC_PFR ,PM )) +return ; +AXGMAC_IOWRITE_BITS (pdata,MAC_PFR ,PM ,1 ); +} + +static void +axgbe_dev_allmulticast_disable (struct rte_eth_dev *dev) +{ +PMD_INIT_FUNC_TRACE (); +struct axgbe_port *pdata = dev->data->dev_private; + +if (!AXGMAC_IOREAD_BITS (pdata,MAC_PFR ,PM )) +return ; +AXGMAC_IOWRITE_BITS (pdata,MAC_PFR ,PM ,0 ); +} +/* return 0 means link status changed, -1 means not changed */ static int axgbe_dev_link_update(struct rte_eth_dev *dev,
Signature · 1 line
2.7.4
Re: [PATCH 12/16] net/axgbe: add promiscuous mode support
On 11/30/2017 5:11 AM, Ravi Kumar wrote:
add promisc _and_ allmulticast support...
Quoted 1 line
Signed-off-by Ravi Kumar <[email protected]>
<...>
PATCH 13/16 net/axgbe: add generic transmit and receive stats support
In reply to Ravi Kumar--- drivers/net/axgbe/axgbe_ethdev.c | 51 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+)
drivers/net/axgbe/axgbe_ethdev.c +51 -0
@@ -142,6 +142,9 @@ static void axgbe_dev_allmulticast_enable(struct rte_eth_dev *dev);static void axgbe_dev_allmulticast_disable (struct rte_eth_dev *dev);static int axgbe_dev_link_update (struct rte_eth_dev *dev,int wait_to_complete); +static int axgbe_dev_stats_get (struct rte_eth_dev *dev, +struct rte_eth_stats *stats); +static void axgbe_dev_stats_reset (struct rte_eth_dev *dev);static void axgbe_dev_info_get (struct rte_eth_dev *dev,struct rte_eth_dev_info *dev_info);static void axgbe_dev_interrupt_handler (void *param);
@@ -201,6 +204,8 @@ static const struct eth_dev_ops axgbe_eth_dev_ops = { .allmulticast_enable = axgbe_dev_allmulticast_enable, .allmulticast_disable = axgbe_dev_allmulticast_disable, .link_update = axgbe_dev_link_update, + .stats_get = axgbe_dev_stats_get, + .stats_reset = axgbe_dev_stats_reset, .dev_infos_get = axgbe_dev_info_get, .rx_queue_setup = axgbe_dev_rx_queue_setup, .rx_queue_release = axgbe_dev_rx_queue_release,
@@ -413,6 +418,52 @@ axgbe_dev_link_update(struct rte_eth_dev *dev,return old_link_status == dev->data->dev_link.link_status ?-1 :0 ; } +static int +axgbe_dev_stats_get (struct rte_eth_dev *dev, +struct rte_eth_stats *stats) +{ +struct axgbe_rx_queue *rxq; +struct axgbe_tx_queue *txq; +unsigned int i; + +for (i =0 ; i < dev->data->nb_rx_queues; i++) { + rxq = dev->data->rx_queues[i]; + stats->q_ipackets[i] = rxq->pkts; + stats->ipackets += rxq->pkts; + stats->q_ibytes[i] = rxq->bytes; + stats->ibytes += rxq->bytes; + } +for (i =0 ; i < dev->data->nb_tx_queues; i++) { + txq = dev->data->tx_queues[i]; + stats->q_opackets[i] = txq->pkts; + stats->opackets += txq->pkts; + stats->q_obytes[i] = txq->bytes; + stats->obytes += txq->bytes; + } + +return 0 ; +} + +static void +axgbe_dev_stats_reset (struct rte_eth_dev *dev) +{ +struct axgbe_rx_queue *rxq; +struct axgbe_tx_queue *txq; +unsigned int i; + +for (i =0 ; i < dev->data->nb_rx_queues; i++) { + rxq = dev->data->rx_queues[i]; + rxq->pkts =0 ; + rxq->bytes =0 ; + rxq->errors =0 ; + } +for (i =0 ; i < dev->data->nb_tx_queues; i++) { + txq = dev->data->tx_queues[i]; + txq->pkts =0 ; + txq->bytes =0 ; + txq->errors =0 ; + } +} static void axgbe_dev_info_get(struct rte_eth_dev *dev,
Signature · 1 line
2.7.4
PATCH 14/16 doc: add documents for AMD axgbe Ethernet PMD
In reply to Ravi Kumar--- doc/guides/nics/axgbe.rst | 214 +++++++++++++++++++++++++++++++++++++ doc/guides/nics/features/axgbe.ini | 18 ++++ doc/guides/nics/index.rst | 1 + 3 files changed, 233 insertions(+) create mode 100644 doc/guides/nics/axgbe.rst create mode 100644 doc/guides/nics/features/axgbe.ini
doc/guides/nics/axgbe.rst new file +214 -0
@@ -0,0 +1,214 @@ +.. Copyright (c) 2017 Advanced Micro Devices, Inc. + All rights reserved. + + AMD 10Gb Ethernet driver + + This file is available to you under your choice of the following two + licenses: + + License 1: GPLv2 + + Copyright (c) 2017 Advanced Micro Devices, Inc. + + This file is free software; you may copy, redistribute and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or (at + your option) any later version. + + This file is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + This file incorporates work covered by the following copyright and + permission notice: + + Copyright (c) 2013 Synopsys, Inc. + + The Synopsys DWC ETHER XGMAC Software Driver and documentation + (hereinafter "Software") is an unsupported proprietary work of Synopsys, + Inc. unless otherwise expressly agreed to in writing between Synopsys + and you. + + The Software IS NOT an item of Licensed Software or Licensed Product + under any End User Software License Agreement or Agreement for Licensed + Product with Synopsys or any supplement thereto. Permission is hereby + granted, free of charge, to any person obtaining a copy of this software + annotated with this license and the Software, to deal in the Software + without restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" + BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS + 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. + + License 2: Modified BSD + + Copyright (c) 2017 Advanced Micro Devices, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * 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. + * Neither the name of Advanced Micro Devices, Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 <COPYRIGHT HOLDER> 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. + + This file incorporates work covered by the following copyright and + permission notice: + + Copyright (c) 2013 Synopsys, Inc. + + The Synopsys DWC ETHER XGMAC Software Driver and documentation + (hereinafter "Software") is an unsupported proprietary work of Synopsys, + Inc. unless otherwise expressly agreed to in writing between Synopsys + and you. + + The Software IS NOT an item of Licensed Software or Licensed Product + under any End User Software License Agreement or Agreement for Licensed + Product with Synopsys or any supplement thereto. Permission is hereby + granted, free of charge, to any person obtaining a copy of this software + annotated with this license and the Software, to deal in the Software + without restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" + BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS + 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. + +AXGBE Poll Mode Driver +====================== + +The AXGBE poll mode driver library (**librte_pmd_axgbe**) implements support +for AMD 10 Gbps family of adapters. It is compiled and tested in standard linux distro like Ubuntu. + +Supported Features +------------------ + +AXGBE PMD has support for: + +- Base L2 features +- Unicast/multicast filtering +- Promiscuous mode +- Port statistics +- TSS (Transmit Side Scaling) +- RSS (Receive Side Scaling) +- Checksum offload +- Jumbo Frame upto 9K + + +Supported Chipsets and NICs +--------------------------- +- AMD 10 Gigabit Ethernet Controller + + +Configuration Information +------------------------- + +The following options can be modified in the ``.config`` file. Please note that +enabling debugging options may affect system performance. + +- ``CONFIG_RTE_LIBRTE_AXGBE_PMD`` (default **n**) + + Toggle compilation of axgbe driver. To use axgbe PMD set this config parameter + to 'y'. + +- ``CONFIG_RTE_LIBRTE_AXGBE_DEBUG_INIT`` (default **n**) + + Toggle display of initialization related messages. + + +Building DPDK +------------- + +See the :ref:`DPDK Getting Started Guide for Linux <linux_gsg>` for +instructions on how to build DPDK. + +By default the AXGBE PMD library will be built into the DPDK library. + +For configuring and using UIO frameworks, please also refer :ref:`the +documentation that comes with DPDK suite <linux_gsg>`. + + +Prerequisites and Pre-conditions +-------------------------------- +- Prepare the system as recommended by DPDK suite. + +- AXGBE PMD works only with legacy interrupts, so load igb_uio module in legacy interrupt mode + using module params. + +- Bind the intented AMD device to igb_uio module. + +Now system is ready to run DPDK application. + + +Usage Example +------------- + +Refer to the document :ref:`compiling and testing a PMD for a NIC <pmd_build_and_test>` +for details. + +Example output: + +.. code-block:: console + + [...] + EAL: PCI device 0000:02:00.4 on NUMA socket 0 + EAL: probe driver: 1022:1458 net_axgbe + Interactive-mode selected + USER1: create a new mbuf pool <mbuf_pool_socket_0>: n=171456, size=2176, socket=0 + USER1: create a new mbuf pool <mbuf_pool_socket_1>: n=171456, size=2176, socket=1 + USER1: create a new mbuf pool <mbuf_pool_socket_2>: n=171456, size=2176, socket=2 + USER1: create a new mbuf pool <mbuf_pool_socket_3>: n=171456, size=2176, socket=3 + Configuring Port 0 (socket 0) + Port 0: 00:00:1A:1C:6A:17 + Checking link statuses... + Port 0 Link Up - speed 10000 Mbps - full-duplex + Done + testpmd>
doc/guides/nics/features/axgbe.ini new file +18 -0
@@ -0,0 +1,18 @@ +; +; Supported features of the 'axgbe' network poll mode driver. +; +; Refer to default.ini for the full list of available PMD features. +; +[Features] +Speed capabilities = Y +Link status = Y +Jumbo frame = Y +Promiscuous mode = Y +Allmulticast mode = Y +RSS hash = Y +CRC offload = Y +L3 checksum offload = Y +L4 checksum offload = Y +Basic stats = Y +Linux UIO = Y +x86-64 = Y
doc/guides/nics/index.rst +1 -0
@@ -40,6 +40,7 @@ Network Interface Controller Drivers build_and_test ark avp + axgbe bnx2x bnxt cxgbe
Signature · 1 line
2.7.4
Re: [PATCH 14/16] doc: add documents for AMD axgbe Ethernet PMD
Quoted 1 line · Ravi Kumar
Signed-off-by Ravi Kumar <[email protected]>
<...>
Quoted 10 lines
+++ b/doc/guides/nics/features/axgbe.ini
doc/guides/nics/features/axgbe.ini new file +8
-0@@ -0,0 +1,18 @@ +; +; Supported features of the 'axgbe' network poll mode driver. +; +; Refer to default.ini for the full list of available PMD features. +; +[Features] +Speed capabilities = Y +Link status = Y
doc/guides/nics/features/axgbe.ini line 18
Quoted 10 lines
doc/guides/nics/features/axgbe.ini new file +10
-0+Jumbo frame = Y +Promiscuous mode = Y +Allmulticast mode = Y +RSS hash = Y +CRC offload = Y +L3 checksum offload = Y +L4 checksum offload = Y +Basic stats = Y +Linux UIO = Y +x86-64 = Y
Can you please distribute these updates to the previous patches that adds the actual feature documented here. Remaining one can go in with this doc patch.
<...>
PATCH 15/16 net/axgbe: add support for icc and clang build
In reply to Ravi Kumar--- drivers/net/axgbe/axgbe_rxtx.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/net/axgbe/axgbe_rxtx.h +6 -1
@@ -128,8 +128,13 @@#ifndef _AXGBE_RXTX_H_#define _AXGBE_RXTX_H_ -/* to suppress gcc warnings related to descriptor casting*/ +/* to suppress gcc warnings related to descriptor casting */ +#ifdef RTE_TOOLCHAIN_GCC #pragma GCC diagnostic ignored "-Wcast-qual" +#endif +#ifdef RTE_TOOLCHAIN_CLANG +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif /* Descriptor related defines */ #define AXGBE_MAX_RING_DESC 4096/*should be power of 2*/
Signature · 1 line
2.7.4
PATCH 16/16 net/axgbe: add support for build 32-bit mode
In reply to Ravi Kumar--- drivers/net/axgbe/axgbe_common.h | 49 +++--- drivers/net/axgbe/axgbe_ethdev.c | 10 +- drivers/net/axgbe/axgbe_ethdev.h | 8 +- drivers/net/axgbe/axgbe_rxtx.c | 12 +- drivers/net/axgbe/axgbe_rxtx.h | 4 +- drivers/net/axgbe/axgbe_rxtx.h.orig | 307 ++++++++++++++++++++++++++++++++++++ 6 files changed, 354 insertions(+), 36 deletions(-) create mode 100644 drivers/net/axgbe/axgbe_rxtx.h.orig
drivers/net/axgbe/axgbe_common.h +29 -20
@@ -1506,7 +1506,7 @@ do { \* register definitions formed using the input names */ #define AXGMAC_IOREAD (_pdata, _reg) \ - rte_read32((void *)((_pdata)->xgmac_regs + (_reg))) + rte_read32((void *)((uint8_t *)((_pdata)->xgmac_regs) + (_reg)))#define AXGMAC_IOREAD_BITS (_pdata, _reg, _field) \ GET_BITS(AXGMAC_IOREAD((_pdata), _reg), \
@@ -1514,7 +1514,8 @@ do { \ _reg##_##_field##_WIDTH) #define AXGMAC_IOWRITE(_pdata, _reg, _val) \ - rte_write32((_val), (void *)((_pdata)->xgmac_regs + (_reg))) + rte_write32((_val), \ + (void *)((uint8_t *)((_pdata)->xgmac_regs) + (_reg))) #define AXGMAC_IOWRITE_BITS(_pdata, _reg, _field, _val) \ do { \
@@ -1530,7 +1531,7 @@ do { \* base register value is calculated by the queue or traffic class number */ #define AXGMAC_MTL_IOREAD (_pdata, _n, _reg) \ - rte_read32((void *)((_pdata)->xgmac_regs + \ + rte_read32((void *)((uint8_t *)((_pdata)->xgmac_regs) + \ MTL_Q_BASE + ((_n) * MTL_Q_INC) + (_reg)))#define AXGMAC_MTL_IOREAD_BITS (_pdata, _n, _reg, _field) \
@@ -1539,7 +1540,7 @@ do { \ _reg##_##_field##_WIDTH) #define AXGMAC_MTL_IOWRITE(_pdata, _n, _reg, _val) \ - rte_write32((_val), (void *)((_pdata)->xgmac_regs + \ + rte_write32((_val), (void *)((uint8_t *)((_pdata)->xgmac_regs) +\ MTL_Q_BASE + ((_n) * MTL_Q_INC) + (_reg)))#define AXGMAC_MTL_IOWRITE_BITS (_pdata, _n, _reg, _field, _val) \
@@ -1556,7 +1557,7 @@ do { \* base register value is obtained from the ring */ #define AXGMAC_DMA_IOREAD (_channel, _reg) \ - rte_read32((void *)((_channel)->dma_regs + (_reg))) + rte_read32((void *)((uint8_t *)((_channel)->dma_regs) + (_reg)))#define AXGMAC_DMA_IOREAD_BITS (_channel, _reg, _field) \ GET_BITS(AXGMAC_DMA_IOREAD((_channel), _reg), \
@@ -1564,7 +1565,8 @@ do { \ _reg##_##_field##_WIDTH) #define AXGMAC_DMA_IOWRITE(_channel, _reg, _val) \ - rte_write32((_val), (void *)((_channel)->dma_regs + (_reg))) + rte_write32((_val), \ + (void *)((uint8_t *)((_channel)->dma_regs) + (_reg))) #define AXGMAC_DMA_IOWRITE_BITS(_channel, _reg, _field, _val) \ do { \
@@ -1589,16 +1591,18 @@ do { \ _prefix##_##_field##_WIDTH, (_val)) #define XPCS32_IOWRITE(_pdata, _off, _val) \ - rte_write32(_val, (void *)((_pdata)->xpcs_regs + (_off))) +rte_write32 (_val, \ + (void *)((uint8_t *)((_pdata)->xpcs_regs) + (_off))) #define XPCS32_IOREAD(_pdata, _off) \ - rte_read32((void *)((_pdata)->xpcs_regs + (_off))) + rte_read32((void *)((uint8_t *)((_pdata)->xpcs_regs) + (_off))) #define XPCS16_IOWRITE(_pdata, _off, _val) \ - rte_write16(_val, (void *)((_pdata)->xpcs_regs + (_off))) +rte_write16 (_val, \ + (void *)((uint8_t *)((_pdata)->xpcs_regs) + (_off))) #define XPCS16_IOREAD(_pdata, _off) \ - rte_read16((void *)((_pdata)->xpcs_regs + (_off))) + rte_read16((void *)((uint8_t *)((_pdata)->xpcs_regs) + (_off)))/* Macros for building, reading or writing register values or bits * within the register values of SerDes integration registers.
@@ -1614,7 +1618,7 @@ do { \ _prefix##_##_field##_WIDTH, (_val)) #define XSIR0_IOREAD(_pdata, _reg) \ - rte_read16((void *)((_pdata)->sir0_regs + (_reg))) + rte_read16((void *)((uint8_t *)((_pdata)->sir0_regs) + (_reg))) #define XSIR0_IOREAD_BITS(_pdata, _reg, _field) \ GET_BITS(XSIR0_IOREAD((_pdata), _reg), \
@@ -1622,7 +1626,8 @@ do { \ _reg##_##_field##_WIDTH) #define XSIR0_IOWRITE(_pdata, _reg, _val) \ - rte_read16((_val), (void *)((_pdata)->sir0_regs + (_reg))) + rte_read16((_val), \ + (void *)((uint8_t *)((_pdata)->sir0_regs) + (_reg))) #define XSIR0_IOWRITE_BITS(_pdata, _reg, _field, _val) \ do { \
@@ -1634,7 +1639,7 @@ do { \ } while (0)#define XSIR1_IOREAD (_pdata, _reg) \ - rte_read16((void *)((_pdata)->sir1_regs + _reg)) + rte_read16((void *)((uint8_t *)((_pdata)->sir1_regs) + _reg))#define XSIR1_IOREAD_BITS (_pdata, _reg, _field) \ GET_BITS(XSIR1_IOREAD((_pdata), _reg), \
@@ -1642,7 +1647,8 @@ do { \ _reg##_##_field##_WIDTH) #define XSIR1_IOWRITE(_pdata, _reg, _val) \ - rte_read16((_val), (void *)((_pdata)->sir1_regs + (_reg))) + rte_read16((_val), \ + (void *)((uint8_t *)((_pdata)->sir1_regs) + (_reg))) #define XSIR1_IOWRITE_BITS(_pdata, _reg, _field, _val) \ do { \
@@ -1657,7 +1663,7 @@ do { \* within the register values of SerDes RxTx registers. */ #define XRXTX_IOREAD (_pdata, _reg) \ - rte_read16((void *)((_pdata)->rxtx_regs + (_reg))) + rte_read16((void *)((uint8_t *)((_pdata)->rxtx_regs) + (_reg)))#define XRXTX_IOREAD_BITS (_pdata, _reg, _field) \ GET_BITS(XRXTX_IOREAD((_pdata), _reg), \
@@ -1665,7 +1671,8 @@ do { \ _reg##_##_field##_WIDTH) #define XRXTX_IOWRITE(_pdata, _reg, _val) \ - rte_write16((_val), (void *)((_pdata)->rxtx_regs + (_reg))) + rte_write16((_val), \ + (void *)((uint8_t *)((_pdata)->rxtx_regs) + (_reg))) #define XRXTX_IOWRITE_BITS(_pdata, _reg, _field, _val) \ do { \
@@ -1690,7 +1697,7 @@ do { \ _prefix##_##_field##_WIDTH, (_val)) #define XP_IOREAD(_pdata, _reg) \ - rte_read32((void *)((_pdata)->xprop_regs + (_reg))) + rte_read32((void *)((uint8_t *)((_pdata)->xprop_regs) + (_reg))) #define XP_IOREAD_BITS(_pdata, _reg, _field) \ GET_BITS(XP_IOREAD((_pdata), (_reg)), \
@@ -1698,7 +1705,8 @@ do { \ _reg##_##_field##_WIDTH) #define XP_IOWRITE(_pdata, _reg, _val) \ - rte_write32((_val), (void *)((_pdata)->xprop_regs + (_reg))) + rte_write32((_val), \ + (void *)((uint8_t *)((_pdata)->xprop_regs) + (_reg))) #define XP_IOWRITE_BITS(_pdata, _reg, _field, _val) \ do { \
@@ -1723,7 +1731,7 @@ do { \ _prefix##_##_field##_WIDTH, (_val)) #define XI2C_IOREAD(_pdata, _reg) \ - rte_read32((void *)((_pdata)->xi2c_regs + (_reg))) + rte_read32((void *)((uint8_t *)((_pdata)->xi2c_regs) + (_reg))) #define XI2C_IOREAD_BITS(_pdata, _reg, _field) \ GET_BITS(XI2C_IOREAD((_pdata), (_reg)), \
@@ -1731,7 +1739,8 @@ do { \ _reg##_##_field##_WIDTH) #define XI2C_IOWRITE(_pdata, _reg, _val) \ - rte_write32((_val), (void *)((_pdata)->xi2c_regs + (_reg))) + rte_write32((_val), \ + (void *)((uint8_t *)((_pdata)->xi2c_regs) + (_reg))) #define XI2C_IOWRITE_BITS(_pdata, _reg, _field, _val) \ do { \
drivers/net/axgbe/axgbe_ethdev.c +6 -4
@@ -710,10 +710,12 @@ eth_axgbe_dev_init(struct rte_eth_dev *eth_dev)rte_eth_copy_pci_info (eth_dev, pci_dev); pdata->xgmac_regs = - (uint64_t )pci_dev->mem_resource[AXGBE_AXGMAC_BAR ].addr; - pdata->xprop_regs = pdata->xgmac_regs +AXGBE_MAC_PROP_OFFSET ; - pdata->xi2c_regs = pdata->xgmac_regs +AXGBE_I2C_CTRL_OFFSET ; - pdata->xpcs_regs = (uint64_t )pci_dev->mem_resource[AXGBE_XPCS_BAR ].addr; + (void *)pci_dev->mem_resource[AXGBE_AXGMAC_BAR ].addr; + pdata->xprop_regs = (void *)((uint8_t *)pdata->xgmac_regs + +AXGBE_MAC_PROP_OFFSET ); + pdata->xi2c_regs = (void *)((uint8_t *)pdata->xgmac_regs + +AXGBE_I2C_CTRL_OFFSET ); + pdata->xpcs_regs = (void *)pci_dev->mem_resource[AXGBE_XPCS_BAR ].addr;/* version specific driver data*/ if (pci_dev->id.device_id ==0x1458 )
drivers/net/axgbe/axgbe_ethdev.h +4 -4
@@ -567,10 +567,10 @@ struct axgbe_port {struct axgbe_version_data *vdata;/* AXGMAC/XPCS related mmio registers */ -uint64_t xgmac_regs;/* AXGMAC CSRs */ -uint64_t xpcs_regs;/* XPCS MMD registers */ -uint64_t xprop_regs;/* AXGBE property registers */ -uint64_t xi2c_regs;/* AXGBE I2C CSRs */ +void *xgmac_regs;/* AXGMAC CSRs */ +void *xpcs_regs;/* XPCS MMD registers */ +void *xprop_regs;/* AXGBE property registers */ +void *xi2c_regs;/* AXGBE I2C CSRs */ /* XPCS indirect addressing lock */ unsigned int xpcs_window_def_reg;
drivers/net/axgbe/axgbe_rxtx.c +6 -6
@@ -192,9 +192,9 @@ int axgbe_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, rxq->queue_id = queue_idx; rxq->port_id = dev->data->port_id; rxq->nb_desc = rx_desc; - rxq->dma_regs = pdata->xgmac_regs +DMA_CH_BASE + - (DMA_CH_INC * rxq->queue_id); - rxq->dma_tail_reg = (volatile uint32_t *)(rxq->dma_regs + + rxq->dma_regs = (void *)((uint8_t *)pdata->xgmac_regs +DMA_CH_BASE + + (DMA_CH_INC * rxq->queue_id)); + rxq->dma_tail_reg = (volatile uint32_t *)((uint8_t *)rxq->dma_regs +DMA_CH_RDTR_LO ); rxq->crc_len = (uint8_t)((dev->data->dev_conf.rxmode.hw_strip_crc) ? 0 :
@@ -509,9 +509,9 @@ int axgbe_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, txq->desc = tz->addr; txq->queue_id = queue_idx; txq->port_id = dev->data->port_id; - txq->dma_regs = pdata->xgmac_regs +DMA_CH_BASE + - (DMA_CH_INC * txq->queue_id); - txq->dma_tail_reg = (volatile uint32_t *)(txq->dma_regs + + txq->dma_regs = (void *)((uint8_t *)pdata->xgmac_regs +DMA_CH_BASE + + (DMA_CH_INC * txq->queue_id)); + txq->dma_tail_reg = (volatile uint32_t *)((uint8_t *)txq->dma_regs +DMA_CH_TDTR_LO ); txq->cur =0 ; txq->dirty =0 ;
drivers/net/axgbe/axgbe_rxtx.h +2 -2
@@ -201,7 +201,7 @@ struct axgbe_rx_queue {/* Ring physical address */ uint64_t ring_phys_addr;/* Dma Channel register address */ -uint64_t dma_regs; +void *dma_regs;/* Dma channel tail register address*/ volatile uint32_t *dma_tail_reg;/* DPDK queue index */
@@ -248,7 +248,7 @@ struct axgbe_tx_queue {/* Physical address of ring */ uint64_t ring_phys_addr;/* Dma channel register space */ -uint64_t dma_regs; +void *dma_regs;/* Dma tail register address of ring*/ volatile uint32_t *dma_tail_reg;/* Tx queue index/id*/
drivers/net/axgbe/axgbe_rxtx.h.orig new file +307 -0
307 lines not on this page · raw message
Signature · 1 line
2.7.4
Re: [PATCH 16/16] net/axgbe: add support for build 32-bit mode
On 11/30/2017 5:11 AM, Ravi Kumar wrote:
Can you please update axgbe.ini in this patch to add x86-32 support.
Quoted 9 lines
Signed-off-by Ravi Kumar <[email protected]>--- drivers/net/axgbe/axgbe_common.h | 49 +++--- drivers/net/axgbe/axgbe_ethdev.c | 10 +- drivers/net/axgbe/axgbe_ethdev.h | 8 +- drivers/net/axgbe/axgbe_rxtx.c | 12 +- drivers/net/axgbe/axgbe_rxtx.h | 4 +-drivers/net/axgbe/axgbe_rxtx.h.orig | 307 ++++++++++++++++++++++++++++++++++++
This looks like git rebase artifact.
<...>
Quoted 1 line · Ravi Kumar
Signed-off-by Ravi Kumar <[email protected]>
Hi Ravi,
Did you tested shared library build?
I am getting build error but I didn't dig it more...
<...>
Quoted 116 lines
drivers/net/axgbe/Makefile new file +115
-0@@ -0,0 +1,146 @@ +# +# Copyright (c) 2017 Advanced Micro Devices, Inc. +# All rights reserved. +# +# AMD 10Gb Ethernet driver +# +# This file is available to you under your choice of the following two +# licenses: +# +# License 1: GPLv2 +# +# Copyright (c) 2017 Advanced Micro Devices, Inc. +# +# This file is free software; you may copy, redistribute and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or (at +# your option) any later version. +# +# This file is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +# This file incorporates work covered by the following copyright and +# permission notice: +# +# Copyright (c) 2013 Synopsys, Inc. +# +# The Synopsys DWC ETHER XGMAC Software Driver and documentation +# (hereinafter "Software") is an unsupported proprietary work of Synopsys, +# Inc. unless otherwise expressly agreed to in writing between Synopsys +# and you. +# +# The Software IS NOT an item of Licensed Software or Licensed Product +# under any End User Software License Agreement or Agreement for Licensed +# Product with Synopsys or any supplement thereto. Permission is hereby +# granted, free of charge, to any person obtaining a copy of this software +# annotated with this license and the Software, to deal in the Software +# without restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished +# to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" +# BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS +# 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. +# +# License 2: Modified BSD +# +# Copyright (c) 2017 Advanced Micro Devices, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of Advanced Micro Devices, Inc. nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 <COPYRIGHT HOLDER> 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. +# +# This file incorporates work covered by the following copyright and +# permission notice +# +# Copyright (c) 2013 Synopsys, Inc. +# +# The Synopsys DWC ETHER XGMAC Software Driver and documentation +# (hereinafter "Software") is an unsupported proprietary work of Synopsys, +# Inc. unless otherwise expressly agreed to in writing between Synopsys +# and you. +# +# The Software IS NOT an item of Licensed Software or Licensed Product +# under any End User Software License Agreement or Agreement for Licensed +# Product with Synopsys or any supplement thereto. Permission is hereby +# granted, free of charge, to any person obtaining a copy of this software +# annotated with this license and the Software, to deal in the Software +# without restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished +# to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS"
drivers/net/axgbe/Makefile line 125
Quoted 10 lines
drivers/net/axgbe/Makefile new file +10
-0+# BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS +# 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.
Any chance to switch to SPDX license identifiers [1]?
Since licensing issues already delayed this PMD, if switching will delay more I am for getting as it is and switch it later but cc'ing Hemant for guidance.
Quoted 1 line · Ravi Kumar
Signed-off-by Ravi Kumar <[email protected]>
<...>
drivers/net/axgbe/axgbe_ethdev.c line 163
Quoted 7 lines
drivers/net/axgbe/axgbe_ethdev.c new file +7
-0+/* +* For secondary processes, we don't initialise any further as primary +* has already done this work. +*/ +if (rte_eal_process_type () !=RTE_PROC_PRIMARY ) { +PMD_DRV_LOG (ERR ,"SECONDARY PROCCESS NOT SUPPORTED" ); +return -EINVAL ;
Do you want to return error here?rte_eth_dev_pci_generic_probe() already calls rte_eth_dev_attach_secondary(), just returning here can work for secondary process.
drivers/net/axgbe/axgbe_ethdev.c line 167
Quoted 4 lines
drivers/net/axgbe/axgbe_ethdev.c new file +4
-0+ } + pci_dev =RTE_DEV_TO_PCI (eth_dev->device); + pdata->pci_dev = pci_dev; +rte_eth_copy_pci_info (eth_dev, pci_dev);
rte_eth_copy_pci_info() already called by rte_eth_dev_pci_generic_probe()
<...>
drivers/net/axgbe/axgbe_ethdev.c line 190
Quoted 7 lines
drivers/net/axgbe/axgbe_ethdev.c new file +7
-0+ eth_dev->dev_ops =NULL ; + eth_dev->rx_pkt_burst =NULL ; + eth_dev->tx_pkt_burst =NULL ; + +/*Clear macaddres at time of dev init*/ + eth_dev->data->mac_addrs =NULL ; + eth_dev->data->hash_mac_addrs =NULL ;
None of these set yet, you can add these when they are initiazed, and this helps to trace matching init / unints.
<...>
drivers/net/axgbe/axgbe_logs.h line 134
Quoted 2 lines
drivers/net/axgbe/axgbe_logs.h new file +2
-0+#define PMD_INIT_LOG(level, fmt, args...) \ + RTE_LOG(level, PMD, "%s(): " fmt "\n", __func__, ##args)
Can you please swith this to dynamic logging, currently only i40e has sample usage for it.
<...>
drivers/net/axgbe/rte_pmd_axgbe_version.map line 1
Quoted 2 lines
drivers/net/axgbe/rte_pmd_axgbe_version.map new file +1
-0@@ -0,0 +1,4 @@ +DPDK_17.11 {
DPDK_18.02
<...>
Quoted 42 lines · Ravi Kumar
Quoted 1 line
Signed-off-by Ravi Kumar <[email protected]><...>
drivers/net/axgbe/axgbe_ethdev.c line 163
Quoted 7 lines
drivers/net/axgbe/axgbe_ethdev.c new file +7
-0+/* +* For secondary processes, we don't initialise any further as primary +* has already done this work. +*/ +if (rte_eal_process_type () !=RTE_PROC_PRIMARY ) { +PMD_DRV_LOG (ERR ,"SECONDARY PROCCESS NOT SUPPORTED" ); +return -EINVAL ;Do you want to return error here?
rte_eth_dev_pci_generic_probe()already callsrte_eth_dev_attach_secondary(), just returning here can work for secondary process.drivers/net/axgbe/axgbe_ethdev.c line 167
Quoted 4 lines
drivers/net/axgbe/axgbe_ethdev.c new file +4
-0+ } + pci_dev =RTE_DEV_TO_PCI (eth_dev->device); + pdata->pci_dev = pci_dev; +rte_eth_copy_pci_info (eth_dev, pci_dev);
rte_eth_copy_pci_info()already called byrte_eth_dev_pci_generic_probe()<...>
drivers/net/axgbe/axgbe_ethdev.c line 190
Quoted 7 lines
drivers/net/axgbe/axgbe_ethdev.c new file +7
-0+ eth_dev->dev_ops =NULL ; + eth_dev->rx_pkt_burst =NULL ; + eth_dev->tx_pkt_burst =NULL ; + +/*Clear macaddres at time of dev init*/ + eth_dev->data->mac_addrs =NULL ; + eth_dev->data->hash_mac_addrs =NULL ;None of these set yet, you can add these when they are initiazed, and this helps to trace matching init / unints.
<...>
drivers/net/axgbe/axgbe_logs.h line 134
Quoted 2 lines
drivers/net/axgbe/axgbe_logs.h new file +2
-0+#define PMD_INIT_LOG(level, fmt, args...) \ + RTE_LOG(level, PMD, "%s(): " fmt "\n", __func__, ##args)Can you please swith this to dynamic logging, currently only i40e has sample usage for it.
Quoted 8 lines
<...>
drivers/net/axgbe/rte_pmd_axgbe_version.map line 1
Quoted 2 lines
drivers/net/axgbe/rte_pmd_axgbe_version.map new file +1
-0@@ -0,0 +1,4 @@ +DPDK_17.11 {DPDK_18.02
<...>
Hi Ferruh,
Thanks a lot for all your comments. We are looking into all of them and will get back with updates.
Regards,
Ravi
PATCH v2 1/16 net/axgbe: add minimal dev init and uninit support
In reply to Ravi Kumar--- MAINTAINERS | 6 + config/common_base | 6 + drivers/net/Makefile | 1 + drivers/net/axgbe/Makefile | 146 +++++++++++++++++++ drivers/net/axgbe/axgbe_common.h | 172 ++++++++++++++++++++++ drivers/net/axgbe/axgbe_ethdev.c | 219 ++++++++++++++++++++++++++++ drivers/net/axgbe/axgbe_ethdev.h | 145 ++++++++++++++++++ drivers/net/axgbe/axgbe_logs.h | 152 +++++++++++++++++++ drivers/net/axgbe/rte_pmd_axgbe_version.map | 4 + mk/rte.app.mk | 1 + 10 files changed, 852 insertions(+) create mode 100644 drivers/net/axgbe/Makefile create mode 100644 drivers/net/axgbe/axgbe_common.h create mode 100644 drivers/net/axgbe/axgbe_ethdev.c create mode 100644 drivers/net/axgbe/axgbe_ethdev.h create mode 100644 drivers/net/axgbe/axgbe_logs.h create mode 100644 drivers/net/axgbe/rte_pmd_axgbe_version.map
MAINTAINERS +6 -0
@@ -347,6 +347,12 @@ F: drivers/net/ena/ F: doc/guides/nics/ena.rst F: doc/guides/nics/features/ena.ini +AMD AXGBE PMD +M: Ravi Kumar <[email protected]> +F: drivers/net/axgbe/ +F: doc/guides/nics/axgbe.rst +F: doc/guides/nics/features/axgbe.ini + Atomic Rules ARK M: Shepard Siegel <[email protected]> M: Ed Czeck <[email protected]>
config/common_base +6 -0
@@ -445,6 +445,12 @@ CONFIG_RTE_LIBRTE_AVP_DEBUG_DRIVER=y CONFIG_RTE_LIBRTE_AVP_DEBUG_BUFFERS=n # +# Compile AMD PMD +# +CONFIG_RTE_LIBRTE_AXGBE_PMD=n +CONFIG_RTE_LIBRTE_AXGBE_DEBUG_INIT=n + +# # Compile the TAP PMD # It is enabled by default for Linux only. #
drivers/net/Makefile +1 -0
@@ -39,6 +39,7 @@ endif DIRS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += af_packet DIRS-$(CONFIG_RTE_LIBRTE_ARK_PMD) += ark DIRS-$(CONFIG_RTE_LIBRTE_AVP_PMD) += avp +DIRS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe DIRS-$(CONFIG_RTE_LIBRTE_BNX2X_PMD) += bnx2x DIRS-$(CONFIG_RTE_LIBRTE_PMD_BOND) += bonding DIRS-$(CONFIG_RTE_LIBRTE_CXGBE_PMD) += cxgbe
drivers/net/axgbe/Makefile new file +146 -0
146 lines not on this page · raw message
drivers/net/axgbe/axgbe_common.h new file +172 -0
172 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.c new file +219 -0
219 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.h new file +145 -0
145 lines not on this page · raw message
drivers/net/axgbe/axgbe_logs.h new file +152 -0
152 lines not on this page · raw message
drivers/net/axgbe/rte_pmd_axgbe_version.map new file +4 -0
@@ -0,0 +1,4 @@ +DPDK_18.02 { + + local: *; +};
mk/rte.app.mk +1 -0
@@ -120,6 +120,7 @@ _LDLIBS-$(CONFIG_RTE_DRIVER_MEMPOOL_STACK) += -lrte_mempool_stack _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += -lrte_pmd_af_packet _LDLIBS-$(CONFIG_RTE_LIBRTE_ARK_PMD) += -lrte_pmd_ark _LDLIBS-$(CONFIG_RTE_LIBRTE_AVP_PMD) += -lrte_pmd_avp +_LDLIBS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += -lrte_pmd_axgbe _LDLIBS-$(CONFIG_RTE_LIBRTE_BNX2X_PMD) += -lrte_pmd_bnx2x -lz _LDLIBS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += -lrte_pmd_bnxt _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_BOND) += -lrte_pmd_bond
Signature · 1 line
2.7.4
PATCH v2 2/16 net/axgbe: add register map and related macros
--- drivers/net/axgbe/axgbe_common.h | 1644 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 1644 insertions(+)
drivers/net/axgbe/axgbe_common.h +1644 -0
@@ -169,4 +169,1648 @@#define AXGBE_HZ 250 +/* DMA register offsets */ +#define DMA_MR 0x3000 +#define DMA_SBMR 0x3004 +#define DMA_ISR 0x3008 +#define DMA_AXIARCR 0x3010 +#define DMA_AXIAWCR 0x3018 +#define DMA_AXIAWRCR 0x301c +#define DMA_DSR0 0x3020 +#define DMA_DSR1 0x3024 +#define EDMA_TX_CONTROL 0x3040 +#define EDMA_RX_CONTROL 0x3044 + +/* DMA register entry bit positions and sizes */ +#define DMA_AXIARCR_DRC_INDEX 0 +#define DMA_AXIARCR_DRC_WIDTH 4 +#define DMA_AXIARCR_DRD_INDEX 4 +#define DMA_AXIARCR_DRD_WIDTH 2 +#define DMA_AXIARCR_TEC_INDEX 8 +#define DMA_AXIARCR_TEC_WIDTH 4 +#define DMA_AXIARCR_TED_INDEX 12 +#define DMA_AXIARCR_TED_WIDTH 2 +#define DMA_AXIARCR_THC_INDEX 16 +#define DMA_AXIARCR_THC_WIDTH 4 +#define DMA_AXIARCR_THD_INDEX 20 +#define DMA_AXIARCR_THD_WIDTH 2 +#define DMA_AXIAWCR_DWC_INDEX 0 +#define DMA_AXIAWCR_DWC_WIDTH 4 +#define DMA_AXIAWCR_DWD_INDEX 4 +#define DMA_AXIAWCR_DWD_WIDTH 2 +#define DMA_AXIAWCR_RPC_INDEX 8 +#define DMA_AXIAWCR_RPC_WIDTH 4 +#define DMA_AXIAWCR_RPD_INDEX 12 +#define DMA_AXIAWCR_RPD_WIDTH 2 +#define DMA_AXIAWCR_RHC_INDEX 16 +#define DMA_AXIAWCR_RHC_WIDTH 4 +#define DMA_AXIAWCR_RHD_INDEX 20 +#define DMA_AXIAWCR_RHD_WIDTH 2 +#define DMA_AXIAWCR_RDC_INDEX 24 +#define DMA_AXIAWCR_RDC_WIDTH 4 +#define DMA_AXIAWCR_RDD_INDEX 28 +#define DMA_AXIAWCR_RDD_WIDTH 2 +#define DMA_AXIAWRCR_TDWC_INDEX 0 +#define DMA_AXIAWRCR_TDWC_WIDTH 4 +#define DMA_AXIAWRCR_TDWD_INDEX 4 +#define DMA_AXIAWRCR_TDWD_WIDTH 4 +#define DMA_AXIAWRCR_RDRC_INDEX 8 +#define DMA_AXIAWRCR_RDRC_WIDTH 4 +#define DMA_ISR_MACIS_INDEX 17 +#define DMA_ISR_MACIS_WIDTH 1 +#define DMA_ISR_MTLIS_INDEX 16 +#define DMA_ISR_MTLIS_WIDTH 1 +#define DMA_MR_INTM_INDEX 12 +#define DMA_MR_INTM_WIDTH 2 +#define DMA_MR_SWR_INDEX 0 +#define DMA_MR_SWR_WIDTH 1 +#define DMA_SBMR_WR_OSR_INDEX 24 +#define DMA_SBMR_WR_OSR_WIDTH 6 +#define DMA_SBMR_RD_OSR_INDEX 16 +#define DMA_SBMR_RD_OSR_WIDTH 6 +#define DMA_SBMR_AAL_INDEX 12 +#define DMA_SBMR_AAL_WIDTH 1 +#define DMA_SBMR_EAME_INDEX 11 +#define DMA_SBMR_EAME_WIDTH 1 +#define DMA_SBMR_BLEN_256_INDEX 7 +#define DMA_SBMR_BLEN_256_WIDTH 1 +#define DMA_SBMR_BLEN_32_INDEX 4 +#define DMA_SBMR_BLEN_32_WIDTH 1 +#define DMA_SBMR_UNDEF_INDEX 0 +#define DMA_SBMR_UNDEF_WIDTH 1 + +/* DMA register values */ +#define DMA_DSR_RPS_WIDTH 4 +#define DMA_DSR_TPS_WIDTH 4 +#define DMA_DSR_Q_WIDTH (DMA_DSR_RPS_WIDTH + DMA_DSR_TPS_WIDTH) +#define DMA_DSR0_RPS_START 8 +#define DMA_DSR0_TPS_START 12 +#define DMA_DSRX_FIRST_QUEUE 3 +#define DMA_DSRX_INC 4 +#define DMA_DSRX_QPR 4 +#define DMA_DSRX_RPS_START 0 +#define DMA_DSRX_TPS_START 4 +#define DMA_TPS_STOPPED 0x00 +#define DMA_TPS_SUSPENDED 0x06 + +/* DMA channel register offsets +* Multiple channels can be active. The first channel has registers +* that begin at 0x3100. Each subsequent channel has registers that +* are accessed using an offset of 0x80 from the previous channel. +*/ +#define DMA_CH_BASE 0x3100 +#define DMA_CH_INC 0x80 + +#define DMA_CH_CR 0x00 +#define DMA_CH_TCR 0x04 +#define DMA_CH_RCR 0x08 +#define DMA_CH_TDLR_HI 0x10 +#define DMA_CH_TDLR_LO 0x14 +#define DMA_CH_RDLR_HI 0x18 +#define DMA_CH_RDLR_LO 0x1c +#define DMA_CH_TDTR_LO 0x24 +#define DMA_CH_RDTR_LO 0x2c +#define DMA_CH_TDRLR 0x30 +#define DMA_CH_RDRLR 0x34 +#define DMA_CH_IER 0x38 +#define DMA_CH_RIWT 0x3c +#define DMA_CH_CATDR_LO 0x44 +#define DMA_CH_CARDR_LO 0x4c +#define DMA_CH_CATBR_HI 0x50 +#define DMA_CH_CATBR_LO 0x54 +#define DMA_CH_CARBR_HI 0x58 +#define DMA_CH_CARBR_LO 0x5c +#define DMA_CH_SR 0x60 + +/* DMA channel register entry bit positions and sizes */ +#define DMA_CH_CR_PBLX8_INDEX 16 +#define DMA_CH_CR_PBLX8_WIDTH 1 +#define DMA_CH_CR_SPH_INDEX 24 +#define DMA_CH_CR_SPH_WIDTH 1 +#define DMA_CH_IER_AIE_INDEX 14 +#define DMA_CH_IER_AIE_WIDTH 1 +#define DMA_CH_IER_FBEE_INDEX 12 +#define DMA_CH_IER_FBEE_WIDTH 1 +#define DMA_CH_IER_NIE_INDEX 15 +#define DMA_CH_IER_NIE_WIDTH 1 +#define DMA_CH_IER_RBUE_INDEX 7 +#define DMA_CH_IER_RBUE_WIDTH 1 +#define DMA_CH_IER_RIE_INDEX 6 +#define DMA_CH_IER_RIE_WIDTH 1 +#define DMA_CH_IER_RSE_INDEX 8 +#define DMA_CH_IER_RSE_WIDTH 1 +#define DMA_CH_IER_TBUE_INDEX 2 +#define DMA_CH_IER_TBUE_WIDTH 1 +#define DMA_CH_IER_TIE_INDEX 0 +#define DMA_CH_IER_TIE_WIDTH 1 +#define DMA_CH_IER_TXSE_INDEX 1 +#define DMA_CH_IER_TXSE_WIDTH 1 +#define DMA_CH_RCR_PBL_INDEX 16 +#define DMA_CH_RCR_PBL_WIDTH 6 +#define DMA_CH_RCR_RBSZ_INDEX 1 +#define DMA_CH_RCR_RBSZ_WIDTH 14 +#define DMA_CH_RCR_SR_INDEX 0 +#define DMA_CH_RCR_SR_WIDTH 1 +#define DMA_CH_RIWT_RWT_INDEX 0 +#define DMA_CH_RIWT_RWT_WIDTH 8 +#define DMA_CH_SR_FBE_INDEX 12 +#define DMA_CH_SR_FBE_WIDTH 1 +#define DMA_CH_SR_RBU_INDEX 7 +#define DMA_CH_SR_RBU_WIDTH 1 +#define DMA_CH_SR_RI_INDEX 6 +#define DMA_CH_SR_RI_WIDTH 1 +#define DMA_CH_SR_RPS_INDEX 8 +#define DMA_CH_SR_RPS_WIDTH 1 +#define DMA_CH_SR_TBU_INDEX 2 +#define DMA_CH_SR_TBU_WIDTH 1 +#define DMA_CH_SR_TI_INDEX 0 +#define DMA_CH_SR_TI_WIDTH 1 +#define DMA_CH_SR_TPS_INDEX 1 +#define DMA_CH_SR_TPS_WIDTH 1 +#define DMA_CH_TCR_OSP_INDEX 4 +#define DMA_CH_TCR_OSP_WIDTH 1 +#define DMA_CH_TCR_PBL_INDEX 16 +#define DMA_CH_TCR_PBL_WIDTH 6 +#define DMA_CH_TCR_ST_INDEX 0 +#define DMA_CH_TCR_ST_WIDTH 1 +#define DMA_CH_TCR_TSE_INDEX 12 +#define DMA_CH_TCR_TSE_WIDTH 1 + +/* DMA channel register values */ +#define DMA_OSP_DISABLE 0x00 +#define DMA_OSP_ENABLE 0x01 +#define DMA_PBL_1 1 +#define DMA_PBL_2 2 +#define DMA_PBL_4 4 +#define DMA_PBL_8 8 +#define DMA_PBL_16 16 +#define DMA_PBL_32 32 +#define DMA_PBL_64 64/* 8 x 8 */ +#define DMA_PBL_128 128/* 8 x 16 */ +#define DMA_PBL_256 256/* 8 x 32 */ +#define DMA_PBL_X8_DISABLE 0x00 +#define DMA_PBL_X8_ENABLE 0x01 + +/* MAC register offsets */ +#define MAC_TCR 0x0000 +#define MAC_RCR 0x0004 +#define MAC_PFR 0x0008 +#define MAC_WTR 0x000c +#define MAC_HTR0 0x0010 +#define MAC_VLANTR 0x0050 +#define MAC_VLANHTR 0x0058 +#define MAC_VLANIR 0x0060 +#define MAC_IVLANIR 0x0064 +#define MAC_RETMR 0x006c +#define MAC_Q0TFCR 0x0070 +#define MAC_RFCR 0x0090 +#define MAC_RQC0R 0x00a0 +#define MAC_RQC1R 0x00a4 +#define MAC_RQC2R 0x00a8 +#define MAC_RQC3R 0x00ac +#define MAC_ISR 0x00b0 +#define MAC_IER 0x00b4 +#define MAC_RTSR 0x00b8 +#define MAC_PMTCSR 0x00c0 +#define MAC_RWKPFR 0x00c4 +#define MAC_LPICSR 0x00d0 +#define MAC_LPITCR 0x00d4 +#define MAC_VR 0x0110 +#define MAC_DR 0x0114 +#define MAC_HWF0R 0x011c +#define MAC_HWF1R 0x0120 +#define MAC_HWF2R 0x0124 +#define MAC_MDIOSCAR 0x0200 +#define MAC_MDIOSCCDR 0x0204 +#define MAC_MDIOISR 0x0214 +#define MAC_MDIOIER 0x0218 +#define MAC_MDIOCL22R 0x0220 +#define MAC_GPIOCR 0x0278 +#define MAC_GPIOSR 0x027c +#define MAC_MACA0HR 0x0300 +#define MAC_MACA0LR 0x0304 +#define MAC_MACA1HR 0x0308 +#define MAC_MACA1LR 0x030c +#define MAC_RSSCR 0x0c80 +#define MAC_RSSAR 0x0c88 +#define MAC_RSSDR 0x0c8c +#define MAC_TSCR 0x0d00 +#define MAC_SSIR 0x0d04 +#define MAC_STSR 0x0d08 +#define MAC_STNR 0x0d0c +#define MAC_STSUR 0x0d10 +#define MAC_STNUR 0x0d14 +#define MAC_TSAR 0x0d18 +#define MAC_TSSR 0x0d20 +#define MAC_TXSNR 0x0d30 +#define MAC_TXSSR 0x0d34 + +#define MAC_QTFCR_INC 4 +#define MAC_MACA_INC 4 +#define MAC_HTR_INC 4 + +#define MAC_RQC2_INC 4 +#define MAC_RQC2_Q_PER_REG 4 + +/* MAC register entry bit positions and sizes */ +#define MAC_HWF0R_ADDMACADRSEL_INDEX 18 +#define MAC_HWF0R_ADDMACADRSEL_WIDTH 5 +#define MAC_HWF0R_ARPOFFSEL_INDEX 9 +#define MAC_HWF0R_ARPOFFSEL_WIDTH 1 +#define MAC_HWF0R_EEESEL_INDEX 13 +#define MAC_HWF0R_EEESEL_WIDTH 1 +#define MAC_HWF0R_GMIISEL_INDEX 1 +#define MAC_HWF0R_GMIISEL_WIDTH 1 +#define MAC_HWF0R_MGKSEL_INDEX 7 +#define MAC_HWF0R_MGKSEL_WIDTH 1 +#define MAC_HWF0R_MMCSEL_INDEX 8 +#define MAC_HWF0R_MMCSEL_WIDTH 1 +#define MAC_HWF0R_RWKSEL_INDEX 6 +#define MAC_HWF0R_RWKSEL_WIDTH 1 +#define MAC_HWF0R_RXCOESEL_INDEX 16 +#define MAC_HWF0R_RXCOESEL_WIDTH 1 +#define MAC_HWF0R_SAVLANINS_INDEX 27 +#define MAC_HWF0R_SAVLANINS_WIDTH 1 +#define MAC_HWF0R_SMASEL_INDEX 5 +#define MAC_HWF0R_SMASEL_WIDTH 1 +#define MAC_HWF0R_TSSEL_INDEX 12 +#define MAC_HWF0R_TSSEL_WIDTH 1 +#define MAC_HWF0R_TSSTSSEL_INDEX 25 +#define MAC_HWF0R_TSSTSSEL_WIDTH 2 +#define MAC_HWF0R_TXCOESEL_INDEX 14 +#define MAC_HWF0R_TXCOESEL_WIDTH 1 +#define MAC_HWF0R_VLHASH_INDEX 4 +#define MAC_HWF0R_VLHASH_WIDTH 1 +#define MAC_HWF1R_ADDR64_INDEX 14 +#define MAC_HWF1R_ADDR64_WIDTH 2 +#define MAC_HWF1R_ADVTHWORD_INDEX 13 +#define MAC_HWF1R_ADVTHWORD_WIDTH 1 +#define MAC_HWF1R_DBGMEMA_INDEX 19 +#define MAC_HWF1R_DBGMEMA_WIDTH 1 +#define MAC_HWF1R_DCBEN_INDEX 16 +#define MAC_HWF1R_DCBEN_WIDTH 1 +#define MAC_HWF1R_HASHTBLSZ_INDEX 24 +#define MAC_HWF1R_HASHTBLSZ_WIDTH 3 +#define MAC_HWF1R_L3L4FNUM_INDEX 27 +#define MAC_HWF1R_L3L4FNUM_WIDTH 4 +#define MAC_HWF1R_NUMTC_INDEX 21 +#define MAC_HWF1R_NUMTC_WIDTH 3 +#define MAC_HWF1R_RSSEN_INDEX 20 +#define MAC_HWF1R_RSSEN_WIDTH 1 +#define MAC_HWF1R_RXFIFOSIZE_INDEX 0 +#define MAC_HWF1R_RXFIFOSIZE_WIDTH 5 +#define MAC_HWF1R_SPHEN_INDEX 17 +#define MAC_HWF1R_SPHEN_WIDTH 1 +#define MAC_HWF1R_TSOEN_INDEX 18 +#define MAC_HWF1R_TSOEN_WIDTH 1 +#define MAC_HWF1R_TXFIFOSIZE_INDEX 6 +#define MAC_HWF1R_TXFIFOSIZE_WIDTH 5 +#define MAC_HWF2R_AUXSNAPNUM_INDEX 28 +#define MAC_HWF2R_AUXSNAPNUM_WIDTH 3 +#define MAC_HWF2R_PPSOUTNUM_INDEX 24 +#define MAC_HWF2R_PPSOUTNUM_WIDTH 3 +#define MAC_HWF2R_RXCHCNT_INDEX 12 +#define MAC_HWF2R_RXCHCNT_WIDTH 4 +#define MAC_HWF2R_RXQCNT_INDEX 0 +#define MAC_HWF2R_RXQCNT_WIDTH 4 +#define MAC_HWF2R_TXCHCNT_INDEX 18 +#define MAC_HWF2R_TXCHCNT_WIDTH 4 +#define MAC_HWF2R_TXQCNT_INDEX 6 +#define MAC_HWF2R_TXQCNT_WIDTH 4 +#define MAC_IER_TSIE_INDEX 12 +#define MAC_IER_TSIE_WIDTH 1 +#define MAC_ISR_MMCRXIS_INDEX 9 +#define MAC_ISR_MMCRXIS_WIDTH 1 +#define MAC_ISR_MMCTXIS_INDEX 10 +#define MAC_ISR_MMCTXIS_WIDTH 1 +#define MAC_ISR_PMTIS_INDEX 4 +#define MAC_ISR_PMTIS_WIDTH 1 +#define MAC_ISR_SMI_INDEX 1 +#define MAC_ISR_SMI_WIDTH 1 +#define MAC_ISR_LSI_INDEX 0 +#define MAC_ISR_LSI_WIDTH 1 +#define MAC_ISR_LS_INDEX 24 +#define MAC_ISR_LS_WIDTH 2 +#define MAC_ISR_TSIS_INDEX 12 +#define MAC_ISR_TSIS_WIDTH 1 +#define MAC_MACA1HR_AE_INDEX 31 +#define MAC_MACA1HR_AE_WIDTH 1 +#define MAC_MDIOIER_SNGLCOMPIE_INDEX 12 +#define MAC_MDIOIER_SNGLCOMPIE_WIDTH 1 +#define MAC_MDIOISR_SNGLCOMPINT_INDEX 12 +#define MAC_MDIOISR_SNGLCOMPINT_WIDTH 1 +#define MAC_MDIOSCAR_DA_INDEX 21 +#define MAC_MDIOSCAR_DA_WIDTH 5 +#define MAC_MDIOSCAR_PA_INDEX 16 +#define MAC_MDIOSCAR_PA_WIDTH 5 +#define MAC_MDIOSCAR_RA_INDEX 0 +#define MAC_MDIOSCAR_RA_WIDTH 16 +#define MAC_MDIOSCAR_REG_INDEX 0 +#define MAC_MDIOSCAR_REG_WIDTH 21 +#define MAC_MDIOSCCDR_BUSY_INDEX 22 +#define MAC_MDIOSCCDR_BUSY_WIDTH 1 +#define MAC_MDIOSCCDR_CMD_INDEX 16 +#define MAC_MDIOSCCDR_CMD_WIDTH 2 +#define MAC_MDIOSCCDR_CR_INDEX 19 +#define MAC_MDIOSCCDR_CR_WIDTH 3 +#define MAC_MDIOSCCDR_DATA_INDEX 0 +#define MAC_MDIOSCCDR_DATA_WIDTH 16 +#define MAC_MDIOSCCDR_SADDR_INDEX 18 +#define MAC_MDIOSCCDR_SADDR_WIDTH 1 +#define MAC_PFR_HMC_INDEX 2 +#define MAC_PFR_HMC_WIDTH 1 +#define MAC_PFR_HPF_INDEX 10 +#define MAC_PFR_HPF_WIDTH 1 +#define MAC_PFR_HUC_INDEX 1 +#define MAC_PFR_HUC_WIDTH 1 +#define MAC_PFR_PM_INDEX 4 +#define MAC_PFR_PM_WIDTH 1 +#define MAC_PFR_PR_INDEX 0 +#define MAC_PFR_PR_WIDTH 1 +#define MAC_PFR_VTFE_INDEX 16 +#define MAC_PFR_VTFE_WIDTH 1 +#define MAC_PMTCSR_MGKPKTEN_INDEX 1 +#define MAC_PMTCSR_MGKPKTEN_WIDTH 1 +#define MAC_PMTCSR_PWRDWN_INDEX 0 +#define MAC_PMTCSR_PWRDWN_WIDTH 1 +#define MAC_PMTCSR_RWKFILTRST_INDEX 31 +#define MAC_PMTCSR_RWKFILTRST_WIDTH 1 +#define MAC_PMTCSR_RWKPKTEN_INDEX 2 +#define MAC_PMTCSR_RWKPKTEN_WIDTH 1 +#define MAC_Q0TFCR_PT_INDEX 16 +#define MAC_Q0TFCR_PT_WIDTH 16 +#define MAC_Q0TFCR_TFE_INDEX 1 +#define MAC_Q0TFCR_TFE_WIDTH 1 +#define MAC_RCR_ACS_INDEX 1 +#define MAC_RCR_ACS_WIDTH 1 +#define MAC_RCR_CST_INDEX 2 +#define MAC_RCR_CST_WIDTH 1 +#define MAC_RCR_DCRCC_INDEX 3 +#define MAC_RCR_DCRCC_WIDTH 1 +#define MAC_RCR_HDSMS_INDEX 12 +#define MAC_RCR_HDSMS_WIDTH 3 +#define MAC_RCR_IPC_INDEX 9 +#define MAC_RCR_IPC_WIDTH 1 +#define MAC_RCR_JE_INDEX 8 +#define MAC_RCR_JE_WIDTH 1 +#define MAC_RCR_LM_INDEX 10 +#define MAC_RCR_LM_WIDTH 1 +#define MAC_RCR_RE_INDEX 0 +#define MAC_RCR_RE_WIDTH 1 +#define MAC_RFCR_PFCE_INDEX 8 +#define MAC_RFCR_PFCE_WIDTH 1 +#define MAC_RFCR_RFE_INDEX 0 +#define MAC_RFCR_RFE_WIDTH 1 +#define MAC_RFCR_UP_INDEX 1 +#define MAC_RFCR_UP_WIDTH 1 +#define MAC_RQC0R_RXQ0EN_INDEX 0 +#define MAC_RQC0R_RXQ0EN_WIDTH 2 +#define MAC_RSSAR_ADDRT_INDEX 2 +#define MAC_RSSAR_ADDRT_WIDTH 1 +#define MAC_RSSAR_CT_INDEX 1 +#define MAC_RSSAR_CT_WIDTH 1 +#define MAC_RSSAR_OB_INDEX 0 +#define MAC_RSSAR_OB_WIDTH 1 +#define MAC_RSSAR_RSSIA_INDEX 8 +#define MAC_RSSAR_RSSIA_WIDTH 8 +#define MAC_RSSCR_IP2TE_INDEX 1 +#define MAC_RSSCR_IP2TE_WIDTH 1 +#define MAC_RSSCR_RSSE_INDEX 0 +#define MAC_RSSCR_RSSE_WIDTH 1 +#define MAC_RSSCR_TCP4TE_INDEX 2 +#define MAC_RSSCR_TCP4TE_WIDTH 1 +#define MAC_RSSCR_UDP4TE_INDEX 3 +#define MAC_RSSCR_UDP4TE_WIDTH 1 +#define MAC_RSSDR_DMCH_INDEX 0 +#define MAC_RSSDR_DMCH_WIDTH 4 +#define MAC_SSIR_SNSINC_INDEX 8 +#define MAC_SSIR_SNSINC_WIDTH 8 +#define MAC_SSIR_SSINC_INDEX 16 +#define MAC_SSIR_SSINC_WIDTH 8 +#define MAC_TCR_SS_INDEX 29 +#define MAC_TCR_SS_WIDTH 2 +#define MAC_TCR_TE_INDEX 0 +#define MAC_TCR_TE_WIDTH 1 +#define MAC_TSCR_AV8021ASMEN_INDEX 28 +#define MAC_TSCR_AV8021ASMEN_WIDTH 1 +#define MAC_TSCR_SNAPTYPSEL_INDEX 16 +#define MAC_TSCR_SNAPTYPSEL_WIDTH 2 +#define MAC_TSCR_TSADDREG_INDEX 5 +#define MAC_TSCR_TSADDREG_WIDTH 1 +#define MAC_TSCR_TSCFUPDT_INDEX 1 +#define MAC_TSCR_TSCFUPDT_WIDTH 1 +#define MAC_TSCR_TSCTRLSSR_INDEX 9 +#define MAC_TSCR_TSCTRLSSR_WIDTH 1 +#define MAC_TSCR_TSENA_INDEX 0 +#define MAC_TSCR_TSENA_WIDTH 1 +#define MAC_TSCR_TSENALL_INDEX 8 +#define MAC_TSCR_TSENALL_WIDTH 1 +#define MAC_TSCR_TSEVNTENA_INDEX 14 +#define MAC_TSCR_TSEVNTENA_WIDTH 1 +#define MAC_TSCR_TSINIT_INDEX 2 +#define MAC_TSCR_TSINIT_WIDTH 1 +#define MAC_TSCR_TSIPENA_INDEX 11 +#define MAC_TSCR_TSIPENA_WIDTH 1 +#define MAC_TSCR_TSIPV4ENA_INDEX 13 +#define MAC_TSCR_TSIPV4ENA_WIDTH 1 +#define MAC_TSCR_TSIPV6ENA_INDEX 12 +#define MAC_TSCR_TSIPV6ENA_WIDTH 1 +#define MAC_TSCR_TSMSTRENA_INDEX 15 +#define MAC_TSCR_TSMSTRENA_WIDTH 1 +#define MAC_TSCR_TSVER2ENA_INDEX 10 +#define MAC_TSCR_TSVER2ENA_WIDTH 1 +#define MAC_TSCR_TXTSSTSM_INDEX 24 +#define MAC_TSCR_TXTSSTSM_WIDTH 1 +#define MAC_TSSR_TXTSC_INDEX 15 +#define MAC_TSSR_TXTSC_WIDTH 1 +#define MAC_TXSNR_TXTSSTSMIS_INDEX 31 +#define MAC_TXSNR_TXTSSTSMIS_WIDTH 1 +#define MAC_VLANHTR_VLHT_INDEX 0 +#define MAC_VLANHTR_VLHT_WIDTH 16 +#define MAC_VLANIR_VLTI_INDEX 20 +#define MAC_VLANIR_VLTI_WIDTH 1 +#define MAC_VLANIR_CSVL_INDEX 19 +#define MAC_VLANIR_CSVL_WIDTH 1 +#define MAC_VLANTR_DOVLTC_INDEX 20 +#define MAC_VLANTR_DOVLTC_WIDTH 1 +#define MAC_VLANTR_ERSVLM_INDEX 19 +#define MAC_VLANTR_ERSVLM_WIDTH 1 +#define MAC_VLANTR_ESVL_INDEX 18 +#define MAC_VLANTR_ESVL_WIDTH 1 +#define MAC_VLANTR_ETV_INDEX 16 +#define MAC_VLANTR_ETV_WIDTH 1 +#define MAC_VLANTR_EVLS_INDEX 21 +#define MAC_VLANTR_EVLS_WIDTH 2 +#define MAC_VLANTR_EVLRXS_INDEX 24 +#define MAC_VLANTR_EVLRXS_WIDTH 1 +#define MAC_VLANTR_VL_INDEX 0 +#define MAC_VLANTR_VL_WIDTH 16 +#define MAC_VLANTR_VTHM_INDEX 25 +#define MAC_VLANTR_VTHM_WIDTH 1 +#define MAC_VLANTR_VTIM_INDEX 17 +#define MAC_VLANTR_VTIM_WIDTH 1 +#define MAC_VR_DEVID_INDEX 8 +#define MAC_VR_DEVID_WIDTH 8 +#define MAC_VR_SNPSVER_INDEX 0 +#define MAC_VR_SNPSVER_WIDTH 8 +#define MAC_VR_USERVER_INDEX 16 +#define MAC_VR_USERVER_WIDTH 8 + +/* MMC register offsets */ +#define MMC_CR 0x0800 +#define MMC_RISR 0x0804 +#define MMC_TISR 0x0808 +#define MMC_RIER 0x080c +#define MMC_TIER 0x0810 +#define MMC_TXOCTETCOUNT_GB_LO 0x0814 +#define MMC_TXOCTETCOUNT_GB_HI 0x0818 +#define MMC_TXFRAMECOUNT_GB_LO 0x081c +#define MMC_TXFRAMECOUNT_GB_HI 0x0820 +#define MMC_TXBROADCASTFRAMES_G_LO 0x0824 +#define MMC_TXBROADCASTFRAMES_G_HI 0x0828 +#define MMC_TXMULTICASTFRAMES_G_LO 0x082c +#define MMC_TXMULTICASTFRAMES_G_HI 0x0830 +#define MMC_TX64OCTETS_GB_LO 0x0834 +#define MMC_TX64OCTETS_GB_HI 0x0838 +#define MMC_TX65TO127OCTETS_GB_LO 0x083c +#define MMC_TX65TO127OCTETS_GB_HI 0x0840 +#define MMC_TX128TO255OCTETS_GB_LO 0x0844 +#define MMC_TX128TO255OCTETS_GB_HI 0x0848 +#define MMC_TX256TO511OCTETS_GB_LO 0x084c +#define MMC_TX256TO511OCTETS_GB_HI 0x0850 +#define MMC_TX512TO1023OCTETS_GB_LO 0x0854 +#define MMC_TX512TO1023OCTETS_GB_HI 0x0858 +#define MMC_TX1024TOMAXOCTETS_GB_LO 0x085c +#define MMC_TX1024TOMAXOCTETS_GB_HI 0x0860 +#define MMC_TXUNICASTFRAMES_GB_LO 0x0864 +#define MMC_TXUNICASTFRAMES_GB_HI 0x0868 +#define MMC_TXMULTICASTFRAMES_GB_LO 0x086c +#define MMC_TXMULTICASTFRAMES_GB_HI 0x0870 +#define MMC_TXBROADCASTFRAMES_GB_LO 0x0874 +#define MMC_TXBROADCASTFRAMES_GB_HI 0x0878 +#define MMC_TXUNDERFLOWERROR_LO 0x087c +#define MMC_TXUNDERFLOWERROR_HI 0x0880 +#define MMC_TXOCTETCOUNT_G_LO 0x0884 +#define MMC_TXOCTETCOUNT_G_HI 0x0888 +#define MMC_TXFRAMECOUNT_G_LO 0x088c +#define MMC_TXFRAMECOUNT_G_HI 0x0890 +#define MMC_TXPAUSEFRAMES_LO 0x0894 +#define MMC_TXPAUSEFRAMES_HI 0x0898 +#define MMC_TXVLANFRAMES_G_LO 0x089c +#define MMC_TXVLANFRAMES_G_HI 0x08a0 +#define MMC_RXFRAMECOUNT_GB_LO 0x0900 +#define MMC_RXFRAMECOUNT_GB_HI 0x0904 +#define MMC_RXOCTETCOUNT_GB_LO 0x0908 +#define MMC_RXOCTETCOUNT_GB_HI 0x090c +#define MMC_RXOCTETCOUNT_G_LO 0x0910 +#define MMC_RXOCTETCOUNT_G_HI 0x0914 +#define MMC_RXBROADCASTFRAMES_G_LO 0x0918 +#define MMC_RXBROADCASTFRAMES_G_HI 0x091c +#define MMC_RXMULTICASTFRAMES_G_LO 0x0920 +#define MMC_RXMULTICASTFRAMES_G_HI 0x0924 +#define MMC_RXCRCERROR_LO 0x0928 +#define MMC_RXCRCERROR_HI 0x092c +#define MMC_RXRUNTERROR 0x0930 +#define MMC_RXJABBERERROR 0x0934 +#define MMC_RXUNDERSIZE_G 0x0938 +#define MMC_RXOVERSIZE_G 0x093c +#define MMC_RX64OCTETS_GB_LO 0x0940 +#define MMC_RX64OCTETS_GB_HI 0x0944 +#define MMC_RX65TO127OCTETS_GB_LO 0x0948 +#define MMC_RX65TO127OCTETS_GB_HI 0x094c +#define MMC_RX128TO255OCTETS_GB_LO 0x0950 +#define MMC_RX128TO255OCTETS_GB_HI 0x0954 +#define MMC_RX256TO511OCTETS_GB_LO 0x0958 +#define MMC_RX256TO511OCTETS_GB_HI 0x095c +#define MMC_RX512TO1023OCTETS_GB_LO 0x0960 +#define MMC_RX512TO1023OCTETS_GB_HI 0x0964 +#define MMC_RX1024TOMAXOCTETS_GB_LO 0x0968 +#define MMC_RX1024TOMAXOCTETS_GB_HI 0x096c +#define MMC_RXUNICASTFRAMES_G_LO 0x0970 +#define MMC_RXUNICASTFRAMES_G_HI 0x0974 +#define MMC_RXLENGTHERROR_LO 0x0978 +#define MMC_RXLENGTHERROR_HI 0x097c +#define MMC_RXOUTOFRANGETYPE_LO 0x0980 +#define MMC_RXOUTOFRANGETYPE_HI 0x0984 +#define MMC_RXPAUSEFRAMES_LO 0x0988 +#define MMC_RXPAUSEFRAMES_HI 0x098c +#define MMC_RXFIFOOVERFLOW_LO 0x0990 +#define MMC_RXFIFOOVERFLOW_HI 0x0994 +#define MMC_RXVLANFRAMES_GB_LO 0x0998 +#define MMC_RXVLANFRAMES_GB_HI 0x099c +#define MMC_RXWATCHDOGERROR 0x09a0 + +/* MMC register entry bit positions and sizes */ +#define MMC_CR_CR_INDEX 0 +#define MMC_CR_CR_WIDTH 1 +#define MMC_CR_CSR_INDEX 1 +#define MMC_CR_CSR_WIDTH 1 +#define MMC_CR_ROR_INDEX 2 +#define MMC_CR_ROR_WIDTH 1 +#define MMC_CR_MCF_INDEX 3 +#define MMC_CR_MCF_WIDTH 1 +#define MMC_CR_MCT_INDEX 4 +#define MMC_CR_MCT_WIDTH 2 +#define MMC_RIER_ALL_INTERRUPTS_INDEX 0 +#define MMC_RIER_ALL_INTERRUPTS_WIDTH 23 +#define MMC_RISR_RXFRAMECOUNT_GB_INDEX 0 +#define MMC_RISR_RXFRAMECOUNT_GB_WIDTH 1 +#define MMC_RISR_RXOCTETCOUNT_GB_INDEX 1 +#define MMC_RISR_RXOCTETCOUNT_GB_WIDTH 1 +#define MMC_RISR_RXOCTETCOUNT_G_INDEX 2 +#define MMC_RISR_RXOCTETCOUNT_G_WIDTH 1 +#define MMC_RISR_RXBROADCASTFRAMES_G_INDEX 3 +#define MMC_RISR_RXBROADCASTFRAMES_G_WIDTH 1 +#define MMC_RISR_RXMULTICASTFRAMES_G_INDEX 4 +#define MMC_RISR_RXMULTICASTFRAMES_G_WIDTH 1 +#define MMC_RISR_RXCRCERROR_INDEX 5 +#define MMC_RISR_RXCRCERROR_WIDTH 1 +#define MMC_RISR_RXRUNTERROR_INDEX 6 +#define MMC_RISR_RXRUNTERROR_WIDTH 1 +#define MMC_RISR_RXJABBERERROR_INDEX 7 +#define MMC_RISR_RXJABBERERROR_WIDTH 1 +#define MMC_RISR_RXUNDERSIZE_G_INDEX 8 +#define MMC_RISR_RXUNDERSIZE_G_WIDTH 1 +#define MMC_RISR_RXOVERSIZE_G_INDEX 9 +#define MMC_RISR_RXOVERSIZE_G_WIDTH 1 +#define MMC_RISR_RX64OCTETS_GB_INDEX 10 +#define MMC_RISR_RX64OCTETS_GB_WIDTH 1 +#define MMC_RISR_RX65TO127OCTETS_GB_INDEX 11 +#define MMC_RISR_RX65TO127OCTETS_GB_WIDTH 1 +#define MMC_RISR_RX128TO255OCTETS_GB_INDEX 12 +#define MMC_RISR_RX128TO255OCTETS_GB_WIDTH 1 +#define MMC_RISR_RX256TO511OCTETS_GB_INDEX 13 +#define MMC_RISR_RX256TO511OCTETS_GB_WIDTH 1 +#define MMC_RISR_RX512TO1023OCTETS_GB_INDEX 14 +#define MMC_RISR_RX512TO1023OCTETS_GB_WIDTH 1 +#define MMC_RISR_RX1024TOMAXOCTETS_GB_INDEX 15 +#define MMC_RISR_RX1024TOMAXOCTETS_GB_WIDTH 1 +#define MMC_RISR_RXUNICASTFRAMES_G_INDEX 16 +#define MMC_RISR_RXUNICASTFRAMES_G_WIDTH 1 +#define MMC_RISR_RXLENGTHERROR_INDEX 17 +#define MMC_RISR_RXLENGTHERROR_WIDTH 1 +#define MMC_RISR_RXOUTOFRANGETYPE_INDEX 18 +#define MMC_RISR_RXOUTOFRANGETYPE_WIDTH 1 +#define MMC_RISR_RXPAUSEFRAMES_INDEX 19 +#define MMC_RISR_RXPAUSEFRAMES_WIDTH 1 +#define MMC_RISR_RXFIFOOVERFLOW_INDEX 20 +#define MMC_RISR_RXFIFOOVERFLOW_WIDTH 1 +#define MMC_RISR_RXVLANFRAMES_GB_INDEX 21 +#define MMC_RISR_RXVLANFRAMES_GB_WIDTH 1 +#define MMC_RISR_RXWATCHDOGERROR_INDEX 22 +#define MMC_RISR_RXWATCHDOGERROR_WIDTH 1 +#define MMC_TIER_ALL_INTERRUPTS_INDEX 0 +#define MMC_TIER_ALL_INTERRUPTS_WIDTH 18 +#define MMC_TISR_TXOCTETCOUNT_GB_INDEX 0 +#define MMC_TISR_TXOCTETCOUNT_GB_WIDTH 1 +#define MMC_TISR_TXFRAMECOUNT_GB_INDEX 1 +#define MMC_TISR_TXFRAMECOUNT_GB_WIDTH 1 +#define MMC_TISR_TXBROADCASTFRAMES_G_INDEX 2 +#define MMC_TISR_TXBROADCASTFRAMES_G_WIDTH 1 +#define MMC_TISR_TXMULTICASTFRAMES_G_INDEX 3 +#define MMC_TISR_TXMULTICASTFRAMES_G_WIDTH 1 +#define MMC_TISR_TX64OCTETS_GB_INDEX 4 +#define MMC_TISR_TX64OCTETS_GB_WIDTH 1 +#define MMC_TISR_TX65TO127OCTETS_GB_INDEX 5 +#define MMC_TISR_TX65TO127OCTETS_GB_WIDTH 1 +#define MMC_TISR_TX128TO255OCTETS_GB_INDEX 6 +#define MMC_TISR_TX128TO255OCTETS_GB_WIDTH 1 +#define MMC_TISR_TX256TO511OCTETS_GB_INDEX 7 +#define MMC_TISR_TX256TO511OCTETS_GB_WIDTH 1 +#define MMC_TISR_TX512TO1023OCTETS_GB_INDEX 8 +#define MMC_TISR_TX512TO1023OCTETS_GB_WIDTH 1 +#define MMC_TISR_TX1024TOMAXOCTETS_GB_INDEX 9 +#define MMC_TISR_TX1024TOMAXOCTETS_GB_WIDTH 1 +#define MMC_TISR_TXUNICASTFRAMES_GB_INDEX 10 +#define MMC_TISR_TXUNICASTFRAMES_GB_WIDTH 1 +#define MMC_TISR_TXMULTICASTFRAMES_GB_INDEX 11 +#define MMC_TISR_TXMULTICASTFRAMES_GB_WIDTH 1 +#define MMC_TISR_TXBROADCASTFRAMES_GB_INDEX 12 +#define MMC_TISR_TXBROADCASTFRAMES_GB_WIDTH 1 +#define MMC_TISR_TXUNDERFLOWERROR_INDEX 13 +#define MMC_TISR_TXUNDERFLOWERROR_WIDTH 1 +#define MMC_TISR_TXOCTETCOUNT_G_INDEX 14 +#define MMC_TISR_TXOCTETCOUNT_G_WIDTH 1 +#define MMC_TISR_TXFRAMECOUNT_G_INDEX 15 +#define MMC_TISR_TXFRAMECOUNT_G_WIDTH 1 +#define MMC_TISR_TXPAUSEFRAMES_INDEX 16 +#define MMC_TISR_TXPAUSEFRAMES_WIDTH 1 +#define MMC_TISR_TXVLANFRAMES_G_INDEX 17 +#define MMC_TISR_TXVLANFRAMES_G_WIDTH 1 + +/* MTL register offsets */ +#define MTL_OMR 0x1000 +#define MTL_FDCR 0x1008 +#define MTL_FDSR 0x100c +#define MTL_FDDR 0x1010 +#define MTL_ISR 0x1020 +#define MTL_RQDCM0R 0x1030 +#define MTL_TCPM0R 0x1040 +#define MTL_TCPM1R 0x1044 + +#define MTL_RQDCM_INC 4 +#define MTL_RQDCM_Q_PER_REG 4 +#define MTL_TCPM_INC 4 +#define MTL_TCPM_TC_PER_REG 4 + +/* MTL register entry bit positions and sizes */ +#define MTL_OMR_ETSALG_INDEX 5 +#define MTL_OMR_ETSALG_WIDTH 2 +#define MTL_OMR_RAA_INDEX 2 +#define MTL_OMR_RAA_WIDTH 1 + +/* MTL queue register offsets +* Multiple queues can be active. The first queue has registers +* that begin at 0x1100. Each subsequent queue has registers that +* are accessed using an offset of 0x80 from the previous queue. +*/ +#define MTL_Q_BASE 0x1100 +#define MTL_Q_INC 0x80 + +#define MTL_Q_TQOMR 0x00 +#define MTL_Q_TQUR 0x04 +#define MTL_Q_TQDR 0x08 +#define MTL_Q_RQOMR 0x40 +#define MTL_Q_RQMPOCR 0x44 +#define MTL_Q_RQDR 0x48 +#define MTL_Q_RQFCR 0x50 +#define MTL_Q_IER 0x70 +#define MTL_Q_ISR 0x74 + +/* MTL queue register entry bit positions and sizes */ +#define MTL_Q_RQDR_PRXQ_INDEX 16 +#define MTL_Q_RQDR_PRXQ_WIDTH 14 +#define MTL_Q_RQDR_RXQSTS_INDEX 4 +#define MTL_Q_RQDR_RXQSTS_WIDTH 2 +#define MTL_Q_RQFCR_RFA_INDEX 1 +#define MTL_Q_RQFCR_RFA_WIDTH 6 +#define MTL_Q_RQFCR_RFD_INDEX 17 +#define MTL_Q_RQFCR_RFD_WIDTH 6 +#define MTL_Q_RQOMR_EHFC_INDEX 7 +#define MTL_Q_RQOMR_EHFC_WIDTH 1 +#define MTL_Q_RQOMR_RQS_INDEX 16 +#define MTL_Q_RQOMR_RQS_WIDTH 9 +#define MTL_Q_RQOMR_RSF_INDEX 5 +#define MTL_Q_RQOMR_RSF_WIDTH 1 +#define MTL_Q_RQOMR_RTC_INDEX 0 +#define MTL_Q_RQOMR_RTC_WIDTH 2 +#define MTL_Q_TQDR_TRCSTS_INDEX 1 +#define MTL_Q_TQDR_TRCSTS_WIDTH 2 +#define MTL_Q_TQDR_TXQSTS_INDEX 4 +#define MTL_Q_TQDR_TXQSTS_WIDTH 1 +#define MTL_Q_TQOMR_FTQ_INDEX 0 +#define MTL_Q_TQOMR_FTQ_WIDTH 1 +#define MTL_Q_TQOMR_Q2TCMAP_INDEX 8 +#define MTL_Q_TQOMR_Q2TCMAP_WIDTH 3 +#define MTL_Q_TQOMR_TQS_INDEX 16 +#define MTL_Q_TQOMR_TQS_WIDTH 10 +#define MTL_Q_TQOMR_TSF_INDEX 1 +#define MTL_Q_TQOMR_TSF_WIDTH 1 +#define MTL_Q_TQOMR_TTC_INDEX 4 +#define MTL_Q_TQOMR_TTC_WIDTH 3 +#define MTL_Q_TQOMR_TXQEN_INDEX 2 +#define MTL_Q_TQOMR_TXQEN_WIDTH 2 + +/* MTL queue register value */ +#define MTL_RSF_DISABLE 0x00 +#define MTL_RSF_ENABLE 0x01 +#define MTL_TSF_DISABLE 0x00 +#define MTL_TSF_ENABLE 0x01 + +#define MTL_RX_THRESHOLD_64 0x00 +#define MTL_RX_THRESHOLD_96 0x02 +#define MTL_RX_THRESHOLD_128 0x03 +#define MTL_TX_THRESHOLD_32 0x01 +#define MTL_TX_THRESHOLD_64 0x00 +#define MTL_TX_THRESHOLD_96 0x02 +#define MTL_TX_THRESHOLD_128 0x03 +#define MTL_TX_THRESHOLD_192 0x04 +#define MTL_TX_THRESHOLD_256 0x05 +#define MTL_TX_THRESHOLD_384 0x06 +#define MTL_TX_THRESHOLD_512 0x07 + +#define MTL_ETSALG_WRR 0x00 +#define MTL_ETSALG_WFQ 0x01 +#define MTL_ETSALG_DWRR 0x02 +#define MTL_RAA_SP 0x00 +#define MTL_RAA_WSP 0x01 + +#define MTL_Q_DISABLED 0x00 +#define MTL_Q_ENABLED 0x02 + +/* MTL traffic class register offsets +* Multiple traffic classes can be active. The first class has registers +* that begin at 0x1100. Each subsequent queue has registers that +* are accessed using an offset of 0x80 from the previous queue. +*/ +#define MTL_TC_BASE MTL_Q_BASE +#define MTL_TC_INC MTL_Q_INC + +#define MTL_TC_ETSCR 0x10 +#define MTL_TC_ETSSR 0x14 +#define MTL_TC_QWR 0x18 + +/* MTL traffic class register entry bit positions and sizes */ +#define MTL_TC_ETSCR_TSA_INDEX 0 +#define MTL_TC_ETSCR_TSA_WIDTH 2 +#define MTL_TC_QWR_QW_INDEX 0 +#define MTL_TC_QWR_QW_WIDTH 21 + +/* MTL traffic class register value */ +#define MTL_TSA_SP 0x00 +#define MTL_TSA_ETS 0x02 + +/* PCS register offsets */ +#define PCS_V1_WINDOW_SELECT 0x03fc +#define PCS_V2_WINDOW_DEF 0x9060 +#define PCS_V2_WINDOW_SELECT 0x9064 + +/* PCS register entry bit positions and sizes */ +#define PCS_V2_WINDOW_DEF_OFFSET_INDEX 6 +#define PCS_V2_WINDOW_DEF_OFFSET_WIDTH 14 +#define PCS_V2_WINDOW_DEF_SIZE_INDEX 2 +#define PCS_V2_WINDOW_DEF_SIZE_WIDTH 4 + +/* SerDes integration register offsets */ +#define SIR0_KR_RT_1 0x002c +#define SIR0_STATUS 0x0040 +#define SIR1_SPEED 0x0000 + +/* SerDes integration register entry bit positions and sizes */ +#define SIR0_KR_RT_1_RESET_INDEX 11 +#define SIR0_KR_RT_1_RESET_WIDTH 1 +#define SIR0_STATUS_RX_READY_INDEX 0 +#define SIR0_STATUS_RX_READY_WIDTH 1 +#define SIR0_STATUS_TX_READY_INDEX 8 +#define SIR0_STATUS_TX_READY_WIDTH 1 +#define SIR1_SPEED_CDR_RATE_INDEX 12 +#define SIR1_SPEED_CDR_RATE_WIDTH 4 +#define SIR1_SPEED_DATARATE_INDEX 4 +#define SIR1_SPEED_DATARATE_WIDTH 2 +#define SIR1_SPEED_PLLSEL_INDEX 3 +#define SIR1_SPEED_PLLSEL_WIDTH 1 +#define SIR1_SPEED_RATECHANGE_INDEX 6 +#define SIR1_SPEED_RATECHANGE_WIDTH 1 +#define SIR1_SPEED_TXAMP_INDEX 8 +#define SIR1_SPEED_TXAMP_WIDTH 4 +#define SIR1_SPEED_WORDMODE_INDEX 0 +#define SIR1_SPEED_WORDMODE_WIDTH 3 + +/* SerDes RxTx register offsets */ +#define RXTX_REG6 0x0018 +#define RXTX_REG20 0x0050 +#define RXTX_REG22 0x0058 +#define RXTX_REG114 0x01c8 +#define RXTX_REG129 0x0204 + +/* SerDes RxTx register entry bit positions and sizes */ +#define RXTX_REG6_RESETB_RXD_INDEX 8 +#define RXTX_REG6_RESETB_RXD_WIDTH 1 +#define RXTX_REG20_BLWC_ENA_INDEX 2 +#define RXTX_REG20_BLWC_ENA_WIDTH 1 +#define RXTX_REG114_PQ_REG_INDEX 9 +#define RXTX_REG114_PQ_REG_WIDTH 7 +#define RXTX_REG129_RXDFE_CONFIG_INDEX 14 +#define RXTX_REG129_RXDFE_CONFIG_WIDTH 2 + +/* MAC Control register offsets */ +#define XP_PROP_0 0x0000 +#define XP_PROP_1 0x0004 +#define XP_PROP_2 0x0008 +#define XP_PROP_3 0x000c +#define XP_PROP_4 0x0010 +#define XP_PROP_5 0x0014 +#define XP_MAC_ADDR_LO 0x0020 +#define XP_MAC_ADDR_HI 0x0024 +#define XP_ECC_ISR 0x0030 +#define XP_ECC_IER 0x0034 +#define XP_ECC_CNT0 0x003c +#define XP_ECC_CNT1 0x0040 +#define XP_DRIVER_INT_REQ 0x0060 +#define XP_DRIVER_INT_RO 0x0064 +#define XP_DRIVER_SCRATCH_0 0x0068 +#define XP_DRIVER_SCRATCH_1 0x006c +#define XP_INT_EN 0x0078 +#define XP_I2C_MUTEX 0x0080 +#define XP_MDIO_MUTEX 0x0084 + +/* MAC Control register entry bit positions and sizes */ +#define XP_DRIVER_INT_REQ_REQUEST_INDEX 0 +#define XP_DRIVER_INT_REQ_REQUEST_WIDTH 1 +#define XP_DRIVER_INT_RO_STATUS_INDEX 0 +#define XP_DRIVER_INT_RO_STATUS_WIDTH 1 +#define XP_DRIVER_SCRATCH_0_COMMAND_INDEX 0 +#define XP_DRIVER_SCRATCH_0_COMMAND_WIDTH 8 +#define XP_DRIVER_SCRATCH_0_SUB_COMMAND_INDEX 8 +#define XP_DRIVER_SCRATCH_0_SUB_COMMAND_WIDTH 8 +#define XP_ECC_CNT0_RX_DED_INDEX 24 +#define XP_ECC_CNT0_RX_DED_WIDTH 8 +#define XP_ECC_CNT0_RX_SEC_INDEX 16 +#define XP_ECC_CNT0_RX_SEC_WIDTH 8 +#define XP_ECC_CNT0_TX_DED_INDEX 8 +#define XP_ECC_CNT0_TX_DED_WIDTH 8 +#define XP_ECC_CNT0_TX_SEC_INDEX 0 +#define XP_ECC_CNT0_TX_SEC_WIDTH 8 +#define XP_ECC_CNT1_DESC_DED_INDEX 8 +#define XP_ECC_CNT1_DESC_DED_WIDTH 8 +#define XP_ECC_CNT1_DESC_SEC_INDEX 0 +#define XP_ECC_CNT1_DESC_SEC_WIDTH 8 +#define XP_ECC_IER_DESC_DED_INDEX 0 +#define XP_ECC_IER_DESC_DED_WIDTH 1 +#define XP_ECC_IER_DESC_SEC_INDEX 1 +#define XP_ECC_IER_DESC_SEC_WIDTH 1 +#define XP_ECC_IER_RX_DED_INDEX 2 +#define XP_ECC_IER_RX_DED_WIDTH 1 +#define XP_ECC_IER_RX_SEC_INDEX 3 +#define XP_ECC_IER_RX_SEC_WIDTH 1 +#define XP_ECC_IER_TX_DED_INDEX 4 +#define XP_ECC_IER_TX_DED_WIDTH 1 +#define XP_ECC_IER_TX_SEC_INDEX 5 +#define XP_ECC_IER_TX_SEC_WIDTH 1 +#define XP_ECC_ISR_DESC_DED_INDEX 0 +#define XP_ECC_ISR_DESC_DED_WIDTH 1 +#define XP_ECC_ISR_DESC_SEC_INDEX 1 +#define XP_ECC_ISR_DESC_SEC_WIDTH 1 +#define XP_ECC_ISR_RX_DED_INDEX 2 +#define XP_ECC_ISR_RX_DED_WIDTH 1 +#define XP_ECC_ISR_RX_SEC_INDEX 3 +#define XP_ECC_ISR_RX_SEC_WIDTH 1 +#define XP_ECC_ISR_TX_DED_INDEX 4 +#define XP_ECC_ISR_TX_DED_WIDTH 1 +#define XP_ECC_ISR_TX_SEC_INDEX 5 +#define XP_ECC_ISR_TX_SEC_WIDTH 1 +#define XP_I2C_MUTEX_BUSY_INDEX 31 +#define XP_I2C_MUTEX_BUSY_WIDTH 1 +#define XP_I2C_MUTEX_ID_INDEX 29 +#define XP_I2C_MUTEX_ID_WIDTH 2 +#define XP_I2C_MUTEX_ACTIVE_INDEX 0 +#define XP_I2C_MUTEX_ACTIVE_WIDTH 1 +#define XP_MAC_ADDR_HI_VALID_INDEX 31 +#define XP_MAC_ADDR_HI_VALID_WIDTH 1 +#define XP_PROP_0_CONN_TYPE_INDEX 28 +#define XP_PROP_0_CONN_TYPE_WIDTH 3 +#define XP_PROP_0_MDIO_ADDR_INDEX 16 +#define XP_PROP_0_MDIO_ADDR_WIDTH 5 +#define XP_PROP_0_PORT_ID_INDEX 0 +#define XP_PROP_0_PORT_ID_WIDTH 8 +#define XP_PROP_0_PORT_MODE_INDEX 8 +#define XP_PROP_0_PORT_MODE_WIDTH 4 +#define XP_PROP_0_PORT_SPEEDS_INDEX 23 +#define XP_PROP_0_PORT_SPEEDS_WIDTH 4 +#define XP_PROP_1_MAX_RX_DMA_INDEX 24 +#define XP_PROP_1_MAX_RX_DMA_WIDTH 5 +#define XP_PROP_1_MAX_RX_QUEUES_INDEX 8 +#define XP_PROP_1_MAX_RX_QUEUES_WIDTH 5 +#define XP_PROP_1_MAX_TX_DMA_INDEX 16 +#define XP_PROP_1_MAX_TX_DMA_WIDTH 5 +#define XP_PROP_1_MAX_TX_QUEUES_INDEX 0 +#define XP_PROP_1_MAX_TX_QUEUES_WIDTH 5 +#define XP_PROP_2_RX_FIFO_SIZE_INDEX 16 +#define XP_PROP_2_RX_FIFO_SIZE_WIDTH 16 +#define XP_PROP_2_TX_FIFO_SIZE_INDEX 0 +#define XP_PROP_2_TX_FIFO_SIZE_WIDTH 16 +#define XP_PROP_3_GPIO_MASK_INDEX 28 +#define XP_PROP_3_GPIO_MASK_WIDTH 4 +#define XP_PROP_3_GPIO_MOD_ABS_INDEX 20 +#define XP_PROP_3_GPIO_MOD_ABS_WIDTH 4 +#define XP_PROP_3_GPIO_RATE_SELECT_INDEX 16 +#define XP_PROP_3_GPIO_RATE_SELECT_WIDTH 4 +#define XP_PROP_3_GPIO_RX_LOS_INDEX 24 +#define XP_PROP_3_GPIO_RX_LOS_WIDTH 4 +#define XP_PROP_3_GPIO_TX_FAULT_INDEX 12 +#define XP_PROP_3_GPIO_TX_FAULT_WIDTH 4 +#define XP_PROP_3_GPIO_ADDR_INDEX 8 +#define XP_PROP_3_GPIO_ADDR_WIDTH 3 +#define XP_PROP_3_MDIO_RESET_INDEX 0 +#define XP_PROP_3_MDIO_RESET_WIDTH 2 +#define XP_PROP_3_MDIO_RESET_I2C_ADDR_INDEX 8 +#define XP_PROP_3_MDIO_RESET_I2C_ADDR_WIDTH 3 +#define XP_PROP_3_MDIO_RESET_I2C_GPIO_INDEX 12 +#define XP_PROP_3_MDIO_RESET_I2C_GPIO_WIDTH 4 +#define XP_PROP_3_MDIO_RESET_INT_GPIO_INDEX 4 +#define XP_PROP_3_MDIO_RESET_INT_GPIO_WIDTH 2 +#define XP_PROP_4_MUX_ADDR_HI_INDEX 8 +#define XP_PROP_4_MUX_ADDR_HI_WIDTH 5 +#define XP_PROP_4_MUX_ADDR_LO_INDEX 0 +#define XP_PROP_4_MUX_ADDR_LO_WIDTH 3 +#define XP_PROP_4_MUX_CHAN_INDEX 4 +#define XP_PROP_4_MUX_CHAN_WIDTH 3 +#define XP_PROP_4_REDRV_ADDR_INDEX 16 +#define XP_PROP_4_REDRV_ADDR_WIDTH 7 +#define XP_PROP_4_REDRV_IF_INDEX 23 +#define XP_PROP_4_REDRV_IF_WIDTH 1 +#define XP_PROP_4_REDRV_LANE_INDEX 24 +#define XP_PROP_4_REDRV_LANE_WIDTH 3 +#define XP_PROP_4_REDRV_MODEL_INDEX 28 +#define XP_PROP_4_REDRV_MODEL_WIDTH 3 +#define XP_PROP_4_REDRV_PRESENT_INDEX 31 +#define XP_PROP_4_REDRV_PRESENT_WIDTH 1 + +/* I2C Control register offsets */ +#define IC_CON 0x0000 +#define IC_TAR 0x0004 +#define IC_DATA_CMD 0x0010 +#define IC_INTR_STAT 0x002c +#define IC_INTR_MASK 0x0030 +#define IC_RAW_INTR_STAT 0x0034 +#define IC_CLR_INTR 0x0040 +#define IC_CLR_TX_ABRT 0x0054 +#define IC_CLR_STOP_DET 0x0060 +#define IC_ENABLE 0x006c +#define IC_TXFLR 0x0074 +#define IC_RXFLR 0x0078 +#define IC_TX_ABRT_SOURCE 0x0080 +#define IC_ENABLE_STATUS 0x009c +#define IC_COMP_PARAM_1 0x00f4 + +/* I2C Control register entry bit positions and sizes */ +#define IC_COMP_PARAM_1_MAX_SPEED_MODE_INDEX 2 +#define IC_COMP_PARAM_1_MAX_SPEED_MODE_WIDTH 2 +#define IC_COMP_PARAM_1_RX_BUFFER_DEPTH_INDEX 8 +#define IC_COMP_PARAM_1_RX_BUFFER_DEPTH_WIDTH 8 +#define IC_COMP_PARAM_1_TX_BUFFER_DEPTH_INDEX 16 +#define IC_COMP_PARAM_1_TX_BUFFER_DEPTH_WIDTH 8 +#define IC_CON_MASTER_MODE_INDEX 0 +#define IC_CON_MASTER_MODE_WIDTH 1 +#define IC_CON_RESTART_EN_INDEX 5 +#define IC_CON_RESTART_EN_WIDTH 1 +#define IC_CON_RX_FIFO_FULL_HOLD_INDEX 9 +#define IC_CON_RX_FIFO_FULL_HOLD_WIDTH 1 +#define IC_CON_SLAVE_DISABLE_INDEX 6 +#define IC_CON_SLAVE_DISABLE_WIDTH 1 +#define IC_CON_SPEED_INDEX 1 +#define IC_CON_SPEED_WIDTH 2 +#define IC_DATA_CMD_CMD_INDEX 8 +#define IC_DATA_CMD_CMD_WIDTH 1 +#define IC_DATA_CMD_STOP_INDEX 9 +#define IC_DATA_CMD_STOP_WIDTH 1 +#define IC_ENABLE_ABORT_INDEX 1 +#define IC_ENABLE_ABORT_WIDTH 1 +#define IC_ENABLE_EN_INDEX 0 +#define IC_ENABLE_EN_WIDTH 1 +#define IC_ENABLE_STATUS_EN_INDEX 0 +#define IC_ENABLE_STATUS_EN_WIDTH 1 +#define IC_INTR_MASK_TX_EMPTY_INDEX 4 +#define IC_INTR_MASK_TX_EMPTY_WIDTH 1 +#define IC_RAW_INTR_STAT_RX_FULL_INDEX 2 +#define IC_RAW_INTR_STAT_RX_FULL_WIDTH 1 +#define IC_RAW_INTR_STAT_STOP_DET_INDEX 9 +#define IC_RAW_INTR_STAT_STOP_DET_WIDTH 1 +#define IC_RAW_INTR_STAT_TX_ABRT_INDEX 6 +#define IC_RAW_INTR_STAT_TX_ABRT_WIDTH 1 +#define IC_RAW_INTR_STAT_TX_EMPTY_INDEX 4 +#define IC_RAW_INTR_STAT_TX_EMPTY_WIDTH 1 + +/* I2C Control register value */ +#define IC_TX_ABRT_7B_ADDR_NOACK 0x0001 +#define IC_TX_ABRT_ARB_LOST 0x1000 + +/* Descriptor/Packet entry bit positions and sizes */ +#define RX_PACKET_ERRORS_CRC_INDEX 2 +#define RX_PACKET_ERRORS_CRC_WIDTH 1 +#define RX_PACKET_ERRORS_FRAME_INDEX 3 +#define RX_PACKET_ERRORS_FRAME_WIDTH 1 +#define RX_PACKET_ERRORS_LENGTH_INDEX 0 +#define RX_PACKET_ERRORS_LENGTH_WIDTH 1 +#define RX_PACKET_ERRORS_OVERRUN_INDEX 1 +#define RX_PACKET_ERRORS_OVERRUN_WIDTH 1 + +#define RX_PACKET_ATTRIBUTES_CSUM_DONE_INDEX 0 +#define RX_PACKET_ATTRIBUTES_CSUM_DONE_WIDTH 1 +#define RX_PACKET_ATTRIBUTES_VLAN_CTAG_INDEX 1 +#define RX_PACKET_ATTRIBUTES_VLAN_CTAG_WIDTH 1 +#define RX_PACKET_ATTRIBUTES_INCOMPLETE_INDEX 2 +#define RX_PACKET_ATTRIBUTES_INCOMPLETE_WIDTH 1 +#define RX_PACKET_ATTRIBUTES_CONTEXT_NEXT_INDEX 3 +#define RX_PACKET_ATTRIBUTES_CONTEXT_NEXT_WIDTH 1 +#define RX_PACKET_ATTRIBUTES_CONTEXT_INDEX 4 +#define RX_PACKET_ATTRIBUTES_CONTEXT_WIDTH 1 +#define RX_PACKET_ATTRIBUTES_RX_TSTAMP_INDEX 5 +#define RX_PACKET_ATTRIBUTES_RX_TSTAMP_WIDTH 1 +#define RX_PACKET_ATTRIBUTES_RSS_HASH_INDEX 6 +#define RX_PACKET_ATTRIBUTES_RSS_HASH_WIDTH 1 + +#define RX_NORMAL_DESC0_OVT_INDEX 0 +#define RX_NORMAL_DESC0_OVT_WIDTH 16 +#define RX_NORMAL_DESC2_HL_INDEX 0 +#define RX_NORMAL_DESC2_HL_WIDTH 10 +#define RX_NORMAL_DESC3_CDA_INDEX 27 +#define RX_NORMAL_DESC3_CDA_WIDTH 1 +#define RX_NORMAL_DESC3_CTXT_INDEX 30 +#define RX_NORMAL_DESC3_CTXT_WIDTH 1 +#define RX_NORMAL_DESC3_ES_INDEX 15 +#define RX_NORMAL_DESC3_ES_WIDTH 1 +#define RX_NORMAL_DESC3_ETLT_INDEX 16 +#define RX_NORMAL_DESC3_ETLT_WIDTH 4 +#define RX_NORMAL_DESC3_FD_INDEX 29 +#define RX_NORMAL_DESC3_FD_WIDTH 1 +#define RX_NORMAL_DESC3_INTE_INDEX 30 +#define RX_NORMAL_DESC3_INTE_WIDTH 1 +#define RX_NORMAL_DESC3_L34T_INDEX 20 +#define RX_NORMAL_DESC3_L34T_WIDTH 4 +#define RX_NORMAL_DESC3_LD_INDEX 28 +#define RX_NORMAL_DESC3_LD_WIDTH 1 +#define RX_NORMAL_DESC3_OWN_INDEX 31 +#define RX_NORMAL_DESC3_OWN_WIDTH 1 +#define RX_NORMAL_DESC3_PL_INDEX 0 +#define RX_NORMAL_DESC3_PL_WIDTH 14 +#define RX_NORMAL_DESC3_RSV_INDEX 26 +#define RX_NORMAL_DESC3_RSV_WIDTH 1 + +#define RX_DESC3_L34T_IPV4_TCP 1 +#define RX_DESC3_L34T_IPV4_UDP 2 +#define RX_DESC3_L34T_IPV4_ICMP 3 +#define RX_DESC3_L34T_IPV6_TCP 9 +#define RX_DESC3_L34T_IPV6_UDP 10 +#define RX_DESC3_L34T_IPV6_ICMP 11 + +#define RX_CONTEXT_DESC3_TSA_INDEX 4 +#define RX_CONTEXT_DESC3_TSA_WIDTH 1 +#define RX_CONTEXT_DESC3_TSD_INDEX 6 +#define RX_CONTEXT_DESC3_TSD_WIDTH 1 + +#define TX_PACKET_ATTRIBUTES_CSUM_ENABLE_INDEX 0 +#define TX_PACKET_ATTRIBUTES_CSUM_ENABLE_WIDTH 1 +#define TX_PACKET_ATTRIBUTES_TSO_ENABLE_INDEX 1 +#define TX_PACKET_ATTRIBUTES_TSO_ENABLE_WIDTH 1 +#define TX_PACKET_ATTRIBUTES_VLAN_CTAG_INDEX 2 +#define TX_PACKET_ATTRIBUTES_VLAN_CTAG_WIDTH 1 +#define TX_PACKET_ATTRIBUTES_PTP_INDEX 3 +#define TX_PACKET_ATTRIBUTES_PTP_WIDTH 1 + +#define TX_CONTEXT_DESC2_MSS_INDEX 0 +#define TX_CONTEXT_DESC2_MSS_WIDTH 15 +#define TX_CONTEXT_DESC3_CTXT_INDEX 30 +#define TX_CONTEXT_DESC3_CTXT_WIDTH 1 +#define TX_CONTEXT_DESC3_TCMSSV_INDEX 26 +#define TX_CONTEXT_DESC3_TCMSSV_WIDTH 1 +#define TX_CONTEXT_DESC3_VLTV_INDEX 16 +#define TX_CONTEXT_DESC3_VLTV_WIDTH 1 +#define TX_CONTEXT_DESC3_VT_INDEX 0 +#define TX_CONTEXT_DESC3_VT_WIDTH 16 + +#define TX_NORMAL_DESC2_HL_B1L_INDEX 0 +#define TX_NORMAL_DESC2_HL_B1L_WIDTH 14 +#define TX_NORMAL_DESC2_IC_INDEX 31 +#define TX_NORMAL_DESC2_IC_WIDTH 1 +#define TX_NORMAL_DESC2_TTSE_INDEX 30 +#define TX_NORMAL_DESC2_TTSE_WIDTH 1 +#define TX_NORMAL_DESC2_VTIR_INDEX 14 +#define TX_NORMAL_DESC2_VTIR_WIDTH 2 +#define TX_NORMAL_DESC3_CIC_INDEX 16 +#define TX_NORMAL_DESC3_CIC_WIDTH 2 +#define TX_NORMAL_DESC3_CPC_INDEX 26 +#define TX_NORMAL_DESC3_CPC_WIDTH 2 +#define TX_NORMAL_DESC3_CTXT_INDEX 30 +#define TX_NORMAL_DESC3_CTXT_WIDTH 1 +#define TX_NORMAL_DESC3_FD_INDEX 29 +#define TX_NORMAL_DESC3_FD_WIDTH 1 +#define TX_NORMAL_DESC3_FL_INDEX 0 +#define TX_NORMAL_DESC3_FL_WIDTH 15 +#define TX_NORMAL_DESC3_LD_INDEX 28 +#define TX_NORMAL_DESC3_LD_WIDTH 1 +#define TX_NORMAL_DESC3_OWN_INDEX 31 +#define TX_NORMAL_DESC3_OWN_WIDTH 1 +#define TX_NORMAL_DESC3_TCPHDRLEN_INDEX 19 +#define TX_NORMAL_DESC3_TCPHDRLEN_WIDTH 4 +#define TX_NORMAL_DESC3_TCPPL_INDEX 0 +#define TX_NORMAL_DESC3_TCPPL_WIDTH 18 +#define TX_NORMAL_DESC3_TSE_INDEX 18 +#define TX_NORMAL_DESC3_TSE_WIDTH 1 + +#define TX_NORMAL_DESC2_VLAN_INSERT 0x2 + +/* MDIO undefined or vendor specific registers */ +#ifndef MDIO_PMA_10GBR_PMD_CTRL +#define MDIO_PMA_10GBR_PMD_CTRL 0x0096 +#endif + +#ifndef MDIO_PMA_10GBR_FECCTRL +#define MDIO_PMA_10GBR_FECCTRL 0x00ab +#endif + +#ifndef MDIO_PCS_DIG_CTRL +#define MDIO_PCS_DIG_CTRL 0x8000 +#endif + +#ifndef MDIO_AN_XNP +#define MDIO_AN_XNP 0x0016 +#endif + +#ifndef MDIO_AN_LPX +#define MDIO_AN_LPX 0x0019 +#endif + +#ifndef MDIO_AN_COMP_STAT +#define MDIO_AN_COMP_STAT 0x0030 +#endif + +#ifndef MDIO_AN_INTMASK +#define MDIO_AN_INTMASK 0x8001 +#endif + +#ifndef MDIO_AN_INT +#define MDIO_AN_INT 0x8002 +#endif + +#ifndef MDIO_VEND2_AN_ADVERTISE +#define MDIO_VEND2_AN_ADVERTISE 0x0004 +#endif + +#ifndef MDIO_VEND2_AN_LP_ABILITY +#define MDIO_VEND2_AN_LP_ABILITY 0x0005 +#endif + +#ifndef MDIO_VEND2_AN_CTRL +#define MDIO_VEND2_AN_CTRL 0x8001 +#endif + +#ifndef MDIO_VEND2_AN_STAT +#define MDIO_VEND2_AN_STAT 0x8002 +#endif + +#ifndef MDIO_CTRL1_SPEED1G +#define MDIO_CTRL1_SPEED1G (MDIO_CTRL1_SPEED10G & ~BMCR_SPEED100) +#endif + +#ifndef MDIO_VEND2_CTRL1_AN_ENABLE +#define MDIO_VEND2_CTRL1_AN_ENABLE BIT(12) +#endif + +#ifndef MDIO_VEND2_CTRL1_AN_RESTART +#define MDIO_VEND2_CTRL1_AN_RESTART BIT(9) +#endif + +#ifndef MDIO_VEND2_CTRL1_SS6 +#define MDIO_VEND2_CTRL1_SS6 BIT(6) +#endif + +#ifndef MDIO_VEND2_CTRL1_SS13 +#define MDIO_VEND2_CTRL1_SS13 BIT(13) +#endif + +/* MDIO mask values */ +#define AXGBE_AN_CL73_INT_CMPLT BIT(0) +#define AXGBE_AN_CL73_INC_LINK BIT(1) +#define AXGBE_AN_CL73_PG_RCV BIT(2) +#define AXGBE_AN_CL73_INT_MASK 0x07 + +#define AXGBE_XNP_MCF_NULL_MESSAGE 0x001 +#define AXGBE_XNP_ACK_PROCESSED BIT(12) +#define AXGBE_XNP_MP_FORMATTED BIT(13) +#define AXGBE_XNP_NP_EXCHANGE BIT(15) + +#define AXGBE_KR_TRAINING_START BIT(0) +#define AXGBE_KR_TRAINING_ENABLE BIT(1) + +#define AXGBE_PCS_CL37_BP BIT(12) + +#define AXGBE_AN_CL37_INT_CMPLT BIT(0) +#define AXGBE_AN_CL37_INT_MASK 0x01 + +#define AXGBE_AN_CL37_HD_MASK 0x40 +#define AXGBE_AN_CL37_FD_MASK 0x20 + +#define AXGBE_AN_CL37_PCS_MODE_MASK 0x06 +#define AXGBE_AN_CL37_PCS_MODE_BASEX 0x00 +#define AXGBE_AN_CL37_PCS_MODE_SGMII 0x04 +#define AXGBE_AN_CL37_TX_CONFIG_MASK 0x08 + +/*generic*/ +#define __iomem + +#define rmb () rte_rmb()/* dpdk rte provided rmb */ +#define wmb () rte_wmb()/* dpdk rte provided wmb */ + +#define __le16 u16 +#define __le32 u32 +#define __le64 u64 + +typedef unsigned char u8 ; +typedef unsigned short u16 ; +typedef unsigned int u32 ; +typedef unsigned long long u64 ; +typedef unsigned long long dma_addr_t ; + +static inline uint32_t low32_value (uint64_t addr) +{ +return (addr) &0x0ffffffff ; +} + +static inline uint32_t high32_value (uint64_t addr) +{ +return (addr >>32 ) &0x0ffffffff ; +} + +/*END*/ + +/* Bit setting and getting macros +* The get macro will extract the current bit field value from within +* the variable +* +* The set macro will clear the current bit field value within the +* variable and then set the bit field of the variable to the +* specified value +*/ +#define GET_BITS (_var, _index, _width) \ + (((_var) >> (_index)) & ((0x1 << (_width)) - 1)) + +#define SET_BITS (_var, _index, _width, _val) \ +do { \ + (_var) &= ~(((0x1 << (_width)) - 1) << (_index)); \ + (_var) |= (((_val) & ((0x1 << (_width)) - 1)) << (_index)); \ +} while (0) + +#define GET_BITS_LE (_var, _index, _width) \ + ((rte_le_to_cpu_32((_var)) >> (_index)) & ((0x1 << (_width)) - 1)) + +#define SET_BITS_LE (_var, _index, _width, _val) \ +do { \ + (_var) &= rte_cpu_to_le_32(~(((0x1 << (_width)) - 1) << (_index)));\ + (_var) |= rte_cpu_to_le_32((((_val) & \ + ((0x1 << (_width)) - 1)) << (_index))); \ +} while (0) + +/* Bit setting and getting macros based on register fields +* The get macro uses the bit field definitions formed using the input +* names to extract the current bit field value from within the +* variable +* +* The set macro uses the bit field definitions formed using the input +* names to set the bit field of the variable to the specified value +*/ +#define AXGMAC_GET_BITS (_var, _prefix, _field) \ + GET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH) + +#define AXGMAC_SET_BITS (_var, _prefix, _field, _val) \ + SET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH, (_val)) + +#define AXGMAC_GET_BITS_LE (_var, _prefix, _field) \ + GET_BITS_LE((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH) + +#define AXGMAC_SET_BITS_LE (_var, _prefix, _field, _val) \ + SET_BITS_LE((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH, (_val)) + +/* Macros for reading or writing registers +* The ioread macros will get bit fields or full values using the +* register definitions formed using the input names +* +* The iowrite macros will set bit fields or full values using the +* register definitions formed using the input names +*/ +#define AXGMAC_IOREAD (_pdata, _reg) \ + rte_read32((void *)((_pdata)->xgmac_regs + (_reg))) + +#define AXGMAC_IOREAD_BITS (_pdata, _reg, _field) \ + GET_BITS(AXGMAC_IOREAD((_pdata), _reg), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define AXGMAC_IOWRITE (_pdata, _reg, _val) \ + rte_write32((_val), (void *)((_pdata)->xgmac_regs + (_reg))) + +#define AXGMAC_IOWRITE_BITS (_pdata, _reg, _field, _val) \ +do { \ + u32 reg_val = AXGMAC_IOREAD((_pdata), _reg); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + AXGMAC_IOWRITE((_pdata), _reg, reg_val); \ +} while (0) + +/* Macros for reading or writing MTL queue or traffic class registers +* Similar to the standard read and write macros except that the +* base register value is calculated by the queue or traffic class number +*/ +#define AXGMAC_MTL_IOREAD (_pdata, _n, _reg) \ + rte_read32((void *)((_pdata)->xgmac_regs + \ + MTL_Q_BASE + ((_n) * MTL_Q_INC) + (_reg))) + +#define AXGMAC_MTL_IOREAD_BITS (_pdata, _n, _reg, _field) \ + GET_BITS(AXGMAC_MTL_IOREAD((_pdata), (_n), (_reg)), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define AXGMAC_MTL_IOWRITE (_pdata, _n, _reg, _val) \ + rte_write32((_val), (void *)((_pdata)->xgmac_regs + \ + MTL_Q_BASE + ((_n) * MTL_Q_INC) + (_reg))) + +#define AXGMAC_MTL_IOWRITE_BITS (_pdata, _n, _reg, _field, _val) \ +do { \ + u32 reg_val = AXGMAC_MTL_IOREAD((_pdata), (_n), _reg); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + AXGMAC_MTL_IOWRITE((_pdata), (_n), _reg, reg_val); \ +} while (0) + +/* Macros for reading or writing DMA channel registers +* Similar to the standard read and write macros except that the +* base register value is obtained from the ring +*/ +#define AXGMAC_DMA_IOREAD (_channel, _reg) \ + rte_read32((void *)((_channel)->dma_regs + (_reg))) + +#define AXGMAC_DMA_IOREAD_BITS (_channel, _reg, _field) \ + GET_BITS(AXGMAC_DMA_IOREAD((_channel), _reg), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define AXGMAC_DMA_IOWRITE (_channel, _reg, _val) \ + rte_write32((_val), (void *)((_channel)->dma_regs + (_reg))) + +#define AXGMAC_DMA_IOWRITE_BITS (_channel, _reg, _field, _val) \ +do { \ + u32 reg_val = AXGMAC_DMA_IOREAD((_channel), _reg); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + AXGMAC_DMA_IOWRITE((_channel), _reg, reg_val); \ +} while (0) + +/* Macros for building, reading or writing register values or bits +* within the register values of XPCS registers. +*/ +#define XPCS_GET_BITS (_var, _prefix, _field) \ + GET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH) + +#define XPCS_SET_BITS (_var, _prefix, _field, _val) \ + SET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH, (_val)) + +#define XPCS32_IOWRITE (_pdata, _off, _val) \ + rte_write32(_val, (void *)((_pdata)->xpcs_regs + (_off))) + +#define XPCS32_IOREAD (_pdata, _off) \ + rte_read32((void *)((_pdata)->xpcs_regs + (_off))) + +#define XPCS16_IOWRITE (_pdata, _off, _val) \ + rte_write16(_val, (void *)((_pdata)->xpcs_regs + (_off))) + +#define XPCS16_IOREAD (_pdata, _off) \ + rte_read16((void *)((_pdata)->xpcs_regs + (_off))) + +/* Macros for building, reading or writing register values or bits +* within the register values of SerDes integration registers. +*/ +#define XSIR_GET_BITS (_var, _prefix, _field) \ + GET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH) + +#define XSIR_SET_BITS (_var, _prefix, _field, _val) \ + SET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH, (_val)) + +#define XSIR0_IOREAD (_pdata, _reg) \ + rte_read16((void *)((_pdata)->sir0_regs + (_reg))) + +#define XSIR0_IOREAD_BITS (_pdata, _reg, _field) \ + GET_BITS(XSIR0_IOREAD((_pdata), _reg), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define XSIR0_IOWRITE (_pdata, _reg, _val) \ + rte_write16((_val), (void *)((_pdata)->sir0_regs + (_reg))) + +#define XSIR0_IOWRITE_BITS (_pdata, _reg, _field, _val) \ +do { \ + u16 reg_val = XSIR0_IOREAD((_pdata), _reg); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + XSIR0_IOWRITE((_pdata), _reg, reg_val); \ +} while (0) + +#define XSIR1_IOREAD (_pdata, _reg) \ + rte_read16((void *)((_pdata)->sir1_regs + _reg)) + +#define XSIR1_IOREAD_BITS (_pdata, _reg, _field) \ + GET_BITS(XSIR1_IOREAD((_pdata), _reg), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define XSIR1_IOWRITE (_pdata, _reg, _val) \ + rte_write16((_val), (void *)((_pdata)->sir1_regs + (_reg))) + +#define XSIR1_IOWRITE_BITS (_pdata, _reg, _field, _val) \ +do { \ + u16 reg_val = XSIR1_IOREAD((_pdata), _reg); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + XSIR1_IOWRITE((_pdata), _reg, reg_val); \ +} while (0) + +/* Macros for building, reading or writing register values or bits +* within the register values of SerDes RxTx registers. +*/ +#define XRXTX_IOREAD (_pdata, _reg) \ + rte_read16((void *)((_pdata)->rxtx_regs + (_reg))) + +#define XRXTX_IOREAD_BITS (_pdata, _reg, _field) \ + GET_BITS(XRXTX_IOREAD((_pdata), _reg), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define XRXTX_IOWRITE (_pdata, _reg, _val) \ + rte_write16((_val), (void *)((_pdata)->rxtx_regs + (_reg))) + +#define XRXTX_IOWRITE_BITS (_pdata, _reg, _field, _val) \ +do { \ + u16 reg_val = XRXTX_IOREAD((_pdata), _reg); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + XRXTX_IOWRITE((_pdata), _reg, reg_val); \ +} while (0) + +/* Macros for building, reading or writing register values or bits +* within the register values of MAC Control registers. +*/ +#define XP_GET_BITS (_var, _prefix, _field) \ + GET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH) + +#define XP_SET_BITS (_var, _prefix, _field, _val) \ + SET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH, (_val)) + +#define XP_IOREAD (_pdata, _reg) \ + rte_read32((void *)((_pdata)->xprop_regs + (_reg))) + +#define XP_IOREAD_BITS (_pdata, _reg, _field) \ + GET_BITS(XP_IOREAD((_pdata), (_reg)), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define XP_IOWRITE (_pdata, _reg, _val) \ + rte_write32((_val), (void *)((_pdata)->xprop_regs + (_reg))) + +#define XP_IOWRITE_BITS (_pdata, _reg, _field, _val) \ +do { \ + u32 reg_val = XP_IOREAD((_pdata), (_reg)); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + XP_IOWRITE((_pdata), (_reg), reg_val); \ +} while (0) + +/* Macros for building, reading or writing register values or bits +* within the register values of I2C Control registers. +*/ +#define XI2C_GET_BITS (_var, _prefix, _field) \ + GET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH) + +#define XI2C_SET_BITS (_var, _prefix, _field, _val) \ + SET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH, (_val)) + +#define XI2C_IOREAD (_pdata, _reg) \ + rte_read32((void *)((_pdata)->xi2c_regs + (_reg))) + +#define XI2C_IOREAD_BITS (_pdata, _reg, _field) \ + GET_BITS(XI2C_IOREAD((_pdata), (_reg)), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define XI2C_IOWRITE (_pdata, _reg, _val) \ + rte_write32((_val), (void *)((_pdata)->xi2c_regs + (_reg))) + +#define XI2C_IOWRITE_BITS (_pdata, _reg, _field, _val) \ +do { \ + u32 reg_val = XI2C_IOREAD((_pdata), (_reg)); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + XI2C_IOWRITE((_pdata), (_reg), reg_val); \ +} while (0) + +/* Macros for building, reading or writing register values or bits +* using MDIO. Different from above because of the use of standardized +* Linux include values. No shifting is performed with the bit +* operations, everything works on mask values. +*/ +#define XMDIO_READ (_pdata, _mmd, _reg) \ + ((_pdata)->hw_if.read_mmd_regs((_pdata), 0, \ + MII_ADDR_C45 | ((_mmd) << 16) | ((_reg) & 0xffff))) + +#define XMDIO_READ_BITS (_pdata, _mmd, _reg, _mask) \ + (XMDIO_READ((_pdata), _mmd, _reg) & _mask) + +#define XMDIO_WRITE (_pdata, _mmd, _reg, _val) \ + ((_pdata)->hw_if.write_mmd_regs((_pdata), 0, \ + MII_ADDR_C45 | ((_mmd) << 16) | ((_reg) & 0xffff), (_val))) + +#define XMDIO_WRITE_BITS (_pdata, _mmd, _reg, _mask, _val) \ +do { \ + u32 mmd_val = XMDIO_READ((_pdata), (_mmd), (_reg)); \ + mmd_val &= ~(_mask); \ + mmd_val |= (_val); \ + XMDIO_WRITE((_pdata), (_mmd), (_reg), (mmd_val)); \ +} while (0) + +/* +* time_after(a,b) returns true if the time a is after time b. +* +* Do this with "<0" and ">=0" to only test the sign of the result. A +* good compiler would generate better code (and a really good compiler +* wouldn't care). Gcc is currently neither. +*/ +#define time_after (a, b) ((long)((b) - (a)) < 0) +#define time_before (a, b) time_after(b, a) + +#define time_after_eq (a, b) ((long)((a) - (b)) >= 0) +#define time_before_eq (a, b) time_after_eq(b, a) + +/*---bitmap support apis---*/ +static inline int axgbe_test_bit (int nr,volatile unsigned long *addr) +{ +int res; + +rte_mb (); + res = ((*addr) & (1UL << nr)) !=0 ; +rte_mb (); +return res; +} + +static inline void axgbe_set_bit (unsigned int nr,volatile unsigned long *addr) +{ +__sync_fetch_and_or (addr, (1UL << nr)); +} + +static inline void axgbe_clear_bit (int nr,volatile unsigned long *addr) +{ +__sync_fetch_and_and (addr, ~(1UL << nr)); +} + +static inline int axgbe_test_and_clear_bit (int nr,volatile unsigned long *addr) +{ +unsigned long mask = (1UL << nr); + +return __sync_fetch_and_and (addr, ~mask) & mask; +} + +static inline unsigned long msecs_to_timer_cycles (unsigned int m) +{ +return rte_get_timer_hz () * (m /1000 ); +} +#endif /* __AXGBE_COMMON_H__ */
Signature · 1 line
2.7.4
PATCH v2 3/16 net/axgbe: add phy register map and helper macros
In reply to Ravi Kumar--- drivers/net/axgbe/axgbe_phy.h | 314 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 314 insertions(+) create mode 100644 drivers/net/axgbe/axgbe_phy.h
drivers/net/axgbe/axgbe_phy.h new file +314 -0
@@ -0,0 +1,314 @@ +/*- +* Copyright(c) 2017 Advanced Micro Devices, Inc. +* All rights reserved. +* +* AMD 10Gb Ethernet driver +* +* This file is available to you under your choice of the following two +* licenses: +* +* License 1: GPLv2 +* +* Copyright (c) 2017 Advanced Micro Devices, Inc. +* +* This file is free software; you may copy, redistribute and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 2 of the License, or +* (at your option) any later version. +* +* This file is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +* +* This file incorporates work covered by the following copyright and +* permission notice: +* +* Copyright (c) 2013 Synopsys, Inc. +* +* The Synopsys DWC ETHER XGMAC Software Driver and documentation +* (hereinafter "Software") is an unsupported proprietary work of Synopsys, +* Inc. unless otherwise expressly agreed to in writing between Synopsys +* and you. +* +* The Software IS NOT an item of Licensed Software or Licensed Product +* under any End User Software License Agreement or Agreement for Licensed +* Product with Synopsys or any supplement thereto. Permission is hereby +* granted, free of charge, to any person obtaining a copy of this software +* annotated with this license and the Software, to deal in the Software +* without restriction, including without limitation the rights to use, +* copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* of the Software, and to permit persons to whom the Software is furnished +* to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" +* BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +* PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS +* 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. +* +* License 2: Modified BSD +* +* Copyright (c) 2017 Advanced Micro Devices, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * 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. +* * Neither the name of Advanced Micro Devices, Inc. nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "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 +* <COPYRIGHT HOLDER> 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. +* +* This file incorporates work covered by the following copyright and +* permission notice: +* +* Copyright (c) 2013 Synopsys, Inc. +* +* The Synopsys DWC ETHER XGMAC Software Driver and documentation +* (hereinafter "Software") is an unsupported proprietary work of Synopsys, +* Inc. unless otherwise expressly agreed to in writing between Synopsys +* and you. +* +* The Software IS NOT an item of Licensed Software or Licensed Product +* under any End User Software License Agreement or Agreement for Licensed +* Product with Synopsys or any supplement thereto. Permission is hereby +* granted, free of charge, to any person obtaining a copy of this software +* annotated with this license and the Software, to deal in the Software +* without restriction, including without limitation the rights to use, +* copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* of the Software, and to permit persons to whom the Software is furnished +* to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" +* BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +* PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS +* 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 __AXGBE_PHY_H__ +#define __AXGBE_PHY_H__ + +#define SPEED_10 10 +#define SPEED_100 100 +#define SPEED_1000 1000 +#define SPEED_2500 2500 +#define SPEED_10000 10000 + + +/* Or MII_ADDR_C45 into regnum for read/write on mii_bus to enable the 21 bit +* IEEE 802.3ae clause 45 addressing mode used by 10GIGE phy chips. +*/ +#define MII_ADDR_C45 (1 << 30) + +/* Basic mode status register. */ +#define BMSR_LSTATUS 0x0004/* Link status */ + +/* Status register 1. */ +#define MDIO_STAT1_LSTATUS BMSR_LSTATUS + +/* Generic MII registers. */ +#define MII_BMCR 0x00/* Basic mode control register */ +#define MII_BMSR 0x01/* Basic mode status register */ +#define MII_PHYSID1 0x02/* PHYS ID 1 */ +#define MII_PHYSID2 0x03/* PHYS ID 2 */ +#define MII_ADVERTISE 0x04/* Advertisement control reg */ +#define MII_LPA 0x05/* Link partner ability reg */ +#define MII_EXPANSION 0x06/* Expansion register */ +#define MII_CTRL1000 0x09/* 1000BASE-T control */ +#define MII_STAT1000 0x0a/* 1000BASE-T status */ +#define MII_MMD_CTRL 0x0d/* MMD Access Control Register */ +#define MII_MMD_DATA 0x0e/* MMD Access Data Register */ +#define MII_ESTATUS 0x0f/* Extended Status */ +#define MII_DCOUNTER 0x12/* Disconnect counter */ +#define MII_FCSCOUNTER 0x13/* False carrier counter */ +#define MII_NWAYTEST 0x14/* N-way auto-neg test reg */ +#define MII_RERRCOUNTER 0x15/* Receive error counter */ +#define MII_SREVISION 0x16/* Silicon revision */ +#define MII_RESV1 0x17/* Reserved... */ +#define MII_LBRERROR 0x18/* Lpback, rx, bypass error */ +#define MII_PHYADDR 0x19/* PHY address */ +#define MII_RESV2 0x1a/* Reserved... */ +#define MII_TPISTATUS 0x1b/* TPI status for 10mbps */ +#define MII_NCONFIG 0x1c/* Network interface config */ + +/* Basic mode control register. */ +#define BMCR_RESV 0x003f/* Unused... */ +#define BMCR_SPEED1000 0x0040/* MSB of Speed (1000) */ +#define BMCR_CTST 0x0080/* Collision test */ +#define BMCR_FULLDPLX 0x0100/* Full duplex */ +#define BMCR_ANRESTART 0x0200/* Auto negotiation restart */ +#define BMCR_ISOLATE 0x0400/* Isolate data paths from MII */ +#define BMCR_PDOWN 0x0800/* Enable low power state */ +#define BMCR_ANENABLE 0x1000/* Enable auto negotiation */ +#define BMCR_SPEED100 0x2000/* Select 100Mbps */ +#define BMCR_LOOPBACK 0x4000/* TXD loopback bits */ +#define BMCR_RESET 0x8000/* Reset to default state */ +#define BMCR_SPEED10 0x0000/* Select 10Mbps */ + + +/* MDIO Manageable Devices (MMDs). */ +#define MDIO_MMD_PMAPMD 1/* Physical Medium Attachment +* Physical Medium Dependent +*/ +#define MDIO_MMD_WIS 2/* WAN Interface Sublayer */ +#define MDIO_MMD_PCS 3/* Physical Coding Sublayer */ +#define MDIO_MMD_PHYXS 4/* PHY Extender Sublayer */ +#define MDIO_MMD_DTEXS 5/* DTE Extender Sublayer */ +#define MDIO_MMD_TC 6/* Transmission Convergence */ +#define MDIO_MMD_AN 7/* Auto-Negotiation */ +#define MDIO_MMD_C22EXT 29/* Clause 22 extension */ +#define MDIO_MMD_VEND1 30/* Vendor specific 1 */ +#define MDIO_MMD_VEND2 31/* Vendor specific 2 */ + +/* Generic MDIO registers. */ +#define MDIO_CTRL1 MII_BMCR +#define MDIO_STAT1 MII_BMSR +#define MDIO_DEVID1 MII_PHYSID1 +#define MDIO_DEVID2 MII_PHYSID2 +#define MDIO_SPEED 4/* Speed ability */ +#define MDIO_DEVS1 5/* Devices in package */ +#define MDIO_DEVS2 6 +#define MDIO_CTRL2 7/* 10G control 2 */ +#define MDIO_STAT2 8/* 10G status 2 */ +#define MDIO_PMA_TXDIS 9/* 10G PMA/PMD transmit disable */ +#define MDIO_PMA_RXDET 10/* 10G PMA/PMD receive signal detect */ +#define MDIO_PMA_EXTABLE 11/* 10G PMA/PMD extended ability */ +#define MDIO_PKGID1 14/* Package identifier */ +#define MDIO_PKGID2 15 +#define MDIO_AN_ADVERTISE 16/* AN advertising (base page) */ +#define MDIO_AN_LPA 19/* AN LP abilities (base page) */ +#define MDIO_PCS_EEE_ABLE 20/* EEE Capability register */ +#define MDIO_PCS_EEE_WK_ERR 22/* EEE wake error counter */ +#define MDIO_PHYXS_LNSTAT 24/* PHY XGXS lane state */ +#define MDIO_AN_EEE_ADV 60/* EEE advertisement */ +#define MDIO_AN_EEE_LPABLE 61/* EEE link partner ability */ + +/* Media-dependent registers. */ +#define MDIO_PMA_10GBT_SWAPPOL 130/* 10GBASE-T pair swap & polarity */ +#define MDIO_PMA_10GBT_TXPWR 131/* 10GBASE-T TX power control */ +#define MDIO_PMA_10GBT_SNR 133/* 10GBASE-T SNR margin, lane A. +* Lanes B-D are numbered 134-136. +*/ +#define MDIO_PMA_10GBR_FECABLE 170/* 10GBASE-R FEC ability */ +#define MDIO_PCS_10GBX_STAT1 24/* 10GBASE-X PCS status 1 */ +#define MDIO_PCS_10GBRT_STAT1 32/* 10GBASE-R/-T PCS status 1 */ +#define MDIO_PCS_10GBRT_STAT2 33/* 10GBASE-R/-T PCS status 2 */ +#define MDIO_AN_10GBT_CTRL 32/* 10GBASE-T auto-negotiation control */ +#define MDIO_AN_10GBT_STAT 33/* 10GBASE-T auto-negotiation status */ + +/* Control register 1. */ +/* Enable extended speed selection */ +#define MDIO_CTRL1_SPEEDSELEXT (BMCR_SPEED1000 | BMCR_SPEED100) +/* All speed selection bits */ +#define MDIO_CTRL1_SPEEDSEL (MDIO_CTRL1_SPEEDSELEXT | 0x003c) +#define MDIO_CTRL1_FULLDPLX BMCR_FULLDPLX +#define MDIO_CTRL1_LPOWER BMCR_PDOWN +#define MDIO_CTRL1_RESET BMCR_RESET +#define MDIO_PMA_CTRL1_LOOPBACK 0x0001 +#define MDIO_PMA_CTRL1_SPEED1000 BMCR_SPEED1000 +#define MDIO_PMA_CTRL1_SPEED100 BMCR_SPEED100 +#define MDIO_PCS_CTRL1_LOOPBACK BMCR_LOOPBACK +#define MDIO_PHYXS_CTRL1_LOOPBACK BMCR_LOOPBACK +#define MDIO_AN_CTRL1_RESTART BMCR_ANRESTART +#define MDIO_AN_CTRL1_ENABLE BMCR_ANENABLE +#define MDIO_AN_CTRL1_XNP 0x2000/* Enable extended next page */ +#define MDIO_PCS_CTRL1_CLKSTOP_EN 0x400/* Stop the clock during LPI */ + + + + + +/* PMA 10GBASE-R FEC ability register. */ +#define MDIO_PMA_10GBR_FECABLE_ABLE 0x0001/* FEC ability */ +#define MDIO_PMA_10GBR_FECABLE_ERRABLE 0x0002/* FEC error indic. ability */ + + +/* Autoneg related */ +#define ADVERTISED_Autoneg (1 << 6) +#define SUPPORTED_Autoneg (1 << 6) +#define AUTONEG_DISABLE 0x00 +#define AUTONEG_ENABLE 0x01 + +#define ADVERTISED_Pause (1 << 13) +#define ADVERTISED_Asym_Pause (1 << 14) + +#define SUPPORTED_Pause (1 << 13) +#define SUPPORTED_Asym_Pause (1 << 14) + +#define SUPPORTED_Backplane (1 << 16) +#define SUPPORTED_TP (1 << 7) + +#define ADVERTISED_10000baseR_FEC (1 << 20) + +#define SUPPORTED_10000baseR_FEC (1 << 20) + +#define SUPPORTED_FIBRE (1 << 10) + +#define ADVERTISED_10000baseKR_Full (1 << 19) +#define ADVERTISED_10000baseT_Full (1 << 12) +#define ADVERTISED_2500baseX_Full (1 << 15) +#define ADVERTISED_1000baseKX_Full (1 << 17) +#define ADVERTISED_1000baseT_Full (1 << 5) +#define ADVERTISED_100baseT_Full (1 << 3) +#define ADVERTISED_TP (1 << 7) +#define ADVERTISED_FIBRE (1 << 10) +#define ADVERTISED_Backplane (1 << 16) + +#define SUPPORTED_1000baseKX_Full (1 << 17) +#define SUPPORTED_10000baseKR_Full (1 << 19) +#define SUPPORTED_2500baseX_Full (1 << 15) +#define SUPPORTED_100baseT_Full (1 << 2) +#define SUPPORTED_1000baseT_Full (1 << 5) +#define SUPPORTED_10000baseT_Full (1 << 12) +#define SUPPORTED_2500baseX_Full (1 << 15) + + +#define SPEED_UNKNOWN -1 + +/* Duplex, half or full. */ +#define DUPLEX_HALF 0x00 +#define DUPLEX_FULL 0x01 +#define DUPLEX_UNKNOWN 0xff + +#endif +/* PHY */
Signature · 1 line
2.7.4
PATCH v2 4/16 net/axgbe: add structures for MAC initialization and reset
In reply to Ravi Kumar--- drivers/net/axgbe/Makefile | 1 + drivers/net/axgbe/axgbe_dev.c | 167 +++++++++++++++++++ drivers/net/axgbe/axgbe_ethdev.c | 301 ++++++++++++++++++++++++++++++++- drivers/net/axgbe/axgbe_ethdev.h | 349 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 816 insertions(+), 2 deletions(-) create mode 100644 drivers/net/axgbe/axgbe_dev.c
drivers/net/axgbe/Makefile +1 -0
@@ -142,5 +142,6 @@ LIBABIVER := 1 # all source are stored in SRCS-y # SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_ethdev.c +SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_dev.c include $(RTE_SDK)/mk/rte.lib.mk
drivers/net/axgbe/axgbe_dev.c new file +167 -0
167 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.c +299 -2
336 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.h +349 -0
361 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v2 5/16 net/axgbe: add phy initialization and related apis
In reply to Ravi Kumar--- drivers/net/axgbe/Makefile | 3 + drivers/net/axgbe/axgbe_dev.c | 188 +++++++++ drivers/net/axgbe/axgbe_ethdev.c | 11 + drivers/net/axgbe/axgbe_ethdev.h | 172 ++++++++ drivers/net/axgbe/axgbe_i2c.c | 453 +++++++++++++++++++++ drivers/net/axgbe/axgbe_mdio.c | 203 ++++++++++ drivers/net/axgbe/axgbe_phy_impl.c | 799 +++++++++++++++++++++++++++++++++++++ 7 files changed, 1829 insertions(+) create mode 100644 drivers/net/axgbe/axgbe_i2c.c create mode 100644 drivers/net/axgbe/axgbe_mdio.c create mode 100644 drivers/net/axgbe/axgbe_phy_impl.c
drivers/net/axgbe/Makefile +3 -0
@@ -143,5 +143,8 @@ LIBABIVER := 1 # SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_ethdev.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_dev.c +SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_mdio.c +SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_phy_impl.c +SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_i2c.c include $(RTE_SDK)/mk/rte.lib.mk
drivers/net/axgbe/axgbe_dev.c +188 -0
198 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.c +11 -0
@@ -147,6 +147,7 @@ static const struct rte_pci_id pci_id_axgbe_map[] = { };static struct axgbe_version_data axgbe_v2a = { + .init_function_ptrs_phy_impl = axgbe_init_function_ptrs_phy_v2, .xpcs_access =AXGBE_XPCS_ACCESS_V2 , .mmc_64bit =1 , .tx_max_fifo_size =229376 ,
@@ -157,6 +158,7 @@ static struct axgbe_version_data axgbe_v2a = { };static struct axgbe_version_data axgbe_v2b = { + .init_function_ptrs_phy_impl = axgbe_init_function_ptrs_phy_v2, .xpcs_access =AXGBE_XPCS_ACCESS_V2 , .mmc_64bit =1 , .tx_max_fifo_size =65536 ,
@@ -271,6 +273,9 @@ static void axgbe_get_all_hw_features(struct axgbe_port *pdata)static void axgbe_init_all_fptrs (struct axgbe_port *pdata) {axgbe_init_function_ptrs_dev (&pdata->hw_if); +axgbe_init_function_ptrs_phy (&pdata->phy_if); +axgbe_init_function_ptrs_i2c (&pdata->i2c_if); + pdata->vdata->init_function_ptrs_phy_impl (&pdata->phy_if); }static void axgbe_set_counts (struct axgbe_port *pdata)
@@ -458,6 +463,12 @@ eth_axgbe_dev_init(struct rte_eth_dev *eth_dev)pthread_mutex_init (&pdata->an_mutex,NULL );pthread_mutex_init (&pdata->phy_mutex,NULL ); + ret = pdata->phy_if.phy_init (pdata); +if (ret) { +rte_free (eth_dev->data->mac_addrs); +return ret; + } +PMD_INIT_LOG (DEBUG ,"port %d vendorID=0x%x deviceID=0x%x" , eth_dev->data->port_id, pci_dev->id.vendor_id, pci_dev->id.device_id);
drivers/net/axgbe/axgbe_ethdev.h +172 -0
203 lines not on this page · raw message
drivers/net/axgbe/axgbe_i2c.c new file +453 -0
453 lines not on this page · raw message
drivers/net/axgbe/axgbe_mdio.c new file +203 -0
203 lines not on this page · raw message
drivers/net/axgbe/axgbe_phy_impl.c new file +799 -0
799 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v2 6/16 net/axgbe: add phy programming apis
In reply to Ravi Kumar--- drivers/net/axgbe/axgbe_dev.c | 27 + drivers/net/axgbe/axgbe_mdio.c | 963 +++++++++++++++++++++++++ drivers/net/axgbe/axgbe_phy_impl.c | 1397 ++++++++++++++++++++++++++++++++++++ 3 files changed, 2387 insertions(+)
drivers/net/axgbe/axgbe_dev.c +27 -0
@@ -310,6 +310,30 @@ static void axgbe_write_mmd_regs(struct axgbe_port *pdata, int prtad, } } +static int axgbe_set_speed (struct axgbe_port *pdata,int speed) +{ +unsigned int ss; + +switch (speed) { +case SPEED_1000 : + ss =0x03 ; +break ; +case SPEED_2500 : + ss =0x02 ; +break ; +case SPEED_10000 : + ss =0x00 ; +break ; +default : +return -EINVAL ; + } + +if (AXGMAC_IOREAD_BITS (pdata,MAC_TCR ,SS ) != ss) +AXGMAC_IOWRITE_BITS (pdata,MAC_TCR ,SS , ss); + +return 0 ; +} +static int __axgbe_exit (struct axgbe_port *pdata) {unsigned int count =2000 ;
@@ -346,9 +370,12 @@ void axgbe_init_function_ptrs_dev(struct axgbe_hw_if *hw_if) { hw_if->exit = axgbe_exit; + hw_if->read_mmd_regs = axgbe_read_mmd_regs; hw_if->write_mmd_regs = axgbe_write_mmd_regs; + hw_if->set_speed = axgbe_set_speed; + hw_if->set_ext_mii_mode = axgbe_set_ext_mii_mode; hw_if->read_ext_mii_regs = axgbe_read_ext_mii_regs; hw_if->write_ext_mii_regs = axgbe_write_ext_mii_regs;
drivers/net/axgbe/axgbe_mdio.c +963 -0
973 lines not on this page · raw message
drivers/net/axgbe/axgbe_phy_impl.c +1397 -0
1,413 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v2 7/16 net/axgbe: add interrupt handler for autonegotiation
In reply to Ravi Kumar--- drivers/net/axgbe/axgbe_ethdev.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+)
drivers/net/axgbe/axgbe_ethdev.c +37 -0
@@ -131,6 +131,7 @@static int eth_axgbe_dev_init (struct rte_eth_dev *eth_dev);static int eth_axgbe_dev_uninit (struct rte_eth_dev *eth_dev); +static void axgbe_dev_interrupt_handler (void *param);/* The set of PCI devices this driver supports */ #define AMD_PCI_VENDOR_ID 0x1022
@@ -168,6 +169,30 @@ static struct axgbe_version_data axgbe_v2b = { .i2c_support = 1, }; +/* +* Interrupt handler triggered by NIC for handling +* specific interrupt. +* +* @param handle +* Pointer to interrupt handle. +* @param param +* The address of parameter (struct rte_eth_dev *) regsitered before. +* +* @return +* void +*/ +static void +axgbe_dev_interrupt_handler (void *param) +{ +struct rte_eth_dev *dev = (struct rte_eth_dev *)param; +struct axgbe_port *pdata = dev->data->dev_private; + + pdata->phy_if.an_isr (pdata); + +/* Enable interrupts since disabled after generation*/ +rte_intr_enable (&pdata->pci_dev->intr_handle); +} +static void axgbe_get_all_hw_features (struct axgbe_port *pdata) {unsigned int mac_hfr0, mac_hfr1, mac_hfr2;
@@ -469,6 +494,9 @@ eth_axgbe_dev_init(struct rte_eth_dev *eth_dev)return ret; } +rte_intr_callback_register (&pci_dev->intr_handle, + axgbe_dev_interrupt_handler, + (void *)eth_dev);PMD_INIT_LOG (DEBUG ,"port %d vendorID=0x%x deviceID=0x%x" , eth_dev->data->port_id, pci_dev->id.vendor_id, pci_dev->id.device_id);
@@ -479,15 +507,24 @@ eth_axgbe_dev_init(struct rte_eth_dev *eth_dev)static int eth_axgbe_dev_uninit (struct rte_eth_dev *eth_dev) { +struct rte_pci_device *pci_dev; +PMD_INIT_FUNC_TRACE ();if (rte_eal_process_type () !=RTE_PROC_PRIMARY )return 0 ; + pci_dev =RTE_DEV_TO_PCI (eth_dev->device);/*Free macaddres*/ rte_free (eth_dev->data->mac_addrs); eth_dev->data->mac_addrs =NULL ; +/* disable uio intr before callback unregister */ +rte_intr_disable (&pci_dev->intr_handle); +rte_intr_callback_unregister (&pci_dev->intr_handle, + axgbe_dev_interrupt_handler, + (void *)eth_dev); +return 0 ; }
Signature · 1 line
2.7.4
PATCH v2 8/16 net/axgbe: add transmit and receive queue setup apis
In reply to Ravi Kumar--- drivers/net/axgbe/Makefile | 1 + drivers/net/axgbe/axgbe_ethdev.c | 81 +++++++++ drivers/net/axgbe/axgbe_ethdev.h | 36 ++++ drivers/net/axgbe/axgbe_rxtx.c | 363 +++++++++++++++++++++++++++++++++++++++ drivers/net/axgbe/axgbe_rxtx.h | 289 +++++++++++++++++++++++++++++++ 5 files changed, 770 insertions(+) create mode 100644 drivers/net/axgbe/axgbe_rxtx.c create mode 100644 drivers/net/axgbe/axgbe_rxtx.h
drivers/net/axgbe/Makefile +1 -0
@@ -146,5 +146,6 @@ SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_dev.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_mdio.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_phy_impl.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_i2c.c +SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_rxtx.c include $(RTE_SDK)/mk/rte.lib.mk
drivers/net/axgbe/axgbe_ethdev.c +81 -0
123 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.h +36 -0
@@ -132,6 +132,16 @@#include <rte_lcore.h> #include "axgbe_common.h" +#define IRQ 0xff +#define VLAN_HLEN 4 + +#define AXGBE_TX_MAX_BUF_SIZE (0x3fff & ~(64 - 1)) +#define AXGBE_RX_MAX_BUF_SIZE (0x3fff & ~(64 - 1)) +#define AXGBE_RX_MIN_BUF_SIZE (ETHER_MAX_LEN + VLAN_HLEN) +#define AXGBE_MAX_MAC_ADDRS 1 + +#define AXGBE_RX_BUF_ALIGN 64 +#define AXGBE_MAX_DMA_CHANNELS 16#define AXGBE_MAX_QUEUES 16#define AXGBE_PRIORITY_QUEUES 8
@@ -147,6 +157,23 @@#define AXGBE_DMA_SYS_ARCACHE 0x0#define AXGBE_DMA_SYS_AWCACHE 0x0 +/* DMA channel interrupt modes */ +#define AXGBE_IRQ_MODE_EDGE 0 +#define AXGBE_IRQ_MODE_LEVEL 1 + +#define AXGBE_DMA_INTERRUPT_MASK 0x31c7 + +#define AXGMAC_MIN_PACKET 60 +#define AXGMAC_STD_PACKET_MTU 1500 +#define AXGMAC_MAX_STD_PACKET 1518 +#define AXGMAC_JUMBO_PACKET_MTU 9000 +#define AXGMAC_MAX_JUMBO_PACKET 9018 +/* Inter-frame gap + preamble */ +#define AXGMAC_ETH_PREAMBLE (12 + 8) + +#define AXGMAC_PFC_DATA_LEN 46 +#define AXGMAC_PFC_DELAYS 14000 +/* PCI BAR mapping */ #define AXGBE_AXGMAC_BAR 0#define AXGBE_XPCS_BAR 1
@@ -630,6 +657,10 @@ struct axgbe_port {struct ether_addr mac_addr; +/* Software Tx/Rx structure pointers*/ +void **rx_queues; +void **tx_queues; +/* MDIO/PHY related settings */ unsigned int phy_started;void *phy_data;
@@ -656,6 +687,11 @@ struct axgbe_port {/* I2C support */ struct axgbe_i2c i2c;volatile int i2c_complete; + +/* CRC stripping by H/w for Rx packet*/ +int crc_strip_enable; +/* csum enable to hardware */ +uint32_t rx_csum_enable; };void axgbe_init_function_ptrs_dev (struct axgbe_hw_if *hw_if);
drivers/net/axgbe/axgbe_rxtx.c new file +363 -0
363 lines not on this page · raw message
drivers/net/axgbe/axgbe_rxtx.h new file +289 -0
289 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v2 9/16 net/axgbe: add DMA programming and dev start and stop apis
In reply to Ravi Kumar--- drivers/net/axgbe/axgbe_dev.c | 844 +++++++++++++++++++++++++++++++++++++++ drivers/net/axgbe/axgbe_ethdev.c | 96 +++++ 2 files changed, 940 insertions(+)
drivers/net/axgbe/axgbe_dev.c +844 -0
@@ -128,6 +128,13 @@#include "axgbe_ethdev.h" #include "axgbe_common.h" #include "axgbe_phy.h" +#include "axgbe_rxtx.h" + +static inline unsigned int axgbe_get_max_frame (struct axgbe_port *pdata) +{ +return pdata->eth_dev->data->mtu +ETHER_HDR_LEN + +ETHER_CRC_LEN +VLAN_HLEN ; +}/* query busy bit */ static int mdio_complete (struct axgbe_port *pdata)
@@ -334,6 +341,191 @@ static int axgbe_set_speed(struct axgbe_port *pdata, int speed)return 0 ; } +static int axgbe_disable_tx_flow_control (struct axgbe_port *pdata) +{ +unsigned int max_q_count, q_count; +unsigned int reg, reg_val; +unsigned int i; + +/* Clear MTL flow control */ +for (i =0 ; i < pdata->rx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQOMR ,EHFC ,0 ); + +/* Clear MAC flow control */ + max_q_count =AXGMAC_MAX_FLOW_CONTROL_QUEUES ; + q_count =RTE_MIN (pdata->tx_q_count, + max_q_count); + reg =MAC_Q0TFCR ; +for (i =0 ; i < q_count; i++) { + reg_val =AXGMAC_IOREAD (pdata, reg); +AXGMAC_SET_BITS (reg_val,MAC_Q0TFCR ,TFE ,0 ); +AXGMAC_IOWRITE (pdata, reg, reg_val); + + reg +=MAC_QTFCR_INC ; + } + +return 0 ; +} + +static int axgbe_enable_tx_flow_control (struct axgbe_port *pdata) +{ +unsigned int max_q_count, q_count; +unsigned int reg, reg_val; +unsigned int i; + +/* Set MTL flow control */ +for (i =0 ; i < pdata->rx_q_count; i++) { +unsigned int ehfc =0 ; + +/* Flow control thresholds are established */ +if (pdata->rx_rfd[i]) + ehfc =1 ; + +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQOMR ,EHFC , ehfc); + } + +/* Set MAC flow control */ + max_q_count =AXGMAC_MAX_FLOW_CONTROL_QUEUES ; + q_count =RTE_MIN (pdata->tx_q_count, + max_q_count); + reg =MAC_Q0TFCR ; +for (i =0 ; i < q_count; i++) { + reg_val =AXGMAC_IOREAD (pdata, reg); + +/* Enable transmit flow control */ +AXGMAC_SET_BITS (reg_val,MAC_Q0TFCR ,TFE ,1 ); +/* Set pause time */ +AXGMAC_SET_BITS (reg_val,MAC_Q0TFCR ,PT ,0xffff ); + +AXGMAC_IOWRITE (pdata, reg, reg_val); + + reg +=MAC_QTFCR_INC ; + } + +return 0 ; +} + +static int axgbe_disable_rx_flow_control (struct axgbe_port *pdata) +{ +AXGMAC_IOWRITE_BITS (pdata,MAC_RFCR ,RFE ,0 ); + +return 0 ; +} + +static int axgbe_enable_rx_flow_control (struct axgbe_port *pdata) +{ +AXGMAC_IOWRITE_BITS (pdata,MAC_RFCR ,RFE ,1 ); + +return 0 ; +} + +static int axgbe_config_tx_flow_control (struct axgbe_port *pdata) +{ +if (pdata->tx_pause) +axgbe_enable_tx_flow_control (pdata); +else +axgbe_disable_tx_flow_control (pdata); + +return 0 ; +} + +static int axgbe_config_rx_flow_control (struct axgbe_port *pdata) +{ +if (pdata->rx_pause) +axgbe_enable_rx_flow_control (pdata); +else +axgbe_disable_rx_flow_control (pdata); + +return 0 ; +} + +static void axgbe_config_flow_control (struct axgbe_port *pdata) +{ +axgbe_config_tx_flow_control (pdata); +axgbe_config_rx_flow_control (pdata); + +AXGMAC_IOWRITE_BITS (pdata,MAC_RFCR ,PFCE ,0 ); +} + +static void axgbe_queue_flow_control_threshold (struct axgbe_port *pdata, +unsigned int queue, +unsigned int q_fifo_size) +{ +unsigned int frame_fifo_size; +unsigned int rfa, rfd; + + frame_fifo_size =AXGMAC_FLOW_CONTROL_ALIGN (axgbe_get_max_frame (pdata)); + +/* This path deals with just maximum frame sizes which are +* limited to a jumbo frame of 9,000 (plus headers, etc.) +* so we can never exceed the maximum allowable RFA/RFD +* values. +*/ +if (q_fifo_size <=2048 ) { +/* rx_rfd to zero to signal no flow control */ + pdata->rx_rfa[queue] =0 ; + pdata->rx_rfd[queue] =0 ; +return ; + } + +if (q_fifo_size <=4096 ) { +/* Between 2048 and 4096 */ + pdata->rx_rfa[queue] =0 ;/* Full - 1024 bytes */ + pdata->rx_rfd[queue] =1 ;/* Full - 1536 bytes */ +return ; + } + +if (q_fifo_size <= frame_fifo_size) { +/* Between 4096 and max-frame */ + pdata->rx_rfa[queue] =2 ;/* Full - 2048 bytes */ + pdata->rx_rfd[queue] =5 ;/* Full - 3584 bytes */ +return ; + } + +if (q_fifo_size <= (frame_fifo_size *3 )) { +/* Between max-frame and 3 max-frames, +* trigger if we get just over a frame of data and +* resume when we have just under half a frame left. +*/ + rfa = q_fifo_size - frame_fifo_size; + rfd = rfa + (frame_fifo_size /2 ); + }else { +/* Above 3 max-frames - trigger when just over +* 2 frames of space available +*/ + rfa = frame_fifo_size *2 ; + rfa +=AXGMAC_FLOW_CONTROL_UNIT ; + rfd = rfa + frame_fifo_size; + } + + pdata->rx_rfa[queue] =AXGMAC_FLOW_CONTROL_VALUE (rfa); + pdata->rx_rfd[queue] =AXGMAC_FLOW_CONTROL_VALUE (rfd); +} + +static void axgbe_calculate_flow_control_threshold (struct axgbe_port *pdata) +{ +unsigned int q_fifo_size; +unsigned int i; + +for (i =0 ; i < pdata->rx_q_count; i++) { + q_fifo_size = (pdata->fifo +1 ) *AXGMAC_FIFO_UNIT ; + +axgbe_queue_flow_control_threshold (pdata, i, q_fifo_size); + } +} + +static void axgbe_config_flow_control_threshold (struct axgbe_port *pdata) +{ +unsigned int i; + +for (i =0 ; i < pdata->rx_q_count; i++) { +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQFCR ,RFA , + pdata->rx_rfa[i]); +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQFCR ,RFD , + pdata->rx_rfd[i]); + } +} +static int __axgbe_exit (struct axgbe_port *pdata) {unsigned int count =2000 ;
@@ -366,10 +558,659 @@ static int axgbe_exit(struct axgbe_port *pdata)return __axgbe_exit (pdata); } +static int axgbe_flush_tx_queues (struct axgbe_port *pdata) +{ +unsigned int i, count; + +if (AXGMAC_GET_BITS (pdata->hw_feat.version,MAC_VR ,SNPSVER ) <0x21 ) +return 0 ; + +for (i =0 ; i < pdata->tx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_TQOMR ,FTQ ,1 ); + +/* Poll Until Poll Condition */ +for (i =0 ; i < pdata->tx_q_count; i++) { + count =2000 ; +while (--count &&AXGMAC_MTL_IOREAD_BITS (pdata, i, +MTL_Q_TQOMR ,FTQ )) +rte_delay_us (500 ); + +if (!count) +return -EBUSY ; + } + +return 0 ; +} + +static void axgbe_config_dma_bus (struct axgbe_port *pdata) +{ +/* Set enhanced addressing mode */ +AXGMAC_IOWRITE_BITS (pdata,DMA_SBMR ,EAME ,1 ); + +/* Out standing read/write requests*/ +AXGMAC_IOWRITE_BITS (pdata,DMA_SBMR ,RD_OSR ,0x3f ); +AXGMAC_IOWRITE_BITS (pdata,DMA_SBMR ,WR_OSR ,0x3f ); + +/* Set the System Bus mode */ +AXGMAC_IOWRITE_BITS (pdata,DMA_SBMR ,UNDEF ,1 ); +AXGMAC_IOWRITE_BITS (pdata,DMA_SBMR ,BLEN_32 ,1 ); +AXGMAC_IOWRITE_BITS (pdata,DMA_SBMR ,AAL ,1 ); +} + +static void axgbe_config_dma_cache (struct axgbe_port *pdata) +{ +unsigned int arcache, awcache, arwcache; + + arcache =0 ; +AXGMAC_SET_BITS (arcache,DMA_AXIARCR ,DRC ,0x3 ); +AXGMAC_IOWRITE (pdata,DMA_AXIARCR , arcache); + + awcache =0 ; +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,DWC ,0x3 ); +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,RPC ,0x3 ); +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,RPD ,0x1 ); +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,RHC ,0x3 ); +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,RHD ,0x1 ); +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,RDC ,0x3 ); +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,RDD ,0x1 ); +AXGMAC_IOWRITE (pdata,DMA_AXIAWCR , awcache); + + arwcache =0 ; +AXGMAC_SET_BITS (arwcache,DMA_AXIAWRCR ,TDWD ,0x1 ); +AXGMAC_SET_BITS (arwcache,DMA_AXIAWRCR ,TDWC ,0x3 ); +AXGMAC_SET_BITS (arwcache,DMA_AXIAWRCR ,RDRC ,0x3 ); +AXGMAC_IOWRITE (pdata,DMA_AXIAWRCR , arwcache); +} + +static void axgbe_config_edma_control (struct axgbe_port *pdata) +{ +AXGMAC_IOWRITE (pdata,EDMA_TX_CONTROL ,0x5 ); +AXGMAC_IOWRITE (pdata,EDMA_RX_CONTROL ,0x5 ); +} + +static int axgbe_config_osp_mode (struct axgbe_port *pdata) +{ +/* Force DMA to operate on second packet before closing descriptors +* of first packet +*/ +struct axgbe_tx_queue *txq; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_tx_queues; i++) { + txq = pdata->eth_dev->data->tx_queues[i]; +AXGMAC_DMA_IOWRITE_BITS (txq,DMA_CH_TCR ,OSP , + pdata->tx_osp_mode); + } + +return 0 ; +} + +static int axgbe_config_pblx8 (struct axgbe_port *pdata) +{ +struct axgbe_tx_queue *txq; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_tx_queues; i++) { + txq = pdata->eth_dev->data->tx_queues[i]; +AXGMAC_DMA_IOWRITE_BITS (txq,DMA_CH_CR ,PBLX8 , + pdata->pblx8); + } +return 0 ; +} + +static int axgbe_config_tx_pbl_val (struct axgbe_port *pdata) +{ +struct axgbe_tx_queue *txq; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_tx_queues; i++) { + txq = pdata->eth_dev->data->tx_queues[i]; +AXGMAC_DMA_IOWRITE_BITS (txq,DMA_CH_TCR ,PBL , + pdata->tx_pbl); + } + +return 0 ; +} + +static int axgbe_config_rx_pbl_val (struct axgbe_port *pdata) +{ +struct axgbe_rx_queue *rxq; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_rx_queues; i++) { + rxq = pdata->eth_dev->data->rx_queues[i]; +AXGMAC_DMA_IOWRITE_BITS (rxq,DMA_CH_RCR ,PBL , + pdata->rx_pbl); + } + +return 0 ; +} + +static void axgbe_config_rx_buffer_size (struct axgbe_port *pdata) +{ +struct axgbe_rx_queue *rxq; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_rx_queues; i++) { + rxq = pdata->eth_dev->data->rx_queues[i]; + + rxq->buf_size =rte_pktmbuf_data_room_size (rxq->mb_pool) - +RTE_PKTMBUF_HEADROOM ; + rxq->buf_size = (rxq->buf_size +AXGBE_RX_BUF_ALIGN -1 ) & + ~(AXGBE_RX_BUF_ALIGN -1 ); + +if (rxq->buf_size > pdata->rx_buf_size) + pdata->rx_buf_size = rxq->buf_size; + +AXGMAC_DMA_IOWRITE_BITS (rxq,DMA_CH_RCR ,RBSZ , + rxq->buf_size); + } +} + +static int axgbe_write_rss_reg (struct axgbe_port *pdata,unsigned int type, +unsigned int index,unsigned int val) +{ +unsigned int wait; + +if (AXGMAC_IOREAD_BITS (pdata,MAC_RSSAR ,OB )) +return -EBUSY ; + +AXGMAC_IOWRITE (pdata,MAC_RSSDR , val); + +AXGMAC_IOWRITE_BITS (pdata,MAC_RSSAR ,RSSIA , index); +AXGMAC_IOWRITE_BITS (pdata,MAC_RSSAR ,ADDRT , type); +AXGMAC_IOWRITE_BITS (pdata,MAC_RSSAR ,CT ,0 ); +AXGMAC_IOWRITE_BITS (pdata,MAC_RSSAR ,OB ,1 ); + + wait =1000 ; +while (wait--) { +if (!AXGMAC_IOREAD_BITS (pdata,MAC_RSSAR ,OB )) +return 0 ; + +rte_delay_us (1500 ); + } + +return -EBUSY ; +} + +static int axgbe_write_rss_hash_key (struct axgbe_port *pdata) +{ +struct rte_eth_rss_conf *rss_conf; +unsigned int key_regs =sizeof (pdata->rss_key) /sizeof (u32); +unsigned int *key; +int ret; + + rss_conf = &pdata->eth_dev->data->dev_conf.rx_adv_conf.rss_conf; + +if (!rss_conf->rss_key) + key = (unsigned int *)&pdata->rss_key; +else + key = (unsigned int *)&rss_conf->rss_key; + +while (key_regs--) { + ret =axgbe_write_rss_reg (pdata,AXGBE_RSS_HASH_KEY_TYPE , + key_regs, *key++); +if (ret) +return ret; + } + +return 0 ; +} + +static int axgbe_write_rss_lookup_table (struct axgbe_port *pdata) +{ +unsigned int i; +int ret; + +for (i =0 ; i <ARRAY_SIZE (pdata->rss_table); i++) { + ret =axgbe_write_rss_reg (pdata, +AXGBE_RSS_LOOKUP_TABLE_TYPE , i, + pdata->rss_table[i]); +if (ret) +return ret; + } + +return 0 ; +} + +static int axgbe_enable_rss (struct axgbe_port *pdata) +{ +int ret; + +/* Program the hash key */ + ret =axgbe_write_rss_hash_key (pdata); +if (ret) +return ret; + +/* Program the lookup table */ + ret =axgbe_write_rss_lookup_table (pdata); +if (ret) +return ret; + +/* Set the RSS options */ +AXGMAC_IOWRITE (pdata,MAC_RSSCR , pdata->rss_options); + +/* Enable RSS */ +AXGMAC_IOWRITE_BITS (pdata,MAC_RSSCR ,RSSE ,1 ); + +return 0 ; +} + +static void axgbe_rss_options (struct axgbe_port *pdata) +{ +struct rte_eth_rss_conf *rss_conf; +uint64_t rss_hf; + + rss_conf = &pdata->eth_dev->data->dev_conf.rx_adv_conf.rss_conf; + rss_hf = rss_conf->rss_hf; + +if (rss_hf & (ETH_RSS_IPV4 |ETH_RSS_IPV6 )) +AXGMAC_SET_BITS (pdata->rss_options,MAC_RSSCR ,IP2TE ,1 ); +if (rss_hf & (ETH_RSS_NONFRAG_IPV4_TCP |ETH_RSS_NONFRAG_IPV6_TCP )) +AXGMAC_SET_BITS (pdata->rss_options,MAC_RSSCR ,TCP4TE ,1 ); +if (rss_hf & (ETH_RSS_NONFRAG_IPV4_UDP |ETH_RSS_NONFRAG_IPV6_UDP )) +AXGMAC_SET_BITS (pdata->rss_options,MAC_RSSCR ,UDP4TE ,1 ); +} + +static int axgbe_config_rss (struct axgbe_port *pdata) +{ +uint32_t i; + +if (pdata->rss_enable) { +/* Initialize RSS hash key and lookup table */ +uint32_t *key = (uint32_t *)pdata->rss_key; + +for (i =0 ; i <sizeof (pdata->rss_key) /4 ; i++) + *key++ = (uint32_t )rte_rand (); +for (i =0 ; i <AXGBE_RSS_MAX_TABLE_SIZE ; i++) +AXGMAC_SET_BITS (pdata->rss_table[i],MAC_RSSDR ,DMCH , + i % pdata->eth_dev->data->nb_rx_queues); +axgbe_rss_options (pdata); +if (axgbe_enable_rss (pdata)) { +PMD_DRV_LOG (ERR ,"Error in enabling RSS support" ); +return -1 ; + } + }else { +AXGMAC_IOWRITE_BITS (pdata,MAC_RSSCR ,RSSE ,0 ); + } + +return 0 ; +} + +static void axgbe_enable_dma_interrupts (struct axgbe_port *pdata) +{ +struct axgbe_tx_queue *txq; +unsigned int dma_ch_isr, dma_ch_ier; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_tx_queues; i++) { + txq = pdata->eth_dev->data->tx_queues[i]; + +/* Clear all the interrupts which are set */ + dma_ch_isr =AXGMAC_DMA_IOREAD (txq,DMA_CH_SR ); +AXGMAC_DMA_IOWRITE (txq,DMA_CH_SR , dma_ch_isr); + +/* Clear all interrupt enable bits */ + dma_ch_ier =0 ; + +/* Enable following interrupts +* NIE - Normal Interrupt Summary Enable +* AIE - Abnormal Interrupt Summary Enable +* FBEE - Fatal Bus Error Enable +*/ +AXGMAC_SET_BITS (dma_ch_ier,DMA_CH_IER ,NIE ,0 ); +AXGMAC_SET_BITS (dma_ch_ier,DMA_CH_IER ,AIE ,1 ); +AXGMAC_SET_BITS (dma_ch_ier,DMA_CH_IER ,FBEE ,1 ); + +/* Enable following Rx interrupts +* RBUE - Receive Buffer Unavailable Enable +* RIE - Receive Interrupt Enable (unless using +* per channel interrupts in edge triggered +* mode) +*/ +AXGMAC_SET_BITS (dma_ch_ier,DMA_CH_IER ,RBUE ,0 ); + +AXGMAC_DMA_IOWRITE (txq,DMA_CH_IER , dma_ch_ier); + } +} + +static void wrapper_tx_desc_init (struct axgbe_port *pdata) +{ +struct axgbe_tx_queue *txq; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_tx_queues; i++) { + txq = pdata->eth_dev->data->tx_queues[i]; + txq->cur =0 ; + txq->dirty =0 ; +/* Update the total number of Tx descriptors */ +AXGMAC_DMA_IOWRITE (txq,DMA_CH_TDRLR , txq->nb_desc -1 ); +/* Update the starting address of descriptor ring */ +AXGMAC_DMA_IOWRITE (txq,DMA_CH_TDLR_HI , +high32_value (txq->ring_phys_addr)); +AXGMAC_DMA_IOWRITE (txq,DMA_CH_TDLR_LO , +low32_value (txq->ring_phys_addr)); + } +} + +static int wrapper_rx_desc_init (struct axgbe_port *pdata) +{ +struct axgbe_rx_queue *rxq; +struct rte_mbuf *mbuf; +volatile union axgbe_rx_desc *desc; +unsigned int i, j; + +for (i =0 ; i < pdata->eth_dev->data->nb_rx_queues; i++) { + rxq = pdata->eth_dev->data->rx_queues[i]; + +/* Initialize software ring entries */ + rxq->mbuf_alloc =0 ; + rxq->cur =0 ; + rxq->dirty =0 ; + desc =AXGBE_GET_DESC_PT (rxq,0 ); + +for (j =0 ; j < rxq->nb_desc; j++) { + mbuf =rte_mbuf_raw_alloc (rxq->mb_pool); +if (mbuf ==NULL ) { +PMD_DRV_LOG (ERR ,"RX mbuf alloc failed queue_id = %u, idx = %d" , + (unsigned int )rxq->queue_id, j); +axgbe_dev_rx_queue_release (rxq); +return -ENOMEM ; + } + rxq->sw_ring[j] = mbuf; +/* Mbuf populate */ + mbuf->next =NULL ; + mbuf->data_off =RTE_PKTMBUF_HEADROOM ; + mbuf->nb_segs =1 ; + mbuf->port = rxq->port_id; + desc->read.baddr = +rte_cpu_to_le_64 ( +rte_mbuf_data_iova_default (mbuf)); +rte_wmb (); +AXGMAC_SET_BITS_LE (desc->read.desc3, +RX_NORMAL_DESC3 ,OWN ,1 ); +rte_wmb (); + rxq->mbuf_alloc++; + desc++; + } +/* Update the total number of Rx descriptors */ +AXGMAC_DMA_IOWRITE (rxq,DMA_CH_RDRLR , + rxq->nb_desc -1 ); +/* Update the starting address of descriptor ring */ +AXGMAC_DMA_IOWRITE (rxq,DMA_CH_RDLR_HI , +high32_value (rxq->ring_phys_addr)); +AXGMAC_DMA_IOWRITE (rxq,DMA_CH_RDLR_LO , +low32_value (rxq->ring_phys_addr)); +/* Update the Rx Descriptor Tail Pointer */ +AXGMAC_DMA_IOWRITE (rxq,DMA_CH_RDTR_LO , +low32_value (rxq->ring_phys_addr + + (rxq->nb_desc -1 ) * +sizeof (union axgbe_rx_desc ))); + } +return 0 ; +} + +static void axgbe_config_mtl_mode (struct axgbe_port *pdata) +{ +unsigned int i; + +/* Set Tx to weighted round robin scheduling algorithm */ +AXGMAC_IOWRITE_BITS (pdata,MTL_OMR ,ETSALG ,MTL_ETSALG_WRR ); + +/* Set Tx traffic classes to use WRR algorithm with equal weights */ +for (i =0 ; i < pdata->hw_feat.tc_cnt; i++) { +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_TC_ETSCR ,TSA , +MTL_TSA_ETS ); +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_TC_QWR ,QW ,1 ); + } + +/* Set Rx to strict priority algorithm */ +AXGMAC_IOWRITE_BITS (pdata,MTL_OMR ,RAA ,MTL_RAA_SP ); +} + +static int axgbe_config_tsf_mode (struct axgbe_port *pdata,unsigned int val) +{ +unsigned int i; + +for (i =0 ; i < pdata->tx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_TQOMR ,TSF , val); + +return 0 ; +} + +static int axgbe_config_rsf_mode (struct axgbe_port *pdata,unsigned int val) +{ +unsigned int i; + +for (i =0 ; i < pdata->rx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQOMR ,RSF , val); + +return 0 ; +} + +static int axgbe_config_tx_threshold (struct axgbe_port *pdata, +unsigned int val) +{ +unsigned int i; + +for (i =0 ; i < pdata->tx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_TQOMR ,TTC , val); + +return 0 ; +} + +static int axgbe_config_rx_threshold (struct axgbe_port *pdata, +unsigned int val) +{ +unsigned int i; + +for (i =0 ; i < pdata->rx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQOMR ,RTC , val); + +return 0 ; +} + +/*Distrubting fifo size */ +static void axgbe_config_rx_fifo_size (struct axgbe_port *pdata) +{ +unsigned int fifo_size; +unsigned int q_fifo_size; +unsigned int p_fifo, i; + + fifo_size =RTE_MIN (pdata->rx_max_fifo_size, + pdata->hw_feat.rx_fifo_size); + q_fifo_size = fifo_size / pdata->rx_q_count; + +/* Calculate the fifo setting by dividing the queue's fifo size +* by the fifo allocation increment (with 0 representing the +* base allocation increment so decrement the result +* by 1). +*/ + p_fifo = q_fifo_size /AXGMAC_FIFO_UNIT ; +if (p_fifo) + p_fifo--; + +for (i =0 ; i < pdata->rx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQOMR ,RQS , p_fifo); + pdata->fifo = p_fifo; + +/*Calculate and config Flow control threshold*/ +axgbe_calculate_flow_control_threshold (pdata); +axgbe_config_flow_control_threshold (pdata); +} + +static void axgbe_config_tx_fifo_size (struct axgbe_port *pdata) +{ +unsigned int fifo_size; +unsigned int q_fifo_size; +unsigned int p_fifo, i; + + fifo_size =RTE_MIN (pdata->tx_max_fifo_size, + pdata->hw_feat.tx_fifo_size); + q_fifo_size = fifo_size / pdata->tx_q_count; + +/* Calculate the fifo setting by dividing the queue's fifo size +* by the fifo allocation increment (with 0 representing the +* base allocation increment so decrement the result +* by 1). +*/ + p_fifo = q_fifo_size /AXGMAC_FIFO_UNIT ; +if (p_fifo) + p_fifo--; + +for (i =0 ; i < pdata->tx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_TQOMR ,TQS , p_fifo); +} + +static void axgbe_config_queue_mapping (struct axgbe_port *pdata) +{ +unsigned int qptc, qptc_extra, queue; +unsigned int i, j, reg, reg_val; + +/* Map the MTL Tx Queues to Traffic Classes +* Note: Tx Queues >= Traffic Classes +*/ + qptc = pdata->tx_q_count / pdata->hw_feat.tc_cnt; + qptc_extra = pdata->tx_q_count % pdata->hw_feat.tc_cnt; + +for (i =0 , queue =0 ; i < pdata->hw_feat.tc_cnt; i++) { +for (j =0 ; j < qptc; j++) +AXGMAC_MTL_IOWRITE_BITS (pdata, queue,MTL_Q_TQOMR , +Q2TCMAP , i); +if (i < qptc_extra) +AXGMAC_MTL_IOWRITE_BITS (pdata, queue,MTL_Q_TQOMR , +Q2TCMAP , i); + } + +if (pdata->rss_enable) { +/* Select dynamic mapping of MTL Rx queue to DMA Rx channel */ + reg =MTL_RQDCM0R ; + reg_val =0 ; +for (i =0 ; i < pdata->rx_q_count;) { + reg_val |= (0x80 << ((i++ %MTL_RQDCM_Q_PER_REG ) <<3 )); + +if ((i %MTL_RQDCM_Q_PER_REG ) && + (i != pdata->rx_q_count)) +continue ; + +AXGMAC_IOWRITE (pdata, reg, reg_val); + + reg +=MTL_RQDCM_INC ; + reg_val =0 ; + } + } +} + +static void axgbe_enable_mtl_interrupts (struct axgbe_port *pdata) +{ +unsigned int mtl_q_isr; +unsigned int q_count, i; + + q_count =RTE_MAX (pdata->hw_feat.tx_q_cnt, pdata->hw_feat.rx_q_cnt); +for (i =0 ; i < q_count; i++) { +/* Clear all the interrupts which are set */ + mtl_q_isr =AXGMAC_MTL_IOREAD (pdata, i,MTL_Q_ISR ); +AXGMAC_MTL_IOWRITE (pdata, i,MTL_Q_ISR , mtl_q_isr); + +/* No MTL interrupts to be enabled */ +AXGMAC_MTL_IOWRITE (pdata, i,MTL_Q_IER ,0 ); + } +} + +static int axgbe_set_mac_address (struct axgbe_port *pdata,u8 *addr) +{ +unsigned int mac_addr_hi, mac_addr_lo; + + mac_addr_hi = (addr[5 ] <<8 ) | (addr[4 ] <<0 ); + mac_addr_lo = (addr[3 ] <<24 ) | (addr[2 ] <<16 ) | + (addr[1 ] <<8 ) | (addr[0 ] <<0 ); + +AXGMAC_IOWRITE (pdata,MAC_MACA0HR , mac_addr_hi); +AXGMAC_IOWRITE (pdata,MAC_MACA0LR , mac_addr_lo); + +return 0 ; +} + +static void axgbe_config_mac_address (struct axgbe_port *pdata) +{ +axgbe_set_mac_address (pdata, pdata->mac_addr.addr_bytes); +} + +static void axgbe_config_jumbo_enable (struct axgbe_port *pdata) +{ +unsigned int val; + + val = (pdata->rx_buf_size >AXGMAC_STD_PACKET_MTU ) ?1 :0 ; + val =1 ; + +AXGMAC_IOWRITE_BITS (pdata,MAC_RCR ,JE , val); +} + +static void axgbe_config_mac_speed (struct axgbe_port *pdata) +{ +axgbe_set_speed (pdata, pdata->phy_speed); +} + +static void axgbe_config_checksum_offload (struct axgbe_port *pdata) +{ +if (pdata->rx_csum_enable) +AXGMAC_IOWRITE_BITS (pdata,MAC_RCR ,IPC ,1 ); +else +AXGMAC_IOWRITE_BITS (pdata,MAC_RCR ,IPC ,0 ); +} + +static int axgbe_init (struct axgbe_port *pdata) +{ +int ret; + +/* Flush Tx queues */ + ret =axgbe_flush_tx_queues (pdata); +if (ret) +return ret; +/* Initialize DMA related features */ +axgbe_config_dma_bus (pdata); +axgbe_config_dma_cache (pdata); +axgbe_config_edma_control (pdata); +axgbe_config_osp_mode (pdata); +axgbe_config_pblx8 (pdata); +axgbe_config_tx_pbl_val (pdata); +axgbe_config_rx_pbl_val (pdata); +axgbe_config_rx_buffer_size (pdata); +axgbe_config_rss (pdata); +wrapper_tx_desc_init (pdata); + ret =wrapper_rx_desc_init (pdata); +if (ret) +return ret; +axgbe_enable_dma_interrupts (pdata); + +/* Initialize MTL related features */ +axgbe_config_mtl_mode (pdata); +axgbe_config_queue_mapping (pdata); +axgbe_config_tsf_mode (pdata, pdata->tx_sf_mode); +axgbe_config_rsf_mode (pdata, pdata->rx_sf_mode); +axgbe_config_tx_threshold (pdata, pdata->tx_threshold); +axgbe_config_rx_threshold (pdata, pdata->rx_threshold); +axgbe_config_tx_fifo_size (pdata); +axgbe_config_rx_fifo_size (pdata); + +axgbe_enable_mtl_interrupts (pdata); + +/* Initialize MAC related features */ +axgbe_config_mac_address (pdata); +axgbe_config_jumbo_enable (pdata); +axgbe_config_flow_control (pdata); +axgbe_config_mac_speed (pdata); +axgbe_config_checksum_offload (pdata); + +return 0 ; +} +void axgbe_init_function_ptrs_dev (struct axgbe_hw_if *hw_if) { hw_if->exit = axgbe_exit; + hw_if->config_flow_control = axgbe_config_flow_control; + hw_if->init = axgbe_init; hw_if->read_mmd_regs = axgbe_read_mmd_regs; hw_if->write_mmd_regs = axgbe_write_mmd_regs;
@@ -379,4 +1220,7 @@ void axgbe_init_function_ptrs_dev(struct axgbe_hw_if *hw_if) hw_if->set_ext_mii_mode = axgbe_set_ext_mii_mode; hw_if->read_ext_mii_regs = axgbe_read_ext_mii_regs; hw_if->write_ext_mii_regs = axgbe_write_ext_mii_regs; +/* For FLOW ctrl */ + hw_if->config_tx_flow_control = axgbe_config_tx_flow_control; + hw_if->config_rx_flow_control = axgbe_config_rx_flow_control; }
drivers/net/axgbe/axgbe_ethdev.c +96 -0
120 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v2 10/16 net/axgbe: add transmit and receive data path apis
In reply to Ravi Kumar--- drivers/net/axgbe/Makefile | 1 + drivers/net/axgbe/axgbe_ethdev.c | 22 +- drivers/net/axgbe/axgbe_rxtx.c | 429 +++++++++++++++++++++++++++++++++ drivers/net/axgbe/axgbe_rxtx.h | 19 ++ drivers/net/axgbe/axgbe_rxtx_vec_sse.c | 215 +++++++++++++++++ 5 files changed, 685 insertions(+), 1 deletion(-) create mode 100644 drivers/net/axgbe/axgbe_rxtx_vec_sse.c
drivers/net/axgbe/Makefile +1 -0
@@ -147,5 +147,6 @@ SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_mdio.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_phy_impl.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_i2c.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_rxtx.c +SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_rxtx_vec_sse.c include $(RTE_SDK)/mk/rte.lib.mk
drivers/net/axgbe/axgbe_ethdev.c +21 -1
@@ -224,9 +224,22 @@ axgbe_dev_interrupt_handler(void *param) {struct rte_eth_dev *dev = (struct rte_eth_dev *)param;struct axgbe_port *pdata = dev->data->dev_private; +unsigned int dma_isr, dma_ch_isr; pdata->phy_if.an_isr (pdata); - +/*DMA related interrupts*/ + dma_isr =AXGMAC_IOREAD (pdata,DMA_ISR ); +if (dma_isr) { +if (dma_isr &1 ) { + dma_ch_isr = +AXGMAC_DMA_IOREAD ((struct axgbe_rx_queue *) + pdata->rx_queues[0 ], +DMA_CH_SR ); +AXGMAC_DMA_IOWRITE ((struct axgbe_rx_queue *) + pdata->rx_queues[0 ], +DMA_CH_SR , dma_ch_isr); + } + }/* Enable interrupts since disabled after generation*/ rte_intr_enable (&pdata->pci_dev->intr_handle); }
@@ -288,6 +301,8 @@ axgbe_dev_start(struct rte_eth_dev *dev)/* phy start*/ pdata->phy_if.phy_start (pdata); +axgbe_dev_enable_tx (dev); +axgbe_dev_enable_rx (dev);axgbe_clear_bit (AXGBE_STOPPED , &pdata->dev_state);axgbe_clear_bit (AXGBE_DOWN , &pdata->dev_state);
@@ -307,6 +322,8 @@ axgbe_dev_stop(struct rte_eth_dev *dev)return ;axgbe_set_bit (AXGBE_STOPPED , &pdata->dev_state); +axgbe_dev_disable_tx (dev); +axgbe_dev_disable_rx (dev); pdata->phy_if.phy_stop (pdata); pdata->hw_if.exit (pdata);
@@ -550,6 +567,7 @@ eth_axgbe_dev_init(struct rte_eth_dev *eth_dev)axgbe_set_bit (AXGBE_STOPPED , &pdata->dev_state); pdata->eth_dev = eth_dev; eth_dev->dev_ops = &axgbe_eth_dev_ops; + eth_dev->rx_pkt_burst = &axgbe_recv_pkts;/* * For secondary processes, we don't initialise any further as primary
@@ -694,6 +712,8 @@ eth_axgbe_dev_uninit(struct rte_eth_dev *eth_dev)rte_free (eth_dev->data->mac_addrs); eth_dev->data->mac_addrs =NULL ; eth_dev->dev_ops =NULL ; + eth_dev->rx_pkt_burst =NULL ; + eth_dev->tx_pkt_burst =NULL ;axgbe_dev_clear_queues (eth_dev);/* disable uio intr before callback unregister */
drivers/net/axgbe/axgbe_rxtx.c +429 -0
450 lines not on this page · raw message
drivers/net/axgbe/axgbe_rxtx.h +19 -0
@@ -278,12 +278,31 @@ void axgbe_dev_tx_queue_release(void *txq);int axgbe_dev_tx_queue_setup (struct rte_eth_dev *dev,uint16_t tx_queue_id,uint16_t nb_tx_desc,unsigned int socket_id,const struct rte_eth_txconf *tx_conf); +void axgbe_dev_enable_tx (struct rte_eth_dev *dev); +void axgbe_dev_disable_tx (struct rte_eth_dev *dev); +int axgbe_dev_tx_queue_start (struct rte_eth_dev *dev,uint16_t tx_queue_id); +int axgbe_dev_tx_queue_stop (struct rte_eth_dev *dev,uint16_t tx_queue_id); + +uint16_t axgbe_xmit_pkts (void *tx_queue,struct rte_mbuf **tx_pkts, +uint16_t nb_pkts); +uint16_t axgbe_xmit_pkts_vec (void *tx_queue,struct rte_mbuf **tx_pkts, +uint16_t nb_pkts); +void axgbe_dev_rx_queue_release (void *rxq);int axgbe_dev_rx_queue_setup (struct rte_eth_dev *dev,uint16_t rx_queue_id,uint16_t nb_rx_desc,unsigned int socket_id,const struct rte_eth_rxconf *rx_conf,struct rte_mempool *mb_pool); +void axgbe_dev_enable_rx (struct rte_eth_dev *dev); +void axgbe_dev_disable_rx (struct rte_eth_dev *dev); +int axgbe_dev_rx_queue_start (struct rte_eth_dev *dev,uint16_t rx_queue_id); +int axgbe_dev_rx_queue_stop (struct rte_eth_dev *dev,uint16_t rx_queue_id); +uint16_t axgbe_recv_pkts (void *rx_queue,struct rte_mbuf **rx_pkts, +uint16_t nb_pkts); +uint16_t axgbe_recv_pkts_threshold_refresh (void *rx_queue, +struct rte_mbuf **rx_pkts, +uint16_t nb_pkts);void axgbe_dev_clear_queues (struct rte_eth_dev *dev);#endif /* _AXGBE_RXTX_H_ */
drivers/net/axgbe/axgbe_rxtx_vec_sse.c new file +215 -0
215 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v2 11/16 doc: add documents for AMD axgbe Ethernet PMD
In reply to Ravi Kumar--- doc/guides/nics/axgbe.rst | 211 +++++++++++++++++++++++++++++++++++++ doc/guides/nics/features/axgbe.ini | 14 +++ doc/guides/nics/index.rst | 1 + 3 files changed, 226 insertions(+) create mode 100644 doc/guides/nics/axgbe.rst create mode 100644 doc/guides/nics/features/axgbe.ini
doc/guides/nics/axgbe.rst new file +211 -0
@@ -0,0 +1,211 @@ +.. Copyright (c) 2017 Advanced Micro Devices, Inc. + All rights reserved. + + AMD 10Gb Ethernet driver + + This file is available to you under your choice of the following two + licenses: + + License 1: GPLv2 + + Copyright (c) 2017 Advanced Micro Devices, Inc. + + This file is free software; you may copy, redistribute and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or (at + your option) any later version. + + This file is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + This file incorporates work covered by the following copyright and + permission notice: + + Copyright (c) 2013 Synopsys, Inc. + + The Synopsys DWC ETHER XGMAC Software Driver and documentation + (hereinafter "Software") is an unsupported proprietary work of Synopsys, + Inc. unless otherwise expressly agreed to in writing between Synopsys + and you. + + The Software IS NOT an item of Licensed Software or Licensed Product + under any End User Software License Agreement or Agreement for Licensed + Product with Synopsys or any supplement thereto. Permission is hereby + granted, free of charge, to any person obtaining a copy of this software + annotated with this license and the Software, to deal in the Software + without restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" + BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS + 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. + + License 2: Modified BSD + + Copyright (c) 2017 Advanced Micro Devices, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * 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. + * Neither the name of Advanced Micro Devices, Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 <COPYRIGHT HOLDER> 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. + + This file incorporates work covered by the following copyright and + permission notice: + + Copyright (c) 2013 Synopsys, Inc. + + The Synopsys DWC ETHER XGMAC Software Driver and documentation + (hereinafter "Software") is an unsupported proprietary work of Synopsys, + Inc. unless otherwise expressly agreed to in writing between Synopsys + and you. + + The Software IS NOT an item of Licensed Software or Licensed Product + under any End User Software License Agreement or Agreement for Licensed + Product with Synopsys or any supplement thereto. Permission is hereby + granted, free of charge, to any person obtaining a copy of this software + annotated with this license and the Software, to deal in the Software + without restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" + BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS + 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. + +AXGBE Poll Mode Driver +====================== + +The AXGBE poll mode driver library (**librte_pmd_axgbe**) implements support +for AMD 10 Gbps family of adapters. It is compiled and tested in standard linux distro like Ubuntu. + +Supported Features +------------------ + +AXGBE PMD has support for: + +- Base L2 features +- TSS (Transmit Side Scaling) +- RSS (Receive Side Scaling) +- Checksum offload +- Jumbo Frame upto 9K + + +Supported Chipsets and NICs +--------------------------- +- AMD 10 Gigabit Ethernet Controller + + +Configuration Information +------------------------- + +The following options can be modified in the ``.config`` file. Please note that +enabling debugging options may affect system performance. + +- ``CONFIG_RTE_LIBRTE_AXGBE_PMD`` (default **n**) + + Toggle compilation of axgbe driver. To use axgbe PMD set this config parameter + to 'y'. + +- ``CONFIG_RTE_LIBRTE_AXGBE_DEBUG_INIT`` (default **n**) + + Toggle display of initialization related messages. + + +Building DPDK +------------- + +See the :ref:`DPDK Getting Started Guide for Linux <linux_gsg>` for +instructions on how to build DPDK. + +By default the AXGBE PMD library will be built into the DPDK library. + +For configuring and using UIO frameworks, please also refer :ref:`the +documentation that comes with DPDK suite <linux_gsg>`. + + +Prerequisites and Pre-conditions +-------------------------------- +- Prepare the system as recommended by DPDK suite. + +- AXGBE PMD works only with legacy interrupts, so load igb_uio module in legacy interrupt mode + using module params. + +- Bind the intended AMD device to igb_uio module. + +Now system is ready to run DPDK application. + + +Usage Example +------------- + +Refer to the document :ref:`compiling and testing a PMD for a NIC <pmd_build_and_test>` +for details. + +Example output: + +.. code-block:: console + + [...] + EAL: PCI device 0000:02:00.4 on NUMA socket 0 + EAL: probe driver: 1022:1458 net_axgbe + Interactive-mode selected + USER1: create a new mbuf pool <mbuf_pool_socket_0>: n=171456, size=2176, socket=0 + USER1: create a new mbuf pool <mbuf_pool_socket_1>: n=171456, size=2176, socket=1 + USER1: create a new mbuf pool <mbuf_pool_socket_2>: n=171456, size=2176, socket=2 + USER1: create a new mbuf pool <mbuf_pool_socket_3>: n=171456, size=2176, socket=3 + Configuring Port 0 (socket 0) + Port 0: 00:00:1A:1C:6A:17 + Checking link statuses... + Port 0 Link Up - speed 10000 Mbps - full-duplex + Done + testpmd>
doc/guides/nics/features/axgbe.ini new file +14 -0
@@ -0,0 +1,14 @@ +; +; Supported features of the 'axgbe' network poll mode driver. +; +; Refer to default.ini for the full list of available PMD features. +; +[Features] +Speed capabilities = Y +Jumbo frame = Y +RSS hash = Y +CRC offload = Y +L3 checksum offload = Y +L4 checksum offload = Y +Linux UIO = Y +x86-64 = Y
doc/guides/nics/index.rst +1 -0
@@ -40,6 +40,7 @@ Network Interface Controller Drivers build_and_test ark avp + axgbe bnx2x bnxt cxgbe
Signature · 1 line
2.7.4
Re: [PATCH v2 11/16] doc: add documents for AMD axgbe Ethernet PMD
Quoted 18 lines · On Fri, 5 Jan 2018 04:52:13 -0500 Ravi Kumar <[email protected]> wrote:
Signed-off-by Ravi Kumar <[email protected]>--- doc/guides/nics/axgbe.rst | 211 +++++++++++++++++++++++++++++++++++++ doc/guides/nics/features/axgbe.ini | 14 +++ doc/guides/nics/index.rst | 1 + 3 files changed, 226 insertions(+) create mode 100644 doc/guides/nics/axgbe.rst create mode 100644 doc/guides/nics/features/axgbe.inidoc/guides/nics/axgbe.rst new file +3
-0@@ -0,0 +1,211 @@ +.. Copyright (c) 2017 Advanced Micro Devices, Inc. + All rights reserved. +
doc/guides/nics/axgbe.rst line 13
Quoted 10 lines
doc/guides/nics/axgbe.rst new file +10
-0+ AMD 10Gb Ethernet driver + + This file is available to you under your choice of the following two + licenses: + + License 1: GPLv2 + + Copyright (c) 2017 Advanced Micro Devices, Inc. + + This file is free software; you may copy, re
Please use SPDX indentifiers for all files.
Also "Modified BSD" must be BSD 3 Clause, not some modified BSD license specific to AMD.
Re: [PATCH v2 11/16] doc: add documents for AMD axgbe Ethernet PMD
Quoted 33 lines
Quoted 17 lines · On Fri, 5 Jan 2018 04:52:13 -0500 Ravi Kumar <[email protected]> wrote:
Signed-off-by Ravi Kumar <[email protected]>--- doc/guides/nics/axgbe.rst | 211 +++++++++++++++++++++++++++++++++++++ doc/guides/nics/features/axgbe.ini | 14 +++ doc/guides/nics/index.rst | 1 + 3 files changed, 226 insertions(+) create mode 100644 doc/guides/nics/axgbe.rst create mode 100644doc/guides/nics/features/axgbe.ini
doc/guides/nics/axgbe.rst new renamed from doc/guides/nics/axgbe.rst +0
-0file mode 100644 index 0000000..e9bebb8
doc/guides/nics/axgbe.rst new file +3
-0@@ -0,0 +1,211 @@ +.. Copyright (c) 2017 Advanced Micro Devices, Inc. + All rights reserved. +doc/guides/nics/axgbe.rst line 13
Quoted 10 lines
doc/guides/nics/axgbe.rst new file +10
-0+ AMD 10Gb Ethernet driver + + This file is available to you under your choice of the following two + licenses: + + License 1: GPLv2 + + Copyright (c) 2017 Advanced Micro Devices, Inc. + + This file is free software; you may copy, rePlease use SPDX indentifiers for all files.
Quoted 2 lines
Also "Modified BSD" must be BSD 3 Clause, not some modified BSD license specific to AMD.
Hi Stephen,
Thanks for looking at the patches. We are aware of the license issue and our legal team is working on it. There are more than one parties involved here which is why it is taking longer than expected. The patch-sets are uploaded to get the source reviewed in parallel.
We will also look at the spdx identifiers.
Regards,
Ravi
Kovacevic, Marko
Acked-byRe: [PATCH v2 11/16] doc: add documents for AMD axgbe Ethernet PMD
Quoted 8 lines
Quoted 4 lines
Quoted 4 lines
Signed-off-by Ravi Kumar <[email protected]>doc/guides/nics/axgbe.rst | 211+++++++++++++++++++++++++++++++++++++
Quoted 3 lines
Quoted 3 lines
doc/guides/nics/features/axgbe.ini | 14 +++ doc/guides/nics/index.rst | 1 + 3 files changed, 226 insertions(+)
PATCH v2 12/16 net/axgbe: add link status update
In reply to Ravi Kumar--- doc/guides/nics/features/axgbe.ini | 1 + drivers/net/axgbe/axgbe_ethdev.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+)
doc/guides/nics/features/axgbe.ini +1 -0
@@ -5,6 +5,7 @@ ; [Features] Speed capabilities = Y +Link status = Y Jumbo frame = Y RSS hash = Y CRC offload = Y
drivers/net/axgbe/axgbe_ethdev.c +33 -0
@@ -137,6 +137,8 @@ static int axgbe_dev_start(struct rte_eth_dev *dev);static void axgbe_dev_stop (struct rte_eth_dev *dev);static void axgbe_dev_interrupt_handler (void *param);static void axgbe_dev_close (struct rte_eth_dev *dev); +static int axgbe_dev_link_update (struct rte_eth_dev *dev, +int wait_to_complete);static void axgbe_dev_info_get (struct rte_eth_dev *dev,struct rte_eth_dev_info *dev_info);
@@ -193,6 +195,7 @@ static const struct eth_dev_ops axgbe_eth_dev_ops = { .dev_start = axgbe_dev_start, .dev_stop = axgbe_dev_stop, .dev_close = axgbe_dev_close, + .link_update = axgbe_dev_link_update, .dev_infos_get = axgbe_dev_info_get, .rx_queue_setup = axgbe_dev_rx_queue_setup, .rx_queue_release = axgbe_dev_rx_queue_release,
@@ -338,6 +341,36 @@ axgbe_dev_close(struct rte_eth_dev *dev)axgbe_dev_clear_queues (dev); } +/* return 0 means link status changed, -1 means not changed */ +static int +axgbe_dev_link_update (struct rte_eth_dev *dev, + int wait_to_complete __rte_unused) +{ +PMD_INIT_FUNC_TRACE (); +rte_delay_ms (800 ); + +struct axgbe_port *pdata = dev->data->dev_private; +int old_link_status = dev->data->dev_link.link_status; + + pdata->phy_if.phy_status (pdata); + + dev->data->dev_link.link_speed = pdata->phy_speed; +switch (pdata->phy.duplex) { +case DUPLEX_FULL : + dev->data->dev_link.link_duplex =ETH_LINK_FULL_DUPLEX ; +break ; +case DUPLEX_HALF : + dev->data->dev_link.link_duplex =ETH_LINK_HALF_DUPLEX ; +break ; + } + dev->data->dev_link.link_autoneg = !(dev->data->dev_conf.link_speeds & +ETH_LINK_SPEED_FIXED ); + dev->data->dev_link.link_status = pdata->phy_link; + +return old_link_status == dev->data->dev_link.link_status ?-1 :0 ; +} + +static void axgbe_dev_info_get (struct rte_eth_dev *dev,struct rte_eth_dev_info *dev_info)
Signature · 1 line
2.7.4
PATCH v2 13/16 net/axgbe: add configure flow control while link adjustment
In reply to Ravi Kumar--- drivers/net/axgbe/axgbe_mdio.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
drivers/net/axgbe/axgbe_mdio.c +13 -0
@@ -796,6 +796,19 @@ static void axgbe_an_init(struct axgbe_port *pdata)static void axgbe_phy_adjust_link (struct axgbe_port *pdata) {if (pdata->phy.link) { +/* Flow control support */ + pdata->pause_autoneg = pdata->phy.pause_autoneg; + +if (pdata->tx_pause != (unsigned int )pdata->phy.tx_pause) { + pdata->hw_if.config_tx_flow_control (pdata); + pdata->tx_pause = pdata->phy.tx_pause; + } + +if (pdata->rx_pause != (unsigned int )pdata->phy.rx_pause) { + pdata->hw_if.config_rx_flow_control (pdata); + pdata->rx_pause = pdata->phy.rx_pause; + } +/* Speed support */ if (pdata->phy_speed != pdata->phy.speed) pdata->phy_speed = pdata->phy.speed;
Signature · 1 line
2.7.4
PATCH v2 14/16 net/axgbe: add promiscuous mode support
In reply to Ravi Kumar--- doc/guides/nics/axgbe.rst | 2 ++ doc/guides/nics/features/axgbe.ini | 2 ++ drivers/net/axgbe/axgbe_ethdev.c | 48 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+)
doc/guides/nics/axgbe.rst +2 -0
@@ -135,6 +135,8 @@ AXGBE PMD has support for: - Base L2 features - TSS (Transmit Side Scaling) +- Promiscuous mode +- Multicast mode - RSS (Receive Side Scaling) - Checksum offload - Jumbo Frame upto 9K
doc/guides/nics/features/axgbe.ini +2 -0
@@ -7,6 +7,8 @@ Speed capabilities = Y Link status = Y Jumbo frame = Y +Promiscuous mode = Y +Allmulticast mode = Y RSS hash = Y CRC offload = Y L3 checksum offload = Y
drivers/net/axgbe/axgbe_ethdev.c +48 -0
66 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v2 15/16 net/axgbe: add generic transmit and receive status support
In reply to Ravi Kumar--- doc/guides/nics/axgbe.rst | 1 + doc/guides/nics/features/axgbe.ini | 1 + drivers/net/axgbe/axgbe_ethdev.c | 51 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+)
doc/guides/nics/axgbe.rst +1 -0
@@ -136,6 +136,7 @@ AXGBE PMD has support for: - Base L2 features - TSS (Transmit Side Scaling) - Promiscuous mode +- Port statistics - Multicast mode - RSS (Receive Side Scaling) - Checksum offload
doc/guides/nics/features/axgbe.ini +1 -0
@@ -13,5 +13,6 @@ RSS hash = Y CRC offload = Y L3 checksum offload = Y L4 checksum offload = Y +Basic stats = Y Linux UIO = Y x86-64 = Y
drivers/net/axgbe/axgbe_ethdev.c +51 -0
69 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v2 16/16 net/axgbe: add support for build 32-bit mode
In reply to Ravi Kumar--- doc/guides/nics/features/axgbe.ini | 1 + drivers/net/axgbe/axgbe_common.h | 49 ++++++++++++++++++++++---------------- drivers/net/axgbe/axgbe_ethdev.c | 10 ++++---- drivers/net/axgbe/axgbe_ethdev.h | 8 +++---- drivers/net/axgbe/axgbe_rxtx.c | 12 +++++----- drivers/net/axgbe/axgbe_rxtx.h | 4 ++-- 6 files changed, 48 insertions(+), 36 deletions(-)
doc/guides/nics/features/axgbe.ini +1 -0
@@ -15,4 +15,5 @@ L3 checksum offload = Y L4 checksum offload = Y Basic stats = Y Linux UIO = Y +x86-32 = Y x86-64 = Y
drivers/net/axgbe/axgbe_common.h +29 -20
157 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.c +6 -4
@@ -712,10 +712,12 @@ eth_axgbe_dev_init(struct rte_eth_dev *eth_dev) pdata->pci_dev = pci_dev; pdata->xgmac_regs = - (uint64_t )pci_dev->mem_resource[AXGBE_AXGMAC_BAR ].addr; - pdata->xprop_regs = pdata->xgmac_regs +AXGBE_MAC_PROP_OFFSET ; - pdata->xi2c_regs = pdata->xgmac_regs +AXGBE_I2C_CTRL_OFFSET ; - pdata->xpcs_regs = (uint64_t )pci_dev->mem_resource[AXGBE_XPCS_BAR ].addr; + (void *)pci_dev->mem_resource[AXGBE_AXGMAC_BAR ].addr; + pdata->xprop_regs = (void *)((uint8_t *)pdata->xgmac_regs + +AXGBE_MAC_PROP_OFFSET ); + pdata->xi2c_regs = (void *)((uint8_t *)pdata->xgmac_regs + +AXGBE_I2C_CTRL_OFFSET ); + pdata->xpcs_regs = (void *)pci_dev->mem_resource[AXGBE_XPCS_BAR ].addr;/* version specific driver data*/ if (pci_dev->id.device_id ==0x1458 )
drivers/net/axgbe/axgbe_ethdev.h +4 -4
@@ -567,10 +567,10 @@ struct axgbe_port {struct axgbe_version_data *vdata;/* AXGMAC/XPCS related mmio registers */ -uint64_t xgmac_regs;/* AXGMAC CSRs */ -uint64_t xpcs_regs;/* XPCS MMD registers */ -uint64_t xprop_regs;/* AXGBE property registers */ -uint64_t xi2c_regs;/* AXGBE I2C CSRs */ +void *xgmac_regs;/* AXGMAC CSRs */ +void *xpcs_regs;/* XPCS MMD registers */ +void *xprop_regs;/* AXGBE property registers */ +void *xi2c_regs;/* AXGBE I2C CSRs */ /* XPCS indirect addressing lock */ unsigned int xpcs_window_def_reg;
drivers/net/axgbe/axgbe_rxtx.c +6 -6
@@ -192,9 +192,9 @@ int axgbe_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, rxq->queue_id = queue_idx; rxq->port_id = dev->data->port_id; rxq->nb_desc = rx_desc; - rxq->dma_regs = pdata->xgmac_regs +DMA_CH_BASE + - (DMA_CH_INC * rxq->queue_id); - rxq->dma_tail_reg = (volatile uint32_t *)(rxq->dma_regs + + rxq->dma_regs = (void *)((uint8_t *)pdata->xgmac_regs +DMA_CH_BASE + + (DMA_CH_INC * rxq->queue_id)); + rxq->dma_tail_reg = (volatile uint32_t *)((uint8_t *)rxq->dma_regs +DMA_CH_RDTR_LO ); rxq->crc_len = (uint8_t)((dev->data->dev_conf.rxmode.hw_strip_crc) ? 0 :
@@ -509,9 +509,9 @@ int axgbe_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, txq->desc = tz->addr; txq->queue_id = queue_idx; txq->port_id = dev->data->port_id; - txq->dma_regs = pdata->xgmac_regs +DMA_CH_BASE + - (DMA_CH_INC * txq->queue_id); - txq->dma_tail_reg = (volatile uint32_t *)(txq->dma_regs + + txq->dma_regs = (void *)((uint8_t *)pdata->xgmac_regs +DMA_CH_BASE + + (DMA_CH_INC * txq->queue_id)); + txq->dma_tail_reg = (volatile uint32_t *)((uint8_t *)txq->dma_regs +DMA_CH_TDTR_LO ); txq->cur =0 ; txq->dirty =0 ;
drivers/net/axgbe/axgbe_rxtx.h +2 -2
@@ -202,7 +202,7 @@ struct axgbe_rx_queue {/* Ring physical address */ uint64_t ring_phys_addr;/* Dma Channel register address */ -uint64_t dma_regs; +void *dma_regs;/* Dma channel tail register address*/ volatile uint32_t *dma_tail_reg;/* DPDK queue index */
@@ -249,7 +249,7 @@ struct axgbe_tx_queue {/* Physical address of ring */ uint64_t ring_phys_addr;/* Dma channel register space */ -uint64_t dma_regs; +void *dma_regs;/* Dma tail register address of ring*/ volatile uint32_t *dma_tail_reg;/* Tx queue index/id*/
Signature · 1 line
2.7.4
Re: [PATCH v2 16/16] net/axgbe: add support for build 32-bit mode
Quoted 25 lines · On Fri, 5 Jan 2018 04:52:18 -0500 Ravi Kumar <[email protected]> wrote:
Signed-off-by Ravi Kumar <[email protected]>--- doc/guides/nics/features/axgbe.ini | 1 + drivers/net/axgbe/axgbe_common.h | 49 ++++++++++++++++++++++---------------- drivers/net/axgbe/axgbe_ethdev.c | 10 ++++---- drivers/net/axgbe/axgbe_ethdev.h | 8 +++---- drivers/net/axgbe/axgbe_rxtx.c | 12 +++++----- drivers/net/axgbe/axgbe_rxtx.h | 4 ++-- 6 files changed, 48 insertions(+), 36 deletions(-)doc/guides/nics/features/axgbe.ini +1
-0@@ -15,4 +15,5 @@ L3 checksum offload = Y L4 checksum offload = Y Basic stats = Y Linux UIO = Y +x86-32 = Y x86-64 = Ydrivers/net/axgbe/axgbe_common.h +0
-0
drivers/net/axgbe/axgbe_common.h do { \ · line 1511
Quoted 6 lines
drivers/net/axgbe/axgbe_common.h +1
-1@@ -1507,7 +1507,7 @@ do { \* register definitions formed using the input names */ #define AXGMAC_IOREAD (_pdata, _reg) \ - rte_read32((void *)((_pdata)->xgmac_regs + (_reg))) + rte_read32((void *)((uint8_t *)((_pdata)->xgmac_regs) + (_reg)))
Since rte_read32 is defined to take void * the cast should not be necessary.. Also in theory _pdata could be const here.
Quoted 1 line · Ravi Kumar
Signed-off-by Ravi Kumar <[email protected]>
lgtm except below comments.
At least share build error needs a new version of the patch. Can you able to complete licensing updates for next version?
<...>
config/common_base CONFIG_RTE_LIBRTE_AVP_DEBUG_DRIVER=y · line 450
Quoted 7 lines
config/common_base +3
-0@@ -445,6 +445,12 @@ CONFIG_RTE_LIBRTE_AVP_DEBUG_DRIVER=y CONFIG_RTE_LIBRTE_AVP_DEBUG_BUFFERS=n # +# Compile AMD PMD +# +CONFIG_RTE_LIBRTE_AXGBE_PMD=n
Why disabled by default?
config/common_base CONFIG_RTE_LIBRTE_AVP_DEBUG_DRIVER=y · line 451
Quoted 1 line
config/common_base +1
-0+CONFIG_RTE_LIBRTE_AXGBE_DEBUG_INIT=n
As far as I can see dynamic logging implemented, is this config option still needed? If you will remove this please remember to clean up the documentation too.
<...>
Quoted 4 lines
drivers/net/axgbe/Makefile new file +4
-0+include $(RTE_SDK)/mk/rte.vars.mk + +# +# library name
drivers/net/axgbe/Makefile line 140
Quoted 10 lines
drivers/net/axgbe/Makefile new file +10
-0+# +LIB = librte_pmd_axgbe.a + +CFLAGS += -O3 +CFLAGS += $(WERROR_FLAGS) + +EXPORT_MAP := rte_pmd_axgbe_version.map + +LIBABIVER := 1 +
Need to add dependent libraries [1] or causing a build error for shared library build [2].
[1]
Something like:
LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring LDLIBS += -lrte_ethdev -lrte_net -lrte_kvargs LDLIBS += -lrte_bus_pc
[2]
build error:
.../drivers/net/axgbe/axgbe_ethdev.c:(.text+0x16): undefined reference to `rte_pci_register'
To enable shared build, update config file:CONFIG_RTE_BUILD_SHARED_LIB=y
<...>
Quoted 8 lines · Ravi Kumar
Quoted 1 line
Signed-off-by Ravi Kumar <[email protected]>lgtm except below comments.
At least share build error needs a new version of the patch. Can you able to complete licensing updates for next version?
Hi Ferruh,
Thanks a lot for reviewing our code. Good to know that it is fine other than the license and comment on this mail.
The new changes in licensing policy has introduced some delays as we work through the implications and get agreement from the third party.
We are working on it and will upload the v3 that addresses the comment below and has SPDX license tags as soon as possible.
Regards,
Ravi
Quoted 50 lines
<...>
config/common_base CONFIG_RTE_LIBRTE_AVP_DEBUG_DRIVER=y · line 450
Quoted 7 lines
config/common_base +3
-0@@ -445,6 +445,12 @@ CONFIG_RTE_LIBRTE_AVP_DEBUG_DRIVER=y CONFIG_RTE_LIBRTE_AVP_DEBUG_BUFFERS=n # +# Compile AMD PMD +# +CONFIG_RTE_LIBRTE_AXGBE_PMD=nWhy disabled by default?
config/common_base CONFIG_RTE_LIBRTE_AVP_DEBUG_DRIVER=y · line 451
Quoted 1 line
config/common_base +1
-0+CONFIG_RTE_LIBRTE_AXGBE_DEBUG_INIT=nAs far as I can see dynamic logging implemented, is this config option still needed? If you will remove this please remember to clean up the documentation too.
<...>
Quoted 4 lines
drivers/net/axgbe/Makefile new file +4
-0+include $(RTE_SDK)/mk/rte.vars.mk + +# +# library namedrivers/net/axgbe/Makefile line 140
Quoted 10 lines
drivers/net/axgbe/Makefile new file +10
-0+# +LIB = librte_pmd_axgbe.a + +CFLAGS += -O3 +CFLAGS += $(WERROR_FLAGS) + +EXPORT_MAP := rte_pmd_axgbe_version.map + +LIBABIVER := 1 +Need to add dependent libraries [1] or causing a build error for shared library build [2].
[1]
Something like:
LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring LDLIBS += -lrte_ethdev -lrte_net -lrte_kvargs LDLIBS += -lrte_bus_pc[2]
build error:
.../drivers/net/axgbe/axgbe_ethdev.c:(.text+0x16): undefined reference to `rte_pci_register'To enable shared build, update config file:
CONFIG_RTE_BUILD_SHARED_LIB=y<...>
PATCH v3 1/18 net/axgbe: add minimal dev init and uninit support
In reply to Ravi Kumar--- MAINTAINERS | 6 + config/common_base | 6 + doc/guides/rel_notes/release_18_05.rst | 5 + drivers/net/Makefile | 1 + drivers/net/axgbe/Makefile | 146 +++++++++++++++++++ drivers/net/axgbe/axgbe_common.h | 172 ++++++++++++++++++++++ drivers/net/axgbe/axgbe_ethdev.c | 219 ++++++++++++++++++++++++++++ drivers/net/axgbe/axgbe_ethdev.h | 145 ++++++++++++++++++ drivers/net/axgbe/axgbe_logs.h | 152 +++++++++++++++++++ drivers/net/axgbe/rte_pmd_axgbe_version.map | 4 + mk/rte.app.mk | 1 + 11 files changed, 857 insertions(+) create mode 100644 drivers/net/axgbe/Makefile create mode 100644 drivers/net/axgbe/axgbe_common.h create mode 100644 drivers/net/axgbe/axgbe_ethdev.c create mode 100644 drivers/net/axgbe/axgbe_ethdev.h create mode 100644 drivers/net/axgbe/axgbe_logs.h create mode 100644 drivers/net/axgbe/rte_pmd_axgbe_version.map
MAINTAINERS +6 -0
@@ -349,6 +349,12 @@ M: Ferruh Yigit <[email protected]> T: git://dpdk.org/next/dpdk-next-net F: doc/guides/nics/features/default.ini +AMD AXGBE PMD +M: Ravi Kumar <[email protected]> +F: drivers/net/axgbe/ +F: doc/guides/nics/axgbe.rst +F: doc/guides/nics/features/axgbe.ini + Link bonding M: Declan Doherty <[email protected]> F: drivers/net/bonding/
config/common_base +6 -0
@@ -412,6 +412,12 @@ CONFIG_RTE_PMD_RING_MAX_TX_RINGS=16 CONFIG_RTE_LIBRTE_PMD_SOFTNIC=y # +# Compile AMD PMD +# +CONFIG_RTE_LIBRTE_AXGBE_PMD=y +CONFIG_RTE_LIBRTE_AXGBE_DEBUG_INIT=n + +# # Compile the TAP PMD # It is enabled by default for Linux only. #
doc/guides/rel_notes/release_18_05.rst +5 -0
@@ -41,6 +41,11 @@ New Features Also, make sure to start the actual text at the margin. ========================================================= +* **Added Ethernet poll mode driver for AMD XGBE devices.** + + Added the new ``axgbe`` ethernet poll mode driver for AMD XGBE devices. + See the :doc:`../nics/axgbe` nic driver guide for more details on this + new driver. API Changes -----------
drivers/net/Makefile +1 -0
@@ -12,6 +12,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += af_packet DIRS-$(CONFIG_RTE_LIBRTE_ARK_PMD) += ark DIRS-$(CONFIG_RTE_LIBRTE_AVF_PMD) += avf DIRS-$(CONFIG_RTE_LIBRTE_AVP_PMD) += avp +DIRS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe DIRS-$(CONFIG_RTE_LIBRTE_BNX2X_PMD) += bnx2x DIRS-$(CONFIG_RTE_LIBRTE_PMD_BOND) += bonding DIRS-$(CONFIG_RTE_LIBRTE_CXGBE_PMD) += cxgbe
drivers/net/axgbe/Makefile new file +146 -0
146 lines not on this page · raw message
drivers/net/axgbe/axgbe_common.h new file +172 -0
172 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.c new file +219 -0
219 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.h new file +145 -0
145 lines not on this page · raw message
drivers/net/axgbe/axgbe_logs.h new file +152 -0
152 lines not on this page · raw message
drivers/net/axgbe/rte_pmd_axgbe_version.map new file +4 -0
@@ -0,0 +1,4 @@ +DPDK_18.05 { + + local: *; +};
mk/rte.app.mk +1 -0
@@ -123,6 +123,7 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += -lrte_pmd_af_packet _LDLIBS-$(CONFIG_RTE_LIBRTE_ARK_PMD) += -lrte_pmd_ark _LDLIBS-$(CONFIG_RTE_LIBRTE_AVF_PMD) += -lrte_pmd_avf _LDLIBS-$(CONFIG_RTE_LIBRTE_AVP_PMD) += -lrte_pmd_avp +_LDLIBS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += -lrte_pmd_axgbe _LDLIBS-$(CONFIG_RTE_LIBRTE_BNX2X_PMD) += -lrte_pmd_bnx2x -lz _LDLIBS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += -lrte_pmd_bnxt _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_BOND) += -lrte_pmd_bond
Signature · 1 line
2.7.4
PATCH v3 2/18 net/axgbe: add register map and related macros
--- drivers/net/axgbe/axgbe_common.h | 1644 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 1644 insertions(+)
drivers/net/axgbe/axgbe_common.h +1644 -0
@@ -169,4 +169,1648 @@#define AXGBE_HZ 250 +/* DMA register offsets */ +#define DMA_MR 0x3000 +#define DMA_SBMR 0x3004 +#define DMA_ISR 0x3008 +#define DMA_AXIARCR 0x3010 +#define DMA_AXIAWCR 0x3018 +#define DMA_AXIAWRCR 0x301c +#define DMA_DSR0 0x3020 +#define DMA_DSR1 0x3024 +#define EDMA_TX_CONTROL 0x3040 +#define EDMA_RX_CONTROL 0x3044 + +/* DMA register entry bit positions and sizes */ +#define DMA_AXIARCR_DRC_INDEX 0 +#define DMA_AXIARCR_DRC_WIDTH 4 +#define DMA_AXIARCR_DRD_INDEX 4 +#define DMA_AXIARCR_DRD_WIDTH 2 +#define DMA_AXIARCR_TEC_INDEX 8 +#define DMA_AXIARCR_TEC_WIDTH 4 +#define DMA_AXIARCR_TED_INDEX 12 +#define DMA_AXIARCR_TED_WIDTH 2 +#define DMA_AXIARCR_THC_INDEX 16 +#define DMA_AXIARCR_THC_WIDTH 4 +#define DMA_AXIARCR_THD_INDEX 20 +#define DMA_AXIARCR_THD_WIDTH 2 +#define DMA_AXIAWCR_DWC_INDEX 0 +#define DMA_AXIAWCR_DWC_WIDTH 4 +#define DMA_AXIAWCR_DWD_INDEX 4 +#define DMA_AXIAWCR_DWD_WIDTH 2 +#define DMA_AXIAWCR_RPC_INDEX 8 +#define DMA_AXIAWCR_RPC_WIDTH 4 +#define DMA_AXIAWCR_RPD_INDEX 12 +#define DMA_AXIAWCR_RPD_WIDTH 2 +#define DMA_AXIAWCR_RHC_INDEX 16 +#define DMA_AXIAWCR_RHC_WIDTH 4 +#define DMA_AXIAWCR_RHD_INDEX 20 +#define DMA_AXIAWCR_RHD_WIDTH 2 +#define DMA_AXIAWCR_RDC_INDEX 24 +#define DMA_AXIAWCR_RDC_WIDTH 4 +#define DMA_AXIAWCR_RDD_INDEX 28 +#define DMA_AXIAWCR_RDD_WIDTH 2 +#define DMA_AXIAWRCR_TDWC_INDEX 0 +#define DMA_AXIAWRCR_TDWC_WIDTH 4 +#define DMA_AXIAWRCR_TDWD_INDEX 4 +#define DMA_AXIAWRCR_TDWD_WIDTH 4 +#define DMA_AXIAWRCR_RDRC_INDEX 8 +#define DMA_AXIAWRCR_RDRC_WIDTH 4 +#define DMA_ISR_MACIS_INDEX 17 +#define DMA_ISR_MACIS_WIDTH 1 +#define DMA_ISR_MTLIS_INDEX 16 +#define DMA_ISR_MTLIS_WIDTH 1 +#define DMA_MR_INTM_INDEX 12 +#define DMA_MR_INTM_WIDTH 2 +#define DMA_MR_SWR_INDEX 0 +#define DMA_MR_SWR_WIDTH 1 +#define DMA_SBMR_WR_OSR_INDEX 24 +#define DMA_SBMR_WR_OSR_WIDTH 6 +#define DMA_SBMR_RD_OSR_INDEX 16 +#define DMA_SBMR_RD_OSR_WIDTH 6 +#define DMA_SBMR_AAL_INDEX 12 +#define DMA_SBMR_AAL_WIDTH 1 +#define DMA_SBMR_EAME_INDEX 11 +#define DMA_SBMR_EAME_WIDTH 1 +#define DMA_SBMR_BLEN_256_INDEX 7 +#define DMA_SBMR_BLEN_256_WIDTH 1 +#define DMA_SBMR_BLEN_32_INDEX 4 +#define DMA_SBMR_BLEN_32_WIDTH 1 +#define DMA_SBMR_UNDEF_INDEX 0 +#define DMA_SBMR_UNDEF_WIDTH 1 + +/* DMA register values */ +#define DMA_DSR_RPS_WIDTH 4 +#define DMA_DSR_TPS_WIDTH 4 +#define DMA_DSR_Q_WIDTH (DMA_DSR_RPS_WIDTH + DMA_DSR_TPS_WIDTH) +#define DMA_DSR0_RPS_START 8 +#define DMA_DSR0_TPS_START 12 +#define DMA_DSRX_FIRST_QUEUE 3 +#define DMA_DSRX_INC 4 +#define DMA_DSRX_QPR 4 +#define DMA_DSRX_RPS_START 0 +#define DMA_DSRX_TPS_START 4 +#define DMA_TPS_STOPPED 0x00 +#define DMA_TPS_SUSPENDED 0x06 + +/* DMA channel register offsets +* Multiple channels can be active. The first channel has registers +* that begin at 0x3100. Each subsequent channel has registers that +* are accessed using an offset of 0x80 from the previous channel. +*/ +#define DMA_CH_BASE 0x3100 +#define DMA_CH_INC 0x80 + +#define DMA_CH_CR 0x00 +#define DMA_CH_TCR 0x04 +#define DMA_CH_RCR 0x08 +#define DMA_CH_TDLR_HI 0x10 +#define DMA_CH_TDLR_LO 0x14 +#define DMA_CH_RDLR_HI 0x18 +#define DMA_CH_RDLR_LO 0x1c +#define DMA_CH_TDTR_LO 0x24 +#define DMA_CH_RDTR_LO 0x2c +#define DMA_CH_TDRLR 0x30 +#define DMA_CH_RDRLR 0x34 +#define DMA_CH_IER 0x38 +#define DMA_CH_RIWT 0x3c +#define DMA_CH_CATDR_LO 0x44 +#define DMA_CH_CARDR_LO 0x4c +#define DMA_CH_CATBR_HI 0x50 +#define DMA_CH_CATBR_LO 0x54 +#define DMA_CH_CARBR_HI 0x58 +#define DMA_CH_CARBR_LO 0x5c +#define DMA_CH_SR 0x60 + +/* DMA channel register entry bit positions and sizes */ +#define DMA_CH_CR_PBLX8_INDEX 16 +#define DMA_CH_CR_PBLX8_WIDTH 1 +#define DMA_CH_CR_SPH_INDEX 24 +#define DMA_CH_CR_SPH_WIDTH 1 +#define DMA_CH_IER_AIE_INDEX 14 +#define DMA_CH_IER_AIE_WIDTH 1 +#define DMA_CH_IER_FBEE_INDEX 12 +#define DMA_CH_IER_FBEE_WIDTH 1 +#define DMA_CH_IER_NIE_INDEX 15 +#define DMA_CH_IER_NIE_WIDTH 1 +#define DMA_CH_IER_RBUE_INDEX 7 +#define DMA_CH_IER_RBUE_WIDTH 1 +#define DMA_CH_IER_RIE_INDEX 6 +#define DMA_CH_IER_RIE_WIDTH 1 +#define DMA_CH_IER_RSE_INDEX 8 +#define DMA_CH_IER_RSE_WIDTH 1 +#define DMA_CH_IER_TBUE_INDEX 2 +#define DMA_CH_IER_TBUE_WIDTH 1 +#define DMA_CH_IER_TIE_INDEX 0 +#define DMA_CH_IER_TIE_WIDTH 1 +#define DMA_CH_IER_TXSE_INDEX 1 +#define DMA_CH_IER_TXSE_WIDTH 1 +#define DMA_CH_RCR_PBL_INDEX 16 +#define DMA_CH_RCR_PBL_WIDTH 6 +#define DMA_CH_RCR_RBSZ_INDEX 1 +#define DMA_CH_RCR_RBSZ_WIDTH 14 +#define DMA_CH_RCR_SR_INDEX 0 +#define DMA_CH_RCR_SR_WIDTH 1 +#define DMA_CH_RIWT_RWT_INDEX 0 +#define DMA_CH_RIWT_RWT_WIDTH 8 +#define DMA_CH_SR_FBE_INDEX 12 +#define DMA_CH_SR_FBE_WIDTH 1 +#define DMA_CH_SR_RBU_INDEX 7 +#define DMA_CH_SR_RBU_WIDTH 1 +#define DMA_CH_SR_RI_INDEX 6 +#define DMA_CH_SR_RI_WIDTH 1 +#define DMA_CH_SR_RPS_INDEX 8 +#define DMA_CH_SR_RPS_WIDTH 1 +#define DMA_CH_SR_TBU_INDEX 2 +#define DMA_CH_SR_TBU_WIDTH 1 +#define DMA_CH_SR_TI_INDEX 0 +#define DMA_CH_SR_TI_WIDTH 1 +#define DMA_CH_SR_TPS_INDEX 1 +#define DMA_CH_SR_TPS_WIDTH 1 +#define DMA_CH_TCR_OSP_INDEX 4 +#define DMA_CH_TCR_OSP_WIDTH 1 +#define DMA_CH_TCR_PBL_INDEX 16 +#define DMA_CH_TCR_PBL_WIDTH 6 +#define DMA_CH_TCR_ST_INDEX 0 +#define DMA_CH_TCR_ST_WIDTH 1 +#define DMA_CH_TCR_TSE_INDEX 12 +#define DMA_CH_TCR_TSE_WIDTH 1 + +/* DMA channel register values */ +#define DMA_OSP_DISABLE 0x00 +#define DMA_OSP_ENABLE 0x01 +#define DMA_PBL_1 1 +#define DMA_PBL_2 2 +#define DMA_PBL_4 4 +#define DMA_PBL_8 8 +#define DMA_PBL_16 16 +#define DMA_PBL_32 32 +#define DMA_PBL_64 64/* 8 x 8 */ +#define DMA_PBL_128 128/* 8 x 16 */ +#define DMA_PBL_256 256/* 8 x 32 */ +#define DMA_PBL_X8_DISABLE 0x00 +#define DMA_PBL_X8_ENABLE 0x01 + +/* MAC register offsets */ +#define MAC_TCR 0x0000 +#define MAC_RCR 0x0004 +#define MAC_PFR 0x0008 +#define MAC_WTR 0x000c +#define MAC_HTR0 0x0010 +#define MAC_VLANTR 0x0050 +#define MAC_VLANHTR 0x0058 +#define MAC_VLANIR 0x0060 +#define MAC_IVLANIR 0x0064 +#define MAC_RETMR 0x006c +#define MAC_Q0TFCR 0x0070 +#define MAC_RFCR 0x0090 +#define MAC_RQC0R 0x00a0 +#define MAC_RQC1R 0x00a4 +#define MAC_RQC2R 0x00a8 +#define MAC_RQC3R 0x00ac +#define MAC_ISR 0x00b0 +#define MAC_IER 0x00b4 +#define MAC_RTSR 0x00b8 +#define MAC_PMTCSR 0x00c0 +#define MAC_RWKPFR 0x00c4 +#define MAC_LPICSR 0x00d0 +#define MAC_LPITCR 0x00d4 +#define MAC_VR 0x0110 +#define MAC_DR 0x0114 +#define MAC_HWF0R 0x011c +#define MAC_HWF1R 0x0120 +#define MAC_HWF2R 0x0124 +#define MAC_MDIOSCAR 0x0200 +#define MAC_MDIOSCCDR 0x0204 +#define MAC_MDIOISR 0x0214 +#define MAC_MDIOIER 0x0218 +#define MAC_MDIOCL22R 0x0220 +#define MAC_GPIOCR 0x0278 +#define MAC_GPIOSR 0x027c +#define MAC_MACA0HR 0x0300 +#define MAC_MACA0LR 0x0304 +#define MAC_MACA1HR 0x0308 +#define MAC_MACA1LR 0x030c +#define MAC_RSSCR 0x0c80 +#define MAC_RSSAR 0x0c88 +#define MAC_RSSDR 0x0c8c +#define MAC_TSCR 0x0d00 +#define MAC_SSIR 0x0d04 +#define MAC_STSR 0x0d08 +#define MAC_STNR 0x0d0c +#define MAC_STSUR 0x0d10 +#define MAC_STNUR 0x0d14 +#define MAC_TSAR 0x0d18 +#define MAC_TSSR 0x0d20 +#define MAC_TXSNR 0x0d30 +#define MAC_TXSSR 0x0d34 + +#define MAC_QTFCR_INC 4 +#define MAC_MACA_INC 4 +#define MAC_HTR_INC 4 + +#define MAC_RQC2_INC 4 +#define MAC_RQC2_Q_PER_REG 4 + +/* MAC register entry bit positions and sizes */ +#define MAC_HWF0R_ADDMACADRSEL_INDEX 18 +#define MAC_HWF0R_ADDMACADRSEL_WIDTH 5 +#define MAC_HWF0R_ARPOFFSEL_INDEX 9 +#define MAC_HWF0R_ARPOFFSEL_WIDTH 1 +#define MAC_HWF0R_EEESEL_INDEX 13 +#define MAC_HWF0R_EEESEL_WIDTH 1 +#define MAC_HWF0R_GMIISEL_INDEX 1 +#define MAC_HWF0R_GMIISEL_WIDTH 1 +#define MAC_HWF0R_MGKSEL_INDEX 7 +#define MAC_HWF0R_MGKSEL_WIDTH 1 +#define MAC_HWF0R_MMCSEL_INDEX 8 +#define MAC_HWF0R_MMCSEL_WIDTH 1 +#define MAC_HWF0R_RWKSEL_INDEX 6 +#define MAC_HWF0R_RWKSEL_WIDTH 1 +#define MAC_HWF0R_RXCOESEL_INDEX 16 +#define MAC_HWF0R_RXCOESEL_WIDTH 1 +#define MAC_HWF0R_SAVLANINS_INDEX 27 +#define MAC_HWF0R_SAVLANINS_WIDTH 1 +#define MAC_HWF0R_SMASEL_INDEX 5 +#define MAC_HWF0R_SMASEL_WIDTH 1 +#define MAC_HWF0R_TSSEL_INDEX 12 +#define MAC_HWF0R_TSSEL_WIDTH 1 +#define MAC_HWF0R_TSSTSSEL_INDEX 25 +#define MAC_HWF0R_TSSTSSEL_WIDTH 2 +#define MAC_HWF0R_TXCOESEL_INDEX 14 +#define MAC_HWF0R_TXCOESEL_WIDTH 1 +#define MAC_HWF0R_VLHASH_INDEX 4 +#define MAC_HWF0R_VLHASH_WIDTH 1 +#define MAC_HWF1R_ADDR64_INDEX 14 +#define MAC_HWF1R_ADDR64_WIDTH 2 +#define MAC_HWF1R_ADVTHWORD_INDEX 13 +#define MAC_HWF1R_ADVTHWORD_WIDTH 1 +#define MAC_HWF1R_DBGMEMA_INDEX 19 +#define MAC_HWF1R_DBGMEMA_WIDTH 1 +#define MAC_HWF1R_DCBEN_INDEX 16 +#define MAC_HWF1R_DCBEN_WIDTH 1 +#define MAC_HWF1R_HASHTBLSZ_INDEX 24 +#define MAC_HWF1R_HASHTBLSZ_WIDTH 3 +#define MAC_HWF1R_L3L4FNUM_INDEX 27 +#define MAC_HWF1R_L3L4FNUM_WIDTH 4 +#define MAC_HWF1R_NUMTC_INDEX 21 +#define MAC_HWF1R_NUMTC_WIDTH 3 +#define MAC_HWF1R_RSSEN_INDEX 20 +#define MAC_HWF1R_RSSEN_WIDTH 1 +#define MAC_HWF1R_RXFIFOSIZE_INDEX 0 +#define MAC_HWF1R_RXFIFOSIZE_WIDTH 5 +#define MAC_HWF1R_SPHEN_INDEX 17 +#define MAC_HWF1R_SPHEN_WIDTH 1 +#define MAC_HWF1R_TSOEN_INDEX 18 +#define MAC_HWF1R_TSOEN_WIDTH 1 +#define MAC_HWF1R_TXFIFOSIZE_INDEX 6 +#define MAC_HWF1R_TXFIFOSIZE_WIDTH 5 +#define MAC_HWF2R_AUXSNAPNUM_INDEX 28 +#define MAC_HWF2R_AUXSNAPNUM_WIDTH 3 +#define MAC_HWF2R_PPSOUTNUM_INDEX 24 +#define MAC_HWF2R_PPSOUTNUM_WIDTH 3 +#define MAC_HWF2R_RXCHCNT_INDEX 12 +#define MAC_HWF2R_RXCHCNT_WIDTH 4 +#define MAC_HWF2R_RXQCNT_INDEX 0 +#define MAC_HWF2R_RXQCNT_WIDTH 4 +#define MAC_HWF2R_TXCHCNT_INDEX 18 +#define MAC_HWF2R_TXCHCNT_WIDTH 4 +#define MAC_HWF2R_TXQCNT_INDEX 6 +#define MAC_HWF2R_TXQCNT_WIDTH 4 +#define MAC_IER_TSIE_INDEX 12 +#define MAC_IER_TSIE_WIDTH 1 +#define MAC_ISR_MMCRXIS_INDEX 9 +#define MAC_ISR_MMCRXIS_WIDTH 1 +#define MAC_ISR_MMCTXIS_INDEX 10 +#define MAC_ISR_MMCTXIS_WIDTH 1 +#define MAC_ISR_PMTIS_INDEX 4 +#define MAC_ISR_PMTIS_WIDTH 1 +#define MAC_ISR_SMI_INDEX 1 +#define MAC_ISR_SMI_WIDTH 1 +#define MAC_ISR_LSI_INDEX 0 +#define MAC_ISR_LSI_WIDTH 1 +#define MAC_ISR_LS_INDEX 24 +#define MAC_ISR_LS_WIDTH 2 +#define MAC_ISR_TSIS_INDEX 12 +#define MAC_ISR_TSIS_WIDTH 1 +#define MAC_MACA1HR_AE_INDEX 31 +#define MAC_MACA1HR_AE_WIDTH 1 +#define MAC_MDIOIER_SNGLCOMPIE_INDEX 12 +#define MAC_MDIOIER_SNGLCOMPIE_WIDTH 1 +#define MAC_MDIOISR_SNGLCOMPINT_INDEX 12 +#define MAC_MDIOISR_SNGLCOMPINT_WIDTH 1 +#define MAC_MDIOSCAR_DA_INDEX 21 +#define MAC_MDIOSCAR_DA_WIDTH 5 +#define MAC_MDIOSCAR_PA_INDEX 16 +#define MAC_MDIOSCAR_PA_WIDTH 5 +#define MAC_MDIOSCAR_RA_INDEX 0 +#define MAC_MDIOSCAR_RA_WIDTH 16 +#define MAC_MDIOSCAR_REG_INDEX 0 +#define MAC_MDIOSCAR_REG_WIDTH 21 +#define MAC_MDIOSCCDR_BUSY_INDEX 22 +#define MAC_MDIOSCCDR_BUSY_WIDTH 1 +#define MAC_MDIOSCCDR_CMD_INDEX 16 +#define MAC_MDIOSCCDR_CMD_WIDTH 2 +#define MAC_MDIOSCCDR_CR_INDEX 19 +#define MAC_MDIOSCCDR_CR_WIDTH 3 +#define MAC_MDIOSCCDR_DATA_INDEX 0 +#define MAC_MDIOSCCDR_DATA_WIDTH 16 +#define MAC_MDIOSCCDR_SADDR_INDEX 18 +#define MAC_MDIOSCCDR_SADDR_WIDTH 1 +#define MAC_PFR_HMC_INDEX 2 +#define MAC_PFR_HMC_WIDTH 1 +#define MAC_PFR_HPF_INDEX 10 +#define MAC_PFR_HPF_WIDTH 1 +#define MAC_PFR_HUC_INDEX 1 +#define MAC_PFR_HUC_WIDTH 1 +#define MAC_PFR_PM_INDEX 4 +#define MAC_PFR_PM_WIDTH 1 +#define MAC_PFR_PR_INDEX 0 +#define MAC_PFR_PR_WIDTH 1 +#define MAC_PFR_VTFE_INDEX 16 +#define MAC_PFR_VTFE_WIDTH 1 +#define MAC_PMTCSR_MGKPKTEN_INDEX 1 +#define MAC_PMTCSR_MGKPKTEN_WIDTH 1 +#define MAC_PMTCSR_PWRDWN_INDEX 0 +#define MAC_PMTCSR_PWRDWN_WIDTH 1 +#define MAC_PMTCSR_RWKFILTRST_INDEX 31 +#define MAC_PMTCSR_RWKFILTRST_WIDTH 1 +#define MAC_PMTCSR_RWKPKTEN_INDEX 2 +#define MAC_PMTCSR_RWKPKTEN_WIDTH 1 +#define MAC_Q0TFCR_PT_INDEX 16 +#define MAC_Q0TFCR_PT_WIDTH 16 +#define MAC_Q0TFCR_TFE_INDEX 1 +#define MAC_Q0TFCR_TFE_WIDTH 1 +#define MAC_RCR_ACS_INDEX 1 +#define MAC_RCR_ACS_WIDTH 1 +#define MAC_RCR_CST_INDEX 2 +#define MAC_RCR_CST_WIDTH 1 +#define MAC_RCR_DCRCC_INDEX 3 +#define MAC_RCR_DCRCC_WIDTH 1 +#define MAC_RCR_HDSMS_INDEX 12 +#define MAC_RCR_HDSMS_WIDTH 3 +#define MAC_RCR_IPC_INDEX 9 +#define MAC_RCR_IPC_WIDTH 1 +#define MAC_RCR_JE_INDEX 8 +#define MAC_RCR_JE_WIDTH 1 +#define MAC_RCR_LM_INDEX 10 +#define MAC_RCR_LM_WIDTH 1 +#define MAC_RCR_RE_INDEX 0 +#define MAC_RCR_RE_WIDTH 1 +#define MAC_RFCR_PFCE_INDEX 8 +#define MAC_RFCR_PFCE_WIDTH 1 +#define MAC_RFCR_RFE_INDEX 0 +#define MAC_RFCR_RFE_WIDTH 1 +#define MAC_RFCR_UP_INDEX 1 +#define MAC_RFCR_UP_WIDTH 1 +#define MAC_RQC0R_RXQ0EN_INDEX 0 +#define MAC_RQC0R_RXQ0EN_WIDTH 2 +#define MAC_RSSAR_ADDRT_INDEX 2 +#define MAC_RSSAR_ADDRT_WIDTH 1 +#define MAC_RSSAR_CT_INDEX 1 +#define MAC_RSSAR_CT_WIDTH 1 +#define MAC_RSSAR_OB_INDEX 0 +#define MAC_RSSAR_OB_WIDTH 1 +#define MAC_RSSAR_RSSIA_INDEX 8 +#define MAC_RSSAR_RSSIA_WIDTH 8 +#define MAC_RSSCR_IP2TE_INDEX 1 +#define MAC_RSSCR_IP2TE_WIDTH 1 +#define MAC_RSSCR_RSSE_INDEX 0 +#define MAC_RSSCR_RSSE_WIDTH 1 +#define MAC_RSSCR_TCP4TE_INDEX 2 +#define MAC_RSSCR_TCP4TE_WIDTH 1 +#define MAC_RSSCR_UDP4TE_INDEX 3 +#define MAC_RSSCR_UDP4TE_WIDTH 1 +#define MAC_RSSDR_DMCH_INDEX 0 +#define MAC_RSSDR_DMCH_WIDTH 4 +#define MAC_SSIR_SNSINC_INDEX 8 +#define MAC_SSIR_SNSINC_WIDTH 8 +#define MAC_SSIR_SSINC_INDEX 16 +#define MAC_SSIR_SSINC_WIDTH 8 +#define MAC_TCR_SS_INDEX 29 +#define MAC_TCR_SS_WIDTH 2 +#define MAC_TCR_TE_INDEX 0 +#define MAC_TCR_TE_WIDTH 1 +#define MAC_TSCR_AV8021ASMEN_INDEX 28 +#define MAC_TSCR_AV8021ASMEN_WIDTH 1 +#define MAC_TSCR_SNAPTYPSEL_INDEX 16 +#define MAC_TSCR_SNAPTYPSEL_WIDTH 2 +#define MAC_TSCR_TSADDREG_INDEX 5 +#define MAC_TSCR_TSADDREG_WIDTH 1 +#define MAC_TSCR_TSCFUPDT_INDEX 1 +#define MAC_TSCR_TSCFUPDT_WIDTH 1 +#define MAC_TSCR_TSCTRLSSR_INDEX 9 +#define MAC_TSCR_TSCTRLSSR_WIDTH 1 +#define MAC_TSCR_TSENA_INDEX 0 +#define MAC_TSCR_TSENA_WIDTH 1 +#define MAC_TSCR_TSENALL_INDEX 8 +#define MAC_TSCR_TSENALL_WIDTH 1 +#define MAC_TSCR_TSEVNTENA_INDEX 14 +#define MAC_TSCR_TSEVNTENA_WIDTH 1 +#define MAC_TSCR_TSINIT_INDEX 2 +#define MAC_TSCR_TSINIT_WIDTH 1 +#define MAC_TSCR_TSIPENA_INDEX 11 +#define MAC_TSCR_TSIPENA_WIDTH 1 +#define MAC_TSCR_TSIPV4ENA_INDEX 13 +#define MAC_TSCR_TSIPV4ENA_WIDTH 1 +#define MAC_TSCR_TSIPV6ENA_INDEX 12 +#define MAC_TSCR_TSIPV6ENA_WIDTH 1 +#define MAC_TSCR_TSMSTRENA_INDEX 15 +#define MAC_TSCR_TSMSTRENA_WIDTH 1 +#define MAC_TSCR_TSVER2ENA_INDEX 10 +#define MAC_TSCR_TSVER2ENA_WIDTH 1 +#define MAC_TSCR_TXTSSTSM_INDEX 24 +#define MAC_TSCR_TXTSSTSM_WIDTH 1 +#define MAC_TSSR_TXTSC_INDEX 15 +#define MAC_TSSR_TXTSC_WIDTH 1 +#define MAC_TXSNR_TXTSSTSMIS_INDEX 31 +#define MAC_TXSNR_TXTSSTSMIS_WIDTH 1 +#define MAC_VLANHTR_VLHT_INDEX 0 +#define MAC_VLANHTR_VLHT_WIDTH 16 +#define MAC_VLANIR_VLTI_INDEX 20 +#define MAC_VLANIR_VLTI_WIDTH 1 +#define MAC_VLANIR_CSVL_INDEX 19 +#define MAC_VLANIR_CSVL_WIDTH 1 +#define MAC_VLANTR_DOVLTC_INDEX 20 +#define MAC_VLANTR_DOVLTC_WIDTH 1 +#define MAC_VLANTR_ERSVLM_INDEX 19 +#define MAC_VLANTR_ERSVLM_WIDTH 1 +#define MAC_VLANTR_ESVL_INDEX 18 +#define MAC_VLANTR_ESVL_WIDTH 1 +#define MAC_VLANTR_ETV_INDEX 16 +#define MAC_VLANTR_ETV_WIDTH 1 +#define MAC_VLANTR_EVLS_INDEX 21 +#define MAC_VLANTR_EVLS_WIDTH 2 +#define MAC_VLANTR_EVLRXS_INDEX 24 +#define MAC_VLANTR_EVLRXS_WIDTH 1 +#define MAC_VLANTR_VL_INDEX 0 +#define MAC_VLANTR_VL_WIDTH 16 +#define MAC_VLANTR_VTHM_INDEX 25 +#define MAC_VLANTR_VTHM_WIDTH 1 +#define MAC_VLANTR_VTIM_INDEX 17 +#define MAC_VLANTR_VTIM_WIDTH 1 +#define MAC_VR_DEVID_INDEX 8 +#define MAC_VR_DEVID_WIDTH 8 +#define MAC_VR_SNPSVER_INDEX 0 +#define MAC_VR_SNPSVER_WIDTH 8 +#define MAC_VR_USERVER_INDEX 16 +#define MAC_VR_USERVER_WIDTH 8 + +/* MMC register offsets */ +#define MMC_CR 0x0800 +#define MMC_RISR 0x0804 +#define MMC_TISR 0x0808 +#define MMC_RIER 0x080c +#define MMC_TIER 0x0810 +#define MMC_TXOCTETCOUNT_GB_LO 0x0814 +#define MMC_TXOCTETCOUNT_GB_HI 0x0818 +#define MMC_TXFRAMECOUNT_GB_LO 0x081c +#define MMC_TXFRAMECOUNT_GB_HI 0x0820 +#define MMC_TXBROADCASTFRAMES_G_LO 0x0824 +#define MMC_TXBROADCASTFRAMES_G_HI 0x0828 +#define MMC_TXMULTICASTFRAMES_G_LO 0x082c +#define MMC_TXMULTICASTFRAMES_G_HI 0x0830 +#define MMC_TX64OCTETS_GB_LO 0x0834 +#define MMC_TX64OCTETS_GB_HI 0x0838 +#define MMC_TX65TO127OCTETS_GB_LO 0x083c +#define MMC_TX65TO127OCTETS_GB_HI 0x0840 +#define MMC_TX128TO255OCTETS_GB_LO 0x0844 +#define MMC_TX128TO255OCTETS_GB_HI 0x0848 +#define MMC_TX256TO511OCTETS_GB_LO 0x084c +#define MMC_TX256TO511OCTETS_GB_HI 0x0850 +#define MMC_TX512TO1023OCTETS_GB_LO 0x0854 +#define MMC_TX512TO1023OCTETS_GB_HI 0x0858 +#define MMC_TX1024TOMAXOCTETS_GB_LO 0x085c +#define MMC_TX1024TOMAXOCTETS_GB_HI 0x0860 +#define MMC_TXUNICASTFRAMES_GB_LO 0x0864 +#define MMC_TXUNICASTFRAMES_GB_HI 0x0868 +#define MMC_TXMULTICASTFRAMES_GB_LO 0x086c +#define MMC_TXMULTICASTFRAMES_GB_HI 0x0870 +#define MMC_TXBROADCASTFRAMES_GB_LO 0x0874 +#define MMC_TXBROADCASTFRAMES_GB_HI 0x0878 +#define MMC_TXUNDERFLOWERROR_LO 0x087c +#define MMC_TXUNDERFLOWERROR_HI 0x0880 +#define MMC_TXOCTETCOUNT_G_LO 0x0884 +#define MMC_TXOCTETCOUNT_G_HI 0x0888 +#define MMC_TXFRAMECOUNT_G_LO 0x088c +#define MMC_TXFRAMECOUNT_G_HI 0x0890 +#define MMC_TXPAUSEFRAMES_LO 0x0894 +#define MMC_TXPAUSEFRAMES_HI 0x0898 +#define MMC_TXVLANFRAMES_G_LO 0x089c +#define MMC_TXVLANFRAMES_G_HI 0x08a0 +#define MMC_RXFRAMECOUNT_GB_LO 0x0900 +#define MMC_RXFRAMECOUNT_GB_HI 0x0904 +#define MMC_RXOCTETCOUNT_GB_LO 0x0908 +#define MMC_RXOCTETCOUNT_GB_HI 0x090c +#define MMC_RXOCTETCOUNT_G_LO 0x0910 +#define MMC_RXOCTETCOUNT_G_HI 0x0914 +#define MMC_RXBROADCASTFRAMES_G_LO 0x0918 +#define MMC_RXBROADCASTFRAMES_G_HI 0x091c +#define MMC_RXMULTICASTFRAMES_G_LO 0x0920 +#define MMC_RXMULTICASTFRAMES_G_HI 0x0924 +#define MMC_RXCRCERROR_LO 0x0928 +#define MMC_RXCRCERROR_HI 0x092c +#define MMC_RXRUNTERROR 0x0930 +#define MMC_RXJABBERERROR 0x0934 +#define MMC_RXUNDERSIZE_G 0x0938 +#define MMC_RXOVERSIZE_G 0x093c +#define MMC_RX64OCTETS_GB_LO 0x0940 +#define MMC_RX64OCTETS_GB_HI 0x0944 +#define MMC_RX65TO127OCTETS_GB_LO 0x0948 +#define MMC_RX65TO127OCTETS_GB_HI 0x094c +#define MMC_RX128TO255OCTETS_GB_LO 0x0950 +#define MMC_RX128TO255OCTETS_GB_HI 0x0954 +#define MMC_RX256TO511OCTETS_GB_LO 0x0958 +#define MMC_RX256TO511OCTETS_GB_HI 0x095c +#define MMC_RX512TO1023OCTETS_GB_LO 0x0960 +#define MMC_RX512TO1023OCTETS_GB_HI 0x0964 +#define MMC_RX1024TOMAXOCTETS_GB_LO 0x0968 +#define MMC_RX1024TOMAXOCTETS_GB_HI 0x096c +#define MMC_RXUNICASTFRAMES_G_LO 0x0970 +#define MMC_RXUNICASTFRAMES_G_HI 0x0974 +#define MMC_RXLENGTHERROR_LO 0x0978 +#define MMC_RXLENGTHERROR_HI 0x097c +#define MMC_RXOUTOFRANGETYPE_LO 0x0980 +#define MMC_RXOUTOFRANGETYPE_HI 0x0984 +#define MMC_RXPAUSEFRAMES_LO 0x0988 +#define MMC_RXPAUSEFRAMES_HI 0x098c +#define MMC_RXFIFOOVERFLOW_LO 0x0990 +#define MMC_RXFIFOOVERFLOW_HI 0x0994 +#define MMC_RXVLANFRAMES_GB_LO 0x0998 +#define MMC_RXVLANFRAMES_GB_HI 0x099c +#define MMC_RXWATCHDOGERROR 0x09a0 + +/* MMC register entry bit positions and sizes */ +#define MMC_CR_CR_INDEX 0 +#define MMC_CR_CR_WIDTH 1 +#define MMC_CR_CSR_INDEX 1 +#define MMC_CR_CSR_WIDTH 1 +#define MMC_CR_ROR_INDEX 2 +#define MMC_CR_ROR_WIDTH 1 +#define MMC_CR_MCF_INDEX 3 +#define MMC_CR_MCF_WIDTH 1 +#define MMC_CR_MCT_INDEX 4 +#define MMC_CR_MCT_WIDTH 2 +#define MMC_RIER_ALL_INTERRUPTS_INDEX 0 +#define MMC_RIER_ALL_INTERRUPTS_WIDTH 23 +#define MMC_RISR_RXFRAMECOUNT_GB_INDEX 0 +#define MMC_RISR_RXFRAMECOUNT_GB_WIDTH 1 +#define MMC_RISR_RXOCTETCOUNT_GB_INDEX 1 +#define MMC_RISR_RXOCTETCOUNT_GB_WIDTH 1 +#define MMC_RISR_RXOCTETCOUNT_G_INDEX 2 +#define MMC_RISR_RXOCTETCOUNT_G_WIDTH 1 +#define MMC_RISR_RXBROADCASTFRAMES_G_INDEX 3 +#define MMC_RISR_RXBROADCASTFRAMES_G_WIDTH 1 +#define MMC_RISR_RXMULTICASTFRAMES_G_INDEX 4 +#define MMC_RISR_RXMULTICASTFRAMES_G_WIDTH 1 +#define MMC_RISR_RXCRCERROR_INDEX 5 +#define MMC_RISR_RXCRCERROR_WIDTH 1 +#define MMC_RISR_RXRUNTERROR_INDEX 6 +#define MMC_RISR_RXRUNTERROR_WIDTH 1 +#define MMC_RISR_RXJABBERERROR_INDEX 7 +#define MMC_RISR_RXJABBERERROR_WIDTH 1 +#define MMC_RISR_RXUNDERSIZE_G_INDEX 8 +#define MMC_RISR_RXUNDERSIZE_G_WIDTH 1 +#define MMC_RISR_RXOVERSIZE_G_INDEX 9 +#define MMC_RISR_RXOVERSIZE_G_WIDTH 1 +#define MMC_RISR_RX64OCTETS_GB_INDEX 10 +#define MMC_RISR_RX64OCTETS_GB_WIDTH 1 +#define MMC_RISR_RX65TO127OCTETS_GB_INDEX 11 +#define MMC_RISR_RX65TO127OCTETS_GB_WIDTH 1 +#define MMC_RISR_RX128TO255OCTETS_GB_INDEX 12 +#define MMC_RISR_RX128TO255OCTETS_GB_WIDTH 1 +#define MMC_RISR_RX256TO511OCTETS_GB_INDEX 13 +#define MMC_RISR_RX256TO511OCTETS_GB_WIDTH 1 +#define MMC_RISR_RX512TO1023OCTETS_GB_INDEX 14 +#define MMC_RISR_RX512TO1023OCTETS_GB_WIDTH 1 +#define MMC_RISR_RX1024TOMAXOCTETS_GB_INDEX 15 +#define MMC_RISR_RX1024TOMAXOCTETS_GB_WIDTH 1 +#define MMC_RISR_RXUNICASTFRAMES_G_INDEX 16 +#define MMC_RISR_RXUNICASTFRAMES_G_WIDTH 1 +#define MMC_RISR_RXLENGTHERROR_INDEX 17 +#define MMC_RISR_RXLENGTHERROR_WIDTH 1 +#define MMC_RISR_RXOUTOFRANGETYPE_INDEX 18 +#define MMC_RISR_RXOUTOFRANGETYPE_WIDTH 1 +#define MMC_RISR_RXPAUSEFRAMES_INDEX 19 +#define MMC_RISR_RXPAUSEFRAMES_WIDTH 1 +#define MMC_RISR_RXFIFOOVERFLOW_INDEX 20 +#define MMC_RISR_RXFIFOOVERFLOW_WIDTH 1 +#define MMC_RISR_RXVLANFRAMES_GB_INDEX 21 +#define MMC_RISR_RXVLANFRAMES_GB_WIDTH 1 +#define MMC_RISR_RXWATCHDOGERROR_INDEX 22 +#define MMC_RISR_RXWATCHDOGERROR_WIDTH 1 +#define MMC_TIER_ALL_INTERRUPTS_INDEX 0 +#define MMC_TIER_ALL_INTERRUPTS_WIDTH 18 +#define MMC_TISR_TXOCTETCOUNT_GB_INDEX 0 +#define MMC_TISR_TXOCTETCOUNT_GB_WIDTH 1 +#define MMC_TISR_TXFRAMECOUNT_GB_INDEX 1 +#define MMC_TISR_TXFRAMECOUNT_GB_WIDTH 1 +#define MMC_TISR_TXBROADCASTFRAMES_G_INDEX 2 +#define MMC_TISR_TXBROADCASTFRAMES_G_WIDTH 1 +#define MMC_TISR_TXMULTICASTFRAMES_G_INDEX 3 +#define MMC_TISR_TXMULTICASTFRAMES_G_WIDTH 1 +#define MMC_TISR_TX64OCTETS_GB_INDEX 4 +#define MMC_TISR_TX64OCTETS_GB_WIDTH 1 +#define MMC_TISR_TX65TO127OCTETS_GB_INDEX 5 +#define MMC_TISR_TX65TO127OCTETS_GB_WIDTH 1 +#define MMC_TISR_TX128TO255OCTETS_GB_INDEX 6 +#define MMC_TISR_TX128TO255OCTETS_GB_WIDTH 1 +#define MMC_TISR_TX256TO511OCTETS_GB_INDEX 7 +#define MMC_TISR_TX256TO511OCTETS_GB_WIDTH 1 +#define MMC_TISR_TX512TO1023OCTETS_GB_INDEX 8 +#define MMC_TISR_TX512TO1023OCTETS_GB_WIDTH 1 +#define MMC_TISR_TX1024TOMAXOCTETS_GB_INDEX 9 +#define MMC_TISR_TX1024TOMAXOCTETS_GB_WIDTH 1 +#define MMC_TISR_TXUNICASTFRAMES_GB_INDEX 10 +#define MMC_TISR_TXUNICASTFRAMES_GB_WIDTH 1 +#define MMC_TISR_TXMULTICASTFRAMES_GB_INDEX 11 +#define MMC_TISR_TXMULTICASTFRAMES_GB_WIDTH 1 +#define MMC_TISR_TXBROADCASTFRAMES_GB_INDEX 12 +#define MMC_TISR_TXBROADCASTFRAMES_GB_WIDTH 1 +#define MMC_TISR_TXUNDERFLOWERROR_INDEX 13 +#define MMC_TISR_TXUNDERFLOWERROR_WIDTH 1 +#define MMC_TISR_TXOCTETCOUNT_G_INDEX 14 +#define MMC_TISR_TXOCTETCOUNT_G_WIDTH 1 +#define MMC_TISR_TXFRAMECOUNT_G_INDEX 15 +#define MMC_TISR_TXFRAMECOUNT_G_WIDTH 1 +#define MMC_TISR_TXPAUSEFRAMES_INDEX 16 +#define MMC_TISR_TXPAUSEFRAMES_WIDTH 1 +#define MMC_TISR_TXVLANFRAMES_G_INDEX 17 +#define MMC_TISR_TXVLANFRAMES_G_WIDTH 1 + +/* MTL register offsets */ +#define MTL_OMR 0x1000 +#define MTL_FDCR 0x1008 +#define MTL_FDSR 0x100c +#define MTL_FDDR 0x1010 +#define MTL_ISR 0x1020 +#define MTL_RQDCM0R 0x1030 +#define MTL_TCPM0R 0x1040 +#define MTL_TCPM1R 0x1044 + +#define MTL_RQDCM_INC 4 +#define MTL_RQDCM_Q_PER_REG 4 +#define MTL_TCPM_INC 4 +#define MTL_TCPM_TC_PER_REG 4 + +/* MTL register entry bit positions and sizes */ +#define MTL_OMR_ETSALG_INDEX 5 +#define MTL_OMR_ETSALG_WIDTH 2 +#define MTL_OMR_RAA_INDEX 2 +#define MTL_OMR_RAA_WIDTH 1 + +/* MTL queue register offsets +* Multiple queues can be active. The first queue has registers +* that begin at 0x1100. Each subsequent queue has registers that +* are accessed using an offset of 0x80 from the previous queue. +*/ +#define MTL_Q_BASE 0x1100 +#define MTL_Q_INC 0x80 + +#define MTL_Q_TQOMR 0x00 +#define MTL_Q_TQUR 0x04 +#define MTL_Q_TQDR 0x08 +#define MTL_Q_RQOMR 0x40 +#define MTL_Q_RQMPOCR 0x44 +#define MTL_Q_RQDR 0x48 +#define MTL_Q_RQFCR 0x50 +#define MTL_Q_IER 0x70 +#define MTL_Q_ISR 0x74 + +/* MTL queue register entry bit positions and sizes */ +#define MTL_Q_RQDR_PRXQ_INDEX 16 +#define MTL_Q_RQDR_PRXQ_WIDTH 14 +#define MTL_Q_RQDR_RXQSTS_INDEX 4 +#define MTL_Q_RQDR_RXQSTS_WIDTH 2 +#define MTL_Q_RQFCR_RFA_INDEX 1 +#define MTL_Q_RQFCR_RFA_WIDTH 6 +#define MTL_Q_RQFCR_RFD_INDEX 17 +#define MTL_Q_RQFCR_RFD_WIDTH 6 +#define MTL_Q_RQOMR_EHFC_INDEX 7 +#define MTL_Q_RQOMR_EHFC_WIDTH 1 +#define MTL_Q_RQOMR_RQS_INDEX 16 +#define MTL_Q_RQOMR_RQS_WIDTH 9 +#define MTL_Q_RQOMR_RSF_INDEX 5 +#define MTL_Q_RQOMR_RSF_WIDTH 1 +#define MTL_Q_RQOMR_RTC_INDEX 0 +#define MTL_Q_RQOMR_RTC_WIDTH 2 +#define MTL_Q_TQDR_TRCSTS_INDEX 1 +#define MTL_Q_TQDR_TRCSTS_WIDTH 2 +#define MTL_Q_TQDR_TXQSTS_INDEX 4 +#define MTL_Q_TQDR_TXQSTS_WIDTH 1 +#define MTL_Q_TQOMR_FTQ_INDEX 0 +#define MTL_Q_TQOMR_FTQ_WIDTH 1 +#define MTL_Q_TQOMR_Q2TCMAP_INDEX 8 +#define MTL_Q_TQOMR_Q2TCMAP_WIDTH 3 +#define MTL_Q_TQOMR_TQS_INDEX 16 +#define MTL_Q_TQOMR_TQS_WIDTH 10 +#define MTL_Q_TQOMR_TSF_INDEX 1 +#define MTL_Q_TQOMR_TSF_WIDTH 1 +#define MTL_Q_TQOMR_TTC_INDEX 4 +#define MTL_Q_TQOMR_TTC_WIDTH 3 +#define MTL_Q_TQOMR_TXQEN_INDEX 2 +#define MTL_Q_TQOMR_TXQEN_WIDTH 2 + +/* MTL queue register value */ +#define MTL_RSF_DISABLE 0x00 +#define MTL_RSF_ENABLE 0x01 +#define MTL_TSF_DISABLE 0x00 +#define MTL_TSF_ENABLE 0x01 + +#define MTL_RX_THRESHOLD_64 0x00 +#define MTL_RX_THRESHOLD_96 0x02 +#define MTL_RX_THRESHOLD_128 0x03 +#define MTL_TX_THRESHOLD_32 0x01 +#define MTL_TX_THRESHOLD_64 0x00 +#define MTL_TX_THRESHOLD_96 0x02 +#define MTL_TX_THRESHOLD_128 0x03 +#define MTL_TX_THRESHOLD_192 0x04 +#define MTL_TX_THRESHOLD_256 0x05 +#define MTL_TX_THRESHOLD_384 0x06 +#define MTL_TX_THRESHOLD_512 0x07 + +#define MTL_ETSALG_WRR 0x00 +#define MTL_ETSALG_WFQ 0x01 +#define MTL_ETSALG_DWRR 0x02 +#define MTL_RAA_SP 0x00 +#define MTL_RAA_WSP 0x01 + +#define MTL_Q_DISABLED 0x00 +#define MTL_Q_ENABLED 0x02 + +/* MTL traffic class register offsets +* Multiple traffic classes can be active. The first class has registers +* that begin at 0x1100. Each subsequent queue has registers that +* are accessed using an offset of 0x80 from the previous queue. +*/ +#define MTL_TC_BASE MTL_Q_BASE +#define MTL_TC_INC MTL_Q_INC + +#define MTL_TC_ETSCR 0x10 +#define MTL_TC_ETSSR 0x14 +#define MTL_TC_QWR 0x18 + +/* MTL traffic class register entry bit positions and sizes */ +#define MTL_TC_ETSCR_TSA_INDEX 0 +#define MTL_TC_ETSCR_TSA_WIDTH 2 +#define MTL_TC_QWR_QW_INDEX 0 +#define MTL_TC_QWR_QW_WIDTH 21 + +/* MTL traffic class register value */ +#define MTL_TSA_SP 0x00 +#define MTL_TSA_ETS 0x02 + +/* PCS register offsets */ +#define PCS_V1_WINDOW_SELECT 0x03fc +#define PCS_V2_WINDOW_DEF 0x9060 +#define PCS_V2_WINDOW_SELECT 0x9064 + +/* PCS register entry bit positions and sizes */ +#define PCS_V2_WINDOW_DEF_OFFSET_INDEX 6 +#define PCS_V2_WINDOW_DEF_OFFSET_WIDTH 14 +#define PCS_V2_WINDOW_DEF_SIZE_INDEX 2 +#define PCS_V2_WINDOW_DEF_SIZE_WIDTH 4 + +/* SerDes integration register offsets */ +#define SIR0_KR_RT_1 0x002c +#define SIR0_STATUS 0x0040 +#define SIR1_SPEED 0x0000 + +/* SerDes integration register entry bit positions and sizes */ +#define SIR0_KR_RT_1_RESET_INDEX 11 +#define SIR0_KR_RT_1_RESET_WIDTH 1 +#define SIR0_STATUS_RX_READY_INDEX 0 +#define SIR0_STATUS_RX_READY_WIDTH 1 +#define SIR0_STATUS_TX_READY_INDEX 8 +#define SIR0_STATUS_TX_READY_WIDTH 1 +#define SIR1_SPEED_CDR_RATE_INDEX 12 +#define SIR1_SPEED_CDR_RATE_WIDTH 4 +#define SIR1_SPEED_DATARATE_INDEX 4 +#define SIR1_SPEED_DATARATE_WIDTH 2 +#define SIR1_SPEED_PLLSEL_INDEX 3 +#define SIR1_SPEED_PLLSEL_WIDTH 1 +#define SIR1_SPEED_RATECHANGE_INDEX 6 +#define SIR1_SPEED_RATECHANGE_WIDTH 1 +#define SIR1_SPEED_TXAMP_INDEX 8 +#define SIR1_SPEED_TXAMP_WIDTH 4 +#define SIR1_SPEED_WORDMODE_INDEX 0 +#define SIR1_SPEED_WORDMODE_WIDTH 3 + +/* SerDes RxTx register offsets */ +#define RXTX_REG6 0x0018 +#define RXTX_REG20 0x0050 +#define RXTX_REG22 0x0058 +#define RXTX_REG114 0x01c8 +#define RXTX_REG129 0x0204 + +/* SerDes RxTx register entry bit positions and sizes */ +#define RXTX_REG6_RESETB_RXD_INDEX 8 +#define RXTX_REG6_RESETB_RXD_WIDTH 1 +#define RXTX_REG20_BLWC_ENA_INDEX 2 +#define RXTX_REG20_BLWC_ENA_WIDTH 1 +#define RXTX_REG114_PQ_REG_INDEX 9 +#define RXTX_REG114_PQ_REG_WIDTH 7 +#define RXTX_REG129_RXDFE_CONFIG_INDEX 14 +#define RXTX_REG129_RXDFE_CONFIG_WIDTH 2 + +/* MAC Control register offsets */ +#define XP_PROP_0 0x0000 +#define XP_PROP_1 0x0004 +#define XP_PROP_2 0x0008 +#define XP_PROP_3 0x000c +#define XP_PROP_4 0x0010 +#define XP_PROP_5 0x0014 +#define XP_MAC_ADDR_LO 0x0020 +#define XP_MAC_ADDR_HI 0x0024 +#define XP_ECC_ISR 0x0030 +#define XP_ECC_IER 0x0034 +#define XP_ECC_CNT0 0x003c +#define XP_ECC_CNT1 0x0040 +#define XP_DRIVER_INT_REQ 0x0060 +#define XP_DRIVER_INT_RO 0x0064 +#define XP_DRIVER_SCRATCH_0 0x0068 +#define XP_DRIVER_SCRATCH_1 0x006c +#define XP_INT_EN 0x0078 +#define XP_I2C_MUTEX 0x0080 +#define XP_MDIO_MUTEX 0x0084 + +/* MAC Control register entry bit positions and sizes */ +#define XP_DRIVER_INT_REQ_REQUEST_INDEX 0 +#define XP_DRIVER_INT_REQ_REQUEST_WIDTH 1 +#define XP_DRIVER_INT_RO_STATUS_INDEX 0 +#define XP_DRIVER_INT_RO_STATUS_WIDTH 1 +#define XP_DRIVER_SCRATCH_0_COMMAND_INDEX 0 +#define XP_DRIVER_SCRATCH_0_COMMAND_WIDTH 8 +#define XP_DRIVER_SCRATCH_0_SUB_COMMAND_INDEX 8 +#define XP_DRIVER_SCRATCH_0_SUB_COMMAND_WIDTH 8 +#define XP_ECC_CNT0_RX_DED_INDEX 24 +#define XP_ECC_CNT0_RX_DED_WIDTH 8 +#define XP_ECC_CNT0_RX_SEC_INDEX 16 +#define XP_ECC_CNT0_RX_SEC_WIDTH 8 +#define XP_ECC_CNT0_TX_DED_INDEX 8 +#define XP_ECC_CNT0_TX_DED_WIDTH 8 +#define XP_ECC_CNT0_TX_SEC_INDEX 0 +#define XP_ECC_CNT0_TX_SEC_WIDTH 8 +#define XP_ECC_CNT1_DESC_DED_INDEX 8 +#define XP_ECC_CNT1_DESC_DED_WIDTH 8 +#define XP_ECC_CNT1_DESC_SEC_INDEX 0 +#define XP_ECC_CNT1_DESC_SEC_WIDTH 8 +#define XP_ECC_IER_DESC_DED_INDEX 0 +#define XP_ECC_IER_DESC_DED_WIDTH 1 +#define XP_ECC_IER_DESC_SEC_INDEX 1 +#define XP_ECC_IER_DESC_SEC_WIDTH 1 +#define XP_ECC_IER_RX_DED_INDEX 2 +#define XP_ECC_IER_RX_DED_WIDTH 1 +#define XP_ECC_IER_RX_SEC_INDEX 3 +#define XP_ECC_IER_RX_SEC_WIDTH 1 +#define XP_ECC_IER_TX_DED_INDEX 4 +#define XP_ECC_IER_TX_DED_WIDTH 1 +#define XP_ECC_IER_TX_SEC_INDEX 5 +#define XP_ECC_IER_TX_SEC_WIDTH 1 +#define XP_ECC_ISR_DESC_DED_INDEX 0 +#define XP_ECC_ISR_DESC_DED_WIDTH 1 +#define XP_ECC_ISR_DESC_SEC_INDEX 1 +#define XP_ECC_ISR_DESC_SEC_WIDTH 1 +#define XP_ECC_ISR_RX_DED_INDEX 2 +#define XP_ECC_ISR_RX_DED_WIDTH 1 +#define XP_ECC_ISR_RX_SEC_INDEX 3 +#define XP_ECC_ISR_RX_SEC_WIDTH 1 +#define XP_ECC_ISR_TX_DED_INDEX 4 +#define XP_ECC_ISR_TX_DED_WIDTH 1 +#define XP_ECC_ISR_TX_SEC_INDEX 5 +#define XP_ECC_ISR_TX_SEC_WIDTH 1 +#define XP_I2C_MUTEX_BUSY_INDEX 31 +#define XP_I2C_MUTEX_BUSY_WIDTH 1 +#define XP_I2C_MUTEX_ID_INDEX 29 +#define XP_I2C_MUTEX_ID_WIDTH 2 +#define XP_I2C_MUTEX_ACTIVE_INDEX 0 +#define XP_I2C_MUTEX_ACTIVE_WIDTH 1 +#define XP_MAC_ADDR_HI_VALID_INDEX 31 +#define XP_MAC_ADDR_HI_VALID_WIDTH 1 +#define XP_PROP_0_CONN_TYPE_INDEX 28 +#define XP_PROP_0_CONN_TYPE_WIDTH 3 +#define XP_PROP_0_MDIO_ADDR_INDEX 16 +#define XP_PROP_0_MDIO_ADDR_WIDTH 5 +#define XP_PROP_0_PORT_ID_INDEX 0 +#define XP_PROP_0_PORT_ID_WIDTH 8 +#define XP_PROP_0_PORT_MODE_INDEX 8 +#define XP_PROP_0_PORT_MODE_WIDTH 4 +#define XP_PROP_0_PORT_SPEEDS_INDEX 23 +#define XP_PROP_0_PORT_SPEEDS_WIDTH 4 +#define XP_PROP_1_MAX_RX_DMA_INDEX 24 +#define XP_PROP_1_MAX_RX_DMA_WIDTH 5 +#define XP_PROP_1_MAX_RX_QUEUES_INDEX 8 +#define XP_PROP_1_MAX_RX_QUEUES_WIDTH 5 +#define XP_PROP_1_MAX_TX_DMA_INDEX 16 +#define XP_PROP_1_MAX_TX_DMA_WIDTH 5 +#define XP_PROP_1_MAX_TX_QUEUES_INDEX 0 +#define XP_PROP_1_MAX_TX_QUEUES_WIDTH 5 +#define XP_PROP_2_RX_FIFO_SIZE_INDEX 16 +#define XP_PROP_2_RX_FIFO_SIZE_WIDTH 16 +#define XP_PROP_2_TX_FIFO_SIZE_INDEX 0 +#define XP_PROP_2_TX_FIFO_SIZE_WIDTH 16 +#define XP_PROP_3_GPIO_MASK_INDEX 28 +#define XP_PROP_3_GPIO_MASK_WIDTH 4 +#define XP_PROP_3_GPIO_MOD_ABS_INDEX 20 +#define XP_PROP_3_GPIO_MOD_ABS_WIDTH 4 +#define XP_PROP_3_GPIO_RATE_SELECT_INDEX 16 +#define XP_PROP_3_GPIO_RATE_SELECT_WIDTH 4 +#define XP_PROP_3_GPIO_RX_LOS_INDEX 24 +#define XP_PROP_3_GPIO_RX_LOS_WIDTH 4 +#define XP_PROP_3_GPIO_TX_FAULT_INDEX 12 +#define XP_PROP_3_GPIO_TX_FAULT_WIDTH 4 +#define XP_PROP_3_GPIO_ADDR_INDEX 8 +#define XP_PROP_3_GPIO_ADDR_WIDTH 3 +#define XP_PROP_3_MDIO_RESET_INDEX 0 +#define XP_PROP_3_MDIO_RESET_WIDTH 2 +#define XP_PROP_3_MDIO_RESET_I2C_ADDR_INDEX 8 +#define XP_PROP_3_MDIO_RESET_I2C_ADDR_WIDTH 3 +#define XP_PROP_3_MDIO_RESET_I2C_GPIO_INDEX 12 +#define XP_PROP_3_MDIO_RESET_I2C_GPIO_WIDTH 4 +#define XP_PROP_3_MDIO_RESET_INT_GPIO_INDEX 4 +#define XP_PROP_3_MDIO_RESET_INT_GPIO_WIDTH 2 +#define XP_PROP_4_MUX_ADDR_HI_INDEX 8 +#define XP_PROP_4_MUX_ADDR_HI_WIDTH 5 +#define XP_PROP_4_MUX_ADDR_LO_INDEX 0 +#define XP_PROP_4_MUX_ADDR_LO_WIDTH 3 +#define XP_PROP_4_MUX_CHAN_INDEX 4 +#define XP_PROP_4_MUX_CHAN_WIDTH 3 +#define XP_PROP_4_REDRV_ADDR_INDEX 16 +#define XP_PROP_4_REDRV_ADDR_WIDTH 7 +#define XP_PROP_4_REDRV_IF_INDEX 23 +#define XP_PROP_4_REDRV_IF_WIDTH 1 +#define XP_PROP_4_REDRV_LANE_INDEX 24 +#define XP_PROP_4_REDRV_LANE_WIDTH 3 +#define XP_PROP_4_REDRV_MODEL_INDEX 28 +#define XP_PROP_4_REDRV_MODEL_WIDTH 3 +#define XP_PROP_4_REDRV_PRESENT_INDEX 31 +#define XP_PROP_4_REDRV_PRESENT_WIDTH 1 + +/* I2C Control register offsets */ +#define IC_CON 0x0000 +#define IC_TAR 0x0004 +#define IC_DATA_CMD 0x0010 +#define IC_INTR_STAT 0x002c +#define IC_INTR_MASK 0x0030 +#define IC_RAW_INTR_STAT 0x0034 +#define IC_CLR_INTR 0x0040 +#define IC_CLR_TX_ABRT 0x0054 +#define IC_CLR_STOP_DET 0x0060 +#define IC_ENABLE 0x006c +#define IC_TXFLR 0x0074 +#define IC_RXFLR 0x0078 +#define IC_TX_ABRT_SOURCE 0x0080 +#define IC_ENABLE_STATUS 0x009c +#define IC_COMP_PARAM_1 0x00f4 + +/* I2C Control register entry bit positions and sizes */ +#define IC_COMP_PARAM_1_MAX_SPEED_MODE_INDEX 2 +#define IC_COMP_PARAM_1_MAX_SPEED_MODE_WIDTH 2 +#define IC_COMP_PARAM_1_RX_BUFFER_DEPTH_INDEX 8 +#define IC_COMP_PARAM_1_RX_BUFFER_DEPTH_WIDTH 8 +#define IC_COMP_PARAM_1_TX_BUFFER_DEPTH_INDEX 16 +#define IC_COMP_PARAM_1_TX_BUFFER_DEPTH_WIDTH 8 +#define IC_CON_MASTER_MODE_INDEX 0 +#define IC_CON_MASTER_MODE_WIDTH 1 +#define IC_CON_RESTART_EN_INDEX 5 +#define IC_CON_RESTART_EN_WIDTH 1 +#define IC_CON_RX_FIFO_FULL_HOLD_INDEX 9 +#define IC_CON_RX_FIFO_FULL_HOLD_WIDTH 1 +#define IC_CON_SLAVE_DISABLE_INDEX 6 +#define IC_CON_SLAVE_DISABLE_WIDTH 1 +#define IC_CON_SPEED_INDEX 1 +#define IC_CON_SPEED_WIDTH 2 +#define IC_DATA_CMD_CMD_INDEX 8 +#define IC_DATA_CMD_CMD_WIDTH 1 +#define IC_DATA_CMD_STOP_INDEX 9 +#define IC_DATA_CMD_STOP_WIDTH 1 +#define IC_ENABLE_ABORT_INDEX 1 +#define IC_ENABLE_ABORT_WIDTH 1 +#define IC_ENABLE_EN_INDEX 0 +#define IC_ENABLE_EN_WIDTH 1 +#define IC_ENABLE_STATUS_EN_INDEX 0 +#define IC_ENABLE_STATUS_EN_WIDTH 1 +#define IC_INTR_MASK_TX_EMPTY_INDEX 4 +#define IC_INTR_MASK_TX_EMPTY_WIDTH 1 +#define IC_RAW_INTR_STAT_RX_FULL_INDEX 2 +#define IC_RAW_INTR_STAT_RX_FULL_WIDTH 1 +#define IC_RAW_INTR_STAT_STOP_DET_INDEX 9 +#define IC_RAW_INTR_STAT_STOP_DET_WIDTH 1 +#define IC_RAW_INTR_STAT_TX_ABRT_INDEX 6 +#define IC_RAW_INTR_STAT_TX_ABRT_WIDTH 1 +#define IC_RAW_INTR_STAT_TX_EMPTY_INDEX 4 +#define IC_RAW_INTR_STAT_TX_EMPTY_WIDTH 1 + +/* I2C Control register value */ +#define IC_TX_ABRT_7B_ADDR_NOACK 0x0001 +#define IC_TX_ABRT_ARB_LOST 0x1000 + +/* Descriptor/Packet entry bit positions and sizes */ +#define RX_PACKET_ERRORS_CRC_INDEX 2 +#define RX_PACKET_ERRORS_CRC_WIDTH 1 +#define RX_PACKET_ERRORS_FRAME_INDEX 3 +#define RX_PACKET_ERRORS_FRAME_WIDTH 1 +#define RX_PACKET_ERRORS_LENGTH_INDEX 0 +#define RX_PACKET_ERRORS_LENGTH_WIDTH 1 +#define RX_PACKET_ERRORS_OVERRUN_INDEX 1 +#define RX_PACKET_ERRORS_OVERRUN_WIDTH 1 + +#define RX_PACKET_ATTRIBUTES_CSUM_DONE_INDEX 0 +#define RX_PACKET_ATTRIBUTES_CSUM_DONE_WIDTH 1 +#define RX_PACKET_ATTRIBUTES_VLAN_CTAG_INDEX 1 +#define RX_PACKET_ATTRIBUTES_VLAN_CTAG_WIDTH 1 +#define RX_PACKET_ATTRIBUTES_INCOMPLETE_INDEX 2 +#define RX_PACKET_ATTRIBUTES_INCOMPLETE_WIDTH 1 +#define RX_PACKET_ATTRIBUTES_CONTEXT_NEXT_INDEX 3 +#define RX_PACKET_ATTRIBUTES_CONTEXT_NEXT_WIDTH 1 +#define RX_PACKET_ATTRIBUTES_CONTEXT_INDEX 4 +#define RX_PACKET_ATTRIBUTES_CONTEXT_WIDTH 1 +#define RX_PACKET_ATTRIBUTES_RX_TSTAMP_INDEX 5 +#define RX_PACKET_ATTRIBUTES_RX_TSTAMP_WIDTH 1 +#define RX_PACKET_ATTRIBUTES_RSS_HASH_INDEX 6 +#define RX_PACKET_ATTRIBUTES_RSS_HASH_WIDTH 1 + +#define RX_NORMAL_DESC0_OVT_INDEX 0 +#define RX_NORMAL_DESC0_OVT_WIDTH 16 +#define RX_NORMAL_DESC2_HL_INDEX 0 +#define RX_NORMAL_DESC2_HL_WIDTH 10 +#define RX_NORMAL_DESC3_CDA_INDEX 27 +#define RX_NORMAL_DESC3_CDA_WIDTH 1 +#define RX_NORMAL_DESC3_CTXT_INDEX 30 +#define RX_NORMAL_DESC3_CTXT_WIDTH 1 +#define RX_NORMAL_DESC3_ES_INDEX 15 +#define RX_NORMAL_DESC3_ES_WIDTH 1 +#define RX_NORMAL_DESC3_ETLT_INDEX 16 +#define RX_NORMAL_DESC3_ETLT_WIDTH 4 +#define RX_NORMAL_DESC3_FD_INDEX 29 +#define RX_NORMAL_DESC3_FD_WIDTH 1 +#define RX_NORMAL_DESC3_INTE_INDEX 30 +#define RX_NORMAL_DESC3_INTE_WIDTH 1 +#define RX_NORMAL_DESC3_L34T_INDEX 20 +#define RX_NORMAL_DESC3_L34T_WIDTH 4 +#define RX_NORMAL_DESC3_LD_INDEX 28 +#define RX_NORMAL_DESC3_LD_WIDTH 1 +#define RX_NORMAL_DESC3_OWN_INDEX 31 +#define RX_NORMAL_DESC3_OWN_WIDTH 1 +#define RX_NORMAL_DESC3_PL_INDEX 0 +#define RX_NORMAL_DESC3_PL_WIDTH 14 +#define RX_NORMAL_DESC3_RSV_INDEX 26 +#define RX_NORMAL_DESC3_RSV_WIDTH 1 + +#define RX_DESC3_L34T_IPV4_TCP 1 +#define RX_DESC3_L34T_IPV4_UDP 2 +#define RX_DESC3_L34T_IPV4_ICMP 3 +#define RX_DESC3_L34T_IPV6_TCP 9 +#define RX_DESC3_L34T_IPV6_UDP 10 +#define RX_DESC3_L34T_IPV6_ICMP 11 + +#define RX_CONTEXT_DESC3_TSA_INDEX 4 +#define RX_CONTEXT_DESC3_TSA_WIDTH 1 +#define RX_CONTEXT_DESC3_TSD_INDEX 6 +#define RX_CONTEXT_DESC3_TSD_WIDTH 1 + +#define TX_PACKET_ATTRIBUTES_CSUM_ENABLE_INDEX 0 +#define TX_PACKET_ATTRIBUTES_CSUM_ENABLE_WIDTH 1 +#define TX_PACKET_ATTRIBUTES_TSO_ENABLE_INDEX 1 +#define TX_PACKET_ATTRIBUTES_TSO_ENABLE_WIDTH 1 +#define TX_PACKET_ATTRIBUTES_VLAN_CTAG_INDEX 2 +#define TX_PACKET_ATTRIBUTES_VLAN_CTAG_WIDTH 1 +#define TX_PACKET_ATTRIBUTES_PTP_INDEX 3 +#define TX_PACKET_ATTRIBUTES_PTP_WIDTH 1 + +#define TX_CONTEXT_DESC2_MSS_INDEX 0 +#define TX_CONTEXT_DESC2_MSS_WIDTH 15 +#define TX_CONTEXT_DESC3_CTXT_INDEX 30 +#define TX_CONTEXT_DESC3_CTXT_WIDTH 1 +#define TX_CONTEXT_DESC3_TCMSSV_INDEX 26 +#define TX_CONTEXT_DESC3_TCMSSV_WIDTH 1 +#define TX_CONTEXT_DESC3_VLTV_INDEX 16 +#define TX_CONTEXT_DESC3_VLTV_WIDTH 1 +#define TX_CONTEXT_DESC3_VT_INDEX 0 +#define TX_CONTEXT_DESC3_VT_WIDTH 16 + +#define TX_NORMAL_DESC2_HL_B1L_INDEX 0 +#define TX_NORMAL_DESC2_HL_B1L_WIDTH 14 +#define TX_NORMAL_DESC2_IC_INDEX 31 +#define TX_NORMAL_DESC2_IC_WIDTH 1 +#define TX_NORMAL_DESC2_TTSE_INDEX 30 +#define TX_NORMAL_DESC2_TTSE_WIDTH 1 +#define TX_NORMAL_DESC2_VTIR_INDEX 14 +#define TX_NORMAL_DESC2_VTIR_WIDTH 2 +#define TX_NORMAL_DESC3_CIC_INDEX 16 +#define TX_NORMAL_DESC3_CIC_WIDTH 2 +#define TX_NORMAL_DESC3_CPC_INDEX 26 +#define TX_NORMAL_DESC3_CPC_WIDTH 2 +#define TX_NORMAL_DESC3_CTXT_INDEX 30 +#define TX_NORMAL_DESC3_CTXT_WIDTH 1 +#define TX_NORMAL_DESC3_FD_INDEX 29 +#define TX_NORMAL_DESC3_FD_WIDTH 1 +#define TX_NORMAL_DESC3_FL_INDEX 0 +#define TX_NORMAL_DESC3_FL_WIDTH 15 +#define TX_NORMAL_DESC3_LD_INDEX 28 +#define TX_NORMAL_DESC3_LD_WIDTH 1 +#define TX_NORMAL_DESC3_OWN_INDEX 31 +#define TX_NORMAL_DESC3_OWN_WIDTH 1 +#define TX_NORMAL_DESC3_TCPHDRLEN_INDEX 19 +#define TX_NORMAL_DESC3_TCPHDRLEN_WIDTH 4 +#define TX_NORMAL_DESC3_TCPPL_INDEX 0 +#define TX_NORMAL_DESC3_TCPPL_WIDTH 18 +#define TX_NORMAL_DESC3_TSE_INDEX 18 +#define TX_NORMAL_DESC3_TSE_WIDTH 1 + +#define TX_NORMAL_DESC2_VLAN_INSERT 0x2 + +/* MDIO undefined or vendor specific registers */ +#ifndef MDIO_PMA_10GBR_PMD_CTRL +#define MDIO_PMA_10GBR_PMD_CTRL 0x0096 +#endif + +#ifndef MDIO_PMA_10GBR_FECCTRL +#define MDIO_PMA_10GBR_FECCTRL 0x00ab +#endif + +#ifndef MDIO_PCS_DIG_CTRL +#define MDIO_PCS_DIG_CTRL 0x8000 +#endif + +#ifndef MDIO_AN_XNP +#define MDIO_AN_XNP 0x0016 +#endif + +#ifndef MDIO_AN_LPX +#define MDIO_AN_LPX 0x0019 +#endif + +#ifndef MDIO_AN_COMP_STAT +#define MDIO_AN_COMP_STAT 0x0030 +#endif + +#ifndef MDIO_AN_INTMASK +#define MDIO_AN_INTMASK 0x8001 +#endif + +#ifndef MDIO_AN_INT +#define MDIO_AN_INT 0x8002 +#endif + +#ifndef MDIO_VEND2_AN_ADVERTISE +#define MDIO_VEND2_AN_ADVERTISE 0x0004 +#endif + +#ifndef MDIO_VEND2_AN_LP_ABILITY +#define MDIO_VEND2_AN_LP_ABILITY 0x0005 +#endif + +#ifndef MDIO_VEND2_AN_CTRL +#define MDIO_VEND2_AN_CTRL 0x8001 +#endif + +#ifndef MDIO_VEND2_AN_STAT +#define MDIO_VEND2_AN_STAT 0x8002 +#endif + +#ifndef MDIO_CTRL1_SPEED1G +#define MDIO_CTRL1_SPEED1G (MDIO_CTRL1_SPEED10G & ~BMCR_SPEED100) +#endif + +#ifndef MDIO_VEND2_CTRL1_AN_ENABLE +#define MDIO_VEND2_CTRL1_AN_ENABLE BIT(12) +#endif + +#ifndef MDIO_VEND2_CTRL1_AN_RESTART +#define MDIO_VEND2_CTRL1_AN_RESTART BIT(9) +#endif + +#ifndef MDIO_VEND2_CTRL1_SS6 +#define MDIO_VEND2_CTRL1_SS6 BIT(6) +#endif + +#ifndef MDIO_VEND2_CTRL1_SS13 +#define MDIO_VEND2_CTRL1_SS13 BIT(13) +#endif + +/* MDIO mask values */ +#define AXGBE_AN_CL73_INT_CMPLT BIT(0) +#define AXGBE_AN_CL73_INC_LINK BIT(1) +#define AXGBE_AN_CL73_PG_RCV BIT(2) +#define AXGBE_AN_CL73_INT_MASK 0x07 + +#define AXGBE_XNP_MCF_NULL_MESSAGE 0x001 +#define AXGBE_XNP_ACK_PROCESSED BIT(12) +#define AXGBE_XNP_MP_FORMATTED BIT(13) +#define AXGBE_XNP_NP_EXCHANGE BIT(15) + +#define AXGBE_KR_TRAINING_START BIT(0) +#define AXGBE_KR_TRAINING_ENABLE BIT(1) + +#define AXGBE_PCS_CL37_BP BIT(12) + +#define AXGBE_AN_CL37_INT_CMPLT BIT(0) +#define AXGBE_AN_CL37_INT_MASK 0x01 + +#define AXGBE_AN_CL37_HD_MASK 0x40 +#define AXGBE_AN_CL37_FD_MASK 0x20 + +#define AXGBE_AN_CL37_PCS_MODE_MASK 0x06 +#define AXGBE_AN_CL37_PCS_MODE_BASEX 0x00 +#define AXGBE_AN_CL37_PCS_MODE_SGMII 0x04 +#define AXGBE_AN_CL37_TX_CONFIG_MASK 0x08 + +/*generic*/ +#define __iomem + +#define rmb () rte_rmb()/* dpdk rte provided rmb */ +#define wmb () rte_wmb()/* dpdk rte provided wmb */ + +#define __le16 u16 +#define __le32 u32 +#define __le64 u64 + +typedef unsigned char u8 ; +typedef unsigned short u16 ; +typedef unsigned int u32 ; +typedef unsigned long long u64 ; +typedef unsigned long long dma_addr_t ; + +static inline uint32_t low32_value (uint64_t addr) +{ +return (addr) &0x0ffffffff ; +} + +static inline uint32_t high32_value (uint64_t addr) +{ +return (addr >>32 ) &0x0ffffffff ; +} + +/*END*/ + +/* Bit setting and getting macros +* The get macro will extract the current bit field value from within +* the variable +* +* The set macro will clear the current bit field value within the +* variable and then set the bit field of the variable to the +* specified value +*/ +#define GET_BITS (_var, _index, _width) \ + (((_var) >> (_index)) & ((0x1 << (_width)) - 1)) + +#define SET_BITS (_var, _index, _width, _val) \ +do { \ + (_var) &= ~(((0x1 << (_width)) - 1) << (_index)); \ + (_var) |= (((_val) & ((0x1 << (_width)) - 1)) << (_index)); \ +} while (0) + +#define GET_BITS_LE (_var, _index, _width) \ + ((rte_le_to_cpu_32((_var)) >> (_index)) & ((0x1 << (_width)) - 1)) + +#define SET_BITS_LE (_var, _index, _width, _val) \ +do { \ + (_var) &= rte_cpu_to_le_32(~(((0x1 << (_width)) - 1) << (_index)));\ + (_var) |= rte_cpu_to_le_32((((_val) & \ + ((0x1 << (_width)) - 1)) << (_index))); \ +} while (0) + +/* Bit setting and getting macros based on register fields +* The get macro uses the bit field definitions formed using the input +* names to extract the current bit field value from within the +* variable +* +* The set macro uses the bit field definitions formed using the input +* names to set the bit field of the variable to the specified value +*/ +#define AXGMAC_GET_BITS (_var, _prefix, _field) \ + GET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH) + +#define AXGMAC_SET_BITS (_var, _prefix, _field, _val) \ + SET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH, (_val)) + +#define AXGMAC_GET_BITS_LE (_var, _prefix, _field) \ + GET_BITS_LE((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH) + +#define AXGMAC_SET_BITS_LE (_var, _prefix, _field, _val) \ + SET_BITS_LE((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH, (_val)) + +/* Macros for reading or writing registers +* The ioread macros will get bit fields or full values using the +* register definitions formed using the input names +* +* The iowrite macros will set bit fields or full values using the +* register definitions formed using the input names +*/ +#define AXGMAC_IOREAD (_pdata, _reg) \ + rte_read32((void *)((_pdata)->xgmac_regs + (_reg))) + +#define AXGMAC_IOREAD_BITS (_pdata, _reg, _field) \ + GET_BITS(AXGMAC_IOREAD((_pdata), _reg), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define AXGMAC_IOWRITE (_pdata, _reg, _val) \ + rte_write32((_val), (void *)((_pdata)->xgmac_regs + (_reg))) + +#define AXGMAC_IOWRITE_BITS (_pdata, _reg, _field, _val) \ +do { \ + u32 reg_val = AXGMAC_IOREAD((_pdata), _reg); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + AXGMAC_IOWRITE((_pdata), _reg, reg_val); \ +} while (0) + +/* Macros for reading or writing MTL queue or traffic class registers +* Similar to the standard read and write macros except that the +* base register value is calculated by the queue or traffic class number +*/ +#define AXGMAC_MTL_IOREAD (_pdata, _n, _reg) \ + rte_read32((void *)((_pdata)->xgmac_regs + \ + MTL_Q_BASE + ((_n) * MTL_Q_INC) + (_reg))) + +#define AXGMAC_MTL_IOREAD_BITS (_pdata, _n, _reg, _field) \ + GET_BITS(AXGMAC_MTL_IOREAD((_pdata), (_n), (_reg)), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define AXGMAC_MTL_IOWRITE (_pdata, _n, _reg, _val) \ + rte_write32((_val), (void *)((_pdata)->xgmac_regs + \ + MTL_Q_BASE + ((_n) * MTL_Q_INC) + (_reg))) + +#define AXGMAC_MTL_IOWRITE_BITS (_pdata, _n, _reg, _field, _val) \ +do { \ + u32 reg_val = AXGMAC_MTL_IOREAD((_pdata), (_n), _reg); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + AXGMAC_MTL_IOWRITE((_pdata), (_n), _reg, reg_val); \ +} while (0) + +/* Macros for reading or writing DMA channel registers +* Similar to the standard read and write macros except that the +* base register value is obtained from the ring +*/ +#define AXGMAC_DMA_IOREAD (_channel, _reg) \ + rte_read32((void *)((_channel)->dma_regs + (_reg))) + +#define AXGMAC_DMA_IOREAD_BITS (_channel, _reg, _field) \ + GET_BITS(AXGMAC_DMA_IOREAD((_channel), _reg), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define AXGMAC_DMA_IOWRITE (_channel, _reg, _val) \ + rte_write32((_val), (void *)((_channel)->dma_regs + (_reg))) + +#define AXGMAC_DMA_IOWRITE_BITS (_channel, _reg, _field, _val) \ +do { \ + u32 reg_val = AXGMAC_DMA_IOREAD((_channel), _reg); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + AXGMAC_DMA_IOWRITE((_channel), _reg, reg_val); \ +} while (0) + +/* Macros for building, reading or writing register values or bits +* within the register values of XPCS registers. +*/ +#define XPCS_GET_BITS (_var, _prefix, _field) \ + GET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH) + +#define XPCS_SET_BITS (_var, _prefix, _field, _val) \ + SET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH, (_val)) + +#define XPCS32_IOWRITE (_pdata, _off, _val) \ + rte_write32(_val, (void *)((_pdata)->xpcs_regs + (_off))) + +#define XPCS32_IOREAD (_pdata, _off) \ + rte_read32((void *)((_pdata)->xpcs_regs + (_off))) + +#define XPCS16_IOWRITE (_pdata, _off, _val) \ + rte_write16(_val, (void *)((_pdata)->xpcs_regs + (_off))) + +#define XPCS16_IOREAD (_pdata, _off) \ + rte_read16((void *)((_pdata)->xpcs_regs + (_off))) + +/* Macros for building, reading or writing register values or bits +* within the register values of SerDes integration registers. +*/ +#define XSIR_GET_BITS (_var, _prefix, _field) \ + GET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH) + +#define XSIR_SET_BITS (_var, _prefix, _field, _val) \ + SET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH, (_val)) + +#define XSIR0_IOREAD (_pdata, _reg) \ + rte_read16((void *)((_pdata)->sir0_regs + (_reg))) + +#define XSIR0_IOREAD_BITS (_pdata, _reg, _field) \ + GET_BITS(XSIR0_IOREAD((_pdata), _reg), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define XSIR0_IOWRITE (_pdata, _reg, _val) \ + rte_write16((_val), (void *)((_pdata)->sir0_regs + (_reg))) + +#define XSIR0_IOWRITE_BITS (_pdata, _reg, _field, _val) \ +do { \ + u16 reg_val = XSIR0_IOREAD((_pdata), _reg); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + XSIR0_IOWRITE((_pdata), _reg, reg_val); \ +} while (0) + +#define XSIR1_IOREAD (_pdata, _reg) \ + rte_read16((void *)((_pdata)->sir1_regs + _reg)) + +#define XSIR1_IOREAD_BITS (_pdata, _reg, _field) \ + GET_BITS(XSIR1_IOREAD((_pdata), _reg), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define XSIR1_IOWRITE (_pdata, _reg, _val) \ + rte_write16((_val), (void *)((_pdata)->sir1_regs + (_reg))) + +#define XSIR1_IOWRITE_BITS (_pdata, _reg, _field, _val) \ +do { \ + u16 reg_val = XSIR1_IOREAD((_pdata), _reg); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + XSIR1_IOWRITE((_pdata), _reg, reg_val); \ +} while (0) + +/* Macros for building, reading or writing register values or bits +* within the register values of SerDes RxTx registers. +*/ +#define XRXTX_IOREAD (_pdata, _reg) \ + rte_read16((void *)((_pdata)->rxtx_regs + (_reg))) + +#define XRXTX_IOREAD_BITS (_pdata, _reg, _field) \ + GET_BITS(XRXTX_IOREAD((_pdata), _reg), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define XRXTX_IOWRITE (_pdata, _reg, _val) \ + rte_write16((_val), (void *)((_pdata)->rxtx_regs + (_reg))) + +#define XRXTX_IOWRITE_BITS (_pdata, _reg, _field, _val) \ +do { \ + u16 reg_val = XRXTX_IOREAD((_pdata), _reg); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + XRXTX_IOWRITE((_pdata), _reg, reg_val); \ +} while (0) + +/* Macros for building, reading or writing register values or bits +* within the register values of MAC Control registers. +*/ +#define XP_GET_BITS (_var, _prefix, _field) \ + GET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH) + +#define XP_SET_BITS (_var, _prefix, _field, _val) \ + SET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH, (_val)) + +#define XP_IOREAD (_pdata, _reg) \ + rte_read32((void *)((_pdata)->xprop_regs + (_reg))) + +#define XP_IOREAD_BITS (_pdata, _reg, _field) \ + GET_BITS(XP_IOREAD((_pdata), (_reg)), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define XP_IOWRITE (_pdata, _reg, _val) \ + rte_write32((_val), (void *)((_pdata)->xprop_regs + (_reg))) + +#define XP_IOWRITE_BITS (_pdata, _reg, _field, _val) \ +do { \ + u32 reg_val = XP_IOREAD((_pdata), (_reg)); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + XP_IOWRITE((_pdata), (_reg), reg_val); \ +} while (0) + +/* Macros for building, reading or writing register values or bits +* within the register values of I2C Control registers. +*/ +#define XI2C_GET_BITS (_var, _prefix, _field) \ + GET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH) + +#define XI2C_SET_BITS (_var, _prefix, _field, _val) \ + SET_BITS((_var), \ + _prefix##_##_field##_INDEX, \ + _prefix##_##_field##_WIDTH, (_val)) + +#define XI2C_IOREAD (_pdata, _reg) \ + rte_read32((void *)((_pdata)->xi2c_regs + (_reg))) + +#define XI2C_IOREAD_BITS (_pdata, _reg, _field) \ + GET_BITS(XI2C_IOREAD((_pdata), (_reg)), \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH) + +#define XI2C_IOWRITE (_pdata, _reg, _val) \ + rte_write32((_val), (void *)((_pdata)->xi2c_regs + (_reg))) + +#define XI2C_IOWRITE_BITS (_pdata, _reg, _field, _val) \ +do { \ + u32 reg_val = XI2C_IOREAD((_pdata), (_reg)); \ + SET_BITS(reg_val, \ + _reg##_##_field##_INDEX, \ + _reg##_##_field##_WIDTH, (_val)); \ + XI2C_IOWRITE((_pdata), (_reg), reg_val); \ +} while (0) + +/* Macros for building, reading or writing register values or bits +* using MDIO. Different from above because of the use of standardized +* Linux include values. No shifting is performed with the bit +* operations, everything works on mask values. +*/ +#define XMDIO_READ (_pdata, _mmd, _reg) \ + ((_pdata)->hw_if.read_mmd_regs((_pdata), 0, \ + MII_ADDR_C45 | ((_mmd) << 16) | ((_reg) & 0xffff))) + +#define XMDIO_READ_BITS (_pdata, _mmd, _reg, _mask) \ + (XMDIO_READ((_pdata), _mmd, _reg) & _mask) + +#define XMDIO_WRITE (_pdata, _mmd, _reg, _val) \ + ((_pdata)->hw_if.write_mmd_regs((_pdata), 0, \ + MII_ADDR_C45 | ((_mmd) << 16) | ((_reg) & 0xffff), (_val))) + +#define XMDIO_WRITE_BITS (_pdata, _mmd, _reg, _mask, _val) \ +do { \ + u32 mmd_val = XMDIO_READ((_pdata), (_mmd), (_reg)); \ + mmd_val &= ~(_mask); \ + mmd_val |= (_val); \ + XMDIO_WRITE((_pdata), (_mmd), (_reg), (mmd_val)); \ +} while (0) + +/* +* time_after(a,b) returns true if the time a is after time b. +* +* Do this with "<0" and ">=0" to only test the sign of the result. A +* good compiler would generate better code (and a really good compiler +* wouldn't care). Gcc is currently neither. +*/ +#define time_after (a, b) ((long)((b) - (a)) < 0) +#define time_before (a, b) time_after(b, a) + +#define time_after_eq (a, b) ((long)((a) - (b)) >= 0) +#define time_before_eq (a, b) time_after_eq(b, a) + +/*---bitmap support apis---*/ +static inline int axgbe_test_bit (int nr,volatile unsigned long *addr) +{ +int res; + +rte_mb (); + res = ((*addr) & (1UL << nr)) !=0 ; +rte_mb (); +return res; +} + +static inline void axgbe_set_bit (unsigned int nr,volatile unsigned long *addr) +{ +__sync_fetch_and_or (addr, (1UL << nr)); +} + +static inline void axgbe_clear_bit (int nr,volatile unsigned long *addr) +{ +__sync_fetch_and_and (addr, ~(1UL << nr)); +} + +static inline int axgbe_test_and_clear_bit (int nr,volatile unsigned long *addr) +{ +unsigned long mask = (1UL << nr); + +return __sync_fetch_and_and (addr, ~mask) & mask; +} + +static inline unsigned long msecs_to_timer_cycles (unsigned int m) +{ +return rte_get_timer_hz () * (m /1000 ); +} +#endif /* __AXGBE_COMMON_H__ */
Signature · 1 line
2.7.4
PATCH v3 3/18 net/axgbe: add phy register map and helper macros
In reply to Ravi Kumar--- drivers/net/axgbe/axgbe_phy.h | 314 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 314 insertions(+) create mode 100644 drivers/net/axgbe/axgbe_phy.h
drivers/net/axgbe/axgbe_phy.h new file +314 -0
@@ -0,0 +1,314 @@ +/*- +* Copyright(c) 2017 Advanced Micro Devices, Inc. +* All rights reserved. +* +* AMD 10Gb Ethernet driver +* +* This file is available to you under your choice of the following two +* licenses: +* +* License 1: GPLv2 +* +* Copyright (c) 2017 Advanced Micro Devices, Inc. +* +* This file is free software; you may copy, redistribute and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 2 of the License, or +* (at your option) any later version. +* +* This file is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +* +* This file incorporates work covered by the following copyright and +* permission notice: +* +* Copyright (c) 2013 Synopsys, Inc. +* +* The Synopsys DWC ETHER XGMAC Software Driver and documentation +* (hereinafter "Software") is an unsupported proprietary work of Synopsys, +* Inc. unless otherwise expressly agreed to in writing between Synopsys +* and you. +* +* The Software IS NOT an item of Licensed Software or Licensed Product +* under any End User Software License Agreement or Agreement for Licensed +* Product with Synopsys or any supplement thereto. Permission is hereby +* granted, free of charge, to any person obtaining a copy of this software +* annotated with this license and the Software, to deal in the Software +* without restriction, including without limitation the rights to use, +* copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* of the Software, and to permit persons to whom the Software is furnished +* to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" +* BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +* PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS +* 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. +* +* License 2: Modified BSD +* +* Copyright (c) 2017 Advanced Micro Devices, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * 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. +* * Neither the name of Advanced Micro Devices, Inc. nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "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 +* <COPYRIGHT HOLDER> 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. +* +* This file incorporates work covered by the following copyright and +* permission notice: +* +* Copyright (c) 2013 Synopsys, Inc. +* +* The Synopsys DWC ETHER XGMAC Software Driver and documentation +* (hereinafter "Software") is an unsupported proprietary work of Synopsys, +* Inc. unless otherwise expressly agreed to in writing between Synopsys +* and you. +* +* The Software IS NOT an item of Licensed Software or Licensed Product +* under any End User Software License Agreement or Agreement for Licensed +* Product with Synopsys or any supplement thereto. Permission is hereby +* granted, free of charge, to any person obtaining a copy of this software +* annotated with this license and the Software, to deal in the Software +* without restriction, including without limitation the rights to use, +* copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* of the Software, and to permit persons to whom the Software is furnished +* to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" +* BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +* PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS +* 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 __AXGBE_PHY_H__ +#define __AXGBE_PHY_H__ + +#define SPEED_10 10 +#define SPEED_100 100 +#define SPEED_1000 1000 +#define SPEED_2500 2500 +#define SPEED_10000 10000 + + +/* Or MII_ADDR_C45 into regnum for read/write on mii_bus to enable the 21 bit +* IEEE 802.3ae clause 45 addressing mode used by 10GIGE phy chips. +*/ +#define MII_ADDR_C45 (1 << 30) + +/* Basic mode status register. */ +#define BMSR_LSTATUS 0x0004/* Link status */ + +/* Status register 1. */ +#define MDIO_STAT1_LSTATUS BMSR_LSTATUS + +/* Generic MII registers. */ +#define MII_BMCR 0x00/* Basic mode control register */ +#define MII_BMSR 0x01/* Basic mode status register */ +#define MII_PHYSID1 0x02/* PHYS ID 1 */ +#define MII_PHYSID2 0x03/* PHYS ID 2 */ +#define MII_ADVERTISE 0x04/* Advertisement control reg */ +#define MII_LPA 0x05/* Link partner ability reg */ +#define MII_EXPANSION 0x06/* Expansion register */ +#define MII_CTRL1000 0x09/* 1000BASE-T control */ +#define MII_STAT1000 0x0a/* 1000BASE-T status */ +#define MII_MMD_CTRL 0x0d/* MMD Access Control Register */ +#define MII_MMD_DATA 0x0e/* MMD Access Data Register */ +#define MII_ESTATUS 0x0f/* Extended Status */ +#define MII_DCOUNTER 0x12/* Disconnect counter */ +#define MII_FCSCOUNTER 0x13/* False carrier counter */ +#define MII_NWAYTEST 0x14/* N-way auto-neg test reg */ +#define MII_RERRCOUNTER 0x15/* Receive error counter */ +#define MII_SREVISION 0x16/* Silicon revision */ +#define MII_RESV1 0x17/* Reserved... */ +#define MII_LBRERROR 0x18/* Lpback, rx, bypass error */ +#define MII_PHYADDR 0x19/* PHY address */ +#define MII_RESV2 0x1a/* Reserved... */ +#define MII_TPISTATUS 0x1b/* TPI status for 10mbps */ +#define MII_NCONFIG 0x1c/* Network interface config */ + +/* Basic mode control register. */ +#define BMCR_RESV 0x003f/* Unused... */ +#define BMCR_SPEED1000 0x0040/* MSB of Speed (1000) */ +#define BMCR_CTST 0x0080/* Collision test */ +#define BMCR_FULLDPLX 0x0100/* Full duplex */ +#define BMCR_ANRESTART 0x0200/* Auto negotiation restart */ +#define BMCR_ISOLATE 0x0400/* Isolate data paths from MII */ +#define BMCR_PDOWN 0x0800/* Enable low power state */ +#define BMCR_ANENABLE 0x1000/* Enable auto negotiation */ +#define BMCR_SPEED100 0x2000/* Select 100Mbps */ +#define BMCR_LOOPBACK 0x4000/* TXD loopback bits */ +#define BMCR_RESET 0x8000/* Reset to default state */ +#define BMCR_SPEED10 0x0000/* Select 10Mbps */ + + +/* MDIO Manageable Devices (MMDs). */ +#define MDIO_MMD_PMAPMD 1/* Physical Medium Attachment +* Physical Medium Dependent +*/ +#define MDIO_MMD_WIS 2/* WAN Interface Sublayer */ +#define MDIO_MMD_PCS 3/* Physical Coding Sublayer */ +#define MDIO_MMD_PHYXS 4/* PHY Extender Sublayer */ +#define MDIO_MMD_DTEXS 5/* DTE Extender Sublayer */ +#define MDIO_MMD_TC 6/* Transmission Convergence */ +#define MDIO_MMD_AN 7/* Auto-Negotiation */ +#define MDIO_MMD_C22EXT 29/* Clause 22 extension */ +#define MDIO_MMD_VEND1 30/* Vendor specific 1 */ +#define MDIO_MMD_VEND2 31/* Vendor specific 2 */ + +/* Generic MDIO registers. */ +#define MDIO_CTRL1 MII_BMCR +#define MDIO_STAT1 MII_BMSR +#define MDIO_DEVID1 MII_PHYSID1 +#define MDIO_DEVID2 MII_PHYSID2 +#define MDIO_SPEED 4/* Speed ability */ +#define MDIO_DEVS1 5/* Devices in package */ +#define MDIO_DEVS2 6 +#define MDIO_CTRL2 7/* 10G control 2 */ +#define MDIO_STAT2 8/* 10G status 2 */ +#define MDIO_PMA_TXDIS 9/* 10G PMA/PMD transmit disable */ +#define MDIO_PMA_RXDET 10/* 10G PMA/PMD receive signal detect */ +#define MDIO_PMA_EXTABLE 11/* 10G PMA/PMD extended ability */ +#define MDIO_PKGID1 14/* Package identifier */ +#define MDIO_PKGID2 15 +#define MDIO_AN_ADVERTISE 16/* AN advertising (base page) */ +#define MDIO_AN_LPA 19/* AN LP abilities (base page) */ +#define MDIO_PCS_EEE_ABLE 20/* EEE Capability register */ +#define MDIO_PCS_EEE_WK_ERR 22/* EEE wake error counter */ +#define MDIO_PHYXS_LNSTAT 24/* PHY XGXS lane state */ +#define MDIO_AN_EEE_ADV 60/* EEE advertisement */ +#define MDIO_AN_EEE_LPABLE 61/* EEE link partner ability */ + +/* Media-dependent registers. */ +#define MDIO_PMA_10GBT_SWAPPOL 130/* 10GBASE-T pair swap & polarity */ +#define MDIO_PMA_10GBT_TXPWR 131/* 10GBASE-T TX power control */ +#define MDIO_PMA_10GBT_SNR 133/* 10GBASE-T SNR margin, lane A. +* Lanes B-D are numbered 134-136. +*/ +#define MDIO_PMA_10GBR_FECABLE 170/* 10GBASE-R FEC ability */ +#define MDIO_PCS_10GBX_STAT1 24/* 10GBASE-X PCS status 1 */ +#define MDIO_PCS_10GBRT_STAT1 32/* 10GBASE-R/-T PCS status 1 */ +#define MDIO_PCS_10GBRT_STAT2 33/* 10GBASE-R/-T PCS status 2 */ +#define MDIO_AN_10GBT_CTRL 32/* 10GBASE-T auto-negotiation control */ +#define MDIO_AN_10GBT_STAT 33/* 10GBASE-T auto-negotiation status */ + +/* Control register 1. */ +/* Enable extended speed selection */ +#define MDIO_CTRL1_SPEEDSELEXT (BMCR_SPEED1000 | BMCR_SPEED100) +/* All speed selection bits */ +#define MDIO_CTRL1_SPEEDSEL (MDIO_CTRL1_SPEEDSELEXT | 0x003c) +#define MDIO_CTRL1_FULLDPLX BMCR_FULLDPLX +#define MDIO_CTRL1_LPOWER BMCR_PDOWN +#define MDIO_CTRL1_RESET BMCR_RESET +#define MDIO_PMA_CTRL1_LOOPBACK 0x0001 +#define MDIO_PMA_CTRL1_SPEED1000 BMCR_SPEED1000 +#define MDIO_PMA_CTRL1_SPEED100 BMCR_SPEED100 +#define MDIO_PCS_CTRL1_LOOPBACK BMCR_LOOPBACK +#define MDIO_PHYXS_CTRL1_LOOPBACK BMCR_LOOPBACK +#define MDIO_AN_CTRL1_RESTART BMCR_ANRESTART +#define MDIO_AN_CTRL1_ENABLE BMCR_ANENABLE +#define MDIO_AN_CTRL1_XNP 0x2000/* Enable extended next page */ +#define MDIO_PCS_CTRL1_CLKSTOP_EN 0x400/* Stop the clock during LPI */ + + + + + +/* PMA 10GBASE-R FEC ability register. */ +#define MDIO_PMA_10GBR_FECABLE_ABLE 0x0001/* FEC ability */ +#define MDIO_PMA_10GBR_FECABLE_ERRABLE 0x0002/* FEC error indic. ability */ + + +/* Autoneg related */ +#define ADVERTISED_Autoneg (1 << 6) +#define SUPPORTED_Autoneg (1 << 6) +#define AUTONEG_DISABLE 0x00 +#define AUTONEG_ENABLE 0x01 + +#define ADVERTISED_Pause (1 << 13) +#define ADVERTISED_Asym_Pause (1 << 14) + +#define SUPPORTED_Pause (1 << 13) +#define SUPPORTED_Asym_Pause (1 << 14) + +#define SUPPORTED_Backplane (1 << 16) +#define SUPPORTED_TP (1 << 7) + +#define ADVERTISED_10000baseR_FEC (1 << 20) + +#define SUPPORTED_10000baseR_FEC (1 << 20) + +#define SUPPORTED_FIBRE (1 << 10) + +#define ADVERTISED_10000baseKR_Full (1 << 19) +#define ADVERTISED_10000baseT_Full (1 << 12) +#define ADVERTISED_2500baseX_Full (1 << 15) +#define ADVERTISED_1000baseKX_Full (1 << 17) +#define ADVERTISED_1000baseT_Full (1 << 5) +#define ADVERTISED_100baseT_Full (1 << 3) +#define ADVERTISED_TP (1 << 7) +#define ADVERTISED_FIBRE (1 << 10) +#define ADVERTISED_Backplane (1 << 16) + +#define SUPPORTED_1000baseKX_Full (1 << 17) +#define SUPPORTED_10000baseKR_Full (1 << 19) +#define SUPPORTED_2500baseX_Full (1 << 15) +#define SUPPORTED_100baseT_Full (1 << 2) +#define SUPPORTED_1000baseT_Full (1 << 5) +#define SUPPORTED_10000baseT_Full (1 << 12) +#define SUPPORTED_2500baseX_Full (1 << 15) + + +#define SPEED_UNKNOWN -1 + +/* Duplex, half or full. */ +#define DUPLEX_HALF 0x00 +#define DUPLEX_FULL 0x01 +#define DUPLEX_UNKNOWN 0xff + +#endif +/* PHY */
Signature · 1 line
2.7.4
PATCH v3 4/18 net/axgbe: add structures for MAC initialization and reset
In reply to Ravi Kumar--- drivers/net/axgbe/Makefile | 1 + drivers/net/axgbe/axgbe_dev.c | 167 +++++++++++++++++++ drivers/net/axgbe/axgbe_ethdev.c | 301 ++++++++++++++++++++++++++++++++- drivers/net/axgbe/axgbe_ethdev.h | 349 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 816 insertions(+), 2 deletions(-) create mode 100644 drivers/net/axgbe/axgbe_dev.c
drivers/net/axgbe/Makefile +1 -0
@@ -142,5 +142,6 @@ LIBABIVER := 1 # all source are stored in SRCS-y # SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_ethdev.c +SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_dev.c include $(RTE_SDK)/mk/rte.lib.mk
drivers/net/axgbe/axgbe_dev.c new file +167 -0
167 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.c +299 -2
336 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.h +349 -0
361 lines not on this page · raw message
Signature · 1 line
2.7.4
Re: [PATCH v3 04/18] net/axgbe: add structures for MAC initialization and reset
Quoted 1 line · Ravi Kumar
Signed-off-by Ravi Kumar <[email protected]>
<...>
Quoted 5 lines
drivers/net/axgbe/axgbe_ethdev.c +1
-0@@ -167,6 +358,106 @@ eth_axgbe_dev_init(struct rte_eth_dev *eth_dev) pci_dev =RTE_DEV_TO_PCI (eth_dev->device); pdata->pci_dev = pci_dev; + pdata->xgmac_regs =
drivers/net/axgbe/axgbe_ethdev.c eth_axgbe_dev_init(struct rte_eth_dev *eth_dev) · line 371
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +10
-0+ (uint64_t )pci_dev->mem_resource[AXGBE_AXGMAC_BAR ].addr; + pdata->xprop_regs = pdata->xgmac_regs +AXGBE_MAC_PROP_OFFSET ; + pdata->xi2c_regs = pdata->xgmac_regs +AXGBE_I2C_CTRL_OFFSET ; + pdata->xpcs_regs = (uint64_t )pci_dev->mem_resource[AXGBE_XPCS_BAR ].addr; + +/* version specific driver data*/ +if (pci_dev->id.device_id ==0x1458 ) + pdata->vdata = &axgbe_v2a; +else + pdata->vdata = &axgbe_v2b;
Can replace hardcoded value 0x1458 with define.
<...>
PATCH v3 5/18 net/axgbe: add phy initialization and related apis
In reply to Ravi Kumar--- drivers/net/axgbe/Makefile | 3 + drivers/net/axgbe/axgbe_dev.c | 188 +++++++++ drivers/net/axgbe/axgbe_ethdev.c | 11 + drivers/net/axgbe/axgbe_ethdev.h | 172 ++++++++ drivers/net/axgbe/axgbe_i2c.c | 453 +++++++++++++++++++++ drivers/net/axgbe/axgbe_mdio.c | 203 ++++++++++ drivers/net/axgbe/axgbe_phy_impl.c | 799 +++++++++++++++++++++++++++++++++++++ 7 files changed, 1829 insertions(+) create mode 100644 drivers/net/axgbe/axgbe_i2c.c create mode 100644 drivers/net/axgbe/axgbe_mdio.c create mode 100644 drivers/net/axgbe/axgbe_phy_impl.c
drivers/net/axgbe/Makefile +3 -0
@@ -143,5 +143,8 @@ LIBABIVER := 1 # SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_ethdev.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_dev.c +SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_mdio.c +SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_phy_impl.c +SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_i2c.c include $(RTE_SDK)/mk/rte.lib.mk
drivers/net/axgbe/axgbe_dev.c +188 -0
198 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.c +11 -0
@@ -147,6 +147,7 @@ static const struct rte_pci_id pci_id_axgbe_map[] = { };static struct axgbe_version_data axgbe_v2a = { + .init_function_ptrs_phy_impl = axgbe_init_function_ptrs_phy_v2, .xpcs_access =AXGBE_XPCS_ACCESS_V2 , .mmc_64bit =1 , .tx_max_fifo_size =229376 ,
@@ -157,6 +158,7 @@ static struct axgbe_version_data axgbe_v2a = { };static struct axgbe_version_data axgbe_v2b = { + .init_function_ptrs_phy_impl = axgbe_init_function_ptrs_phy_v2, .xpcs_access =AXGBE_XPCS_ACCESS_V2 , .mmc_64bit =1 , .tx_max_fifo_size =65536 ,
@@ -271,6 +273,9 @@ static void axgbe_get_all_hw_features(struct axgbe_port *pdata)static void axgbe_init_all_fptrs (struct axgbe_port *pdata) {axgbe_init_function_ptrs_dev (&pdata->hw_if); +axgbe_init_function_ptrs_phy (&pdata->phy_if); +axgbe_init_function_ptrs_i2c (&pdata->i2c_if); + pdata->vdata->init_function_ptrs_phy_impl (&pdata->phy_if); }static void axgbe_set_counts (struct axgbe_port *pdata)
@@ -458,6 +463,12 @@ eth_axgbe_dev_init(struct rte_eth_dev *eth_dev)pthread_mutex_init (&pdata->an_mutex,NULL );pthread_mutex_init (&pdata->phy_mutex,NULL ); + ret = pdata->phy_if.phy_init (pdata); +if (ret) { +rte_free (eth_dev->data->mac_addrs); +return ret; + } +PMD_INIT_LOG (DEBUG ,"port %d vendorID=0x%x deviceID=0x%x" , eth_dev->data->port_id, pci_dev->id.vendor_id, pci_dev->id.device_id);
drivers/net/axgbe/axgbe_ethdev.h +172 -0
203 lines not on this page · raw message
drivers/net/axgbe/axgbe_i2c.c new file +453 -0
453 lines not on this page · raw message
drivers/net/axgbe/axgbe_mdio.c new file +203 -0
203 lines not on this page · raw message
drivers/net/axgbe/axgbe_phy_impl.c new file +799 -0
799 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v3 6/18 net/axgbe: add phy programming apis
In reply to Ravi Kumar--- drivers/net/axgbe/axgbe_dev.c | 27 + drivers/net/axgbe/axgbe_mdio.c | 963 +++++++++++++++++++++++++ drivers/net/axgbe/axgbe_phy_impl.c | 1397 ++++++++++++++++++++++++++++++++++++ 3 files changed, 2387 insertions(+)
drivers/net/axgbe/axgbe_dev.c +27 -0
@@ -310,6 +310,30 @@ static void axgbe_write_mmd_regs(struct axgbe_port *pdata, int prtad, } } +static int axgbe_set_speed (struct axgbe_port *pdata,int speed) +{ +unsigned int ss; + +switch (speed) { +case SPEED_1000 : + ss =0x03 ; +break ; +case SPEED_2500 : + ss =0x02 ; +break ; +case SPEED_10000 : + ss =0x00 ; +break ; +default : +return -EINVAL ; + } + +if (AXGMAC_IOREAD_BITS (pdata,MAC_TCR ,SS ) != ss) +AXGMAC_IOWRITE_BITS (pdata,MAC_TCR ,SS , ss); + +return 0 ; +} +static int __axgbe_exit (struct axgbe_port *pdata) {unsigned int count =2000 ;
@@ -346,9 +370,12 @@ void axgbe_init_function_ptrs_dev(struct axgbe_hw_if *hw_if) { hw_if->exit = axgbe_exit; + hw_if->read_mmd_regs = axgbe_read_mmd_regs; hw_if->write_mmd_regs = axgbe_write_mmd_regs; + hw_if->set_speed = axgbe_set_speed; + hw_if->set_ext_mii_mode = axgbe_set_ext_mii_mode; hw_if->read_ext_mii_regs = axgbe_read_ext_mii_regs; hw_if->write_ext_mii_regs = axgbe_write_ext_mii_regs;
drivers/net/axgbe/axgbe_mdio.c +963 -0
973 lines not on this page · raw message
drivers/net/axgbe/axgbe_phy_impl.c +1397 -0
1,413 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v3 7/18 net/axgbe: add interrupt handler for autonegotiation
In reply to Ravi Kumar--- drivers/net/axgbe/axgbe_ethdev.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+)
drivers/net/axgbe/axgbe_ethdev.c +37 -0
@@ -131,6 +131,7 @@static int eth_axgbe_dev_init (struct rte_eth_dev *eth_dev);static int eth_axgbe_dev_uninit (struct rte_eth_dev *eth_dev); +static void axgbe_dev_interrupt_handler (void *param);/* The set of PCI devices this driver supports */ #define AMD_PCI_VENDOR_ID 0x1022
@@ -168,6 +169,30 @@ static struct axgbe_version_data axgbe_v2b = { .i2c_support = 1, }; +/* +* Interrupt handler triggered by NIC for handling +* specific interrupt. +* +* @param handle +* Pointer to interrupt handle. +* @param param +* The address of parameter (struct rte_eth_dev *) regsitered before. +* +* @return +* void +*/ +static void +axgbe_dev_interrupt_handler (void *param) +{ +struct rte_eth_dev *dev = (struct rte_eth_dev *)param; +struct axgbe_port *pdata = dev->data->dev_private; + + pdata->phy_if.an_isr (pdata); + +/* Enable interrupts since disabled after generation*/ +rte_intr_enable (&pdata->pci_dev->intr_handle); +} +static void axgbe_get_all_hw_features (struct axgbe_port *pdata) {unsigned int mac_hfr0, mac_hfr1, mac_hfr2;
@@ -469,6 +494,9 @@ eth_axgbe_dev_init(struct rte_eth_dev *eth_dev)return ret; } +rte_intr_callback_register (&pci_dev->intr_handle, + axgbe_dev_interrupt_handler, + (void *)eth_dev);PMD_INIT_LOG (DEBUG ,"port %d vendorID=0x%x deviceID=0x%x" , eth_dev->data->port_id, pci_dev->id.vendor_id, pci_dev->id.device_id);
@@ -479,15 +507,24 @@ eth_axgbe_dev_init(struct rte_eth_dev *eth_dev)static int eth_axgbe_dev_uninit (struct rte_eth_dev *eth_dev) { +struct rte_pci_device *pci_dev; +PMD_INIT_FUNC_TRACE ();if (rte_eal_process_type () !=RTE_PROC_PRIMARY )return 0 ; + pci_dev =RTE_DEV_TO_PCI (eth_dev->device);/*Free macaddres*/ rte_free (eth_dev->data->mac_addrs); eth_dev->data->mac_addrs =NULL ; +/* disable uio intr before callback unregister */ +rte_intr_disable (&pci_dev->intr_handle); +rte_intr_callback_unregister (&pci_dev->intr_handle, + axgbe_dev_interrupt_handler, + (void *)eth_dev); +return 0 ; }
Signature · 1 line
2.7.4
PATCH v3 8/18 net/axgbe: add transmit and receive queue setup apis
In reply to Ravi Kumar--- drivers/net/axgbe/Makefile | 1 + drivers/net/axgbe/axgbe_ethdev.c | 81 +++++++++ drivers/net/axgbe/axgbe_ethdev.h | 36 ++++ drivers/net/axgbe/axgbe_rxtx.c | 363 +++++++++++++++++++++++++++++++++++++++ drivers/net/axgbe/axgbe_rxtx.h | 289 +++++++++++++++++++++++++++++++ 5 files changed, 770 insertions(+) create mode 100644 drivers/net/axgbe/axgbe_rxtx.c create mode 100644 drivers/net/axgbe/axgbe_rxtx.h
drivers/net/axgbe/Makefile +1 -0
@@ -146,5 +146,6 @@ SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_dev.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_mdio.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_phy_impl.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_i2c.c +SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_rxtx.c include $(RTE_SDK)/mk/rte.lib.mk
drivers/net/axgbe/axgbe_ethdev.c +81 -0
123 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.h +36 -0
@@ -132,6 +132,16 @@#include <rte_lcore.h> #include "axgbe_common.h" +#define IRQ 0xff +#define VLAN_HLEN 4 + +#define AXGBE_TX_MAX_BUF_SIZE (0x3fff & ~(64 - 1)) +#define AXGBE_RX_MAX_BUF_SIZE (0x3fff & ~(64 - 1)) +#define AXGBE_RX_MIN_BUF_SIZE (ETHER_MAX_LEN + VLAN_HLEN) +#define AXGBE_MAX_MAC_ADDRS 1 + +#define AXGBE_RX_BUF_ALIGN 64 +#define AXGBE_MAX_DMA_CHANNELS 16#define AXGBE_MAX_QUEUES 16#define AXGBE_PRIORITY_QUEUES 8
@@ -147,6 +157,23 @@#define AXGBE_DMA_SYS_ARCACHE 0x0#define AXGBE_DMA_SYS_AWCACHE 0x0 +/* DMA channel interrupt modes */ +#define AXGBE_IRQ_MODE_EDGE 0 +#define AXGBE_IRQ_MODE_LEVEL 1 + +#define AXGBE_DMA_INTERRUPT_MASK 0x31c7 + +#define AXGMAC_MIN_PACKET 60 +#define AXGMAC_STD_PACKET_MTU 1500 +#define AXGMAC_MAX_STD_PACKET 1518 +#define AXGMAC_JUMBO_PACKET_MTU 9000 +#define AXGMAC_MAX_JUMBO_PACKET 9018 +/* Inter-frame gap + preamble */ +#define AXGMAC_ETH_PREAMBLE (12 + 8) + +#define AXGMAC_PFC_DATA_LEN 46 +#define AXGMAC_PFC_DELAYS 14000 +/* PCI BAR mapping */ #define AXGBE_AXGMAC_BAR 0#define AXGBE_XPCS_BAR 1
@@ -630,6 +657,10 @@ struct axgbe_port {struct ether_addr mac_addr; +/* Software Tx/Rx structure pointers*/ +void **rx_queues; +void **tx_queues; +/* MDIO/PHY related settings */ unsigned int phy_started;void *phy_data;
@@ -656,6 +687,11 @@ struct axgbe_port {/* I2C support */ struct axgbe_i2c i2c;volatile int i2c_complete; + +/* CRC stripping by H/w for Rx packet*/ +int crc_strip_enable; +/* csum enable to hardware */ +uint32_t rx_csum_enable; };void axgbe_init_function_ptrs_dev (struct axgbe_hw_if *hw_if);
drivers/net/axgbe/axgbe_rxtx.c new file +363 -0
363 lines not on this page · raw message
drivers/net/axgbe/axgbe_rxtx.h new file +289 -0
289 lines not on this page · raw message
Signature · 1 line
2.7.4
Re: [PATCH v3 08/18] net/axgbe: add transmit and receive queue setup apis
Quoted 1 line · Ravi Kumar
Signed-off-by Ravi Kumar <[email protected]>
<...>
drivers/net/axgbe/axgbe_rxtx.c line 201
Quoted 3 lines
drivers/net/axgbe/axgbe_rxtx.c new file +3
-0+ + rxq->crc_len = (uint8_t )((dev->data->dev_conf.rxmode.hw_strip_crc) ?0 : +ETHER_CRC_LEN );
This is also changed recently, new ethdev offloading API introduced which PMDs target to switch this release.
According new offloading API, instead of using dev->data->dev_conf.rxmode.hw_strip_crc, (dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_CRC_STRIP) should be checked.
<...>
PATCH v3 9/18 net/axgbe: add DMA programming and dev start and stop apis
In reply to Ravi Kumar--- drivers/net/axgbe/axgbe_dev.c | 844 +++++++++++++++++++++++++++++++++++++++ drivers/net/axgbe/axgbe_ethdev.c | 96 +++++ 2 files changed, 940 insertions(+)
drivers/net/axgbe/axgbe_dev.c +844 -0
@@ -128,6 +128,13 @@#include "axgbe_ethdev.h" #include "axgbe_common.h" #include "axgbe_phy.h" +#include "axgbe_rxtx.h" + +static inline unsigned int axgbe_get_max_frame (struct axgbe_port *pdata) +{ +return pdata->eth_dev->data->mtu +ETHER_HDR_LEN + +ETHER_CRC_LEN +VLAN_HLEN ; +}/* query busy bit */ static int mdio_complete (struct axgbe_port *pdata)
@@ -334,6 +341,191 @@ static int axgbe_set_speed(struct axgbe_port *pdata, int speed)return 0 ; } +static int axgbe_disable_tx_flow_control (struct axgbe_port *pdata) +{ +unsigned int max_q_count, q_count; +unsigned int reg, reg_val; +unsigned int i; + +/* Clear MTL flow control */ +for (i =0 ; i < pdata->rx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQOMR ,EHFC ,0 ); + +/* Clear MAC flow control */ + max_q_count =AXGMAC_MAX_FLOW_CONTROL_QUEUES ; + q_count =RTE_MIN (pdata->tx_q_count, + max_q_count); + reg =MAC_Q0TFCR ; +for (i =0 ; i < q_count; i++) { + reg_val =AXGMAC_IOREAD (pdata, reg); +AXGMAC_SET_BITS (reg_val,MAC_Q0TFCR ,TFE ,0 ); +AXGMAC_IOWRITE (pdata, reg, reg_val); + + reg +=MAC_QTFCR_INC ; + } + +return 0 ; +} + +static int axgbe_enable_tx_flow_control (struct axgbe_port *pdata) +{ +unsigned int max_q_count, q_count; +unsigned int reg, reg_val; +unsigned int i; + +/* Set MTL flow control */ +for (i =0 ; i < pdata->rx_q_count; i++) { +unsigned int ehfc =0 ; + +/* Flow control thresholds are established */ +if (pdata->rx_rfd[i]) + ehfc =1 ; + +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQOMR ,EHFC , ehfc); + } + +/* Set MAC flow control */ + max_q_count =AXGMAC_MAX_FLOW_CONTROL_QUEUES ; + q_count =RTE_MIN (pdata->tx_q_count, + max_q_count); + reg =MAC_Q0TFCR ; +for (i =0 ; i < q_count; i++) { + reg_val =AXGMAC_IOREAD (pdata, reg); + +/* Enable transmit flow control */ +AXGMAC_SET_BITS (reg_val,MAC_Q0TFCR ,TFE ,1 ); +/* Set pause time */ +AXGMAC_SET_BITS (reg_val,MAC_Q0TFCR ,PT ,0xffff ); + +AXGMAC_IOWRITE (pdata, reg, reg_val); + + reg +=MAC_QTFCR_INC ; + } + +return 0 ; +} + +static int axgbe_disable_rx_flow_control (struct axgbe_port *pdata) +{ +AXGMAC_IOWRITE_BITS (pdata,MAC_RFCR ,RFE ,0 ); + +return 0 ; +} + +static int axgbe_enable_rx_flow_control (struct axgbe_port *pdata) +{ +AXGMAC_IOWRITE_BITS (pdata,MAC_RFCR ,RFE ,1 ); + +return 0 ; +} + +static int axgbe_config_tx_flow_control (struct axgbe_port *pdata) +{ +if (pdata->tx_pause) +axgbe_enable_tx_flow_control (pdata); +else +axgbe_disable_tx_flow_control (pdata); + +return 0 ; +} + +static int axgbe_config_rx_flow_control (struct axgbe_port *pdata) +{ +if (pdata->rx_pause) +axgbe_enable_rx_flow_control (pdata); +else +axgbe_disable_rx_flow_control (pdata); + +return 0 ; +} + +static void axgbe_config_flow_control (struct axgbe_port *pdata) +{ +axgbe_config_tx_flow_control (pdata); +axgbe_config_rx_flow_control (pdata); + +AXGMAC_IOWRITE_BITS (pdata,MAC_RFCR ,PFCE ,0 ); +} + +static void axgbe_queue_flow_control_threshold (struct axgbe_port *pdata, +unsigned int queue, +unsigned int q_fifo_size) +{ +unsigned int frame_fifo_size; +unsigned int rfa, rfd; + + frame_fifo_size =AXGMAC_FLOW_CONTROL_ALIGN (axgbe_get_max_frame (pdata)); + +/* This path deals with just maximum frame sizes which are +* limited to a jumbo frame of 9,000 (plus headers, etc.) +* so we can never exceed the maximum allowable RFA/RFD +* values. +*/ +if (q_fifo_size <=2048 ) { +/* rx_rfd to zero to signal no flow control */ + pdata->rx_rfa[queue] =0 ; + pdata->rx_rfd[queue] =0 ; +return ; + } + +if (q_fifo_size <=4096 ) { +/* Between 2048 and 4096 */ + pdata->rx_rfa[queue] =0 ;/* Full - 1024 bytes */ + pdata->rx_rfd[queue] =1 ;/* Full - 1536 bytes */ +return ; + } + +if (q_fifo_size <= frame_fifo_size) { +/* Between 4096 and max-frame */ + pdata->rx_rfa[queue] =2 ;/* Full - 2048 bytes */ + pdata->rx_rfd[queue] =5 ;/* Full - 3584 bytes */ +return ; + } + +if (q_fifo_size <= (frame_fifo_size *3 )) { +/* Between max-frame and 3 max-frames, +* trigger if we get just over a frame of data and +* resume when we have just under half a frame left. +*/ + rfa = q_fifo_size - frame_fifo_size; + rfd = rfa + (frame_fifo_size /2 ); + }else { +/* Above 3 max-frames - trigger when just over +* 2 frames of space available +*/ + rfa = frame_fifo_size *2 ; + rfa +=AXGMAC_FLOW_CONTROL_UNIT ; + rfd = rfa + frame_fifo_size; + } + + pdata->rx_rfa[queue] =AXGMAC_FLOW_CONTROL_VALUE (rfa); + pdata->rx_rfd[queue] =AXGMAC_FLOW_CONTROL_VALUE (rfd); +} + +static void axgbe_calculate_flow_control_threshold (struct axgbe_port *pdata) +{ +unsigned int q_fifo_size; +unsigned int i; + +for (i =0 ; i < pdata->rx_q_count; i++) { + q_fifo_size = (pdata->fifo +1 ) *AXGMAC_FIFO_UNIT ; + +axgbe_queue_flow_control_threshold (pdata, i, q_fifo_size); + } +} + +static void axgbe_config_flow_control_threshold (struct axgbe_port *pdata) +{ +unsigned int i; + +for (i =0 ; i < pdata->rx_q_count; i++) { +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQFCR ,RFA , + pdata->rx_rfa[i]); +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQFCR ,RFD , + pdata->rx_rfd[i]); + } +} +static int __axgbe_exit (struct axgbe_port *pdata) {unsigned int count =2000 ;
@@ -366,10 +558,659 @@ static int axgbe_exit(struct axgbe_port *pdata)return __axgbe_exit (pdata); } +static int axgbe_flush_tx_queues (struct axgbe_port *pdata) +{ +unsigned int i, count; + +if (AXGMAC_GET_BITS (pdata->hw_feat.version,MAC_VR ,SNPSVER ) <0x21 ) +return 0 ; + +for (i =0 ; i < pdata->tx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_TQOMR ,FTQ ,1 ); + +/* Poll Until Poll Condition */ +for (i =0 ; i < pdata->tx_q_count; i++) { + count =2000 ; +while (--count &&AXGMAC_MTL_IOREAD_BITS (pdata, i, +MTL_Q_TQOMR ,FTQ )) +rte_delay_us (500 ); + +if (!count) +return -EBUSY ; + } + +return 0 ; +} + +static void axgbe_config_dma_bus (struct axgbe_port *pdata) +{ +/* Set enhanced addressing mode */ +AXGMAC_IOWRITE_BITS (pdata,DMA_SBMR ,EAME ,1 ); + +/* Out standing read/write requests*/ +AXGMAC_IOWRITE_BITS (pdata,DMA_SBMR ,RD_OSR ,0x3f ); +AXGMAC_IOWRITE_BITS (pdata,DMA_SBMR ,WR_OSR ,0x3f ); + +/* Set the System Bus mode */ +AXGMAC_IOWRITE_BITS (pdata,DMA_SBMR ,UNDEF ,1 ); +AXGMAC_IOWRITE_BITS (pdata,DMA_SBMR ,BLEN_32 ,1 ); +AXGMAC_IOWRITE_BITS (pdata,DMA_SBMR ,AAL ,1 ); +} + +static void axgbe_config_dma_cache (struct axgbe_port *pdata) +{ +unsigned int arcache, awcache, arwcache; + + arcache =0 ; +AXGMAC_SET_BITS (arcache,DMA_AXIARCR ,DRC ,0x3 ); +AXGMAC_IOWRITE (pdata,DMA_AXIARCR , arcache); + + awcache =0 ; +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,DWC ,0x3 ); +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,RPC ,0x3 ); +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,RPD ,0x1 ); +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,RHC ,0x3 ); +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,RHD ,0x1 ); +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,RDC ,0x3 ); +AXGMAC_SET_BITS (awcache,DMA_AXIAWCR ,RDD ,0x1 ); +AXGMAC_IOWRITE (pdata,DMA_AXIAWCR , awcache); + + arwcache =0 ; +AXGMAC_SET_BITS (arwcache,DMA_AXIAWRCR ,TDWD ,0x1 ); +AXGMAC_SET_BITS (arwcache,DMA_AXIAWRCR ,TDWC ,0x3 ); +AXGMAC_SET_BITS (arwcache,DMA_AXIAWRCR ,RDRC ,0x3 ); +AXGMAC_IOWRITE (pdata,DMA_AXIAWRCR , arwcache); +} + +static void axgbe_config_edma_control (struct axgbe_port *pdata) +{ +AXGMAC_IOWRITE (pdata,EDMA_TX_CONTROL ,0x5 ); +AXGMAC_IOWRITE (pdata,EDMA_RX_CONTROL ,0x5 ); +} + +static int axgbe_config_osp_mode (struct axgbe_port *pdata) +{ +/* Force DMA to operate on second packet before closing descriptors +* of first packet +*/ +struct axgbe_tx_queue *txq; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_tx_queues; i++) { + txq = pdata->eth_dev->data->tx_queues[i]; +AXGMAC_DMA_IOWRITE_BITS (txq,DMA_CH_TCR ,OSP , + pdata->tx_osp_mode); + } + +return 0 ; +} + +static int axgbe_config_pblx8 (struct axgbe_port *pdata) +{ +struct axgbe_tx_queue *txq; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_tx_queues; i++) { + txq = pdata->eth_dev->data->tx_queues[i]; +AXGMAC_DMA_IOWRITE_BITS (txq,DMA_CH_CR ,PBLX8 , + pdata->pblx8); + } +return 0 ; +} + +static int axgbe_config_tx_pbl_val (struct axgbe_port *pdata) +{ +struct axgbe_tx_queue *txq; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_tx_queues; i++) { + txq = pdata->eth_dev->data->tx_queues[i]; +AXGMAC_DMA_IOWRITE_BITS (txq,DMA_CH_TCR ,PBL , + pdata->tx_pbl); + } + +return 0 ; +} + +static int axgbe_config_rx_pbl_val (struct axgbe_port *pdata) +{ +struct axgbe_rx_queue *rxq; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_rx_queues; i++) { + rxq = pdata->eth_dev->data->rx_queues[i]; +AXGMAC_DMA_IOWRITE_BITS (rxq,DMA_CH_RCR ,PBL , + pdata->rx_pbl); + } + +return 0 ; +} + +static void axgbe_config_rx_buffer_size (struct axgbe_port *pdata) +{ +struct axgbe_rx_queue *rxq; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_rx_queues; i++) { + rxq = pdata->eth_dev->data->rx_queues[i]; + + rxq->buf_size =rte_pktmbuf_data_room_size (rxq->mb_pool) - +RTE_PKTMBUF_HEADROOM ; + rxq->buf_size = (rxq->buf_size +AXGBE_RX_BUF_ALIGN -1 ) & + ~(AXGBE_RX_BUF_ALIGN -1 ); + +if (rxq->buf_size > pdata->rx_buf_size) + pdata->rx_buf_size = rxq->buf_size; + +AXGMAC_DMA_IOWRITE_BITS (rxq,DMA_CH_RCR ,RBSZ , + rxq->buf_size); + } +} + +static int axgbe_write_rss_reg (struct axgbe_port *pdata,unsigned int type, +unsigned int index,unsigned int val) +{ +unsigned int wait; + +if (AXGMAC_IOREAD_BITS (pdata,MAC_RSSAR ,OB )) +return -EBUSY ; + +AXGMAC_IOWRITE (pdata,MAC_RSSDR , val); + +AXGMAC_IOWRITE_BITS (pdata,MAC_RSSAR ,RSSIA , index); +AXGMAC_IOWRITE_BITS (pdata,MAC_RSSAR ,ADDRT , type); +AXGMAC_IOWRITE_BITS (pdata,MAC_RSSAR ,CT ,0 ); +AXGMAC_IOWRITE_BITS (pdata,MAC_RSSAR ,OB ,1 ); + + wait =1000 ; +while (wait--) { +if (!AXGMAC_IOREAD_BITS (pdata,MAC_RSSAR ,OB )) +return 0 ; + +rte_delay_us (1500 ); + } + +return -EBUSY ; +} + +static int axgbe_write_rss_hash_key (struct axgbe_port *pdata) +{ +struct rte_eth_rss_conf *rss_conf; +unsigned int key_regs =sizeof (pdata->rss_key) /sizeof (u32); +unsigned int *key; +int ret; + + rss_conf = &pdata->eth_dev->data->dev_conf.rx_adv_conf.rss_conf; + +if (!rss_conf->rss_key) + key = (unsigned int *)&pdata->rss_key; +else + key = (unsigned int *)&rss_conf->rss_key; + +while (key_regs--) { + ret =axgbe_write_rss_reg (pdata,AXGBE_RSS_HASH_KEY_TYPE , + key_regs, *key++); +if (ret) +return ret; + } + +return 0 ; +} + +static int axgbe_write_rss_lookup_table (struct axgbe_port *pdata) +{ +unsigned int i; +int ret; + +for (i =0 ; i <ARRAY_SIZE (pdata->rss_table); i++) { + ret =axgbe_write_rss_reg (pdata, +AXGBE_RSS_LOOKUP_TABLE_TYPE , i, + pdata->rss_table[i]); +if (ret) +return ret; + } + +return 0 ; +} + +static int axgbe_enable_rss (struct axgbe_port *pdata) +{ +int ret; + +/* Program the hash key */ + ret =axgbe_write_rss_hash_key (pdata); +if (ret) +return ret; + +/* Program the lookup table */ + ret =axgbe_write_rss_lookup_table (pdata); +if (ret) +return ret; + +/* Set the RSS options */ +AXGMAC_IOWRITE (pdata,MAC_RSSCR , pdata->rss_options); + +/* Enable RSS */ +AXGMAC_IOWRITE_BITS (pdata,MAC_RSSCR ,RSSE ,1 ); + +return 0 ; +} + +static void axgbe_rss_options (struct axgbe_port *pdata) +{ +struct rte_eth_rss_conf *rss_conf; +uint64_t rss_hf; + + rss_conf = &pdata->eth_dev->data->dev_conf.rx_adv_conf.rss_conf; + rss_hf = rss_conf->rss_hf; + +if (rss_hf & (ETH_RSS_IPV4 |ETH_RSS_IPV6 )) +AXGMAC_SET_BITS (pdata->rss_options,MAC_RSSCR ,IP2TE ,1 ); +if (rss_hf & (ETH_RSS_NONFRAG_IPV4_TCP |ETH_RSS_NONFRAG_IPV6_TCP )) +AXGMAC_SET_BITS (pdata->rss_options,MAC_RSSCR ,TCP4TE ,1 ); +if (rss_hf & (ETH_RSS_NONFRAG_IPV4_UDP |ETH_RSS_NONFRAG_IPV6_UDP )) +AXGMAC_SET_BITS (pdata->rss_options,MAC_RSSCR ,UDP4TE ,1 ); +} + +static int axgbe_config_rss (struct axgbe_port *pdata) +{ +uint32_t i; + +if (pdata->rss_enable) { +/* Initialize RSS hash key and lookup table */ +uint32_t *key = (uint32_t *)pdata->rss_key; + +for (i =0 ; i <sizeof (pdata->rss_key) /4 ; i++) + *key++ = (uint32_t )rte_rand (); +for (i =0 ; i <AXGBE_RSS_MAX_TABLE_SIZE ; i++) +AXGMAC_SET_BITS (pdata->rss_table[i],MAC_RSSDR ,DMCH , + i % pdata->eth_dev->data->nb_rx_queues); +axgbe_rss_options (pdata); +if (axgbe_enable_rss (pdata)) { +PMD_DRV_LOG (ERR ,"Error in enabling RSS support" ); +return -1 ; + } + }else { +AXGMAC_IOWRITE_BITS (pdata,MAC_RSSCR ,RSSE ,0 ); + } + +return 0 ; +} + +static void axgbe_enable_dma_interrupts (struct axgbe_port *pdata) +{ +struct axgbe_tx_queue *txq; +unsigned int dma_ch_isr, dma_ch_ier; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_tx_queues; i++) { + txq = pdata->eth_dev->data->tx_queues[i]; + +/* Clear all the interrupts which are set */ + dma_ch_isr =AXGMAC_DMA_IOREAD (txq,DMA_CH_SR ); +AXGMAC_DMA_IOWRITE (txq,DMA_CH_SR , dma_ch_isr); + +/* Clear all interrupt enable bits */ + dma_ch_ier =0 ; + +/* Enable following interrupts +* NIE - Normal Interrupt Summary Enable +* AIE - Abnormal Interrupt Summary Enable +* FBEE - Fatal Bus Error Enable +*/ +AXGMAC_SET_BITS (dma_ch_ier,DMA_CH_IER ,NIE ,0 ); +AXGMAC_SET_BITS (dma_ch_ier,DMA_CH_IER ,AIE ,1 ); +AXGMAC_SET_BITS (dma_ch_ier,DMA_CH_IER ,FBEE ,1 ); + +/* Enable following Rx interrupts +* RBUE - Receive Buffer Unavailable Enable +* RIE - Receive Interrupt Enable (unless using +* per channel interrupts in edge triggered +* mode) +*/ +AXGMAC_SET_BITS (dma_ch_ier,DMA_CH_IER ,RBUE ,0 ); + +AXGMAC_DMA_IOWRITE (txq,DMA_CH_IER , dma_ch_ier); + } +} + +static void wrapper_tx_desc_init (struct axgbe_port *pdata) +{ +struct axgbe_tx_queue *txq; +unsigned int i; + +for (i =0 ; i < pdata->eth_dev->data->nb_tx_queues; i++) { + txq = pdata->eth_dev->data->tx_queues[i]; + txq->cur =0 ; + txq->dirty =0 ; +/* Update the total number of Tx descriptors */ +AXGMAC_DMA_IOWRITE (txq,DMA_CH_TDRLR , txq->nb_desc -1 ); +/* Update the starting address of descriptor ring */ +AXGMAC_DMA_IOWRITE (txq,DMA_CH_TDLR_HI , +high32_value (txq->ring_phys_addr)); +AXGMAC_DMA_IOWRITE (txq,DMA_CH_TDLR_LO , +low32_value (txq->ring_phys_addr)); + } +} + +static int wrapper_rx_desc_init (struct axgbe_port *pdata) +{ +struct axgbe_rx_queue *rxq; +struct rte_mbuf *mbuf; +volatile union axgbe_rx_desc *desc; +unsigned int i, j; + +for (i =0 ; i < pdata->eth_dev->data->nb_rx_queues; i++) { + rxq = pdata->eth_dev->data->rx_queues[i]; + +/* Initialize software ring entries */ + rxq->mbuf_alloc =0 ; + rxq->cur =0 ; + rxq->dirty =0 ; + desc =AXGBE_GET_DESC_PT (rxq,0 ); + +for (j =0 ; j < rxq->nb_desc; j++) { + mbuf =rte_mbuf_raw_alloc (rxq->mb_pool); +if (mbuf ==NULL ) { +PMD_DRV_LOG (ERR ,"RX mbuf alloc failed queue_id = %u, idx = %d" , + (unsigned int )rxq->queue_id, j); +axgbe_dev_rx_queue_release (rxq); +return -ENOMEM ; + } + rxq->sw_ring[j] = mbuf; +/* Mbuf populate */ + mbuf->next =NULL ; + mbuf->data_off =RTE_PKTMBUF_HEADROOM ; + mbuf->nb_segs =1 ; + mbuf->port = rxq->port_id; + desc->read.baddr = +rte_cpu_to_le_64 ( +rte_mbuf_data_iova_default (mbuf)); +rte_wmb (); +AXGMAC_SET_BITS_LE (desc->read.desc3, +RX_NORMAL_DESC3 ,OWN ,1 ); +rte_wmb (); + rxq->mbuf_alloc++; + desc++; + } +/* Update the total number of Rx descriptors */ +AXGMAC_DMA_IOWRITE (rxq,DMA_CH_RDRLR , + rxq->nb_desc -1 ); +/* Update the starting address of descriptor ring */ +AXGMAC_DMA_IOWRITE (rxq,DMA_CH_RDLR_HI , +high32_value (rxq->ring_phys_addr)); +AXGMAC_DMA_IOWRITE (rxq,DMA_CH_RDLR_LO , +low32_value (rxq->ring_phys_addr)); +/* Update the Rx Descriptor Tail Pointer */ +AXGMAC_DMA_IOWRITE (rxq,DMA_CH_RDTR_LO , +low32_value (rxq->ring_phys_addr + + (rxq->nb_desc -1 ) * +sizeof (union axgbe_rx_desc ))); + } +return 0 ; +} + +static void axgbe_config_mtl_mode (struct axgbe_port *pdata) +{ +unsigned int i; + +/* Set Tx to weighted round robin scheduling algorithm */ +AXGMAC_IOWRITE_BITS (pdata,MTL_OMR ,ETSALG ,MTL_ETSALG_WRR ); + +/* Set Tx traffic classes to use WRR algorithm with equal weights */ +for (i =0 ; i < pdata->hw_feat.tc_cnt; i++) { +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_TC_ETSCR ,TSA , +MTL_TSA_ETS ); +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_TC_QWR ,QW ,1 ); + } + +/* Set Rx to strict priority algorithm */ +AXGMAC_IOWRITE_BITS (pdata,MTL_OMR ,RAA ,MTL_RAA_SP ); +} + +static int axgbe_config_tsf_mode (struct axgbe_port *pdata,unsigned int val) +{ +unsigned int i; + +for (i =0 ; i < pdata->tx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_TQOMR ,TSF , val); + +return 0 ; +} + +static int axgbe_config_rsf_mode (struct axgbe_port *pdata,unsigned int val) +{ +unsigned int i; + +for (i =0 ; i < pdata->rx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQOMR ,RSF , val); + +return 0 ; +} + +static int axgbe_config_tx_threshold (struct axgbe_port *pdata, +unsigned int val) +{ +unsigned int i; + +for (i =0 ; i < pdata->tx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_TQOMR ,TTC , val); + +return 0 ; +} + +static int axgbe_config_rx_threshold (struct axgbe_port *pdata, +unsigned int val) +{ +unsigned int i; + +for (i =0 ; i < pdata->rx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQOMR ,RTC , val); + +return 0 ; +} + +/*Distrubting fifo size */ +static void axgbe_config_rx_fifo_size (struct axgbe_port *pdata) +{ +unsigned int fifo_size; +unsigned int q_fifo_size; +unsigned int p_fifo, i; + + fifo_size =RTE_MIN (pdata->rx_max_fifo_size, + pdata->hw_feat.rx_fifo_size); + q_fifo_size = fifo_size / pdata->rx_q_count; + +/* Calculate the fifo setting by dividing the queue's fifo size +* by the fifo allocation increment (with 0 representing the +* base allocation increment so decrement the result +* by 1). +*/ + p_fifo = q_fifo_size /AXGMAC_FIFO_UNIT ; +if (p_fifo) + p_fifo--; + +for (i =0 ; i < pdata->rx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_RQOMR ,RQS , p_fifo); + pdata->fifo = p_fifo; + +/*Calculate and config Flow control threshold*/ +axgbe_calculate_flow_control_threshold (pdata); +axgbe_config_flow_control_threshold (pdata); +} + +static void axgbe_config_tx_fifo_size (struct axgbe_port *pdata) +{ +unsigned int fifo_size; +unsigned int q_fifo_size; +unsigned int p_fifo, i; + + fifo_size =RTE_MIN (pdata->tx_max_fifo_size, + pdata->hw_feat.tx_fifo_size); + q_fifo_size = fifo_size / pdata->tx_q_count; + +/* Calculate the fifo setting by dividing the queue's fifo size +* by the fifo allocation increment (with 0 representing the +* base allocation increment so decrement the result +* by 1). +*/ + p_fifo = q_fifo_size /AXGMAC_FIFO_UNIT ; +if (p_fifo) + p_fifo--; + +for (i =0 ; i < pdata->tx_q_count; i++) +AXGMAC_MTL_IOWRITE_BITS (pdata, i,MTL_Q_TQOMR ,TQS , p_fifo); +} + +static void axgbe_config_queue_mapping (struct axgbe_port *pdata) +{ +unsigned int qptc, qptc_extra, queue; +unsigned int i, j, reg, reg_val; + +/* Map the MTL Tx Queues to Traffic Classes +* Note: Tx Queues >= Traffic Classes +*/ + qptc = pdata->tx_q_count / pdata->hw_feat.tc_cnt; + qptc_extra = pdata->tx_q_count % pdata->hw_feat.tc_cnt; + +for (i =0 , queue =0 ; i < pdata->hw_feat.tc_cnt; i++) { +for (j =0 ; j < qptc; j++) +AXGMAC_MTL_IOWRITE_BITS (pdata, queue,MTL_Q_TQOMR , +Q2TCMAP , i); +if (i < qptc_extra) +AXGMAC_MTL_IOWRITE_BITS (pdata, queue,MTL_Q_TQOMR , +Q2TCMAP , i); + } + +if (pdata->rss_enable) { +/* Select dynamic mapping of MTL Rx queue to DMA Rx channel */ + reg =MTL_RQDCM0R ; + reg_val =0 ; +for (i =0 ; i < pdata->rx_q_count;) { + reg_val |= (0x80 << ((i++ %MTL_RQDCM_Q_PER_REG ) <<3 )); + +if ((i %MTL_RQDCM_Q_PER_REG ) && + (i != pdata->rx_q_count)) +continue ; + +AXGMAC_IOWRITE (pdata, reg, reg_val); + + reg +=MTL_RQDCM_INC ; + reg_val =0 ; + } + } +} + +static void axgbe_enable_mtl_interrupts (struct axgbe_port *pdata) +{ +unsigned int mtl_q_isr; +unsigned int q_count, i; + + q_count =RTE_MAX (pdata->hw_feat.tx_q_cnt, pdata->hw_feat.rx_q_cnt); +for (i =0 ; i < q_count; i++) { +/* Clear all the interrupts which are set */ + mtl_q_isr =AXGMAC_MTL_IOREAD (pdata, i,MTL_Q_ISR ); +AXGMAC_MTL_IOWRITE (pdata, i,MTL_Q_ISR , mtl_q_isr); + +/* No MTL interrupts to be enabled */ +AXGMAC_MTL_IOWRITE (pdata, i,MTL_Q_IER ,0 ); + } +} + +static int axgbe_set_mac_address (struct axgbe_port *pdata,u8 *addr) +{ +unsigned int mac_addr_hi, mac_addr_lo; + + mac_addr_hi = (addr[5 ] <<8 ) | (addr[4 ] <<0 ); + mac_addr_lo = (addr[3 ] <<24 ) | (addr[2 ] <<16 ) | + (addr[1 ] <<8 ) | (addr[0 ] <<0 ); + +AXGMAC_IOWRITE (pdata,MAC_MACA0HR , mac_addr_hi); +AXGMAC_IOWRITE (pdata,MAC_MACA0LR , mac_addr_lo); + +return 0 ; +} + +static void axgbe_config_mac_address (struct axgbe_port *pdata) +{ +axgbe_set_mac_address (pdata, pdata->mac_addr.addr_bytes); +} + +static void axgbe_config_jumbo_enable (struct axgbe_port *pdata) +{ +unsigned int val; + + val = (pdata->rx_buf_size >AXGMAC_STD_PACKET_MTU ) ?1 :0 ; + val =1 ; + +AXGMAC_IOWRITE_BITS (pdata,MAC_RCR ,JE , val); +} + +static void axgbe_config_mac_speed (struct axgbe_port *pdata) +{ +axgbe_set_speed (pdata, pdata->phy_speed); +} + +static void axgbe_config_checksum_offload (struct axgbe_port *pdata) +{ +if (pdata->rx_csum_enable) +AXGMAC_IOWRITE_BITS (pdata,MAC_RCR ,IPC ,1 ); +else +AXGMAC_IOWRITE_BITS (pdata,MAC_RCR ,IPC ,0 ); +} + +static int axgbe_init (struct axgbe_port *pdata) +{ +int ret; + +/* Flush Tx queues */ + ret =axgbe_flush_tx_queues (pdata); +if (ret) +return ret; +/* Initialize DMA related features */ +axgbe_config_dma_bus (pdata); +axgbe_config_dma_cache (pdata); +axgbe_config_edma_control (pdata); +axgbe_config_osp_mode (pdata); +axgbe_config_pblx8 (pdata); +axgbe_config_tx_pbl_val (pdata); +axgbe_config_rx_pbl_val (pdata); +axgbe_config_rx_buffer_size (pdata); +axgbe_config_rss (pdata); +wrapper_tx_desc_init (pdata); + ret =wrapper_rx_desc_init (pdata); +if (ret) +return ret; +axgbe_enable_dma_interrupts (pdata); + +/* Initialize MTL related features */ +axgbe_config_mtl_mode (pdata); +axgbe_config_queue_mapping (pdata); +axgbe_config_tsf_mode (pdata, pdata->tx_sf_mode); +axgbe_config_rsf_mode (pdata, pdata->rx_sf_mode); +axgbe_config_tx_threshold (pdata, pdata->tx_threshold); +axgbe_config_rx_threshold (pdata, pdata->rx_threshold); +axgbe_config_tx_fifo_size (pdata); +axgbe_config_rx_fifo_size (pdata); + +axgbe_enable_mtl_interrupts (pdata); + +/* Initialize MAC related features */ +axgbe_config_mac_address (pdata); +axgbe_config_jumbo_enable (pdata); +axgbe_config_flow_control (pdata); +axgbe_config_mac_speed (pdata); +axgbe_config_checksum_offload (pdata); + +return 0 ; +} +void axgbe_init_function_ptrs_dev (struct axgbe_hw_if *hw_if) { hw_if->exit = axgbe_exit; + hw_if->config_flow_control = axgbe_config_flow_control; + hw_if->init = axgbe_init; hw_if->read_mmd_regs = axgbe_read_mmd_regs; hw_if->write_mmd_regs = axgbe_write_mmd_regs;
@@ -379,4 +1220,7 @@ void axgbe_init_function_ptrs_dev(struct axgbe_hw_if *hw_if) hw_if->set_ext_mii_mode = axgbe_set_ext_mii_mode; hw_if->read_ext_mii_regs = axgbe_read_ext_mii_regs; hw_if->write_ext_mii_regs = axgbe_write_ext_mii_regs; +/* For FLOW ctrl */ + hw_if->config_tx_flow_control = axgbe_config_tx_flow_control; + hw_if->config_rx_flow_control = axgbe_config_rx_flow_control; }
drivers/net/axgbe/axgbe_ethdev.c +96 -0
120 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v3 10/18 net/axgbe: add transmit and receive data path apis
In reply to Ravi Kumar--- drivers/net/axgbe/Makefile | 1 + drivers/net/axgbe/axgbe_ethdev.c | 22 +- drivers/net/axgbe/axgbe_rxtx.c | 429 +++++++++++++++++++++++++++++++++ drivers/net/axgbe/axgbe_rxtx.h | 19 ++ drivers/net/axgbe/axgbe_rxtx_vec_sse.c | 215 +++++++++++++++++ 5 files changed, 685 insertions(+), 1 deletion(-) create mode 100644 drivers/net/axgbe/axgbe_rxtx_vec_sse.c
drivers/net/axgbe/Makefile +1 -0
@@ -147,5 +147,6 @@ SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_mdio.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_phy_impl.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_i2c.c SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_rxtx.c +SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_rxtx_vec_sse.c include $(RTE_SDK)/mk/rte.lib.mk
drivers/net/axgbe/axgbe_ethdev.c +21 -1
@@ -224,9 +224,22 @@ axgbe_dev_interrupt_handler(void *param) {struct rte_eth_dev *dev = (struct rte_eth_dev *)param;struct axgbe_port *pdata = dev->data->dev_private; +unsigned int dma_isr, dma_ch_isr; pdata->phy_if.an_isr (pdata); - +/*DMA related interrupts*/ + dma_isr =AXGMAC_IOREAD (pdata,DMA_ISR ); +if (dma_isr) { +if (dma_isr &1 ) { + dma_ch_isr = +AXGMAC_DMA_IOREAD ((struct axgbe_rx_queue *) + pdata->rx_queues[0 ], +DMA_CH_SR ); +AXGMAC_DMA_IOWRITE ((struct axgbe_rx_queue *) + pdata->rx_queues[0 ], +DMA_CH_SR , dma_ch_isr); + } + }/* Enable interrupts since disabled after generation*/ rte_intr_enable (&pdata->pci_dev->intr_handle); }
@@ -288,6 +301,8 @@ axgbe_dev_start(struct rte_eth_dev *dev)/* phy start*/ pdata->phy_if.phy_start (pdata); +axgbe_dev_enable_tx (dev); +axgbe_dev_enable_rx (dev);axgbe_clear_bit (AXGBE_STOPPED , &pdata->dev_state);axgbe_clear_bit (AXGBE_DOWN , &pdata->dev_state);
@@ -307,6 +322,8 @@ axgbe_dev_stop(struct rte_eth_dev *dev)return ;axgbe_set_bit (AXGBE_STOPPED , &pdata->dev_state); +axgbe_dev_disable_tx (dev); +axgbe_dev_disable_rx (dev); pdata->phy_if.phy_stop (pdata); pdata->hw_if.exit (pdata);
@@ -550,6 +567,7 @@ eth_axgbe_dev_init(struct rte_eth_dev *eth_dev)axgbe_set_bit (AXGBE_STOPPED , &pdata->dev_state); pdata->eth_dev = eth_dev; eth_dev->dev_ops = &axgbe_eth_dev_ops; + eth_dev->rx_pkt_burst = &axgbe_recv_pkts;/* * For secondary processes, we don't initialise any further as primary
@@ -694,6 +712,8 @@ eth_axgbe_dev_uninit(struct rte_eth_dev *eth_dev)rte_free (eth_dev->data->mac_addrs); eth_dev->data->mac_addrs =NULL ; eth_dev->dev_ops =NULL ; + eth_dev->rx_pkt_burst =NULL ; + eth_dev->tx_pkt_burst =NULL ;axgbe_dev_clear_queues (eth_dev);/* disable uio intr before callback unregister */
drivers/net/axgbe/axgbe_rxtx.c +429 -0
450 lines not on this page · raw message
drivers/net/axgbe/axgbe_rxtx.h +19 -0
@@ -278,12 +278,31 @@ void axgbe_dev_tx_queue_release(void *txq);int axgbe_dev_tx_queue_setup (struct rte_eth_dev *dev,uint16_t tx_queue_id,uint16_t nb_tx_desc,unsigned int socket_id,const struct rte_eth_txconf *tx_conf); +void axgbe_dev_enable_tx (struct rte_eth_dev *dev); +void axgbe_dev_disable_tx (struct rte_eth_dev *dev); +int axgbe_dev_tx_queue_start (struct rte_eth_dev *dev,uint16_t tx_queue_id); +int axgbe_dev_tx_queue_stop (struct rte_eth_dev *dev,uint16_t tx_queue_id); + +uint16_t axgbe_xmit_pkts (void *tx_queue,struct rte_mbuf **tx_pkts, +uint16_t nb_pkts); +uint16_t axgbe_xmit_pkts_vec (void *tx_queue,struct rte_mbuf **tx_pkts, +uint16_t nb_pkts); +void axgbe_dev_rx_queue_release (void *rxq);int axgbe_dev_rx_queue_setup (struct rte_eth_dev *dev,uint16_t rx_queue_id,uint16_t nb_rx_desc,unsigned int socket_id,const struct rte_eth_rxconf *rx_conf,struct rte_mempool *mb_pool); +void axgbe_dev_enable_rx (struct rte_eth_dev *dev); +void axgbe_dev_disable_rx (struct rte_eth_dev *dev); +int axgbe_dev_rx_queue_start (struct rte_eth_dev *dev,uint16_t rx_queue_id); +int axgbe_dev_rx_queue_stop (struct rte_eth_dev *dev,uint16_t rx_queue_id); +uint16_t axgbe_recv_pkts (void *rx_queue,struct rte_mbuf **rx_pkts, +uint16_t nb_pkts); +uint16_t axgbe_recv_pkts_threshold_refresh (void *rx_queue, +struct rte_mbuf **rx_pkts, +uint16_t nb_pkts);void axgbe_dev_clear_queues (struct rte_eth_dev *dev);#endif /* _AXGBE_RXTX_H_ */
drivers/net/axgbe/axgbe_rxtx_vec_sse.c new file +215 -0
215 lines not on this page · raw message
Signature · 1 line
2.7.4
Re: [PATCH v3 10/18] net/axgbe: add transmit and receive data path apis
On 3/9/2018 8:42 AM, Ravi Kumar wrote:
May be good to mention in commit log that for scalar path both Rx/Tx implemented but for vector path only Tx implemented.
Quoted 1 line
Signed-off-by Ravi Kumar <[email protected]>
PATCH v3 11/18 doc: add documents for AMD axgbe Ethernet PMD
In reply to Ravi Kumar--- doc/guides/nics/axgbe.rst | 211 +++++++++++++++++++++++++++++++++++++ doc/guides/nics/features/axgbe.ini | 14 +++ doc/guides/nics/index.rst | 1 + 3 files changed, 226 insertions(+) create mode 100644 doc/guides/nics/axgbe.rst create mode 100644 doc/guides/nics/features/axgbe.ini
doc/guides/nics/axgbe.rst new file +211 -0
@@ -0,0 +1,211 @@ +.. Copyright (c) 2017 Advanced Micro Devices, Inc. + All rights reserved. + + AMD 10Gb Ethernet driver + + This file is available to you under your choice of the following two + licenses: + + License 1: GPLv2 + + Copyright (c) 2017 Advanced Micro Devices, Inc. + + This file is free software; you may copy, redistribute and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or (at + your option) any later version. + + This file is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + This file incorporates work covered by the following copyright and + permission notice: + + Copyright (c) 2013 Synopsys, Inc. + + The Synopsys DWC ETHER XGMAC Software Driver and documentation + (hereinafter "Software") is an unsupported proprietary work of Synopsys, + Inc. unless otherwise expressly agreed to in writing between Synopsys + and you. + + The Software IS NOT an item of Licensed Software or Licensed Product + under any End User Software License Agreement or Agreement for Licensed + Product with Synopsys or any supplement thereto. Permission is hereby + granted, free of charge, to any person obtaining a copy of this software + annotated with this license and the Software, to deal in the Software + without restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" + BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS + 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. + + License 2: Modified BSD + + Copyright (c) 2017 Advanced Micro Devices, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * 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. + * Neither the name of Advanced Micro Devices, Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 <COPYRIGHT HOLDER> 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. + + This file incorporates work covered by the following copyright and + permission notice: + + Copyright (c) 2013 Synopsys, Inc. + + The Synopsys DWC ETHER XGMAC Software Driver and documentation + (hereinafter "Software") is an unsupported proprietary work of Synopsys, + Inc. unless otherwise expressly agreed to in writing between Synopsys + and you. + + The Software IS NOT an item of Licensed Software or Licensed Product + under any End User Software License Agreement or Agreement for Licensed + Product with Synopsys or any supplement thereto. Permission is hereby + granted, free of charge, to any person obtaining a copy of this software + annotated with this license and the Software, to deal in the Software + without restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" + BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS + 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. + +AXGBE Poll Mode Driver +====================== + +The AXGBE poll mode driver library (**librte_pmd_axgbe**) implements support +for AMD 10 Gbps family of adapters. It is compiled and tested in standard linux distro like Ubuntu. + +Supported Features +------------------ + +AXGBE PMD has support for: + +- Base L2 features +- TSS (Transmit Side Scaling) +- RSS (Receive Side Scaling) +- Checksum offload +- Jumbo Frame upto 9K + + +Supported Chipsets and NICs +--------------------------- +- AMD 10 Gigabit Ethernet Controller + + +Configuration Information +------------------------- + +The following options can be modified in the ``.config`` file. Please note that +enabling debugging options may affect system performance. + +- ``CONFIG_RTE_LIBRTE_AXGBE_PMD`` (default **n**) + + Toggle compilation of axgbe driver. To use axgbe PMD set this config parameter + to 'y'. + +- ``CONFIG_RTE_LIBRTE_AXGBE_DEBUG_INIT`` (default **n**) + + Toggle display of initialization related messages. + + +Building DPDK +------------- + +See the :ref:`DPDK Getting Started Guide for Linux <linux_gsg>` for +instructions on how to build DPDK. + +By default the AXGBE PMD library will be built into the DPDK library. + +For configuring and using UIO frameworks, please also refer :ref:`the +documentation that comes with DPDK suite <linux_gsg>`. + + +Prerequisites and Pre-conditions +-------------------------------- +- Prepare the system as recommended by DPDK suite. + +- AXGBE PMD works only with legacy interrupts, so load igb_uio module in legacy interrupt mode + using module params. + +- Bind the intended AMD device to igb_uio module. + +Now system is ready to run DPDK application. + + +Usage Example +------------- + +Refer to the document :ref:`compiling and testing a PMD for a NIC <pmd_build_and_test>` +for details. + +Example output: + +.. code-block:: console + + [...] + EAL: PCI device 0000:02:00.4 on NUMA socket 0 + EAL: probe driver: 1022:1458 net_axgbe + Interactive-mode selected + USER1: create a new mbuf pool <mbuf_pool_socket_0>: n=171456, size=2176, socket=0 + USER1: create a new mbuf pool <mbuf_pool_socket_1>: n=171456, size=2176, socket=1 + USER1: create a new mbuf pool <mbuf_pool_socket_2>: n=171456, size=2176, socket=2 + USER1: create a new mbuf pool <mbuf_pool_socket_3>: n=171456, size=2176, socket=3 + Configuring Port 0 (socket 0) + Port 0: 00:00:1A:1C:6A:17 + Checking link statuses... + Port 0 Link Up - speed 10000 Mbps - full-duplex + Done + testpmd>
doc/guides/nics/features/axgbe.ini new file +14 -0
@@ -0,0 +1,14 @@ +; +; Supported features of the 'axgbe' network poll mode driver. +; +; Refer to default.ini for the full list of available PMD features. +; +[Features] +Speed capabilities = Y +Jumbo frame = Y +RSS hash = Y +CRC offload = Y +L3 checksum offload = Y +L4 checksum offload = Y +Linux UIO = Y +x86-64 = Y
doc/guides/nics/index.rst +1 -0
@@ -13,6 +13,7 @@ Network Interface Controller Drivers build_and_test ark avp + axgbe bnx2x bnxt cxgbe
Signature · 1 line
2.7.4
Re: [PATCH v3 11/18] doc: add documents for AMD axgbe Ethernet PMD
Quoted 3 lines · Ravi Kumar
Signed-off-by Ravi Kumar <[email protected]>--- doc/guides/nics/axgbe.rst | 211 +++++++++++++++++++++++++++++++++++++
cc'ed document maintainers.
<...>
Quoted 3 lines
+Supported Chipsets and NICs
+--------------------------- +- AMD 10 Gigabit Ethernet Controller
Would you mind giving more details about supported device? Any link to product webpage perhaps?
Also there is a dpdk.org web page lists the supported devices, it would be good to update that page (with a web patch) to announce the support.
<...>
doc/guides/nics/axgbe.rst line 157
Quoted 4 lines
+- ``CONFIG_RTE_LIBRTE_AXGBE_PMD`` (default **n**)
doc/guides/nics/axgbe.rst new file +3
-0+ + Toggle compilation of axgbe driver. To use axgbe PMD set this config parameter + to 'y'.
It is default enabled now.
<...>
PATCH v3 12/18 net/axgbe: add link status update
In reply to Ravi Kumar--- doc/guides/nics/features/axgbe.ini | 1 + drivers/net/axgbe/axgbe_ethdev.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+)
doc/guides/nics/features/axgbe.ini +1 -0
@@ -5,6 +5,7 @@ ; [Features] Speed capabilities = Y +Link status = Y Jumbo frame = Y RSS hash = Y CRC offload = Y
drivers/net/axgbe/axgbe_ethdev.c +33 -0
@@ -137,6 +137,8 @@ static int axgbe_dev_start(struct rte_eth_dev *dev);static void axgbe_dev_stop (struct rte_eth_dev *dev);static void axgbe_dev_interrupt_handler (void *param);static void axgbe_dev_close (struct rte_eth_dev *dev); +static int axgbe_dev_link_update (struct rte_eth_dev *dev, +int wait_to_complete);static void axgbe_dev_info_get (struct rte_eth_dev *dev,struct rte_eth_dev_info *dev_info);
@@ -193,6 +195,7 @@ static const struct eth_dev_ops axgbe_eth_dev_ops = { .dev_start = axgbe_dev_start, .dev_stop = axgbe_dev_stop, .dev_close = axgbe_dev_close, + .link_update = axgbe_dev_link_update, .dev_infos_get = axgbe_dev_info_get, .rx_queue_setup = axgbe_dev_rx_queue_setup, .rx_queue_release = axgbe_dev_rx_queue_release,
@@ -338,6 +341,36 @@ axgbe_dev_close(struct rte_eth_dev *dev)axgbe_dev_clear_queues (dev); } +/* return 0 means link status changed, -1 means not changed */ +static int +axgbe_dev_link_update (struct rte_eth_dev *dev, + int wait_to_complete __rte_unused) +{ +PMD_INIT_FUNC_TRACE (); +rte_delay_ms (800 ); + +struct axgbe_port *pdata = dev->data->dev_private; +int old_link_status = dev->data->dev_link.link_status; + + pdata->phy_if.phy_status (pdata); + + dev->data->dev_link.link_speed = pdata->phy_speed; +switch (pdata->phy.duplex) { +case DUPLEX_FULL : + dev->data->dev_link.link_duplex =ETH_LINK_FULL_DUPLEX ; +break ; +case DUPLEX_HALF : + dev->data->dev_link.link_duplex =ETH_LINK_HALF_DUPLEX ; +break ; + } + dev->data->dev_link.link_autoneg = !(dev->data->dev_conf.link_speeds & +ETH_LINK_SPEED_FIXED ); + dev->data->dev_link.link_status = pdata->phy_link; + +return old_link_status == dev->data->dev_link.link_status ?-1 :0 ; +} + +static void axgbe_dev_info_get (struct rte_eth_dev *dev,struct rte_eth_dev_info *dev_info)
Signature · 1 line
2.7.4
Re: [PATCH v3 12/18] net/axgbe: add link status update
Quoted 1 line · Ravi Kumar
Signed-off-by Ravi Kumar <[email protected]>
<...>
Quoted 17 lines
drivers/net/axgbe/axgbe_ethdev.c +17
-0+/* return 0 means link status changed, -1 means not changed */ +static int +axgbe_dev_link_update (struct rte_eth_dev *dev, + int wait_to_complete __rte_unused) +{ +PMD_INIT_FUNC_TRACE (); +rte_delay_ms (800 ); + +struct axgbe_port *pdata = dev->data->dev_private; +int old_link_status = dev->data->dev_link.link_status; + + pdata->phy_if.phy_status (pdata); + + dev->data->dev_link.link_speed = pdata->phy_speed; +switch (pdata->phy.duplex) { +case DUPLEX_FULL : + dev->data->dev_link.link_duplex =ETH_LINK_FULL_DUPLEX ;
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_close(struct rte_eth_dev *dev) · line 370
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +10
-0+break ; +case DUPLEX_HALF : + dev->data->dev_link.link_duplex =ETH_LINK_HALF_DUPLEX ; +break ; + } + dev->data->dev_link.link_autoneg = !(dev->data->dev_conf.link_speeds & +ETH_LINK_SPEED_FIXED ); + dev->data->dev_link.link_status = pdata->phy_link; + +return old_link_status == dev->data->dev_link.link_status ?-1 :0 ;
There are a very recently merged patches to get/set link status atomically (rte_eth_linkstatus_get / rte_eth_linkstatus_set) only in next-net (not merged to main repo yet), you may benefit from them.
<...>
PATCH v3 13/18 net/axgbe: add configure flow control while link adjustment
In reply to Ravi Kumar--- drivers/net/axgbe/axgbe_mdio.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
drivers/net/axgbe/axgbe_mdio.c +13 -0
@@ -796,6 +796,19 @@ static void axgbe_an_init(struct axgbe_port *pdata)static void axgbe_phy_adjust_link (struct axgbe_port *pdata) {if (pdata->phy.link) { +/* Flow control support */ + pdata->pause_autoneg = pdata->phy.pause_autoneg; + +if (pdata->tx_pause != (unsigned int )pdata->phy.tx_pause) { + pdata->hw_if.config_tx_flow_control (pdata); + pdata->tx_pause = pdata->phy.tx_pause; + } + +if (pdata->rx_pause != (unsigned int )pdata->phy.rx_pause) { + pdata->hw_if.config_rx_flow_control (pdata); + pdata->rx_pause = pdata->phy.rx_pause; + } +/* Speed support */ if (pdata->phy_speed != pdata->phy.speed) pdata->phy_speed = pdata->phy.speed;
Signature · 1 line
2.7.4
PATCH v3 14/18 net/axgbe: add promiscuous mode support
In reply to Ravi Kumar--- doc/guides/nics/axgbe.rst | 2 ++ doc/guides/nics/features/axgbe.ini | 2 ++ drivers/net/axgbe/axgbe_ethdev.c | 48 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+)
doc/guides/nics/axgbe.rst +2 -0
@@ -135,6 +135,8 @@ AXGBE PMD has support for: - Base L2 features - TSS (Transmit Side Scaling) +- Promiscuous mode +- Multicast mode - RSS (Receive Side Scaling) - Checksum offload - Jumbo Frame upto 9K
doc/guides/nics/features/axgbe.ini +2 -0
@@ -7,6 +7,8 @@ Speed capabilities = Y Link status = Y Jumbo frame = Y +Promiscuous mode = Y +Allmulticast mode = Y RSS hash = Y CRC offload = Y L3 checksum offload = Y
drivers/net/axgbe/axgbe_ethdev.c +48 -0
66 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v3 15/18 net/axgbe: add generic transmit and receive stats support
In reply to Ravi Kumar--- doc/guides/nics/axgbe.rst | 1 + doc/guides/nics/features/axgbe.ini | 1 + drivers/net/axgbe/axgbe_ethdev.c | 51 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+)
doc/guides/nics/axgbe.rst +1 -0
@@ -136,6 +136,7 @@ AXGBE PMD has support for: - Base L2 features - TSS (Transmit Side Scaling) - Promiscuous mode +- Port statistics - Multicast mode - RSS (Receive Side Scaling) - Checksum offload
doc/guides/nics/features/axgbe.ini +1 -0
@@ -13,5 +13,6 @@ RSS hash = Y CRC offload = Y L3 checksum offload = Y L4 checksum offload = Y +Basic stats = Y Linux UIO = Y x86-64 = Y
drivers/net/axgbe/axgbe_ethdev.c +51 -0
69 lines not on this page · raw message
Signature · 1 line
2.7.4
Re: [PATCH v3 15/18] net/axgbe: add generic transmit and receive stats support
Quoted 1 line · Ravi Kumar
Signed-off-by Ravi Kumar <[email protected]>
<...>
Quoted 12 lines
drivers/net/axgbe/axgbe_ethdev.c +12
-0+static int +axgbe_dev_stats_get (struct rte_eth_dev *dev, +struct rte_eth_stats *stats) +{ +struct axgbe_rx_queue *rxq; +struct axgbe_tx_queue *txq; +unsigned int i; + +for (i =0 ; i < dev->data->nb_rx_queues; i++) { + rxq = dev->data->rx_queues[i]; + stats->q_ipackets[i] = rxq->pkts; + stats->ipackets += rxq->pkts;
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_link_update(struct rte_eth_dev *dev, · line 447
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +10
-0+ stats->q_ibytes[i] = rxq->bytes; + stats->ibytes += rxq->bytes; + } +for (i =0 ; i < dev->data->nb_tx_queues; i++) { + txq = dev->data->tx_queues[i]; + stats->q_opackets[i] = txq->pkts; + stats->opackets += txq->pkts; + stats->q_obytes[i] = txq->bytes; + stats->obytes += txq->bytes; + }
Just as a reminder of imissed and ierror, it is OK if they are not ready to use in this stage.
<...>
PATCH v3 16/18 net/axgbe: add support for build 32-bit mode
In reply to Ravi Kumar--- doc/guides/nics/features/axgbe.ini | 1 + drivers/net/axgbe/axgbe_common.h | 53 ++++++++++++++++++++++---------------- drivers/net/axgbe/axgbe_ethdev.c | 10 ++++--- drivers/net/axgbe/axgbe_ethdev.h | 8 +++--- drivers/net/axgbe/axgbe_rxtx.c | 12 ++++----- drivers/net/axgbe/axgbe_rxtx.h | 4 +-- 6 files changed, 50 insertions(+), 38 deletions(-)
doc/guides/nics/features/axgbe.ini +1 -0
@@ -15,4 +15,5 @@ L3 checksum offload = Y L4 checksum offload = Y Basic stats = Y Linux UIO = Y +x86-32 = Y x86-64 = Y
drivers/net/axgbe/axgbe_common.h +31 -22
161 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.c +6 -4
@@ -712,10 +712,12 @@ eth_axgbe_dev_init(struct rte_eth_dev *eth_dev) pdata->pci_dev = pci_dev; pdata->xgmac_regs = - (uint64_t )pci_dev->mem_resource[AXGBE_AXGMAC_BAR ].addr; - pdata->xprop_regs = pdata->xgmac_regs +AXGBE_MAC_PROP_OFFSET ; - pdata->xi2c_regs = pdata->xgmac_regs +AXGBE_I2C_CTRL_OFFSET ; - pdata->xpcs_regs = (uint64_t )pci_dev->mem_resource[AXGBE_XPCS_BAR ].addr; + (void *)pci_dev->mem_resource[AXGBE_AXGMAC_BAR ].addr; + pdata->xprop_regs = (void *)((uint8_t *)pdata->xgmac_regs + +AXGBE_MAC_PROP_OFFSET ); + pdata->xi2c_regs = (void *)((uint8_t *)pdata->xgmac_regs + +AXGBE_I2C_CTRL_OFFSET ); + pdata->xpcs_regs = (void *)pci_dev->mem_resource[AXGBE_XPCS_BAR ].addr;/* version specific driver data*/ if (pci_dev->id.device_id ==0x1458 )
drivers/net/axgbe/axgbe_ethdev.h +4 -4
@@ -567,10 +567,10 @@ struct axgbe_port {struct axgbe_version_data *vdata;/* AXGMAC/XPCS related mmio registers */ -uint64_t xgmac_regs;/* AXGMAC CSRs */ -uint64_t xpcs_regs;/* XPCS MMD registers */ -uint64_t xprop_regs;/* AXGBE property registers */ -uint64_t xi2c_regs;/* AXGBE I2C CSRs */ +void *xgmac_regs;/* AXGMAC CSRs */ +void *xpcs_regs;/* XPCS MMD registers */ +void *xprop_regs;/* AXGBE property registers */ +void *xi2c_regs;/* AXGBE I2C CSRs */ /* XPCS indirect addressing lock */ unsigned int xpcs_window_def_reg;
drivers/net/axgbe/axgbe_rxtx.c +6 -6
@@ -192,9 +192,9 @@ int axgbe_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, rxq->queue_id = queue_idx; rxq->port_id = dev->data->port_id; rxq->nb_desc = rx_desc; - rxq->dma_regs = pdata->xgmac_regs +DMA_CH_BASE + - (DMA_CH_INC * rxq->queue_id); - rxq->dma_tail_reg = (volatile uint32_t *)(rxq->dma_regs + + rxq->dma_regs = (void *)((uint8_t *)pdata->xgmac_regs +DMA_CH_BASE + + (DMA_CH_INC * rxq->queue_id)); + rxq->dma_tail_reg = (volatile uint32_t *)((uint8_t *)rxq->dma_regs +DMA_CH_RDTR_LO ); rxq->crc_len = (uint8_t)((dev->data->dev_conf.rxmode.hw_strip_crc) ? 0 :
@@ -509,9 +509,9 @@ int axgbe_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, txq->desc = tz->addr; txq->queue_id = queue_idx; txq->port_id = dev->data->port_id; - txq->dma_regs = pdata->xgmac_regs +DMA_CH_BASE + - (DMA_CH_INC * txq->queue_id); - txq->dma_tail_reg = (volatile uint32_t *)(txq->dma_regs + + txq->dma_regs = (void *)((uint8_t *)pdata->xgmac_regs +DMA_CH_BASE + + (DMA_CH_INC * txq->queue_id)); + txq->dma_tail_reg = (volatile uint32_t *)((uint8_t *)txq->dma_regs +DMA_CH_TDTR_LO ); txq->cur =0 ; txq->dirty =0 ;
drivers/net/axgbe/axgbe_rxtx.h +2 -2
@@ -202,7 +202,7 @@ struct axgbe_rx_queue {/* Ring physical address */ uint64_t ring_phys_addr;/* Dma Channel register address */ -uint64_t dma_regs; +void *dma_regs;/* Dma channel tail register address*/ volatile uint32_t *dma_tail_reg;/* DPDK queue index */
@@ -249,7 +249,7 @@ struct axgbe_tx_queue {/* Physical address of ring */ uint64_t ring_phys_addr;/* Dma channel register space */ -uint64_t dma_regs; +void *dma_regs;/* Dma tail register address of ring*/ volatile uint32_t *dma_tail_reg;/* Tx queue index/id*/
Signature · 1 line
2.7.4
PATCH v3 17/18 net/axgbe: add workaround for axgbe ethernet training bug
In reply to Ravi Kumar--- drivers/net/axgbe/axgbe_common.h | 8 +++ drivers/net/axgbe/axgbe_ethdev.c | 2 + drivers/net/axgbe/axgbe_ethdev.h | 6 ++ drivers/net/axgbe/axgbe_mdio.c | 13 ++++- drivers/net/axgbe/axgbe_phy_impl.c | 117 +++++++++++++++++++++++++++++++++++++ 5 files changed, 144 insertions(+), 2 deletions(-)
drivers/net/axgbe/axgbe_common.h +8 -0
@@ -1369,6 +1369,10 @@#define MDIO_VEND2_AN_STAT 0x8002#endif +#ifndef MDIO_VEND2_PMA_CDR_CONTROL +#define MDIO_VEND2_PMA_CDR_CONTROL 0x8056 +#endif +#ifndef MDIO_CTRL1_SPEED1G #define MDIO_CTRL1_SPEED1G (MDIO_CTRL1_SPEED10G & ~BMCR_SPEED100)#endif
@@ -1416,6 +1420,10 @@#define AXGBE_AN_CL37_PCS_MODE_SGMII 0x04#define AXGBE_AN_CL37_TX_CONFIG_MASK 0x08 +#define AXGBE_PMA_CDR_TRACK_EN_MASK 0x01 +#define AXGBE_PMA_CDR_TRACK_EN_OFF 0x00 +#define AXGBE_PMA_CDR_TRACK_EN_ON 0x01 +/*generic*/ #define __iomem
drivers/net/axgbe/axgbe_ethdev.c +2 -0
@@ -172,6 +172,7 @@ static struct axgbe_version_data axgbe_v2a = { .tx_tstamp_workaround = 1, .ecc_support = 1, .i2c_support = 1, + .an_cdr_workaround = 1, };static struct axgbe_version_data axgbe_v2b = {
@@ -183,6 +184,7 @@ static struct axgbe_version_data axgbe_v2b = { .tx_tstamp_workaround = 1, .ecc_support = 1, .i2c_support = 1, + .an_cdr_workaround = 1, };static const struct rte_eth_desc_lim rx_desc_lim = {
drivers/net/axgbe/axgbe_ethdev.h +6 -0
@@ -459,6 +459,10 @@ struct axgbe_phy_impl_if {/* Process results of auto-negotiation */ enum axgbe_mode (*an_outcome)(struct axgbe_port *); +/* Pre/Post auto-negotiation support */ +void (*an_pre)(struct axgbe_port *port); +void (*an_post)(struct axgbe_port *port); +/* Pre/Post KR training enablement support */ void (*kr_training_pre)(struct axgbe_port *);void (*kr_training_post)(struct axgbe_port *);
@@ -553,6 +557,7 @@ struct axgbe_version_data {unsigned int tx_tstamp_workaround;unsigned int ecc_support;unsigned int i2c_support; +unsigned int an_cdr_workaround; };/*
@@ -572,6 +577,7 @@ struct axgbe_port {void *xprop_regs;/* AXGBE property registers */ void *xi2c_regs;/* AXGBE I2C CSRs */ +bool cdr_track_early;/* XPCS indirect addressing lock */ unsigned int xpcs_window_def_reg;unsigned int xpcs_window_sel_reg;
drivers/net/axgbe/axgbe_mdio.c +11 -2
@@ -409,10 +409,14 @@ static void axgbe_an73_disable(struct axgbe_port *pdata) {axgbe_an73_set (pdata, false, false);axgbe_an73_disable_interrupts (pdata); + pdata->an_start =0 ; }static void axgbe_an_restart (struct axgbe_port *pdata) { +if (pdata->phy_if.phy_impl.an_pre) + pdata->phy_if.phy_impl.an_pre (pdata); +switch (pdata->an_mode) {case AXGBE_AN_MODE_CL73 :case AXGBE_AN_MODE_CL73_REDRV :
@@ -429,6 +433,9 @@ static void axgbe_an_restart(struct axgbe_port *pdata)static void axgbe_an_disable (struct axgbe_port *pdata) { +if (pdata->phy_if.phy_impl.an_post) + pdata->phy_if.phy_impl.an_post (pdata); +switch (pdata->an_mode) {case AXGBE_AN_MODE_CL73 :case AXGBE_AN_MODE_CL73_REDRV :
@@ -604,9 +611,9 @@ static enum axgbe_an axgbe_an73_incompat_link(struct axgbe_port *pdata)return AXGBE_AN_NO_LINK ; } -axgbe_an73_disable (pdata); +axgbe_an_disable (pdata);axgbe_switch_mode (pdata); -axgbe_an73_restart (pdata); +axgbe_an_restart (pdata);return AXGBE_AN_INCOMPAT_LINK ; }
@@ -675,6 +682,8 @@ static void axgbe_an73_state_machine(struct axgbe_port *pdata) pdata->kr_state =AXGBE_RX_BPA ; pdata->kx_state =AXGBE_RX_BPA ; pdata->an_start =0 ; +if (pdata->phy_if.phy_impl.an_post) + pdata->phy_if.phy_impl.an_post (pdata); }if (cur_state != pdata->an_state)
drivers/net/axgbe/axgbe_phy_impl.c +117 -0
157 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v3 18/18 net/axgbe: moved license headers to SPDX format
In reply to Ravi Kumar--- doc/guides/nics/axgbe.rst | 125 +------------------------------- drivers/net/axgbe/Makefile | 127 +-------------------------------- drivers/net/axgbe/axgbe_common.h | 127 ++------------------------------- drivers/net/axgbe/axgbe_dev.c | 127 ++------------------------------- drivers/net/axgbe/axgbe_ethdev.c | 127 ++------------------------------- drivers/net/axgbe/axgbe_ethdev.h | 127 ++------------------------------- drivers/net/axgbe/axgbe_i2c.c | 127 ++------------------------------- drivers/net/axgbe/axgbe_logs.h | 126 +------------------------------- drivers/net/axgbe/axgbe_mdio.c | 127 ++------------------------------- drivers/net/axgbe/axgbe_phy.h | 127 ++------------------------------- drivers/net/axgbe/axgbe_phy_impl.c | 127 ++------------------------------- drivers/net/axgbe/axgbe_rxtx.c | 127 ++------------------------------- drivers/net/axgbe/axgbe_rxtx.h | 127 ++------------------------------- drivers/net/axgbe/axgbe_rxtx_vec_sse.c | 127 ++------------------------------- 14 files changed, 50 insertions(+), 1725 deletions(-)
doc/guides/nics/axgbe.rst +2 -123
@@ -1,126 +1,5 @@ -.. Copyright (c) 2017 Advanced Micro Devices, Inc. - All rights reserved. - - AMD 10Gb Ethernet driver - - This file is available to you under your choice of the following two - licenses: - - License 1: GPLv2 - - Copyright (c) 2017 Advanced Micro Devices, Inc. - - This file is free software; you may copy, redistribute and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or (at - your option) any later version. - - This file is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - - This file incorporates work covered by the following copyright and - permission notice: - - Copyright (c) 2013 Synopsys, Inc. - - The Synopsys DWC ETHER XGMAC Software Driver and documentation - (hereinafter "Software") is an unsupported proprietary work of Synopsys, - Inc. unless otherwise expressly agreed to in writing between Synopsys - and you. - - The Software IS NOT an item of Licensed Software or Licensed Product - under any End User Software License Agreement or Agreement for Licensed - Product with Synopsys or any supplement thereto. Permission is hereby - granted, free of charge, to any person obtaining a copy of this software - annotated with this license and the Software, to deal in the Software - without restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is furnished - to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" - BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS - 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. - - License 2: Modified BSD - - Copyright (c) 2017 Advanced Micro Devices, Inc. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * 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. - * Neither the name of Advanced Micro Devices, Inc. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 <COPYRIGHT HOLDER> 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. - - This file incorporates work covered by the following copyright and - permission notice: - - Copyright (c) 2013 Synopsys, Inc. - - The Synopsys DWC ETHER XGMAC Software Driver and documentation - (hereinafter "Software") is an unsupported proprietary work of Synopsys, - Inc. unless otherwise expressly agreed to in writing between Synopsys - and you. - - The Software IS NOT an item of Licensed Software or Licensed Product - under any End User Software License Agreement or Agreement for Licensed - Product with Synopsys or any supplement thereto. Permission is hereby - granted, free of charge, to any person obtaining a copy of this software - annotated with this license and the Software, to deal in the Software - without restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is furnished - to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" - BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS - 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. +.. Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. + SPDX-License-Identifier: BSD-3-Clause AXGBE Poll Mode Driver ======================
drivers/net/axgbe/Makefile +2 -125
130 lines not on this page · raw message
drivers/net/axgbe/axgbe_common.h +4 -123
132 lines not on this page · raw message
drivers/net/axgbe/axgbe_dev.c +4 -123
132 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.c +4 -123
132 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.h +4 -123
132 lines not on this page · raw message
drivers/net/axgbe/axgbe_i2c.c +4 -123
132 lines not on this page · raw message
drivers/net/axgbe/axgbe_logs.h +2 -124
130 lines not on this page · raw message
drivers/net/axgbe/axgbe_mdio.c +4 -123
132 lines not on this page · raw message
drivers/net/axgbe/axgbe_phy.h +4 -123
132 lines not on this page · raw message
drivers/net/axgbe/axgbe_phy_impl.c +4 -123
132 lines not on this page · raw message
drivers/net/axgbe/axgbe_rxtx.c +4 -123
132 lines not on this page · raw message
drivers/net/axgbe/axgbe_rxtx.h +4 -123
132 lines not on this page · raw message
drivers/net/axgbe/axgbe_rxtx_vec_sse.c +4 -123
132 lines not on this page · raw message
Signature · 1 line
2.7.4
Re: [PATCH v3 18/18] net/axgbe: moved license headers to SPDX format
Quoted 3 lines · On Fri, 9 Mar 2018 03:42:34 -0500 Ravi Kumar <[email protected]> wrote:
+.. Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved.
+ SPDX-License-Identifier: BSD-3-Clause
By convention SPDX tag is always first line of the file.
Re: [PATCH v3 18/18] net/axgbe: moved license headers to SPDX format
Quoted 9 lines
-----Original Message-----
From: Stephen Hemminger [mailto:[email protected]]
Sent: Monday, March 12, 2018 5:02 AM
To: Kumar, Ravi1 <[email protected]>
Cc: [email protected]; [email protected]
Subject: Re: [dpdk-dev] [PATCH v3 18/18] net/axgbe: moved license headers to SPDX format
Quoted 9 lines
Quoted 3 lines · On Fri, 9 Mar 2018 03:42:34 -0500 Ravi Kumar <[email protected]> wrote:
+.. Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved.
+ SPDX-License-Identifier: BSD-3-ClauseBy convention SPDX tag is always first line of
Sure Stephan. Thanks for reviewing. We will fix this.