drivers/net: add generic ethdev macro to get PCI device
[dpdk.git] / drivers / net / qede / qede_ethdev.c
index fdb6bb1..c28a2bc 100644 (file)
@@ -298,6 +298,7 @@ qede_alloc_etherdev(struct qede_dev *qdev, struct qed_dev_eth_info *info)
        qdev->ops = qed_ops;
 }
 
+#ifdef RTE_LIBRTE_QEDE_DEBUG_INFO
 static void qede_print_adapter_info(struct qede_dev *qdev)
 {
        struct ecore_dev *edev = &qdev->edev;
@@ -326,6 +327,7 @@ static void qede_print_adapter_info(struct qede_dev *qdev)
        DP_INFO(edev, " Firmware file : %s\n", fw_file);
        DP_INFO(edev, "*********************************\n");
 }
+#endif
 
 static void qede_set_ucast_cmn_params(struct ecore_filter_ucast *ucast)
 {
@@ -506,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,
-                 uint32_t index, __rte_unused uint32_t pool)
+                 __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
@@ -523,9 +527,7 @@ qede_mac_addr_remove(struct rte_eth_dev *eth_dev, uint32_t index)
 {
        struct qede_dev *qdev = eth_dev->data->dev_private;
        struct ecore_dev *edev = &qdev->edev;
-       struct ether_addr mac_addr;
        struct ecore_filter_ucast ucast;
-       int rc;
 
        PMD_INIT_FUNC_TRACE(edev);
 
@@ -609,46 +611,6 @@ static int qede_vlan_stripping(struct rte_eth_dev *eth_dev, bool set_stripping)
        return 0;
 }
 
-static void qede_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)
-{
-       struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
-       struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
-       struct rte_eth_rxmode *rxmode = &eth_dev->data->dev_conf.rxmode;
-
-       if (mask & ETH_VLAN_STRIP_MASK) {
-               if (rxmode->hw_vlan_strip)
-                       (void)qede_vlan_stripping(eth_dev, 1);
-               else
-                       (void)qede_vlan_stripping(eth_dev, 0);
-       }
-
-       if (mask & ETH_VLAN_FILTER_MASK) {
-               /* VLAN filtering kicks in when a VLAN is added */
-               if (rxmode->hw_vlan_filter) {
-                       qede_vlan_filter_set(eth_dev, 0, 1);
-               } else {
-                       if (qdev->configured_vlans > 1) { /* Excluding VLAN0 */
-                               DP_ERR(edev,
-                                 " Please remove existing VLAN filters"
-                                 " before disabling VLAN filtering\n");
-                               /* Signal app that VLAN filtering is still
-                                * enabled
-                                */
-                               rxmode->hw_vlan_filter = true;
-                       } else {
-                               qede_vlan_filter_set(eth_dev, 0, 0);
-                       }
-               }
-       }
-
-       if (mask & ETH_VLAN_EXTEND_MASK)
-               DP_INFO(edev, "No offloads are supported with VLAN Q-in-Q"
-                       " and classification is based on outer tag only\n");
-
-       DP_INFO(edev, "vlan offload mask %d vlan-strip %d vlan-filter %d\n",
-               mask, rxmode->hw_vlan_strip, rxmode->hw_vlan_filter);
-}
-
 static int qede_vlan_filter_set(struct rte_eth_dev *eth_dev,
                                uint16_t vlan_id, int on)
 {
@@ -739,6 +701,46 @@ static int qede_vlan_filter_set(struct rte_eth_dev *eth_dev,
        return rc;
 }
 
+static void qede_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)
+{
+       struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
+       struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
+       struct rte_eth_rxmode *rxmode = &eth_dev->data->dev_conf.rxmode;
+
+       if (mask & ETH_VLAN_STRIP_MASK) {
+               if (rxmode->hw_vlan_strip)
+                       (void)qede_vlan_stripping(eth_dev, 1);
+               else
+                       (void)qede_vlan_stripping(eth_dev, 0);
+       }
+
+       if (mask & ETH_VLAN_FILTER_MASK) {
+               /* VLAN filtering kicks in when a VLAN is added */
+               if (rxmode->hw_vlan_filter) {
+                       qede_vlan_filter_set(eth_dev, 0, 1);
+               } else {
+                       if (qdev->configured_vlans > 1) { /* Excluding VLAN0 */
+                               DP_ERR(edev,
+                                 " Please remove existing VLAN filters"
+                                 " before disabling VLAN filtering\n");
+                               /* Signal app that VLAN filtering is still
+                                * enabled
+                                */
+                               rxmode->hw_vlan_filter = true;
+                       } else {
+                               qede_vlan_filter_set(eth_dev, 0, 0);
+                       }
+               }
+       }
+
+       if (mask & ETH_VLAN_EXTEND_MASK)
+               DP_INFO(edev, "No offloads are supported with VLAN Q-in-Q"
+                       " and classification is based on outer tag only\n");
+
+       DP_INFO(edev, "vlan offload mask %d vlan-strip %d vlan-filter %d\n",
+               mask, rxmode->hw_vlan_strip, rxmode->hw_vlan_filter);
+}
+
 static int qede_init_vport(struct qede_dev *qdev)
 {
        struct ecore_dev *edev = &qdev->edev;
@@ -778,7 +780,9 @@ static void qede_prandom_bytes(uint32_t *buff)
 int qede_config_rss(struct rte_eth_dev *eth_dev)
 {
        struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
+#ifdef RTE_LIBRTE_QEDE_DEBUG_INFO
        struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
+#endif
        uint32_t def_rss_key[ECORE_RSS_KEY_SIZE];
        struct rte_eth_rss_reta_entry64 reta_conf[2];
        struct rte_eth_rss_conf rss_conf;
@@ -819,7 +823,7 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)
        struct qede_dev *qdev = eth_dev->data->dev_private;
        struct ecore_dev *edev = &qdev->edev;
        struct rte_eth_rxmode *rxmode = &eth_dev->data->dev_conf.rxmode;
-       int rc, i, j;
+       int rc;
 
        PMD_INIT_FUNC_TRACE(edev);
 
@@ -942,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;
@@ -1045,10 +1049,12 @@ 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;
 
        PMD_INIT_FUNC_TRACE(edev);
+#endif
 
        enum qed_filter_rx_mode_type type = QED_FILTER_RX_MODE_TYPE_PROMISC;
 
@@ -1060,10 +1066,12 @@ 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,
@@ -1095,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;
@@ -1180,8 +1188,8 @@ qede_get_stats(struct rte_eth_dev *eth_dev, struct rte_eth_stats *eth_stats)
                               RTE_ETHDEV_QUEUE_STAT_CNTRS);
        txq_stat_cntrs = RTE_MIN(QEDE_TSS_COUNT(qdev),
                               RTE_ETHDEV_QUEUE_STAT_CNTRS);
-       if ((rxq_stat_cntrs != QEDE_RSS_COUNT(qdev)) ||
-           (txq_stat_cntrs != QEDE_TSS_COUNT(qdev)))
+       if ((rxq_stat_cntrs != (unsigned int)QEDE_RSS_COUNT(qdev)) ||
+           (txq_stat_cntrs != (unsigned int)QEDE_TSS_COUNT(qdev)))
                DP_VERBOSE(edev, ECORE_MSG_DEBUG,
                       "Not all the queue stats will be displayed. Set"
                       " RTE_ETHDEV_QUEUE_STAT_CNTRS config param"
@@ -1233,8 +1241,9 @@ qede_get_xstats_count(struct qede_dev *qdev) {
 }
 
 static int
-qede_get_xstats_names(__rte_unused struct rte_eth_dev *dev,
-                     struct rte_eth_xstat_name *xstats_names, unsigned limit)
+qede_get_xstats_names(struct rte_eth_dev *dev,
+                     struct rte_eth_xstat_name *xstats_names,
+                     __rte_unused unsigned int limit)
 {
        struct qede_dev *qdev = dev->data->dev_private;
        const unsigned int stat_cnt = qede_get_xstats_count(qdev);
@@ -1462,8 +1471,8 @@ static void qede_init_rss_caps(uint8_t *rss_caps, uint64_t hf)
        *rss_caps |= (hf & ETH_RSS_NONFRAG_IPV6_UDP)  ? ECORE_RSS_IPV6_UDP : 0;
 }
 
-static int qede_rss_hash_update(struct rte_eth_dev *eth_dev,
-                               struct rte_eth_rss_conf *rss_conf)
+int qede_rss_hash_update(struct rte_eth_dev *eth_dev,
+                        struct rte_eth_rss_conf *rss_conf)
 {
        struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
        struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
@@ -1567,18 +1576,73 @@ static int qede_rss_hash_conf_get(struct rte_eth_dev *eth_dev,
        return 0;
 }
 
-static int qede_rss_reta_update(struct rte_eth_dev *eth_dev,
-                               struct rte_eth_rss_reta_entry64 *reta_conf,
-                               uint16_t reta_size)
+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)
 {
        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",
@@ -1587,7 +1651,8 @@ static 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;
@@ -1595,24 +1660,25 @@ static 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];
@@ -1621,11 +1687,13 @@ static 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,
@@ -1655,7 +1723,7 @@ static int qede_rss_reta_query(struct rte_eth_dev *eth_dev,
        return 0;
 }
 
-int qede_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
+static int qede_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
 {
        struct qede_dev *qdev = QEDE_INIT_QDEV(dev);
        struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
@@ -1749,14 +1817,14 @@ qede_conf_udp_dst_port(struct rte_eth_dev *eth_dev,
        return 0;
 }
 
-int
+static int
 qede_udp_dst_port_del(struct rte_eth_dev *eth_dev,
                      struct rte_eth_udp_tunnel *tunnel_udp)
 {
        return qede_conf_udp_dst_port(eth_dev, tunnel_udp, false);
 }
 
-int
+static int
 qede_udp_dst_port_add(struct rte_eth_dev *eth_dev,
                      struct rte_eth_udp_tunnel *tunnel_udp)
 {
@@ -2090,13 +2158,12 @@ static int qede_common_dev_init(struct rte_eth_dev *eth_dev, bool is_vf)
        /* Fix up ecore debug level */
        uint32_t dp_module = ~0 & ~ECORE_MSG_HW;
        uint8_t dp_level = ECORE_LEVEL_VERBOSE;
-       uint32_t max_mac_addrs;
        int rc;
 
        /* 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);
@@ -2248,7 +2315,9 @@ static int qede_common_dev_init(struct rte_eth_dev *eth_dev, bool is_vf)
        eth_dev->dev_ops = (is_vf) ? &qede_eth_vf_dev_ops : &qede_eth_dev_ops;
 
        if (do_once) {
+#ifdef RTE_LIBRTE_QEDE_DEBUG_INFO
                qede_print_adapter_info(adapter);
+#endif
                do_once = false;
        }
 
@@ -2395,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");