18691632fSRavi Kumar /* SPDX-License-Identifier: BSD-3-Clause 28691632fSRavi Kumar * Copyright(c) 2018 Advanced Micro Devices, Inc. All rights reserved. 38691632fSRavi Kumar * Copyright(c) 2018 Synopsys, Inc. All rights reserved. 48691632fSRavi Kumar */ 58691632fSRavi Kumar 68691632fSRavi Kumar #include "axgbe_ethdev.h" 7572890efSRavi Kumar #include "axgbe_common.h" 8572890efSRavi Kumar #include "axgbe_phy.h" 98691632fSRavi Kumar 108691632fSRavi Kumar static int eth_axgbe_dev_init(struct rte_eth_dev *eth_dev); 118691632fSRavi Kumar static int eth_axgbe_dev_uninit(struct rte_eth_dev *eth_dev); 128691632fSRavi Kumar 138691632fSRavi Kumar /* The set of PCI devices this driver supports */ 148691632fSRavi Kumar #define AMD_PCI_VENDOR_ID 0x1022 158691632fSRavi Kumar #define AMD_PCI_AXGBE_DEVICE_V2A 0x1458 168691632fSRavi Kumar #define AMD_PCI_AXGBE_DEVICE_V2B 0x1459 178691632fSRavi Kumar 188691632fSRavi Kumar int axgbe_logtype_init; 198691632fSRavi Kumar int axgbe_logtype_driver; 208691632fSRavi Kumar 218691632fSRavi Kumar static const struct rte_pci_id pci_id_axgbe_map[] = { 228691632fSRavi Kumar {RTE_PCI_DEVICE(AMD_PCI_VENDOR_ID, AMD_PCI_AXGBE_DEVICE_V2A)}, 238691632fSRavi Kumar {RTE_PCI_DEVICE(AMD_PCI_VENDOR_ID, AMD_PCI_AXGBE_DEVICE_V2B)}, 248691632fSRavi Kumar { .vendor_id = 0, }, 258691632fSRavi Kumar }; 268691632fSRavi Kumar 27572890efSRavi Kumar static struct axgbe_version_data axgbe_v2a = { 28*4ac7516bSRavi Kumar .init_function_ptrs_phy_impl = axgbe_init_function_ptrs_phy_v2, 29572890efSRavi Kumar .xpcs_access = AXGBE_XPCS_ACCESS_V2, 30572890efSRavi Kumar .mmc_64bit = 1, 31572890efSRavi Kumar .tx_max_fifo_size = 229376, 32572890efSRavi Kumar .rx_max_fifo_size = 229376, 33572890efSRavi Kumar .tx_tstamp_workaround = 1, 34572890efSRavi Kumar .ecc_support = 1, 35572890efSRavi Kumar .i2c_support = 1, 36572890efSRavi Kumar }; 37572890efSRavi Kumar 38572890efSRavi Kumar static struct axgbe_version_data axgbe_v2b = { 39*4ac7516bSRavi Kumar .init_function_ptrs_phy_impl = axgbe_init_function_ptrs_phy_v2, 40572890efSRavi Kumar .xpcs_access = AXGBE_XPCS_ACCESS_V2, 41572890efSRavi Kumar .mmc_64bit = 1, 42572890efSRavi Kumar .tx_max_fifo_size = 65536, 43572890efSRavi Kumar .rx_max_fifo_size = 65536, 44572890efSRavi Kumar .tx_tstamp_workaround = 1, 45572890efSRavi Kumar .ecc_support = 1, 46572890efSRavi Kumar .i2c_support = 1, 47572890efSRavi Kumar }; 48572890efSRavi Kumar 49572890efSRavi Kumar static void axgbe_get_all_hw_features(struct axgbe_port *pdata) 50572890efSRavi Kumar { 51572890efSRavi Kumar unsigned int mac_hfr0, mac_hfr1, mac_hfr2; 52572890efSRavi Kumar struct axgbe_hw_features *hw_feat = &pdata->hw_feat; 53572890efSRavi Kumar 54572890efSRavi Kumar mac_hfr0 = AXGMAC_IOREAD(pdata, MAC_HWF0R); 55572890efSRavi Kumar mac_hfr1 = AXGMAC_IOREAD(pdata, MAC_HWF1R); 56572890efSRavi Kumar mac_hfr2 = AXGMAC_IOREAD(pdata, MAC_HWF2R); 57572890efSRavi Kumar 58572890efSRavi Kumar memset(hw_feat, 0, sizeof(*hw_feat)); 59572890efSRavi Kumar 60572890efSRavi Kumar hw_feat->version = AXGMAC_IOREAD(pdata, MAC_VR); 61572890efSRavi Kumar 62572890efSRavi Kumar /* Hardware feature register 0 */ 63572890efSRavi Kumar hw_feat->gmii = AXGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, GMIISEL); 64572890efSRavi Kumar hw_feat->vlhash = AXGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, VLHASH); 65572890efSRavi Kumar hw_feat->sma = AXGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, SMASEL); 66572890efSRavi Kumar hw_feat->rwk = AXGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, RWKSEL); 67572890efSRavi Kumar hw_feat->mgk = AXGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, MGKSEL); 68572890efSRavi Kumar hw_feat->mmc = AXGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, MMCSEL); 69572890efSRavi Kumar hw_feat->aoe = AXGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, ARPOFFSEL); 70572890efSRavi Kumar hw_feat->ts = AXGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, TSSEL); 71572890efSRavi Kumar hw_feat->eee = AXGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, EEESEL); 72572890efSRavi Kumar hw_feat->tx_coe = AXGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, TXCOESEL); 73572890efSRavi Kumar hw_feat->rx_coe = AXGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, RXCOESEL); 74572890efSRavi Kumar hw_feat->addn_mac = AXGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, 75572890efSRavi Kumar ADDMACADRSEL); 76572890efSRavi Kumar hw_feat->ts_src = AXGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, TSSTSSEL); 77572890efSRavi Kumar hw_feat->sa_vlan_ins = AXGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, SAVLANINS); 78572890efSRavi Kumar 79572890efSRavi Kumar /* Hardware feature register 1 */ 80572890efSRavi Kumar hw_feat->rx_fifo_size = AXGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, 81572890efSRavi Kumar RXFIFOSIZE); 82572890efSRavi Kumar hw_feat->tx_fifo_size = AXGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, 83572890efSRavi Kumar TXFIFOSIZE); 84572890efSRavi Kumar hw_feat->adv_ts_hi = AXGMAC_GET_BITS(mac_hfr1, 85572890efSRavi Kumar MAC_HWF1R, ADVTHWORD); 86572890efSRavi Kumar hw_feat->dma_width = AXGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, ADDR64); 87572890efSRavi Kumar hw_feat->dcb = AXGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, DCBEN); 88572890efSRavi Kumar hw_feat->sph = AXGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, SPHEN); 89572890efSRavi Kumar hw_feat->tso = AXGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, TSOEN); 90572890efSRavi Kumar hw_feat->dma_debug = AXGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, DBGMEMA); 91572890efSRavi Kumar hw_feat->rss = AXGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, RSSEN); 92572890efSRavi Kumar hw_feat->tc_cnt = AXGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, NUMTC); 93572890efSRavi Kumar hw_feat->hash_table_size = AXGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, 94572890efSRavi Kumar HASHTBLSZ); 95572890efSRavi Kumar hw_feat->l3l4_filter_num = AXGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, 96572890efSRavi Kumar L3L4FNUM); 97572890efSRavi Kumar 98572890efSRavi Kumar /* Hardware feature register 2 */ 99572890efSRavi Kumar hw_feat->rx_q_cnt = AXGMAC_GET_BITS(mac_hfr2, MAC_HWF2R, RXQCNT); 100572890efSRavi Kumar hw_feat->tx_q_cnt = AXGMAC_GET_BITS(mac_hfr2, MAC_HWF2R, TXQCNT); 101572890efSRavi Kumar hw_feat->rx_ch_cnt = AXGMAC_GET_BITS(mac_hfr2, MAC_HWF2R, RXCHCNT); 102572890efSRavi Kumar hw_feat->tx_ch_cnt = AXGMAC_GET_BITS(mac_hfr2, MAC_HWF2R, TXCHCNT); 103572890efSRavi Kumar hw_feat->pps_out_num = AXGMAC_GET_BITS(mac_hfr2, MAC_HWF2R, PPSOUTNUM); 104572890efSRavi Kumar hw_feat->aux_snap_num = AXGMAC_GET_BITS(mac_hfr2, MAC_HWF2R, 105572890efSRavi Kumar AUXSNAPNUM); 106572890efSRavi Kumar 107572890efSRavi Kumar /* Translate the Hash Table size into actual number */ 108572890efSRavi Kumar switch (hw_feat->hash_table_size) { 109572890efSRavi Kumar case 0: 110572890efSRavi Kumar break; 111572890efSRavi Kumar case 1: 112572890efSRavi Kumar hw_feat->hash_table_size = 64; 113572890efSRavi Kumar break; 114572890efSRavi Kumar case 2: 115572890efSRavi Kumar hw_feat->hash_table_size = 128; 116572890efSRavi Kumar break; 117572890efSRavi Kumar case 3: 118572890efSRavi Kumar hw_feat->hash_table_size = 256; 119572890efSRavi Kumar break; 120572890efSRavi Kumar } 121572890efSRavi Kumar 122572890efSRavi Kumar /* Translate the address width setting into actual number */ 123572890efSRavi Kumar switch (hw_feat->dma_width) { 124572890efSRavi Kumar case 0: 125572890efSRavi Kumar hw_feat->dma_width = 32; 126572890efSRavi Kumar break; 127572890efSRavi Kumar case 1: 128572890efSRavi Kumar hw_feat->dma_width = 40; 129572890efSRavi Kumar break; 130572890efSRavi Kumar case 2: 131572890efSRavi Kumar hw_feat->dma_width = 48; 132572890efSRavi Kumar break; 133572890efSRavi Kumar default: 134572890efSRavi Kumar hw_feat->dma_width = 32; 135572890efSRavi Kumar } 136572890efSRavi Kumar 137572890efSRavi Kumar /* The Queue, Channel and TC counts are zero based so increment them 138572890efSRavi Kumar * to get the actual number 139572890efSRavi Kumar */ 140572890efSRavi Kumar hw_feat->rx_q_cnt++; 141572890efSRavi Kumar hw_feat->tx_q_cnt++; 142572890efSRavi Kumar hw_feat->rx_ch_cnt++; 143572890efSRavi Kumar hw_feat->tx_ch_cnt++; 144572890efSRavi Kumar hw_feat->tc_cnt++; 145572890efSRavi Kumar 146572890efSRavi Kumar /* Translate the fifo sizes into actual numbers */ 147572890efSRavi Kumar hw_feat->rx_fifo_size = 1 << (hw_feat->rx_fifo_size + 7); 148572890efSRavi Kumar hw_feat->tx_fifo_size = 1 << (hw_feat->tx_fifo_size + 7); 149572890efSRavi Kumar } 150572890efSRavi Kumar 151572890efSRavi Kumar static void axgbe_init_all_fptrs(struct axgbe_port *pdata) 152572890efSRavi Kumar { 153572890efSRavi Kumar axgbe_init_function_ptrs_dev(&pdata->hw_if); 154*4ac7516bSRavi Kumar axgbe_init_function_ptrs_phy(&pdata->phy_if); 155*4ac7516bSRavi Kumar axgbe_init_function_ptrs_i2c(&pdata->i2c_if); 156*4ac7516bSRavi Kumar pdata->vdata->init_function_ptrs_phy_impl(&pdata->phy_if); 157572890efSRavi Kumar } 158572890efSRavi Kumar 159572890efSRavi Kumar static void axgbe_set_counts(struct axgbe_port *pdata) 160572890efSRavi Kumar { 161572890efSRavi Kumar /* Set all the function pointers */ 162572890efSRavi Kumar axgbe_init_all_fptrs(pdata); 163572890efSRavi Kumar 164572890efSRavi Kumar /* Populate the hardware features */ 165572890efSRavi Kumar axgbe_get_all_hw_features(pdata); 166572890efSRavi Kumar 167572890efSRavi Kumar /* Set default max values if not provided */ 168572890efSRavi Kumar if (!pdata->tx_max_channel_count) 169572890efSRavi Kumar pdata->tx_max_channel_count = pdata->hw_feat.tx_ch_cnt; 170572890efSRavi Kumar if (!pdata->rx_max_channel_count) 171572890efSRavi Kumar pdata->rx_max_channel_count = pdata->hw_feat.rx_ch_cnt; 172572890efSRavi Kumar 173572890efSRavi Kumar if (!pdata->tx_max_q_count) 174572890efSRavi Kumar pdata->tx_max_q_count = pdata->hw_feat.tx_q_cnt; 175572890efSRavi Kumar if (!pdata->rx_max_q_count) 176572890efSRavi Kumar pdata->rx_max_q_count = pdata->hw_feat.rx_q_cnt; 177572890efSRavi Kumar 178572890efSRavi Kumar /* Calculate the number of Tx and Rx rings to be created 179572890efSRavi Kumar * -Tx (DMA) Channels map 1-to-1 to Tx Queues so set 180572890efSRavi Kumar * the number of Tx queues to the number of Tx channels 181572890efSRavi Kumar * enabled 182572890efSRavi Kumar * -Rx (DMA) Channels do not map 1-to-1 so use the actual 183572890efSRavi Kumar * number of Rx queues or maximum allowed 184572890efSRavi Kumar */ 185572890efSRavi Kumar pdata->tx_ring_count = RTE_MIN(pdata->hw_feat.tx_ch_cnt, 186572890efSRavi Kumar pdata->tx_max_channel_count); 187572890efSRavi Kumar pdata->tx_ring_count = RTE_MIN(pdata->tx_ring_count, 188572890efSRavi Kumar pdata->tx_max_q_count); 189572890efSRavi Kumar 190572890efSRavi Kumar pdata->tx_q_count = pdata->tx_ring_count; 191572890efSRavi Kumar 192572890efSRavi Kumar pdata->rx_ring_count = RTE_MIN(pdata->hw_feat.rx_ch_cnt, 193572890efSRavi Kumar pdata->rx_max_channel_count); 194572890efSRavi Kumar 195572890efSRavi Kumar pdata->rx_q_count = RTE_MIN(pdata->hw_feat.rx_q_cnt, 196572890efSRavi Kumar pdata->rx_max_q_count); 197572890efSRavi Kumar } 198572890efSRavi Kumar 199572890efSRavi Kumar static void axgbe_default_config(struct axgbe_port *pdata) 200572890efSRavi Kumar { 201572890efSRavi Kumar pdata->pblx8 = DMA_PBL_X8_ENABLE; 202572890efSRavi Kumar pdata->tx_sf_mode = MTL_TSF_ENABLE; 203572890efSRavi Kumar pdata->tx_threshold = MTL_TX_THRESHOLD_64; 204572890efSRavi Kumar pdata->tx_pbl = DMA_PBL_32; 205572890efSRavi Kumar pdata->tx_osp_mode = DMA_OSP_ENABLE; 206572890efSRavi Kumar pdata->rx_sf_mode = MTL_RSF_ENABLE; 207572890efSRavi Kumar pdata->rx_threshold = MTL_RX_THRESHOLD_64; 208572890efSRavi Kumar pdata->rx_pbl = DMA_PBL_32; 209572890efSRavi Kumar pdata->pause_autoneg = 1; 210572890efSRavi Kumar pdata->tx_pause = 0; 211572890efSRavi Kumar pdata->rx_pause = 0; 212572890efSRavi Kumar pdata->phy_speed = SPEED_UNKNOWN; 213572890efSRavi Kumar pdata->power_down = 0; 214572890efSRavi Kumar } 215572890efSRavi Kumar 2168691632fSRavi Kumar /* 2178691632fSRavi Kumar * It returns 0 on success. 2188691632fSRavi Kumar */ 2198691632fSRavi Kumar static int 2208691632fSRavi Kumar eth_axgbe_dev_init(struct rte_eth_dev *eth_dev) 2218691632fSRavi Kumar { 2228691632fSRavi Kumar PMD_INIT_FUNC_TRACE(); 2238691632fSRavi Kumar struct axgbe_port *pdata; 2248691632fSRavi Kumar struct rte_pci_device *pci_dev; 225572890efSRavi Kumar uint32_t reg, mac_lo, mac_hi; 226572890efSRavi Kumar int ret; 2278691632fSRavi Kumar 2288691632fSRavi Kumar /* 2298691632fSRavi Kumar * For secondary processes, we don't initialise any further as primary 2308691632fSRavi Kumar * has already done this work. 2318691632fSRavi Kumar */ 2328691632fSRavi Kumar if (rte_eal_process_type() != RTE_PROC_PRIMARY) 2338691632fSRavi Kumar return 0; 2348691632fSRavi Kumar 2358691632fSRavi Kumar pdata = (struct axgbe_port *)eth_dev->data->dev_private; 236572890efSRavi Kumar /* initial state */ 237572890efSRavi Kumar axgbe_set_bit(AXGBE_DOWN, &pdata->dev_state); 238572890efSRavi Kumar axgbe_set_bit(AXGBE_STOPPED, &pdata->dev_state); 2398691632fSRavi Kumar pdata->eth_dev = eth_dev; 2408691632fSRavi Kumar 2418691632fSRavi Kumar pci_dev = RTE_DEV_TO_PCI(eth_dev->device); 2428691632fSRavi Kumar pdata->pci_dev = pci_dev; 2438691632fSRavi Kumar 244572890efSRavi Kumar pdata->xgmac_regs = 245572890efSRavi Kumar (uint64_t)pci_dev->mem_resource[AXGBE_AXGMAC_BAR].addr; 246572890efSRavi Kumar pdata->xprop_regs = pdata->xgmac_regs + AXGBE_MAC_PROP_OFFSET; 247572890efSRavi Kumar pdata->xi2c_regs = pdata->xgmac_regs + AXGBE_I2C_CTRL_OFFSET; 248572890efSRavi Kumar pdata->xpcs_regs = (uint64_t)pci_dev->mem_resource[AXGBE_XPCS_BAR].addr; 249572890efSRavi Kumar 250572890efSRavi Kumar /* version specific driver data*/ 251572890efSRavi Kumar if (pci_dev->id.device_id == AMD_PCI_AXGBE_DEVICE_V2A) 252572890efSRavi Kumar pdata->vdata = &axgbe_v2a; 253572890efSRavi Kumar else 254572890efSRavi Kumar pdata->vdata = &axgbe_v2b; 255572890efSRavi Kumar 256572890efSRavi Kumar /* Configure the PCS indirect addressing support */ 257572890efSRavi Kumar reg = XPCS32_IOREAD(pdata, PCS_V2_WINDOW_DEF); 258572890efSRavi Kumar pdata->xpcs_window = XPCS_GET_BITS(reg, PCS_V2_WINDOW_DEF, OFFSET); 259572890efSRavi Kumar pdata->xpcs_window <<= 6; 260572890efSRavi Kumar pdata->xpcs_window_size = XPCS_GET_BITS(reg, PCS_V2_WINDOW_DEF, SIZE); 261572890efSRavi Kumar pdata->xpcs_window_size = 1 << (pdata->xpcs_window_size + 7); 262572890efSRavi Kumar pdata->xpcs_window_mask = pdata->xpcs_window_size - 1; 263572890efSRavi Kumar pdata->xpcs_window_def_reg = PCS_V2_WINDOW_DEF; 264572890efSRavi Kumar pdata->xpcs_window_sel_reg = PCS_V2_WINDOW_SELECT; 265572890efSRavi Kumar PMD_INIT_LOG(DEBUG, 266572890efSRavi Kumar "xpcs window :%x, size :%x, mask :%x ", pdata->xpcs_window, 267572890efSRavi Kumar pdata->xpcs_window_size, pdata->xpcs_window_mask); 268572890efSRavi Kumar XP_IOWRITE(pdata, XP_INT_EN, 0x1fffff); 269572890efSRavi Kumar 270572890efSRavi Kumar /* Retrieve the MAC address */ 271572890efSRavi Kumar mac_lo = XP_IOREAD(pdata, XP_MAC_ADDR_LO); 272572890efSRavi Kumar mac_hi = XP_IOREAD(pdata, XP_MAC_ADDR_HI); 273572890efSRavi Kumar pdata->mac_addr.addr_bytes[0] = mac_lo & 0xff; 274572890efSRavi Kumar pdata->mac_addr.addr_bytes[1] = (mac_lo >> 8) & 0xff; 275572890efSRavi Kumar pdata->mac_addr.addr_bytes[2] = (mac_lo >> 16) & 0xff; 276572890efSRavi Kumar pdata->mac_addr.addr_bytes[3] = (mac_lo >> 24) & 0xff; 277572890efSRavi Kumar pdata->mac_addr.addr_bytes[4] = mac_hi & 0xff; 278572890efSRavi Kumar pdata->mac_addr.addr_bytes[5] = (mac_hi >> 8) & 0xff; 279572890efSRavi Kumar 280572890efSRavi Kumar eth_dev->data->mac_addrs = rte_zmalloc("axgbe_mac_addr", 281572890efSRavi Kumar ETHER_ADDR_LEN, 0); 282572890efSRavi Kumar if (!eth_dev->data->mac_addrs) { 283572890efSRavi Kumar PMD_INIT_LOG(ERR, 284572890efSRavi Kumar "Failed to alloc %u bytes needed to store MAC addr tbl", 285572890efSRavi Kumar ETHER_ADDR_LEN); 286572890efSRavi Kumar return -ENOMEM; 287572890efSRavi Kumar } 288572890efSRavi Kumar 289572890efSRavi Kumar if (!is_valid_assigned_ether_addr(&pdata->mac_addr)) 290572890efSRavi Kumar eth_random_addr(pdata->mac_addr.addr_bytes); 291572890efSRavi Kumar 292572890efSRavi Kumar /* Copy the permanent MAC address */ 293572890efSRavi Kumar ether_addr_copy(&pdata->mac_addr, ð_dev->data->mac_addrs[0]); 294572890efSRavi Kumar 295572890efSRavi Kumar /* Clock settings */ 296572890efSRavi Kumar pdata->sysclk_rate = AXGBE_V2_DMA_CLOCK_FREQ; 297572890efSRavi Kumar pdata->ptpclk_rate = AXGBE_V2_PTP_CLOCK_FREQ; 298572890efSRavi Kumar 299572890efSRavi Kumar /* Set the DMA coherency values */ 300572890efSRavi Kumar pdata->coherent = 1; 301572890efSRavi Kumar pdata->axdomain = AXGBE_DMA_OS_AXDOMAIN; 302572890efSRavi Kumar pdata->arcache = AXGBE_DMA_OS_ARCACHE; 303572890efSRavi Kumar pdata->awcache = AXGBE_DMA_OS_AWCACHE; 304572890efSRavi Kumar 305572890efSRavi Kumar /* Set the maximum channels and queues */ 306572890efSRavi Kumar reg = XP_IOREAD(pdata, XP_PROP_1); 307572890efSRavi Kumar pdata->tx_max_channel_count = XP_GET_BITS(reg, XP_PROP_1, MAX_TX_DMA); 308572890efSRavi Kumar pdata->rx_max_channel_count = XP_GET_BITS(reg, XP_PROP_1, MAX_RX_DMA); 309572890efSRavi Kumar pdata->tx_max_q_count = XP_GET_BITS(reg, XP_PROP_1, MAX_TX_QUEUES); 310572890efSRavi Kumar pdata->rx_max_q_count = XP_GET_BITS(reg, XP_PROP_1, MAX_RX_QUEUES); 311572890efSRavi Kumar 312572890efSRavi Kumar /* Set the hardware channel and queue counts */ 313572890efSRavi Kumar axgbe_set_counts(pdata); 314572890efSRavi Kumar 315572890efSRavi Kumar /* Set the maximum fifo amounts */ 316572890efSRavi Kumar reg = XP_IOREAD(pdata, XP_PROP_2); 317572890efSRavi Kumar pdata->tx_max_fifo_size = XP_GET_BITS(reg, XP_PROP_2, TX_FIFO_SIZE); 318572890efSRavi Kumar pdata->tx_max_fifo_size *= 16384; 319572890efSRavi Kumar pdata->tx_max_fifo_size = RTE_MIN(pdata->tx_max_fifo_size, 320572890efSRavi Kumar pdata->vdata->tx_max_fifo_size); 321572890efSRavi Kumar pdata->rx_max_fifo_size = XP_GET_BITS(reg, XP_PROP_2, RX_FIFO_SIZE); 322572890efSRavi Kumar pdata->rx_max_fifo_size *= 16384; 323572890efSRavi Kumar pdata->rx_max_fifo_size = RTE_MIN(pdata->rx_max_fifo_size, 324572890efSRavi Kumar pdata->vdata->rx_max_fifo_size); 325572890efSRavi Kumar /* Issue software reset to DMA */ 326572890efSRavi Kumar ret = pdata->hw_if.exit(pdata); 327572890efSRavi Kumar if (ret) 328572890efSRavi Kumar PMD_DRV_LOG(ERR, "hw_if->exit EBUSY error\n"); 329572890efSRavi Kumar 330572890efSRavi Kumar /* Set default configuration data */ 331572890efSRavi Kumar axgbe_default_config(pdata); 332572890efSRavi Kumar 333572890efSRavi Kumar /* Set default max values if not provided */ 334572890efSRavi Kumar if (!pdata->tx_max_fifo_size) 335572890efSRavi Kumar pdata->tx_max_fifo_size = pdata->hw_feat.tx_fifo_size; 336572890efSRavi Kumar if (!pdata->rx_max_fifo_size) 337572890efSRavi Kumar pdata->rx_max_fifo_size = pdata->hw_feat.rx_fifo_size; 338572890efSRavi Kumar 339572890efSRavi Kumar pthread_mutex_init(&pdata->xpcs_mutex, NULL); 340572890efSRavi Kumar pthread_mutex_init(&pdata->i2c_mutex, NULL); 341572890efSRavi Kumar pthread_mutex_init(&pdata->an_mutex, NULL); 342572890efSRavi Kumar pthread_mutex_init(&pdata->phy_mutex, NULL); 343572890efSRavi Kumar 344*4ac7516bSRavi Kumar ret = pdata->phy_if.phy_init(pdata); 345*4ac7516bSRavi Kumar if (ret) { 346*4ac7516bSRavi Kumar rte_free(eth_dev->data->mac_addrs); 347*4ac7516bSRavi Kumar return ret; 348*4ac7516bSRavi Kumar } 349*4ac7516bSRavi Kumar 3508691632fSRavi Kumar PMD_INIT_LOG(DEBUG, "port %d vendorID=0x%x deviceID=0x%x", 3518691632fSRavi Kumar eth_dev->data->port_id, pci_dev->id.vendor_id, 3528691632fSRavi Kumar pci_dev->id.device_id); 3538691632fSRavi Kumar 3548691632fSRavi Kumar return 0; 3558691632fSRavi Kumar } 3568691632fSRavi Kumar 3578691632fSRavi Kumar static int 358572890efSRavi Kumar eth_axgbe_dev_uninit(struct rte_eth_dev *eth_dev) 3598691632fSRavi Kumar { 3608691632fSRavi Kumar PMD_INIT_FUNC_TRACE(); 3618691632fSRavi Kumar 362572890efSRavi Kumar if (rte_eal_process_type() != RTE_PROC_PRIMARY) 363572890efSRavi Kumar return 0; 364572890efSRavi Kumar 365572890efSRavi Kumar /*Free macaddres*/ 366572890efSRavi Kumar rte_free(eth_dev->data->mac_addrs); 367572890efSRavi Kumar eth_dev->data->mac_addrs = NULL; 368572890efSRavi Kumar 3698691632fSRavi Kumar return 0; 3708691632fSRavi Kumar } 3718691632fSRavi Kumar 3728691632fSRavi Kumar static int eth_axgbe_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, 3738691632fSRavi Kumar struct rte_pci_device *pci_dev) 3748691632fSRavi Kumar { 3758691632fSRavi Kumar return rte_eth_dev_pci_generic_probe(pci_dev, 3768691632fSRavi Kumar sizeof(struct axgbe_port), eth_axgbe_dev_init); 3778691632fSRavi Kumar } 3788691632fSRavi Kumar 3798691632fSRavi Kumar static int eth_axgbe_pci_remove(struct rte_pci_device *pci_dev) 3808691632fSRavi Kumar { 3818691632fSRavi Kumar return rte_eth_dev_pci_generic_remove(pci_dev, eth_axgbe_dev_uninit); 3828691632fSRavi Kumar } 3838691632fSRavi Kumar 3848691632fSRavi Kumar static struct rte_pci_driver rte_axgbe_pmd = { 3858691632fSRavi Kumar .id_table = pci_id_axgbe_map, 3868691632fSRavi Kumar .drv_flags = RTE_PCI_DRV_NEED_MAPPING, 3878691632fSRavi Kumar .probe = eth_axgbe_pci_probe, 3888691632fSRavi Kumar .remove = eth_axgbe_pci_remove, 3898691632fSRavi Kumar }; 3908691632fSRavi Kumar 3918691632fSRavi Kumar RTE_PMD_REGISTER_PCI(net_axgbe, rte_axgbe_pmd); 3928691632fSRavi Kumar RTE_PMD_REGISTER_PCI_TABLE(net_axgbe, pci_id_axgbe_map); 3938691632fSRavi Kumar RTE_PMD_REGISTER_KMOD_DEP(net_axgbe, "* igb_uio | uio_pci_generic | vfio-pci"); 3948691632fSRavi Kumar 3958691632fSRavi Kumar RTE_INIT(axgbe_init_log); 3968691632fSRavi Kumar static void 3978691632fSRavi Kumar axgbe_init_log(void) 3988691632fSRavi Kumar { 3998691632fSRavi Kumar axgbe_logtype_init = rte_log_register("pmd.net.axgbe.init"); 4008691632fSRavi Kumar if (axgbe_logtype_init >= 0) 4018691632fSRavi Kumar rte_log_set_level(axgbe_logtype_init, RTE_LOG_NOTICE); 4028691632fSRavi Kumar axgbe_logtype_driver = rte_log_register("pmd.net.axgbe.driver"); 4038691632fSRavi Kumar if (axgbe_logtype_driver >= 0) 4048691632fSRavi Kumar rte_log_set_level(axgbe_logtype_driver, RTE_LOG_NOTICE); 4058691632fSRavi Kumar } 406