drivers/net: add generic ethdev macro to get PCI device
[dpdk.git] / drivers / net / qede / qede_ethdev.c
index 7056fed..c28a2bc 100644 (file)
@@ -508,16 +508,18 @@ qede_mac_int_ops(struct rte_eth_dev *eth_dev, struct ecore_filter_ucast *ucast,
        return rc;
 }
 
-static void
+static int
 qede_mac_addr_add(struct rte_eth_dev *eth_dev, struct ether_addr *mac_addr,
                  __rte_unused uint32_t index, __rte_unused uint32_t pool)
 {
        struct ecore_filter_ucast ucast;
+       int re;
 
        qede_set_ucast_cmn_params(&ucast);
        ucast.type = ECORE_FILTER_MAC;
        ether_addr_copy(mac_addr, (struct ether_addr *)&ucast.mac);
-       (void)qede_mac_int_ops(eth_dev, &ucast, 1);
+       re = (int)qede_mac_int_ops(eth_dev, &ucast, 1);
+       return re;
 }
 
 static void
@@ -944,7 +946,7 @@ qede_dev_info_get(struct rte_eth_dev *eth_dev,
 
        PMD_INIT_FUNC_TRACE(edev);
 
-       dev_info->pci_dev = RTE_DEV_TO_PCI(eth_dev->device);
+       dev_info->pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
        dev_info->min_rx_bufsize = (uint32_t)QEDE_MIN_RX_BUFF_SIZE;
        dev_info->max_rx_pktlen = (uint32_t)ETH_TX_MAX_NON_LSO_PKT_LEN;
        dev_info->rx_desc_lim = qede_rx_desc_lim;
@@ -1101,7 +1103,7 @@ static void qede_poll_sp_sb_cb(void *param)
 
 static void qede_dev_close(struct rte_eth_dev *eth_dev)
 {
-       struct rte_pci_device *pci_dev = RTE_DEV_TO_PCI(eth_dev->device);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
        struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
        struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
        int rc;
@@ -1239,7 +1241,7 @@ qede_get_xstats_count(struct qede_dev *qdev) {
 }
 
 static int
-qede_get_xstats_names(__rte_unused struct rte_eth_dev *dev,
+qede_get_xstats_names(struct rte_eth_dev *dev,
                      struct rte_eth_xstat_name *xstats_names,
                      __rte_unused unsigned int limit)
 {
@@ -1574,6 +1576,61 @@ static int qede_rss_hash_conf_get(struct rte_eth_dev *eth_dev,
        return 0;
 }
 
+static bool qede_update_rss_parm_cmt(struct ecore_dev *edev,
+                                   struct ecore_rss_params *rss)
+{
+       int i, fn;
+       bool rss_mode = 1; /* enable */
+       struct ecore_queue_cid *cid;
+       struct ecore_rss_params *t_rss;
+
+       /* In regular scenario, we'd simply need to take input handlers.
+        * But in CMT, we'd have to split the handlers according to the
+        * engine they were configured on. We'd then have to understand
+        * whether RSS is really required, since 2-queues on CMT doesn't
+        * require RSS.
+        */
+
+       /* CMT should be round-robin */
+       for (i = 0; i < ECORE_RSS_IND_TABLE_SIZE; i++) {
+               cid = rss->rss_ind_table[i];
+
+               if (cid->p_owner == ECORE_LEADING_HWFN(edev))
+                       t_rss = &rss[0];
+               else
+                       t_rss = &rss[1];
+
+               t_rss->rss_ind_table[i / edev->num_hwfns] = cid;
+       }
+
+       t_rss = &rss[1];
+       t_rss->update_rss_ind_table = 1;
+       t_rss->rss_table_size_log = 7;
+       t_rss->update_rss_config = 1;
+
+       /* Make sure RSS is actually required */
+       for_each_hwfn(edev, fn) {
+               for (i = 1; i < ECORE_RSS_IND_TABLE_SIZE / edev->num_hwfns;
+                    i++) {
+                       if (rss[fn].rss_ind_table[i] !=
+                           rss[fn].rss_ind_table[0])
+                               break;
+               }
+
+               if (i == ECORE_RSS_IND_TABLE_SIZE / edev->num_hwfns) {
+                       DP_INFO(edev,
+                               "CMT - 1 queue per-hwfn; Disabling RSS\n");
+                       rss_mode = 0;
+                       goto out;
+               }
+       }
+
+out:
+       t_rss->rss_enable = rss_mode;
+
+       return rss_mode;
+}
+
 int qede_rss_reta_update(struct rte_eth_dev *eth_dev,
                         struct rte_eth_rss_reta_entry64 *reta_conf,
                         uint16_t reta_size)
@@ -1581,11 +1638,11 @@ int qede_rss_reta_update(struct rte_eth_dev *eth_dev,
        struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
        struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
        struct ecore_sp_vport_update_params vport_update_params;
-       struct ecore_rss_params params;
+       struct ecore_rss_params *params;
        struct ecore_hwfn *p_hwfn;
        uint16_t i, idx, shift;
        uint8_t entry;
-       int rc;
+       int rc = 0;
 
        if (reta_size > ETH_RSS_RETA_SIZE_128) {
                DP_ERR(edev, "reta_size %d is not supported by hardware\n",
@@ -1594,7 +1651,8 @@ int qede_rss_reta_update(struct rte_eth_dev *eth_dev,
        }
 
        memset(&vport_update_params, 0, sizeof(vport_update_params));
-       memset(&params, 0, sizeof(params));
+       params = rte_zmalloc("qede_rss", sizeof(*params) * edev->num_hwfns,
+                            RTE_CACHE_LINE_SIZE);
 
        for (i = 0; i < reta_size; i++) {
                idx = i / RTE_RETA_GROUP_SIZE;
@@ -1602,24 +1660,25 @@ int qede_rss_reta_update(struct rte_eth_dev *eth_dev,
                if (reta_conf[idx].mask & (1ULL << shift)) {
                        entry = reta_conf[idx].reta[shift];
                        /* Pass rxq handles to ecore */
-                       params.rss_ind_table[i] =
+                       params->rss_ind_table[i] =
                                        qdev->fp_array[entry].rxq->handle;
                        /* Update the local copy for RETA query command */
                        qdev->rss_ind_table[i] = entry;
                }
        }
 
+       params->update_rss_ind_table = 1;
+       params->rss_table_size_log = 7;
+       params->update_rss_config = 1;
+
        /* Fix up RETA for CMT mode device */
        if (edev->num_hwfns > 1)
-               qdev->rss_enable = qed_update_rss_parm_cmt(edev,
-                                       params.rss_ind_table[0]);
-       params.update_rss_ind_table = 1;
-       params.rss_table_size_log = 7;
-       params.update_rss_config = 1;
+               qdev->rss_enable = qede_update_rss_parm_cmt(edev,
+                                                           params);
        vport_update_params.vport_id = 0;
        /* Use the current value of rss_enable */
-       params.rss_enable = qdev->rss_enable;
-       vport_update_params.rss_params = &params;
+       params->rss_enable = qdev->rss_enable;
+       vport_update_params.rss_params = params;
 
        for_each_hwfn(edev, i) {
                p_hwfn = &edev->hwfns[i];
@@ -1628,11 +1687,13 @@ int qede_rss_reta_update(struct rte_eth_dev *eth_dev,
                                           ECORE_SPQ_MODE_EBLOCK, NULL);
                if (rc) {
                        DP_ERR(edev, "vport-update for RSS failed\n");
-                       return rc;
+                       goto out;
                }
        }
 
-       return 0;
+out:
+       rte_free(params);
+       return rc;
 }
 
 static int qede_rss_reta_query(struct rte_eth_dev *eth_dev,
@@ -2102,7 +2163,7 @@ static int qede_common_dev_init(struct rte_eth_dev *eth_dev, bool is_vf)
        /* Extract key data structures */
        adapter = eth_dev->data->dev_private;
        edev = &adapter->edev;
-       pci_dev = RTE_DEV_TO_PCI(eth_dev->device);
+       pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
        pci_addr = pci_dev->addr;
 
        PMD_INIT_FUNC_TRACE(edev);
@@ -2403,7 +2464,7 @@ static struct rte_pci_driver rte_qede_pmd = {
 
 RTE_PMD_REGISTER_PCI(net_qede, rte_qede_pmd);
 RTE_PMD_REGISTER_PCI_TABLE(net_qede, pci_id_qede_map);
-RTE_PMD_REGISTER_KMOD_DEP(net_qede, "* igb_uio | uio_pci_generic | vfio");
+RTE_PMD_REGISTER_KMOD_DEP(net_qede, "* igb_uio | uio_pci_generic | vfio-pci");
 RTE_PMD_REGISTER_PCI(net_qede_vf, rte_qedevf_pmd);
 RTE_PMD_REGISTER_PCI_TABLE(net_qede_vf, pci_id_qedevf_map);
-RTE_PMD_REGISTER_KMOD_DEP(net_qede_vf, "* igb_uio | vfio");
+RTE_PMD_REGISTER_KMOD_DEP(net_qede_vf, "* igb_uio | vfio-pci");