1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause 2d30ea906Sjfb8856606 * Copyright(c) 2018 Advanced Micro Devices, Inc. All rights reserved. 3d30ea906Sjfb8856606 * Copyright(c) 2018 Synopsys, Inc. All rights reserved. 4d30ea906Sjfb8856606 */ 5d30ea906Sjfb8856606 6d30ea906Sjfb8856606 #ifndef RTE_ETH_AXGBE_H_ 7d30ea906Sjfb8856606 #define RTE_ETH_AXGBE_H_ 8d30ea906Sjfb8856606 9d30ea906Sjfb8856606 #include <rte_mempool.h> 10d30ea906Sjfb8856606 #include <rte_lcore.h> 11d30ea906Sjfb8856606 #include "axgbe_common.h" 12*2d9fd380Sjfb8856606 #include "rte_time.h" 13d30ea906Sjfb8856606 14d30ea906Sjfb8856606 #define IRQ 0xff 15d30ea906Sjfb8856606 #define VLAN_HLEN 4 16d30ea906Sjfb8856606 17d30ea906Sjfb8856606 #define AXGBE_TX_MAX_BUF_SIZE (0x3fff & ~(64 - 1)) 18d30ea906Sjfb8856606 #define AXGBE_RX_MAX_BUF_SIZE (0x3fff & ~(64 - 1)) 194418919fSjohnjiang #define AXGBE_RX_MIN_BUF_SIZE (RTE_ETHER_MAX_LEN + VLAN_HLEN) 20*2d9fd380Sjfb8856606 #define AXGBE_MAX_MAC_ADDRS 32 21*2d9fd380Sjfb8856606 #define AXGBE_MAX_HASH_MAC_ADDRS 256 22d30ea906Sjfb8856606 23d30ea906Sjfb8856606 #define AXGBE_RX_BUF_ALIGN 64 24d30ea906Sjfb8856606 25d30ea906Sjfb8856606 #define AXGBE_MAX_DMA_CHANNELS 16 26d30ea906Sjfb8856606 #define AXGBE_MAX_QUEUES 16 27d30ea906Sjfb8856606 #define AXGBE_PRIORITY_QUEUES 8 28d30ea906Sjfb8856606 #define AXGBE_DMA_STOP_TIMEOUT 1 29d30ea906Sjfb8856606 30d30ea906Sjfb8856606 /* DMA cache settings - Outer sharable, write-back, write-allocate */ 31d30ea906Sjfb8856606 #define AXGBE_DMA_OS_AXDOMAIN 0x2 32d30ea906Sjfb8856606 #define AXGBE_DMA_OS_ARCACHE 0xb 33d30ea906Sjfb8856606 #define AXGBE_DMA_OS_AWCACHE 0xf 34d30ea906Sjfb8856606 35d30ea906Sjfb8856606 /* DMA cache settings - System, no caches used */ 36d30ea906Sjfb8856606 #define AXGBE_DMA_SYS_AXDOMAIN 0x3 37d30ea906Sjfb8856606 #define AXGBE_DMA_SYS_ARCACHE 0x0 38d30ea906Sjfb8856606 #define AXGBE_DMA_SYS_AWCACHE 0x0 39d30ea906Sjfb8856606 40d30ea906Sjfb8856606 /* DMA channel interrupt modes */ 41d30ea906Sjfb8856606 #define AXGBE_IRQ_MODE_EDGE 0 42d30ea906Sjfb8856606 #define AXGBE_IRQ_MODE_LEVEL 1 43d30ea906Sjfb8856606 44d30ea906Sjfb8856606 #define AXGBE_DMA_INTERRUPT_MASK 0x31c7 45d30ea906Sjfb8856606 46d30ea906Sjfb8856606 #define AXGMAC_MIN_PACKET 60 47d30ea906Sjfb8856606 #define AXGMAC_STD_PACKET_MTU 1500 48d30ea906Sjfb8856606 #define AXGMAC_MAX_STD_PACKET 1518 49d30ea906Sjfb8856606 #define AXGMAC_JUMBO_PACKET_MTU 9000 50d30ea906Sjfb8856606 #define AXGMAC_MAX_JUMBO_PACKET 9018 51d30ea906Sjfb8856606 /* Inter-frame gap + preamble */ 52d30ea906Sjfb8856606 #define AXGMAC_ETH_PREAMBLE (12 + 8) 53d30ea906Sjfb8856606 54d30ea906Sjfb8856606 #define AXGMAC_PFC_DATA_LEN 46 55d30ea906Sjfb8856606 #define AXGMAC_PFC_DELAYS 14000 56d30ea906Sjfb8856606 57d30ea906Sjfb8856606 /* PCI BAR mapping */ 58d30ea906Sjfb8856606 #define AXGBE_AXGMAC_BAR 0 59d30ea906Sjfb8856606 #define AXGBE_XPCS_BAR 1 60d30ea906Sjfb8856606 #define AXGBE_MAC_PROP_OFFSET 0x1d000 61d30ea906Sjfb8856606 #define AXGBE_I2C_CTRL_OFFSET 0x1e000 62d30ea906Sjfb8856606 63d30ea906Sjfb8856606 /* PCI clock frequencies */ 64d30ea906Sjfb8856606 #define AXGBE_V2_DMA_CLOCK_FREQ 500000000 65d30ea906Sjfb8856606 #define AXGBE_V2_PTP_CLOCK_FREQ 125000000 66d30ea906Sjfb8856606 67*2d9fd380Sjfb8856606 /* Timestamp support - values based on 50MHz PTP clock 68*2d9fd380Sjfb8856606 * 50MHz => 20 nsec 69*2d9fd380Sjfb8856606 */ 70*2d9fd380Sjfb8856606 #define AXGBE_TSTAMP_SSINC 20 71*2d9fd380Sjfb8856606 #define AXGBE_TSTAMP_SNSINC 0 72*2d9fd380Sjfb8856606 #define AXGBE_CYCLECOUNTER_MASK 0xffffffffffffffffULL 73*2d9fd380Sjfb8856606 74d30ea906Sjfb8856606 #define AXGMAC_FIFO_MIN_ALLOC 2048 75d30ea906Sjfb8856606 #define AXGMAC_FIFO_UNIT 256 76d30ea906Sjfb8856606 #define AXGMAC_FIFO_ALIGN(_x) \ 77d30ea906Sjfb8856606 (((_x) + AXGMAC_FIFO_UNIT - 1) & ~(XGMAC_FIFO_UNIT - 1)) 78d30ea906Sjfb8856606 #define AXGMAC_FIFO_FC_OFF 2048 79d30ea906Sjfb8856606 #define AXGMAC_FIFO_FC_MIN 4096 80d30ea906Sjfb8856606 81d30ea906Sjfb8856606 #define AXGBE_TC_MIN_QUANTUM 10 82d30ea906Sjfb8856606 83d30ea906Sjfb8856606 /* Flow control queue count */ 84d30ea906Sjfb8856606 #define AXGMAC_MAX_FLOW_CONTROL_QUEUES 8 85d30ea906Sjfb8856606 86d30ea906Sjfb8856606 /* Flow control threshold units */ 87d30ea906Sjfb8856606 #define AXGMAC_FLOW_CONTROL_UNIT 512 88d30ea906Sjfb8856606 #define AXGMAC_FLOW_CONTROL_ALIGN(_x) \ 89d30ea906Sjfb8856606 (((_x) + AXGMAC_FLOW_CONTROL_UNIT - 1) & \ 90d30ea906Sjfb8856606 ~(AXGMAC_FLOW_CONTROL_UNIT - 1)) 91d30ea906Sjfb8856606 #define AXGMAC_FLOW_CONTROL_VALUE(_x) \ 92d30ea906Sjfb8856606 (((_x) < 1024) ? 0 : ((_x) / AXGMAC_FLOW_CONTROL_UNIT) - 2) 93d30ea906Sjfb8856606 #define AXGMAC_FLOW_CONTROL_MAX 33280 94d30ea906Sjfb8856606 95*2d9fd380Sjfb8856606 /* Maximum MAC address hash table size (256 bits = 8 dword) */ 96d30ea906Sjfb8856606 #define AXGBE_MAC_HASH_TABLE_SIZE 8 97d30ea906Sjfb8856606 98d30ea906Sjfb8856606 /* Receive Side Scaling */ 99d30ea906Sjfb8856606 #define AXGBE_RSS_OFFLOAD ( \ 100d30ea906Sjfb8856606 ETH_RSS_IPV4 | \ 101d30ea906Sjfb8856606 ETH_RSS_NONFRAG_IPV4_TCP | \ 102d30ea906Sjfb8856606 ETH_RSS_NONFRAG_IPV4_UDP | \ 103d30ea906Sjfb8856606 ETH_RSS_IPV6 | \ 104d30ea906Sjfb8856606 ETH_RSS_NONFRAG_IPV6_TCP | \ 105d30ea906Sjfb8856606 ETH_RSS_NONFRAG_IPV6_UDP) 106d30ea906Sjfb8856606 107d30ea906Sjfb8856606 #define AXGBE_RSS_HASH_KEY_SIZE 40 108d30ea906Sjfb8856606 #define AXGBE_RSS_MAX_TABLE_SIZE 256 109d30ea906Sjfb8856606 #define AXGBE_RSS_LOOKUP_TABLE_TYPE 0 110d30ea906Sjfb8856606 #define AXGBE_RSS_HASH_KEY_TYPE 1 111d30ea906Sjfb8856606 112d30ea906Sjfb8856606 /* Auto-negotiation */ 113d30ea906Sjfb8856606 #define AXGBE_AN_MS_TIMEOUT 500 114d30ea906Sjfb8856606 #define AXGBE_LINK_TIMEOUT 5 115d30ea906Sjfb8856606 116d30ea906Sjfb8856606 #define AXGBE_SGMII_AN_LINK_STATUS BIT(1) 117d30ea906Sjfb8856606 #define AXGBE_SGMII_AN_LINK_SPEED (BIT(2) | BIT(3)) 118d30ea906Sjfb8856606 #define AXGBE_SGMII_AN_LINK_SPEED_100 0x04 119d30ea906Sjfb8856606 #define AXGBE_SGMII_AN_LINK_SPEED_1000 0x08 120d30ea906Sjfb8856606 #define AXGBE_SGMII_AN_LINK_DUPLEX BIT(4) 121d30ea906Sjfb8856606 122d30ea906Sjfb8856606 /* ECC correctable error notification window (seconds) */ 123d30ea906Sjfb8856606 #define AXGBE_ECC_LIMIT 60 124d30ea906Sjfb8856606 125d30ea906Sjfb8856606 /* MDIO port types */ 126d30ea906Sjfb8856606 #define AXGMAC_MAX_C22_PORT 3 127d30ea906Sjfb8856606 128d30ea906Sjfb8856606 /* Helper macro for descriptor handling 129d30ea906Sjfb8856606 * Always use AXGBE_GET_DESC_DATA to access the descriptor data 130d30ea906Sjfb8856606 * since the index is free-running and needs to be and-ed 131d30ea906Sjfb8856606 * with the descriptor count value of the ring to index to 132d30ea906Sjfb8856606 * the proper descriptor data. 133d30ea906Sjfb8856606 */ 134d30ea906Sjfb8856606 #define AXGBE_GET_DESC_DATA(_ring, _idx) \ 135d30ea906Sjfb8856606 ((_ring)->rdata + \ 136d30ea906Sjfb8856606 ((_idx) & ((_ring)->rdesc_count - 1))) 137d30ea906Sjfb8856606 138d30ea906Sjfb8856606 struct axgbe_port; 139d30ea906Sjfb8856606 140d30ea906Sjfb8856606 enum axgbe_state { 141d30ea906Sjfb8856606 AXGBE_DOWN, 142d30ea906Sjfb8856606 AXGBE_LINK_INIT, 143d30ea906Sjfb8856606 AXGBE_LINK_ERR, 144d30ea906Sjfb8856606 AXGBE_STOPPED, 145d30ea906Sjfb8856606 }; 146d30ea906Sjfb8856606 147d30ea906Sjfb8856606 enum axgbe_int { 148d30ea906Sjfb8856606 AXGMAC_INT_DMA_CH_SR_TI, 149d30ea906Sjfb8856606 AXGMAC_INT_DMA_CH_SR_TPS, 150d30ea906Sjfb8856606 AXGMAC_INT_DMA_CH_SR_TBU, 151d30ea906Sjfb8856606 AXGMAC_INT_DMA_CH_SR_RI, 152d30ea906Sjfb8856606 AXGMAC_INT_DMA_CH_SR_RBU, 153d30ea906Sjfb8856606 AXGMAC_INT_DMA_CH_SR_RPS, 154d30ea906Sjfb8856606 AXGMAC_INT_DMA_CH_SR_TI_RI, 155d30ea906Sjfb8856606 AXGMAC_INT_DMA_CH_SR_FBE, 156d30ea906Sjfb8856606 AXGMAC_INT_DMA_ALL, 157d30ea906Sjfb8856606 }; 158d30ea906Sjfb8856606 159d30ea906Sjfb8856606 enum axgbe_int_state { 160d30ea906Sjfb8856606 AXGMAC_INT_STATE_SAVE, 161d30ea906Sjfb8856606 AXGMAC_INT_STATE_RESTORE, 162d30ea906Sjfb8856606 }; 163d30ea906Sjfb8856606 164d30ea906Sjfb8856606 enum axgbe_ecc_sec { 165d30ea906Sjfb8856606 AXGBE_ECC_SEC_TX, 166d30ea906Sjfb8856606 AXGBE_ECC_SEC_RX, 167d30ea906Sjfb8856606 AXGBE_ECC_SEC_DESC, 168d30ea906Sjfb8856606 }; 169d30ea906Sjfb8856606 170d30ea906Sjfb8856606 enum axgbe_speed { 171d30ea906Sjfb8856606 AXGBE_SPEED_1000 = 0, 172d30ea906Sjfb8856606 AXGBE_SPEED_2500, 173d30ea906Sjfb8856606 AXGBE_SPEED_10000, 174d30ea906Sjfb8856606 AXGBE_SPEEDS, 175d30ea906Sjfb8856606 }; 176d30ea906Sjfb8856606 177d30ea906Sjfb8856606 enum axgbe_xpcs_access { 178d30ea906Sjfb8856606 AXGBE_XPCS_ACCESS_V1 = 0, 179d30ea906Sjfb8856606 AXGBE_XPCS_ACCESS_V2, 180d30ea906Sjfb8856606 }; 181d30ea906Sjfb8856606 182d30ea906Sjfb8856606 enum axgbe_an_mode { 183d30ea906Sjfb8856606 AXGBE_AN_MODE_CL73 = 0, 184d30ea906Sjfb8856606 AXGBE_AN_MODE_CL73_REDRV, 185d30ea906Sjfb8856606 AXGBE_AN_MODE_CL37, 186d30ea906Sjfb8856606 AXGBE_AN_MODE_CL37_SGMII, 187d30ea906Sjfb8856606 AXGBE_AN_MODE_NONE, 188d30ea906Sjfb8856606 }; 189d30ea906Sjfb8856606 190d30ea906Sjfb8856606 enum axgbe_an { 191d30ea906Sjfb8856606 AXGBE_AN_READY = 0, 192d30ea906Sjfb8856606 AXGBE_AN_PAGE_RECEIVED, 193d30ea906Sjfb8856606 AXGBE_AN_INCOMPAT_LINK, 194d30ea906Sjfb8856606 AXGBE_AN_COMPLETE, 195d30ea906Sjfb8856606 AXGBE_AN_NO_LINK, 196d30ea906Sjfb8856606 AXGBE_AN_ERROR, 197d30ea906Sjfb8856606 }; 198d30ea906Sjfb8856606 199d30ea906Sjfb8856606 enum axgbe_rx { 200d30ea906Sjfb8856606 AXGBE_RX_BPA = 0, 201d30ea906Sjfb8856606 AXGBE_RX_XNP, 202d30ea906Sjfb8856606 AXGBE_RX_COMPLETE, 203d30ea906Sjfb8856606 AXGBE_RX_ERROR, 204d30ea906Sjfb8856606 }; 205d30ea906Sjfb8856606 206d30ea906Sjfb8856606 enum axgbe_mode { 207d30ea906Sjfb8856606 AXGBE_MODE_KX_1000 = 0, 208d30ea906Sjfb8856606 AXGBE_MODE_KX_2500, 209d30ea906Sjfb8856606 AXGBE_MODE_KR, 210d30ea906Sjfb8856606 AXGBE_MODE_X, 211d30ea906Sjfb8856606 AXGBE_MODE_SGMII_100, 212d30ea906Sjfb8856606 AXGBE_MODE_SGMII_1000, 213d30ea906Sjfb8856606 AXGBE_MODE_SFI, 214d30ea906Sjfb8856606 AXGBE_MODE_UNKNOWN, 215d30ea906Sjfb8856606 }; 216d30ea906Sjfb8856606 217d30ea906Sjfb8856606 enum axgbe_speedset { 218d30ea906Sjfb8856606 AXGBE_SPEEDSET_1000_10000 = 0, 219d30ea906Sjfb8856606 AXGBE_SPEEDSET_2500_10000, 220d30ea906Sjfb8856606 }; 221d30ea906Sjfb8856606 222d30ea906Sjfb8856606 enum axgbe_mdio_mode { 223d30ea906Sjfb8856606 AXGBE_MDIO_MODE_NONE = 0, 224d30ea906Sjfb8856606 AXGBE_MDIO_MODE_CL22, 225d30ea906Sjfb8856606 AXGBE_MDIO_MODE_CL45, 226d30ea906Sjfb8856606 }; 227d30ea906Sjfb8856606 228d30ea906Sjfb8856606 struct axgbe_phy { 229d30ea906Sjfb8856606 uint32_t supported; 230d30ea906Sjfb8856606 uint32_t advertising; 231d30ea906Sjfb8856606 uint32_t lp_advertising; 232d30ea906Sjfb8856606 233d30ea906Sjfb8856606 int address; 234d30ea906Sjfb8856606 235d30ea906Sjfb8856606 int autoneg; 236d30ea906Sjfb8856606 int speed; 237d30ea906Sjfb8856606 int duplex; 238d30ea906Sjfb8856606 239d30ea906Sjfb8856606 int link; 240d30ea906Sjfb8856606 241d30ea906Sjfb8856606 int pause_autoneg; 242d30ea906Sjfb8856606 int tx_pause; 243d30ea906Sjfb8856606 int rx_pause; 244d30ea906Sjfb8856606 }; 245d30ea906Sjfb8856606 246d30ea906Sjfb8856606 enum axgbe_i2c_cmd { 247d30ea906Sjfb8856606 AXGBE_I2C_CMD_READ = 0, 248d30ea906Sjfb8856606 AXGBE_I2C_CMD_WRITE, 249d30ea906Sjfb8856606 }; 250d30ea906Sjfb8856606 251d30ea906Sjfb8856606 struct axgbe_i2c_op { 252d30ea906Sjfb8856606 enum axgbe_i2c_cmd cmd; 253d30ea906Sjfb8856606 254d30ea906Sjfb8856606 unsigned int target; 255d30ea906Sjfb8856606 256d30ea906Sjfb8856606 uint8_t *buf; 257d30ea906Sjfb8856606 unsigned int len; 258d30ea906Sjfb8856606 }; 259d30ea906Sjfb8856606 260d30ea906Sjfb8856606 struct axgbe_i2c_op_state { 261d30ea906Sjfb8856606 struct axgbe_i2c_op *op; 262d30ea906Sjfb8856606 263d30ea906Sjfb8856606 unsigned int tx_len; 264d30ea906Sjfb8856606 unsigned char *tx_buf; 265d30ea906Sjfb8856606 266d30ea906Sjfb8856606 unsigned int rx_len; 267d30ea906Sjfb8856606 unsigned char *rx_buf; 268d30ea906Sjfb8856606 269d30ea906Sjfb8856606 unsigned int tx_abort_source; 270d30ea906Sjfb8856606 271d30ea906Sjfb8856606 int ret; 272d30ea906Sjfb8856606 }; 273d30ea906Sjfb8856606 274d30ea906Sjfb8856606 struct axgbe_i2c { 275d30ea906Sjfb8856606 unsigned int started; 276d30ea906Sjfb8856606 unsigned int max_speed_mode; 277d30ea906Sjfb8856606 unsigned int rx_fifo_size; 278d30ea906Sjfb8856606 unsigned int tx_fifo_size; 279d30ea906Sjfb8856606 280d30ea906Sjfb8856606 struct axgbe_i2c_op_state op_state; 281d30ea906Sjfb8856606 }; 282d30ea906Sjfb8856606 283d30ea906Sjfb8856606 struct axgbe_hw_if { 284d30ea906Sjfb8856606 void (*config_flow_control)(struct axgbe_port *); 285d30ea906Sjfb8856606 int (*config_rx_mode)(struct axgbe_port *); 286d30ea906Sjfb8856606 287d30ea906Sjfb8856606 int (*init)(struct axgbe_port *); 288d30ea906Sjfb8856606 289d30ea906Sjfb8856606 int (*read_mmd_regs)(struct axgbe_port *, int, int); 290d30ea906Sjfb8856606 void (*write_mmd_regs)(struct axgbe_port *, int, int, int); 291d30ea906Sjfb8856606 int (*set_speed)(struct axgbe_port *, int); 292d30ea906Sjfb8856606 293d30ea906Sjfb8856606 int (*set_ext_mii_mode)(struct axgbe_port *, unsigned int, 294d30ea906Sjfb8856606 enum axgbe_mdio_mode); 295d30ea906Sjfb8856606 int (*read_ext_mii_regs)(struct axgbe_port *, int, int); 296d30ea906Sjfb8856606 int (*write_ext_mii_regs)(struct axgbe_port *, int, int, uint16_t); 297d30ea906Sjfb8856606 298d30ea906Sjfb8856606 /* For FLOW ctrl */ 299d30ea906Sjfb8856606 int (*config_tx_flow_control)(struct axgbe_port *); 300d30ea906Sjfb8856606 int (*config_rx_flow_control)(struct axgbe_port *); 301d30ea906Sjfb8856606 302d30ea906Sjfb8856606 int (*exit)(struct axgbe_port *); 303d30ea906Sjfb8856606 }; 304d30ea906Sjfb8856606 305d30ea906Sjfb8856606 /* This structure represents implementation specific routines for an 306d30ea906Sjfb8856606 * implementation of a PHY. All routines are required unless noted below. 307d30ea906Sjfb8856606 * Optional routines: 308d30ea906Sjfb8856606 * kr_training_pre, kr_training_post 309d30ea906Sjfb8856606 */ 310d30ea906Sjfb8856606 struct axgbe_phy_impl_if { 311d30ea906Sjfb8856606 /* Perform Setup/teardown actions */ 312d30ea906Sjfb8856606 int (*init)(struct axgbe_port *); 313d30ea906Sjfb8856606 void (*exit)(struct axgbe_port *); 314d30ea906Sjfb8856606 315d30ea906Sjfb8856606 /* Perform start/stop specific actions */ 316d30ea906Sjfb8856606 int (*reset)(struct axgbe_port *); 317d30ea906Sjfb8856606 int (*start)(struct axgbe_port *); 318d30ea906Sjfb8856606 void (*stop)(struct axgbe_port *); 319d30ea906Sjfb8856606 320d30ea906Sjfb8856606 /* Return the link status */ 321d30ea906Sjfb8856606 int (*link_status)(struct axgbe_port *, int *); 322d30ea906Sjfb8856606 323d30ea906Sjfb8856606 /* Indicate if a particular speed is valid */ 324d30ea906Sjfb8856606 int (*valid_speed)(struct axgbe_port *, int); 325d30ea906Sjfb8856606 326d30ea906Sjfb8856606 /* Check if the specified mode can/should be used */ 327d30ea906Sjfb8856606 bool (*use_mode)(struct axgbe_port *, enum axgbe_mode); 328d30ea906Sjfb8856606 /* Switch the PHY into various modes */ 329d30ea906Sjfb8856606 void (*set_mode)(struct axgbe_port *, enum axgbe_mode); 330d30ea906Sjfb8856606 /* Retrieve mode needed for a specific speed */ 331d30ea906Sjfb8856606 enum axgbe_mode (*get_mode)(struct axgbe_port *, int); 332d30ea906Sjfb8856606 /* Retrieve new/next mode when trying to auto-negotiate */ 333d30ea906Sjfb8856606 enum axgbe_mode (*switch_mode)(struct axgbe_port *); 334d30ea906Sjfb8856606 /* Retrieve current mode */ 335d30ea906Sjfb8856606 enum axgbe_mode (*cur_mode)(struct axgbe_port *); 336d30ea906Sjfb8856606 337d30ea906Sjfb8856606 /* Retrieve current auto-negotiation mode */ 338d30ea906Sjfb8856606 enum axgbe_an_mode (*an_mode)(struct axgbe_port *); 339d30ea906Sjfb8856606 340d30ea906Sjfb8856606 /* Configure auto-negotiation settings */ 341d30ea906Sjfb8856606 int (*an_config)(struct axgbe_port *); 342d30ea906Sjfb8856606 343d30ea906Sjfb8856606 /* Set/override auto-negotiation advertisement settings */ 344d30ea906Sjfb8856606 unsigned int (*an_advertising)(struct axgbe_port *port); 345d30ea906Sjfb8856606 346d30ea906Sjfb8856606 /* Process results of auto-negotiation */ 347d30ea906Sjfb8856606 enum axgbe_mode (*an_outcome)(struct axgbe_port *); 348d30ea906Sjfb8856606 349d30ea906Sjfb8856606 /* Pre/Post auto-negotiation support */ 350d30ea906Sjfb8856606 void (*an_pre)(struct axgbe_port *port); 351d30ea906Sjfb8856606 void (*an_post)(struct axgbe_port *port); 352d30ea906Sjfb8856606 353d30ea906Sjfb8856606 /* Pre/Post KR training enablement support */ 354d30ea906Sjfb8856606 void (*kr_training_pre)(struct axgbe_port *); 355d30ea906Sjfb8856606 void (*kr_training_post)(struct axgbe_port *); 356d30ea906Sjfb8856606 }; 357d30ea906Sjfb8856606 358d30ea906Sjfb8856606 struct axgbe_phy_if { 359d30ea906Sjfb8856606 /* For PHY setup/teardown */ 360d30ea906Sjfb8856606 int (*phy_init)(struct axgbe_port *); 361d30ea906Sjfb8856606 void (*phy_exit)(struct axgbe_port *); 362d30ea906Sjfb8856606 363d30ea906Sjfb8856606 /* For PHY support when setting device up/down */ 364d30ea906Sjfb8856606 int (*phy_reset)(struct axgbe_port *); 365d30ea906Sjfb8856606 int (*phy_start)(struct axgbe_port *); 366d30ea906Sjfb8856606 void (*phy_stop)(struct axgbe_port *); 367d30ea906Sjfb8856606 368d30ea906Sjfb8856606 /* For PHY support while device is up */ 369d30ea906Sjfb8856606 void (*phy_status)(struct axgbe_port *); 370d30ea906Sjfb8856606 int (*phy_config_aneg)(struct axgbe_port *); 371d30ea906Sjfb8856606 372d30ea906Sjfb8856606 /* For PHY settings validation */ 373d30ea906Sjfb8856606 int (*phy_valid_speed)(struct axgbe_port *, int); 374d30ea906Sjfb8856606 /* For single interrupt support */ 375d30ea906Sjfb8856606 void (*an_isr)(struct axgbe_port *); 376d30ea906Sjfb8856606 /* PHY implementation specific services */ 377d30ea906Sjfb8856606 struct axgbe_phy_impl_if phy_impl; 378d30ea906Sjfb8856606 }; 379d30ea906Sjfb8856606 380d30ea906Sjfb8856606 struct axgbe_i2c_if { 381d30ea906Sjfb8856606 /* For initial I2C setup */ 382d30ea906Sjfb8856606 int (*i2c_init)(struct axgbe_port *); 383d30ea906Sjfb8856606 384d30ea906Sjfb8856606 /* For I2C support when setting device up/down */ 385d30ea906Sjfb8856606 int (*i2c_start)(struct axgbe_port *); 386d30ea906Sjfb8856606 void (*i2c_stop)(struct axgbe_port *); 387d30ea906Sjfb8856606 388d30ea906Sjfb8856606 /* For performing I2C operations */ 389d30ea906Sjfb8856606 int (*i2c_xfer)(struct axgbe_port *, struct axgbe_i2c_op *); 390d30ea906Sjfb8856606 }; 391d30ea906Sjfb8856606 392d30ea906Sjfb8856606 /* This structure contains flags that indicate what hardware features 393d30ea906Sjfb8856606 * or configurations are present in the device. 394d30ea906Sjfb8856606 */ 395d30ea906Sjfb8856606 struct axgbe_hw_features { 396d30ea906Sjfb8856606 /* HW Version */ 397d30ea906Sjfb8856606 unsigned int version; 398d30ea906Sjfb8856606 399d30ea906Sjfb8856606 /* HW Feature Register0 */ 400d30ea906Sjfb8856606 unsigned int gmii; /* 1000 Mbps support */ 401d30ea906Sjfb8856606 unsigned int vlhash; /* VLAN Hash Filter */ 402d30ea906Sjfb8856606 unsigned int sma; /* SMA(MDIO) Interface */ 403d30ea906Sjfb8856606 unsigned int rwk; /* PMT remote wake-up packet */ 404d30ea906Sjfb8856606 unsigned int mgk; /* PMT magic packet */ 405d30ea906Sjfb8856606 unsigned int mmc; /* RMON module */ 406d30ea906Sjfb8856606 unsigned int aoe; /* ARP Offload */ 407d30ea906Sjfb8856606 unsigned int ts; /* IEEE 1588-2008 Advanced Timestamp */ 408d30ea906Sjfb8856606 unsigned int eee; /* Energy Efficient Ethernet */ 409d30ea906Sjfb8856606 unsigned int tx_coe; /* Tx Checksum Offload */ 410d30ea906Sjfb8856606 unsigned int rx_coe; /* Rx Checksum Offload */ 411d30ea906Sjfb8856606 unsigned int addn_mac; /* Additional MAC Addresses */ 412d30ea906Sjfb8856606 unsigned int ts_src; /* Timestamp Source */ 413d30ea906Sjfb8856606 unsigned int sa_vlan_ins; /* Source Address or VLAN Insertion */ 414d30ea906Sjfb8856606 415d30ea906Sjfb8856606 /* HW Feature Register1 */ 416d30ea906Sjfb8856606 unsigned int rx_fifo_size; /* MTL Receive FIFO Size */ 417d30ea906Sjfb8856606 unsigned int tx_fifo_size; /* MTL Transmit FIFO Size */ 418d30ea906Sjfb8856606 unsigned int adv_ts_hi; /* Advance Timestamping High Word */ 419d30ea906Sjfb8856606 unsigned int dma_width; /* DMA width */ 420d30ea906Sjfb8856606 unsigned int dcb; /* DCB Feature */ 421d30ea906Sjfb8856606 unsigned int sph; /* Split Header Feature */ 422d30ea906Sjfb8856606 unsigned int tso; /* TCP Segmentation Offload */ 423d30ea906Sjfb8856606 unsigned int dma_debug; /* DMA Debug Registers */ 424d30ea906Sjfb8856606 unsigned int rss; /* Receive Side Scaling */ 425d30ea906Sjfb8856606 unsigned int tc_cnt; /* Number of Traffic Classes */ 426d30ea906Sjfb8856606 unsigned int hash_table_size; /* Hash Table Size */ 427d30ea906Sjfb8856606 unsigned int l3l4_filter_num; /* Number of L3-L4 Filters */ 428d30ea906Sjfb8856606 429d30ea906Sjfb8856606 /* HW Feature Register2 */ 430d30ea906Sjfb8856606 unsigned int rx_q_cnt; /* Number of MTL Receive Queues */ 431d30ea906Sjfb8856606 unsigned int tx_q_cnt; /* Number of MTL Transmit Queues */ 432d30ea906Sjfb8856606 unsigned int rx_ch_cnt; /* Number of DMA Receive Channels */ 433d30ea906Sjfb8856606 unsigned int tx_ch_cnt; /* Number of DMA Transmit Channels */ 434d30ea906Sjfb8856606 unsigned int pps_out_num; /* Number of PPS outputs */ 435d30ea906Sjfb8856606 unsigned int aux_snap_num; /* Number of Aux snapshot inputs */ 436d30ea906Sjfb8856606 }; 437d30ea906Sjfb8856606 438d30ea906Sjfb8856606 struct axgbe_version_data { 439d30ea906Sjfb8856606 void (*init_function_ptrs_phy_impl)(struct axgbe_phy_if *); 440d30ea906Sjfb8856606 enum axgbe_xpcs_access xpcs_access; 441d30ea906Sjfb8856606 unsigned int mmc_64bit; 442d30ea906Sjfb8856606 unsigned int tx_max_fifo_size; 443d30ea906Sjfb8856606 unsigned int rx_max_fifo_size; 444d30ea906Sjfb8856606 unsigned int tx_tstamp_workaround; 445d30ea906Sjfb8856606 unsigned int ecc_support; 446d30ea906Sjfb8856606 unsigned int i2c_support; 447d30ea906Sjfb8856606 unsigned int an_cdr_workaround; 448d30ea906Sjfb8856606 }; 449d30ea906Sjfb8856606 450*2d9fd380Sjfb8856606 struct axgbe_mmc_stats { 451*2d9fd380Sjfb8856606 /* Tx Stats */ 452*2d9fd380Sjfb8856606 uint64_t txoctetcount_gb; 453*2d9fd380Sjfb8856606 uint64_t txframecount_gb; 454*2d9fd380Sjfb8856606 uint64_t txbroadcastframes_g; 455*2d9fd380Sjfb8856606 uint64_t txmulticastframes_g; 456*2d9fd380Sjfb8856606 uint64_t tx64octets_gb; 457*2d9fd380Sjfb8856606 uint64_t tx65to127octets_gb; 458*2d9fd380Sjfb8856606 uint64_t tx128to255octets_gb; 459*2d9fd380Sjfb8856606 uint64_t tx256to511octets_gb; 460*2d9fd380Sjfb8856606 uint64_t tx512to1023octets_gb; 461*2d9fd380Sjfb8856606 uint64_t tx1024tomaxoctets_gb; 462*2d9fd380Sjfb8856606 uint64_t txunicastframes_gb; 463*2d9fd380Sjfb8856606 uint64_t txmulticastframes_gb; 464*2d9fd380Sjfb8856606 uint64_t txbroadcastframes_gb; 465*2d9fd380Sjfb8856606 uint64_t txunderflowerror; 466*2d9fd380Sjfb8856606 uint64_t txoctetcount_g; 467*2d9fd380Sjfb8856606 uint64_t txframecount_g; 468*2d9fd380Sjfb8856606 uint64_t txpauseframes; 469*2d9fd380Sjfb8856606 uint64_t txvlanframes_g; 470*2d9fd380Sjfb8856606 471*2d9fd380Sjfb8856606 /* Rx Stats */ 472*2d9fd380Sjfb8856606 uint64_t rxframecount_gb; 473*2d9fd380Sjfb8856606 uint64_t rxoctetcount_gb; 474*2d9fd380Sjfb8856606 uint64_t rxoctetcount_g; 475*2d9fd380Sjfb8856606 uint64_t rxbroadcastframes_g; 476*2d9fd380Sjfb8856606 uint64_t rxmulticastframes_g; 477*2d9fd380Sjfb8856606 uint64_t rxcrcerror; 478*2d9fd380Sjfb8856606 uint64_t rxrunterror; 479*2d9fd380Sjfb8856606 uint64_t rxjabbererror; 480*2d9fd380Sjfb8856606 uint64_t rxundersize_g; 481*2d9fd380Sjfb8856606 uint64_t rxoversize_g; 482*2d9fd380Sjfb8856606 uint64_t rx64octets_gb; 483*2d9fd380Sjfb8856606 uint64_t rx65to127octets_gb; 484*2d9fd380Sjfb8856606 uint64_t rx128to255octets_gb; 485*2d9fd380Sjfb8856606 uint64_t rx256to511octets_gb; 486*2d9fd380Sjfb8856606 uint64_t rx512to1023octets_gb; 487*2d9fd380Sjfb8856606 uint64_t rx1024tomaxoctets_gb; 488*2d9fd380Sjfb8856606 uint64_t rxunicastframes_g; 489*2d9fd380Sjfb8856606 uint64_t rxlengtherror; 490*2d9fd380Sjfb8856606 uint64_t rxoutofrangetype; 491*2d9fd380Sjfb8856606 uint64_t rxpauseframes; 492*2d9fd380Sjfb8856606 uint64_t rxfifooverflow; 493*2d9fd380Sjfb8856606 uint64_t rxvlanframes_gb; 494*2d9fd380Sjfb8856606 uint64_t rxwatchdogerror; 495*2d9fd380Sjfb8856606 }; 496*2d9fd380Sjfb8856606 497*2d9fd380Sjfb8856606 /* Flow control parameters */ 498*2d9fd380Sjfb8856606 struct xgbe_fc_info { 499*2d9fd380Sjfb8856606 uint32_t high_water[AXGBE_PRIORITY_QUEUES]; 500*2d9fd380Sjfb8856606 uint32_t low_water[AXGBE_PRIORITY_QUEUES]; 501*2d9fd380Sjfb8856606 uint16_t pause_time[AXGBE_PRIORITY_QUEUES]; 502*2d9fd380Sjfb8856606 uint16_t send_xon; 503*2d9fd380Sjfb8856606 enum rte_eth_fc_mode mode; 504*2d9fd380Sjfb8856606 uint8_t autoneg; 505*2d9fd380Sjfb8856606 }; 506*2d9fd380Sjfb8856606 507d30ea906Sjfb8856606 /* 508d30ea906Sjfb8856606 * Structure to store private data for each port. 509d30ea906Sjfb8856606 */ 510d30ea906Sjfb8856606 struct axgbe_port { 511d30ea906Sjfb8856606 /* Ethdev where port belongs*/ 512d30ea906Sjfb8856606 struct rte_eth_dev *eth_dev; 513d30ea906Sjfb8856606 /* Pci dev info */ 514d30ea906Sjfb8856606 const struct rte_pci_device *pci_dev; 515d30ea906Sjfb8856606 /* Version related data */ 516d30ea906Sjfb8856606 struct axgbe_version_data *vdata; 517d30ea906Sjfb8856606 518d30ea906Sjfb8856606 /* AXGMAC/XPCS related mmio registers */ 519d30ea906Sjfb8856606 void *xgmac_regs; /* AXGMAC CSRs */ 520d30ea906Sjfb8856606 void *xpcs_regs; /* XPCS MMD registers */ 521d30ea906Sjfb8856606 void *xprop_regs; /* AXGBE property registers */ 522d30ea906Sjfb8856606 void *xi2c_regs; /* AXGBE I2C CSRs */ 523d30ea906Sjfb8856606 524d30ea906Sjfb8856606 bool cdr_track_early; 525d30ea906Sjfb8856606 /* XPCS indirect addressing lock */ 526d30ea906Sjfb8856606 unsigned int xpcs_window_def_reg; 527d30ea906Sjfb8856606 unsigned int xpcs_window_sel_reg; 528d30ea906Sjfb8856606 unsigned int xpcs_window; 529d30ea906Sjfb8856606 unsigned int xpcs_window_size; 530d30ea906Sjfb8856606 unsigned int xpcs_window_mask; 531d30ea906Sjfb8856606 532d30ea906Sjfb8856606 /* Flags representing axgbe_state */ 533*2d9fd380Sjfb8856606 uint32_t dev_state; 534d30ea906Sjfb8856606 535d30ea906Sjfb8856606 struct axgbe_hw_if hw_if; 536d30ea906Sjfb8856606 struct axgbe_phy_if phy_if; 537d30ea906Sjfb8856606 struct axgbe_i2c_if i2c_if; 538d30ea906Sjfb8856606 539d30ea906Sjfb8856606 /* AXI DMA settings */ 540d30ea906Sjfb8856606 unsigned int coherent; 541d30ea906Sjfb8856606 unsigned int axdomain; 542d30ea906Sjfb8856606 unsigned int arcache; 543d30ea906Sjfb8856606 unsigned int awcache; 544d30ea906Sjfb8856606 545d30ea906Sjfb8856606 unsigned int tx_max_channel_count; 546d30ea906Sjfb8856606 unsigned int rx_max_channel_count; 547d30ea906Sjfb8856606 unsigned int channel_count; 548d30ea906Sjfb8856606 unsigned int tx_ring_count; 549d30ea906Sjfb8856606 unsigned int tx_desc_count; 550d30ea906Sjfb8856606 unsigned int rx_ring_count; 551d30ea906Sjfb8856606 unsigned int rx_desc_count; 552d30ea906Sjfb8856606 553d30ea906Sjfb8856606 unsigned int tx_max_q_count; 554d30ea906Sjfb8856606 unsigned int rx_max_q_count; 555d30ea906Sjfb8856606 unsigned int tx_q_count; 556d30ea906Sjfb8856606 unsigned int rx_q_count; 557d30ea906Sjfb8856606 558d30ea906Sjfb8856606 /* Tx/Rx common settings */ 559d30ea906Sjfb8856606 unsigned int pblx8; 560d30ea906Sjfb8856606 561d30ea906Sjfb8856606 /* Tx settings */ 562d30ea906Sjfb8856606 unsigned int tx_sf_mode; 563d30ea906Sjfb8856606 unsigned int tx_threshold; 564d30ea906Sjfb8856606 unsigned int tx_pbl; 565d30ea906Sjfb8856606 unsigned int tx_osp_mode; 566d30ea906Sjfb8856606 unsigned int tx_max_fifo_size; 567d30ea906Sjfb8856606 568d30ea906Sjfb8856606 /* Rx settings */ 569d30ea906Sjfb8856606 unsigned int rx_sf_mode; 570d30ea906Sjfb8856606 unsigned int rx_threshold; 571d30ea906Sjfb8856606 unsigned int rx_pbl; 572d30ea906Sjfb8856606 unsigned int rx_max_fifo_size; 573d30ea906Sjfb8856606 unsigned int rx_buf_size; 574d30ea906Sjfb8856606 575d30ea906Sjfb8856606 /* Device clocks */ 576d30ea906Sjfb8856606 unsigned long sysclk_rate; 577d30ea906Sjfb8856606 unsigned long ptpclk_rate; 578d30ea906Sjfb8856606 579d30ea906Sjfb8856606 /* Keeps track of power mode */ 580d30ea906Sjfb8856606 unsigned int power_down; 581d30ea906Sjfb8856606 582d30ea906Sjfb8856606 /* Current PHY settings */ 583d30ea906Sjfb8856606 int phy_link; 584d30ea906Sjfb8856606 int phy_speed; 585d30ea906Sjfb8856606 586d30ea906Sjfb8856606 pthread_mutex_t xpcs_mutex; 587d30ea906Sjfb8856606 pthread_mutex_t i2c_mutex; 588d30ea906Sjfb8856606 pthread_mutex_t an_mutex; 589d30ea906Sjfb8856606 pthread_mutex_t phy_mutex; 590d30ea906Sjfb8856606 591d30ea906Sjfb8856606 /* Flow control settings */ 592d30ea906Sjfb8856606 unsigned int pause_autoneg; 593d30ea906Sjfb8856606 unsigned int tx_pause; 594d30ea906Sjfb8856606 unsigned int rx_pause; 595d30ea906Sjfb8856606 unsigned int rx_rfa[AXGBE_MAX_QUEUES]; 596d30ea906Sjfb8856606 unsigned int rx_rfd[AXGBE_MAX_QUEUES]; 597d30ea906Sjfb8856606 unsigned int fifo; 598*2d9fd380Sjfb8856606 unsigned int pfc_map[AXGBE_MAX_QUEUES]; 599d30ea906Sjfb8856606 600d30ea906Sjfb8856606 /* Receive Side Scaling settings */ 601d30ea906Sjfb8856606 u8 rss_key[AXGBE_RSS_HASH_KEY_SIZE]; 602d30ea906Sjfb8856606 uint32_t rss_table[AXGBE_RSS_MAX_TABLE_SIZE]; 603d30ea906Sjfb8856606 uint32_t rss_options; 604d30ea906Sjfb8856606 int rss_enable; 605*2d9fd380Sjfb8856606 uint64_t rss_hf; 606d30ea906Sjfb8856606 607d30ea906Sjfb8856606 /* Hardware features of the device */ 608d30ea906Sjfb8856606 struct axgbe_hw_features hw_feat; 609d30ea906Sjfb8856606 6104418919fSjohnjiang struct rte_ether_addr mac_addr; 611d30ea906Sjfb8856606 612d30ea906Sjfb8856606 /* Software Tx/Rx structure pointers*/ 613d30ea906Sjfb8856606 void **rx_queues; 614d30ea906Sjfb8856606 void **tx_queues; 615d30ea906Sjfb8856606 616d30ea906Sjfb8856606 /* MDIO/PHY related settings */ 617d30ea906Sjfb8856606 unsigned int phy_started; 618d30ea906Sjfb8856606 void *phy_data; 619d30ea906Sjfb8856606 struct axgbe_phy phy; 620d30ea906Sjfb8856606 int mdio_mmd; 621d30ea906Sjfb8856606 unsigned long link_check; 622d30ea906Sjfb8856606 volatile int mdio_completion; 623d30ea906Sjfb8856606 624d30ea906Sjfb8856606 unsigned int kr_redrv; 625d30ea906Sjfb8856606 626d30ea906Sjfb8856606 /* Auto-negotiation atate machine support */ 627d30ea906Sjfb8856606 unsigned int an_int; 628d30ea906Sjfb8856606 unsigned int an_status; 629d30ea906Sjfb8856606 enum axgbe_an an_result; 630d30ea906Sjfb8856606 enum axgbe_an an_state; 631d30ea906Sjfb8856606 enum axgbe_rx kr_state; 632d30ea906Sjfb8856606 enum axgbe_rx kx_state; 633d30ea906Sjfb8856606 unsigned int an_supported; 634d30ea906Sjfb8856606 unsigned int parallel_detect; 635d30ea906Sjfb8856606 unsigned int fec_ability; 636d30ea906Sjfb8856606 unsigned long an_start; 637d30ea906Sjfb8856606 enum axgbe_an_mode an_mode; 638d30ea906Sjfb8856606 639d30ea906Sjfb8856606 /* I2C support */ 640d30ea906Sjfb8856606 struct axgbe_i2c i2c; 641d30ea906Sjfb8856606 volatile int i2c_complete; 642d30ea906Sjfb8856606 643d30ea906Sjfb8856606 /* CRC stripping by H/w for Rx packet*/ 644d30ea906Sjfb8856606 int crc_strip_enable; 645d30ea906Sjfb8856606 /* csum enable to hardware */ 646d30ea906Sjfb8856606 uint32_t rx_csum_enable; 647*2d9fd380Sjfb8856606 648*2d9fd380Sjfb8856606 struct axgbe_mmc_stats mmc_stats; 649*2d9fd380Sjfb8856606 struct xgbe_fc_info fc; 650*2d9fd380Sjfb8856606 651*2d9fd380Sjfb8856606 /* Hash filtering */ 652*2d9fd380Sjfb8856606 unsigned int hash_table_shift; 653*2d9fd380Sjfb8856606 unsigned int hash_table_count; 654*2d9fd380Sjfb8856606 unsigned int uc_hash_mac_addr; 655*2d9fd380Sjfb8856606 unsigned int uc_hash_table[AXGBE_MAC_HASH_TABLE_SIZE]; 656*2d9fd380Sjfb8856606 657*2d9fd380Sjfb8856606 /* For IEEE1588 PTP */ 658*2d9fd380Sjfb8856606 struct rte_timecounter systime_tc; 659*2d9fd380Sjfb8856606 struct rte_timecounter tx_tstamp; 660*2d9fd380Sjfb8856606 unsigned int tstamp_addend; 661*2d9fd380Sjfb8856606 662d30ea906Sjfb8856606 }; 663d30ea906Sjfb8856606 664d30ea906Sjfb8856606 void axgbe_init_function_ptrs_dev(struct axgbe_hw_if *hw_if); 665d30ea906Sjfb8856606 void axgbe_init_function_ptrs_phy(struct axgbe_phy_if *phy_if); 666d30ea906Sjfb8856606 void axgbe_init_function_ptrs_phy_v2(struct axgbe_phy_if *phy_if); 667d30ea906Sjfb8856606 void axgbe_init_function_ptrs_i2c(struct axgbe_i2c_if *i2c_if); 668*2d9fd380Sjfb8856606 void axgbe_set_mac_addn_addr(struct axgbe_port *pdata, u8 *addr, 669*2d9fd380Sjfb8856606 uint32_t index); 670*2d9fd380Sjfb8856606 void axgbe_set_mac_hash_table(struct axgbe_port *pdata, u8 *addr, bool add); 671*2d9fd380Sjfb8856606 int axgbe_write_rss_lookup_table(struct axgbe_port *pdata); 672*2d9fd380Sjfb8856606 int axgbe_write_rss_hash_key(struct axgbe_port *pdata); 673d30ea906Sjfb8856606 674d30ea906Sjfb8856606 #endif /* RTE_ETH_AXGBE_H_ */ 675