net/qede: support IOVA VA mode
[dpdk.git] / drivers / net / qede / qede_ethdev.c
index b828273..0b2f305 100644 (file)
@@ -14,6 +14,9 @@ int qede_logtype_init;
 int qede_logtype_driver;
 
 static const struct qed_eth_ops *qed_ops;
+static int qede_eth_dev_uninit(struct rte_eth_dev *eth_dev);
+static int qede_eth_dev_init(struct rte_eth_dev *eth_dev);
+
 #define QEDE_SP_TIMER_PERIOD   10000 /* 100ms */
 
 struct rte_qede_xstats_name_off {
@@ -294,7 +297,7 @@ static void qede_print_adapter_info(struct qede_dev *qdev)
                (info->mfw_rev >> 16) & 0xff,
                (info->mfw_rev >> 8) & 0xff, (info->mfw_rev) & 0xff);
        DP_INFO(edev, " Management Firmware version : %s\n", ver_str);
-       DP_INFO(edev, " Firmware file : %s\n", fw_file);
+       DP_INFO(edev, " Firmware file : %s\n", qede_fw_file);
        DP_INFO(edev, "*********************************\n");
 }
 
@@ -1086,7 +1089,7 @@ static void qede_dev_stop(struct rte_eth_dev *eth_dev)
        DP_INFO(edev, "Device is stopped\n");
 }
 
-const char *valid_args[] = {
+static const char * const valid_args[] = {
        QEDE_NPAR_TX_SWITCHING,
        QEDE_VF_TX_SWITCHING,
        NULL,
@@ -1210,7 +1213,7 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)
        if (rxmode->offloads & DEV_RX_OFFLOAD_JUMBO_FRAME)
                eth_dev->data->mtu =
                        eth_dev->data->dev_conf.rxmode.max_rx_pkt_len -
-                       ETHER_HDR_LEN - ETHER_CRC_LEN;
+                       ETHER_HDR_LEN - QEDE_ETH_OVERHEAD;
 
        if (rxmode->offloads & DEV_RX_OFFLOAD_SCATTER)
                eth_dev->data->scattered_rx = 1;
@@ -1377,14 +1380,11 @@ qede_link_update(struct rte_eth_dev *eth_dev, __rte_unused int wait_to_complete)
 
 static void qede_promiscuous_enable(struct rte_eth_dev *eth_dev)
 {
-#ifdef RTE_LIBRTE_QEDE_DEBUG_INIT
        struct qede_dev *qdev = eth_dev->data->dev_private;
        struct ecore_dev *edev = &qdev->edev;
+       enum qed_filter_rx_mode_type type = QED_FILTER_RX_MODE_TYPE_PROMISC;
 
        PMD_INIT_FUNC_TRACE(edev);
-#endif
-
-       enum qed_filter_rx_mode_type type = QED_FILTER_RX_MODE_TYPE_PROMISC;
 
        if (rte_eth_allmulticast_get(eth_dev->data->port_id) == 1)
                type |= QED_FILTER_RX_MODE_TYPE_MULTI_PROMISC;
@@ -1394,12 +1394,10 @@ static void qede_promiscuous_enable(struct rte_eth_dev *eth_dev)
 
 static void qede_promiscuous_disable(struct rte_eth_dev *eth_dev)
 {
-#ifdef RTE_LIBRTE_QEDE_DEBUG_INIT
        struct qede_dev *qdev = eth_dev->data->dev_private;
        struct ecore_dev *edev = &qdev->edev;
 
        PMD_INIT_FUNC_TRACE(edev);
-#endif
 
        if (rte_eth_allmulticast_get(eth_dev->data->port_id) == 1)
                qed_configure_filter_rx_mode(eth_dev,
@@ -2225,19 +2223,18 @@ static int qede_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
        struct qede_fastpath *fp;
        uint32_t max_rx_pkt_len;
        uint32_t frame_size;
-       uint16_t rx_buf_size;
        uint16_t bufsz;
        bool restart = false;
-       int i;
+       int i, rc;
 
        PMD_INIT_FUNC_TRACE(edev);
        qede_dev_info_get(dev, &dev_info);
-       max_rx_pkt_len = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
-       frame_size = max_rx_pkt_len + QEDE_ETH_OVERHEAD;
+       max_rx_pkt_len = mtu + QEDE_MAX_ETHER_HDR_LEN;
+       frame_size = max_rx_pkt_len;
        if ((mtu < ETHER_MIN_MTU) || (frame_size > dev_info.max_rx_pktlen)) {
                DP_ERR(edev, "MTU %u out of range, %u is maximum allowable\n",
                       mtu, dev_info.max_rx_pktlen - ETHER_HDR_LEN -
-                       ETHER_CRC_LEN - QEDE_ETH_OVERHEAD);
+                      QEDE_ETH_OVERHEAD);
                return -EINVAL;
        }
        if (!dev->data->scattered_rx &&
@@ -2265,14 +2262,15 @@ static int qede_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
                if (fp->rxq != NULL) {
                        bufsz = (uint16_t)rte_pktmbuf_data_room_size(
                                fp->rxq->mb_pool) - RTE_PKTMBUF_HEADROOM;
-                       if (dev->data->scattered_rx)
-                               rx_buf_size = bufsz + ETHER_HDR_LEN +
-                                             ETHER_CRC_LEN + QEDE_ETH_OVERHEAD;
-                       else
-                               rx_buf_size = frame_size;
-                       rx_buf_size = QEDE_CEIL_TO_CACHE_LINE_SIZE(rx_buf_size);
-                       fp->rxq->rx_buf_size = rx_buf_size;
-                       DP_INFO(edev, "RX buffer size %u\n", rx_buf_size);
+                       /* cache align the mbuf size to simplfy rx_buf_size
+                        * calculation
+                        */
+                       bufsz = QEDE_FLOOR_TO_CACHE_LINE_SIZE(bufsz);
+                       rc = qede_calc_rx_buf_size(dev, bufsz, frame_size);
+                       if (rc < 0)
+                               return rc;
+
+                       fp->rxq->rx_buf_size = rc;
                }
        }
        if (max_rx_pkt_len > ETHER_MAX_LEN)
@@ -2294,14 +2292,28 @@ static int qede_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
        return 0;
 }
 
+static int
+qede_dev_reset(struct rte_eth_dev *dev)
+{
+       int ret;
+
+       ret = qede_eth_dev_uninit(dev);
+       if (ret)
+               return ret;
+
+       return qede_eth_dev_init(dev);
+}
+
 static const struct eth_dev_ops qede_eth_dev_ops = {
        .dev_configure = qede_dev_configure,
        .dev_infos_get = qede_dev_info_get,
        .rx_queue_setup = qede_rx_queue_setup,
        .rx_queue_release = qede_rx_queue_release,
+       .rx_descriptor_status = qede_rx_descriptor_status,
        .tx_queue_setup = qede_tx_queue_setup,
        .tx_queue_release = qede_tx_queue_release,
        .dev_start = qede_dev_start,
+       .dev_reset = qede_dev_reset,
        .dev_set_link_up = qede_dev_set_link_up,
        .dev_set_link_down = qede_dev_set_link_down,
        .link_update = qede_link_update,
@@ -2340,9 +2352,11 @@ static const struct eth_dev_ops qede_eth_vf_dev_ops = {
        .dev_infos_get = qede_dev_info_get,
        .rx_queue_setup = qede_rx_queue_setup,
        .rx_queue_release = qede_rx_queue_release,
+       .rx_descriptor_status = qede_rx_descriptor_status,
        .tx_queue_setup = qede_tx_queue_setup,
        .tx_queue_release = qede_tx_queue_release,
        .dev_start = qede_dev_start,
+       .dev_reset = qede_dev_reset,
        .dev_set_link_up = qede_dev_set_link_up,
        .dev_set_link_down = qede_dev_set_link_down,
        .link_update = qede_link_update,
@@ -2629,12 +2643,10 @@ static int qede_eth_dev_init(struct rte_eth_dev *eth_dev)
 
 static int qede_dev_common_uninit(struct rte_eth_dev *eth_dev)
 {
-#ifdef RTE_LIBRTE_QEDE_DEBUG_INIT
        struct qede_dev *qdev = eth_dev->data->dev_private;
        struct ecore_dev *edev = &qdev->edev;
 
        PMD_INIT_FUNC_TRACE(edev);
-#endif
 
        /* only uninitialize in the primary process */
        if (rte_eal_process_type() != RTE_PROC_PRIMARY)
@@ -2647,11 +2659,6 @@ static int qede_dev_common_uninit(struct rte_eth_dev *eth_dev)
        eth_dev->rx_pkt_burst = NULL;
        eth_dev->tx_pkt_burst = NULL;
 
-       if (eth_dev->data->mac_addrs)
-               rte_free(eth_dev->data->mac_addrs);
-
-       eth_dev->data->mac_addrs = NULL;
-
        return 0;
 }
 
@@ -2728,7 +2735,8 @@ static int qedevf_eth_dev_pci_remove(struct rte_pci_device *pci_dev)
 
 static struct rte_pci_driver rte_qedevf_pmd = {
        .id_table = pci_id_qedevf_map,
-       .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC,
+       .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC |
+                    RTE_PCI_DRV_IOVA_AS_VA,
        .probe = qedevf_eth_dev_pci_probe,
        .remove = qedevf_eth_dev_pci_remove,
 };
@@ -2747,7 +2755,8 @@ static int qede_eth_dev_pci_remove(struct rte_pci_device *pci_dev)
 
 static struct rte_pci_driver rte_qede_pmd = {
        .id_table = pci_id_qede_map,
-       .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC,
+       .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC |
+                    RTE_PCI_DRV_IOVA_AS_VA,
        .probe = qede_eth_dev_pci_probe,
        .remove = qede_eth_dev_pci_remove,
 };