bus/pci: change IOVA as VA flag name
[dpdk.git] / drivers / net / octeontx2 / otx2_ethdev.c
index 7d1fce5..7b91f6b 100644 (file)
@@ -277,6 +277,8 @@ nix_cq_rq_init(struct rte_eth_dev *eth_dev, struct otx2_eth_dev *dev,
 
        /* Many to one reduction */
        aq->cq.qint_idx = qid % dev->qints;
+       /* Map CQ0 [RQ0] to CINT0 and so on till max 64 irqs */
+       aq->cq.cint_idx = qid;
 
        if (otx2_ethdev_fixup_is_limit_cq_full(dev)) {
                uint16_t min_rx_drop;
@@ -1186,11 +1188,6 @@ otx2_nix_configure(struct rte_eth_dev *eth_dev)
                goto fail;
        }
 
-       if (rte_eal_iova_mode() != RTE_IOVA_VA) {
-               otx2_err("iova mode should be va");
-               goto fail;
-       }
-
        if (conf->link_speeds & ETH_LINK_SPEED_FIXED) {
                otx2_err("Setting link speed/duplex not supported");
                goto fail;
@@ -1223,6 +1220,8 @@ otx2_nix_configure(struct rte_eth_dev *eth_dev)
                otx2_nix_vlan_fini(eth_dev);
                otx2_flow_free_all_resources(dev);
                oxt2_nix_unregister_queue_irqs(eth_dev);
+               if (eth_dev->data->dev_conf.intr_conf.rxq)
+                       oxt2_nix_unregister_cq_irqs(eth_dev);
                nix_set_nop_rxtx_function(eth_dev);
                rc = nix_store_queue_cfg_and_then_release(eth_dev);
                if (rc)
@@ -1231,7 +1230,7 @@ otx2_nix_configure(struct rte_eth_dev *eth_dev)
                nix_lf_free(dev);
        }
 
-       if (otx2_dev_is_A0(dev) &&
+       if (otx2_dev_is_Ax(dev) &&
            (txmode->offloads & DEV_TX_OFFLOAD_SCTP_CKSUM) &&
            ((txmode->offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) ||
            (txmode->offloads & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM))) {
@@ -1283,6 +1282,27 @@ otx2_nix_configure(struct rte_eth_dev *eth_dev)
                goto free_nix_lf;
        }
 
+       /* Register cq IRQs */
+       if (eth_dev->data->dev_conf.intr_conf.rxq) {
+               if (eth_dev->data->nb_rx_queues > dev->cints) {
+                       otx2_err("Rx interrupt cannot be enabled, rxq > %d",
+                                dev->cints);
+                       goto free_nix_lf;
+               }
+               /* Rx interrupt feature cannot work with vector mode because,
+                * vector mode doesn't process packets unless min 4 pkts are
+                * received, while cq interrupts are generated even for 1 pkt
+                * in the CQ.
+                */
+               dev->scalar_ena = true;
+
+               rc = oxt2_nix_register_cq_irqs(eth_dev);
+               if (rc) {
+                       otx2_err("Failed to register CQ interrupts rc=%d", rc);
+                       goto free_nix_lf;
+               }
+       }
+
        /* Configure loop back mode */
        rc = cgx_intlbk_enable(dev, eth_dev->data->dev_conf.lpbk_mode);
        if (rc) {
@@ -1547,6 +1567,8 @@ static const struct eth_dev_ops otx2_eth_dev_ops = {
        .tx_queue_stop            = otx2_nix_tx_queue_stop,
        .rx_queue_start           = otx2_nix_rx_queue_start,
        .rx_queue_stop            = otx2_nix_rx_queue_stop,
+       .dev_set_link_up          = otx2_nix_dev_set_link_up,
+       .dev_set_link_down        = otx2_nix_dev_set_link_down,
        .dev_supported_ptypes_get = otx2_nix_supported_ptypes_get,
        .dev_reset                = otx2_nix_dev_reset,
        .stats_get                = otx2_nix_dev_stats_get,
@@ -1595,6 +1617,8 @@ static const struct eth_dev_ops otx2_eth_dev_ops = {
        .vlan_strip_queue_set     = otx2_nix_vlan_strip_queue_set,
        .vlan_tpid_set            = otx2_nix_vlan_tpid_set,
        .vlan_pvid_set            = otx2_nix_vlan_pvid_set,
+       .rx_queue_intr_enable     = otx2_nix_rx_queue_intr_enable,
+       .rx_queue_intr_disable    = otx2_nix_rx_queue_intr_disable,
 };
 
 static inline int
@@ -1758,7 +1782,7 @@ otx2_eth_dev_init(struct rte_eth_dev *eth_dev)
        dev->tx_offload_capa = nix_get_tx_offload_capa(dev);
        dev->rx_offload_capa = nix_get_rx_offload_capa(dev);
 
-       if (otx2_dev_is_A0(dev)) {
+       if (otx2_dev_is_Ax(dev)) {
                dev->hwcap |= OTX2_FIXUP_F_MIN_4K_Q;
                dev->hwcap |= OTX2_FIXUP_F_LIMIT_CQ_FULL;
        }
@@ -1843,6 +1867,10 @@ otx2_eth_dev_uninit(struct rte_eth_dev *eth_dev, bool mbox_close)
        /* Unregister queue irqs */
        oxt2_nix_unregister_queue_irqs(eth_dev);
 
+       /* Unregister cq irqs */
+       if (eth_dev->data->dev_conf.intr_conf.rxq)
+               oxt2_nix_unregister_cq_irqs(eth_dev);
+
        rc = nix_lf_free(dev);
        if (rc)
                otx2_err("Failed to free nix lf, rc=%d", rc);
@@ -1973,7 +2001,7 @@ static const struct rte_pci_id pci_nix_map[] = {
 
 static struct rte_pci_driver pci_nix = {
        .id_table = pci_nix_map,
-       .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_IOVA_AS_VA |
+       .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_NEED_IOVA_AS_VA |
                        RTE_PCI_DRV_INTR_LSC,
        .probe = nix_probe,
        .remove = nix_remove,