]> git.droids-corp.org - dpdk.git/commitdiff
net/nfp: read PF port MAC addr using NSP
authorAlejandro Lucero <alejandro.lucero@netronome.com>
Fri, 1 Sep 2017 14:12:18 +0000 (15:12 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 6 Oct 2017 00:49:48 +0000 (02:49 +0200)
During initialization, mac address is read from configuration bar. This is
the default option when using VFs.

This patch adds support for reading the mac address using the NSPU
interface when PMD works with the PF.

Signed-off-by: Alejandro Lucero <alejandro.lucero@netronome.com>
drivers/net/nfp/nfp_net.c
drivers/net/nfp/nfp_net_pmd.h
drivers/net/nfp/nfp_nspu.c
drivers/net/nfp/nfp_nspu.h

index 251a1c65b412a9170a0cc3e04914ca6d25965be7..5d35ce13487fa0b3dd21ec0d7f70f666050bb801 100644 (file)
@@ -593,7 +593,55 @@ nfp_net_cfg_queue_setup(struct nfp_net_hw *hw)
        hw->qcp_cfg = hw->tx_bar + NFP_QCP_QUEUE_ADDR_SZ;
 }
 
-static void nfp_net_read_mac(struct nfp_net_hw *hw)
+#define ETH_ADDR_LEN   6
+
+static void
+nfp_eth_copy_mac_reverse(uint8_t *dst, const uint8_t *src)
+{
+       int i;
+
+       for (i = 0; i < ETH_ADDR_LEN; i++)
+               dst[ETH_ADDR_LEN - i - 1] = src[i];
+}
+
+static int
+nfp_net_pf_read_mac(struct nfp_net_hw *hw, int port)
+{
+       union eth_table_entry *entry;
+       int idx, i;
+
+       idx = port;
+       entry = hw->eth_table;
+
+       /* Reading NFP ethernet table obtained before */
+       for (i = 0; i < NSP_ETH_MAX_COUNT; i++) {
+               if (!(entry->port & NSP_ETH_PORT_LANES_MASK)) {
+                       /* port not in use */
+                       entry++;
+                       continue;
+               }
+               if (idx == 0)
+                       break;
+               idx--;
+               entry++;
+       }
+
+       if (i == NSP_ETH_MAX_COUNT)
+               return -EINVAL;
+
+       /*
+        * hw points to port0 private data. We need hw now pointing to
+        * right port.
+        */
+       hw += port;
+       nfp_eth_copy_mac_reverse((uint8_t *)&hw->mac_addr,
+                                (uint8_t *)&entry->mac_addr);
+
+       return 0;
+}
+
+static void
+nfp_net_vf_read_mac(struct nfp_net_hw *hw)
 {
        uint32_t tmp;
 
@@ -2676,6 +2724,10 @@ nfp_net_init(struct rte_eth_dev *eth_dev)
 
                /* vNIC PF tx/rx BARs are a subset of PF PCI device */
                hwport0->hw_queues += bar_offset;
+
+               /* Lets seize the chance to read eth table from hw */
+               if (nfp_nsp_eth_read_table(nspu_desc, &hw->eth_table))
+                       return -ENODEV;
        }
 
        if (hw->is_pf) {
@@ -2736,7 +2788,10 @@ nfp_net_init(struct rte_eth_dev *eth_dev)
                return -ENOMEM;
        }
 
-       nfp_net_read_mac(hw);
+       if (hw->is_pf)
+               nfp_net_pf_read_mac(hwport0, port);
+       else
+               nfp_net_vf_read_mac(hw);
 
        if (!is_valid_assigned_ether_addr((struct ether_addr *)&hw->mac_addr)) {
                /* Using random mac addresses for VFs */
index d7e38d4fd9a18485712fc7f22b3ea498a20468ed..20ade1a93a4d5a3404de53f33cccffe0668bcefa 100644 (file)
@@ -441,6 +441,7 @@ struct nfp_net_hw {
        uint8_t is_pf;
        uint8_t pf_port_idx;
        uint8_t pf_multiport_enabled;
+       union eth_table_entry *eth_table;
        nspu_desc_t *nspu_desc;
        nfpu_desc_t *nfpu_desc;
 };
index 2f5632dfb1f737372c9185c8287cf85011c49ddb..6ba940cbf915fb7dc055bef1e47fdae4882437cd 100644 (file)
@@ -11,7 +11,6 @@
 #include <rte_byteorder.h>
 
 #include "nfp_nfpu.h"
-#include "nfp_net_eth.h"
 
 #define CFG_EXP_BAR_ADDR_SZ     1
 #define CFG_EXP_BAR_MAP_TYPE   1
@@ -601,3 +600,24 @@ nfp_nsp_eth_config(nspu_desc_t *desc, int port, int up)
        rte_spinlock_unlock(&desc->nsp_lock);
        return ret;
 }
+
+int
+nfp_nsp_eth_read_table(nspu_desc_t *desc, union eth_table_entry **table)
+{
+       int ret;
+
+       RTE_LOG(INFO, PMD, "Reading hw ethernet table...\n");
+       /* port 0 allocates the eth table and read it using NSPU */
+       *table = malloc(NSP_ETH_TABLE_SIZE);
+       if (!table)
+               return -ENOMEM;
+
+       ret = nspu_command(desc, NSP_CMD_READ_ETH_TABLE, 1, 0, *table,
+                          NSP_ETH_TABLE_SIZE, 0);
+       if (ret)
+               return ret;
+
+       RTE_LOG(INFO, PMD, "Done\n");
+
+       return 0;
+}
index 4e5898683338b82f680ba20a50492e7031539b3c..8c33835e5ee93b62e633c5b6f9670bf03984aea9 100644 (file)
@@ -58,6 +58,7 @@
  */
 
 #include <rte_spinlock.h>
+#include "nfp_net_eth.h"
 
 typedef struct {
        int nfp;        /* NFP device */
@@ -79,3 +80,4 @@ int nfp_nsp_fw_setup(nspu_desc_t *desc, const char *sym, uint64_t *pcie_offset);
 int nfp_nsp_map_ctrl_bar(nspu_desc_t *desc, uint64_t *pcie_offset);
 void nfp_nsp_map_queues_bar(nspu_desc_t *desc, uint64_t *pcie_offset);
 int nfp_nsp_eth_config(nspu_desc_t *desc, int port, int up);
+int nfp_nsp_eth_read_table(nspu_desc_t *desc, union eth_table_entry **table);