bus/dpaa: support shared MAC
authorRadu Bulie <radu-andrei.bulie@nxp.com>
Fri, 4 Sep 2020 08:39:26 +0000 (14:09 +0530)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 18 Sep 2020 16:55:08 +0000 (18:55 +0200)
A shared MAC interface is an interface which can be used
by both kernel and userspace based on classification configuration
It is defined in dts with the compatible string
"fsl,dpa-ethernet-shared" which bpool will be seeded by the dpdk
partition and configured as a netdev by the dpaa Linux eth driver.
User space buffers from the bpool will be kmapped by the kernel.

Signed-off-by: Radu Bulie <radu-andrei.bulie@nxp.com>
Signed-off-by: Jun Yang <jun.yang@nxp.com>
Signed-off-by: Nipun Gupta <nipun.gupta@nxp.com>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
drivers/bus/dpaa/base/fman/fman.c
drivers/bus/dpaa/include/fman.h
drivers/net/dpaa/dpaa_ethdev.c
drivers/net/dpaa/dpaa_flow.c

index 33be9e5..3ae29bf 100644 (file)
@@ -167,13 +167,21 @@ fman_if_init(const struct device_node *dpa_node)
        const char *mname, *fname;
        const char *dname = dpa_node->full_name;
        size_t lenp;
-       int _errno;
+       int _errno, is_shared = 0;
        const char *char_prop;
        uint32_t na;
 
        if (of_device_is_available(dpa_node) == false)
                return 0;
 
+       if (!of_device_is_compatible(dpa_node, "fsl,dpa-ethernet-init") &&
+               !of_device_is_compatible(dpa_node, "fsl,dpa-ethernet-shared")) {
+               return 0;
+       }
+
+       if (of_device_is_compatible(dpa_node, "fsl,dpa-ethernet-shared"))
+               is_shared = 1;
+
        rprop = "fsl,qman-frame-queues-rx";
        mprop = "fsl,fman-mac";
 
@@ -387,7 +395,7 @@ fman_if_init(const struct device_node *dpa_node)
                goto err;
        }
 
-       assert(lenp == (4 * sizeof(phandle)));
+       assert(lenp >= (4 * sizeof(phandle)));
 
        na = of_n_addr_cells(mac_node);
        /* Get rid of endianness (issues). Convert to host byte order */
@@ -408,7 +416,7 @@ fman_if_init(const struct device_node *dpa_node)
                goto err;
        }
 
-       assert(lenp == (4 * sizeof(phandle)));
+       assert(lenp >= (4 * sizeof(phandle)));
        /*TODO: Fix for other cases also */
        na = of_n_addr_cells(mac_node);
        /* Get rid of endianness (issues). Convert to host byte order */
@@ -508,6 +516,9 @@ fman_if_init(const struct device_node *dpa_node)
                pools_phandle++;
        }
 
+       if (is_shared)
+               __if->__if.is_shared_mac = 1;
+
        /* Parsing of the network interface is complete, add it to the list */
        DPAA_BUS_LOG(DEBUG, "Found %s, Tx Channel = %x, FMAN = %x,"
                    "Port ID = %x",
@@ -524,7 +535,7 @@ err:
 int
 fman_init(void)
 {
-       const struct device_node *dpa_node;
+       const struct device_node *dpa_node, *parent_node;
        int _errno;
 
        /* If multiple dependencies try to initialise the Fman driver, don't
@@ -539,7 +550,13 @@ fman_init(void)
                return fman_ccsr_map_fd;
        }
 
-       for_each_compatible_node(dpa_node, NULL, "fsl,dpa-ethernet-init") {
+       parent_node = of_find_compatible_node(NULL, NULL, "fsl,dpaa");
+       if (!parent_node) {
+               DPAA_BUS_LOG(ERR, "Unable to find fsl,dpaa node");
+               return -ENODEV;
+       }
+
+       for_each_child_node(parent_node, dpa_node) {
                _errno = fman_if_init(dpa_node);
                if (_errno) {
                        FMAN_ERR(_errno, "if_init(%s)\n", dpa_node->full_name);
index 7a0a7d4..cb7f18c 100644 (file)
@@ -320,6 +320,8 @@ struct fman_if {
        struct rte_ether_addr mac_addr;
        /* The Qman channel to schedule Tx FQs to */
        u16 tx_channel_id;
+
+       uint8_t is_shared_mac;
        /* The hard-coded FQIDs for this interface. Note: this doesn't cover
         * the PCD nor the "Rx default" FQIDs, which are configured via FMC
         * and its XML-based configuration.
index c5b9ac1..c2d4803 100644 (file)
@@ -351,7 +351,8 @@ static void dpaa_eth_dev_stop(struct rte_eth_dev *dev)
 
        PMD_INIT_FUNC_TRACE();
 
-       fman_if_disable_rx(fif);
+       if (!fif->is_shared_mac)
+               fman_if_disable_rx(fif);
        dev->tx_pkt_burst = dpaa_eth_tx_drop_all;
 }
 
@@ -1807,19 +1808,21 @@ dpaa_dev_init(struct rte_eth_dev *eth_dev)
                fman_intf->mac_addr.addr_bytes[4],
                fman_intf->mac_addr.addr_bytes[5]);
 
-
-       /* Disable RX mode */
-       fman_if_discard_rx_errors(fman_intf);
-       fman_if_disable_rx(fman_intf);
-       /* Disable promiscuous mode */
-       fman_if_promiscuous_disable(fman_intf);
-       /* Disable multicast */
-       fman_if_reset_mcast_filter_table(fman_intf);
-       /* Reset interface statistics */
-       fman_if_stats_reset(fman_intf);
-       /* Disable SG by default */
-       fman_if_set_sg(fman_intf, 0);
-       fman_if_set_maxfrm(fman_intf, RTE_ETHER_MAX_LEN + VLAN_TAG_SIZE);
+       if (!fman_intf->is_shared_mac) {
+               /* Disable RX mode */
+               fman_if_discard_rx_errors(fman_intf);
+               fman_if_disable_rx(fman_intf);
+               /* Disable promiscuous mode */
+               fman_if_promiscuous_disable(fman_intf);
+               /* Disable multicast */
+               fman_if_reset_mcast_filter_table(fman_intf);
+               /* Reset interface statistics */
+               fman_if_stats_reset(fman_intf);
+               /* Disable SG by default */
+               fman_if_set_sg(fman_intf, 0);
+               fman_if_set_maxfrm(fman_intf,
+                                  RTE_ETHER_MAX_LEN + VLAN_TAG_SIZE);
+       }
 
        return 0;
 
index a12141e..d24cd85 100644 (file)
@@ -736,6 +736,14 @@ int dpaa_fm_deconfig(struct dpaa_if *dpaa_intf,
        }
        dpaa_intf->netenv_handle = NULL;
 
+       if (fif && fif->is_shared_mac) {
+               ret = fm_port_enable(dpaa_intf->port_handle);
+               if (ret != E_OK) {
+                       DPAA_PMD_ERR("shared mac re-enable failed");
+                       return ret;
+               }
+       }
+
        /* FM PORT Close */
        fm_port_close(dpaa_intf->port_handle);
        dpaa_intf->port_handle = NULL;
@@ -785,10 +793,12 @@ int dpaa_fm_config(struct rte_eth_dev *dev, uint64_t req_dist_set)
                }
        }
        /* Set default netenv and scheme */
-       ret = set_default_scheme(dpaa_intf);
-       if (ret) {
-               DPAA_PMD_ERR("Set PCD NetEnv and Scheme: Failed");
-               goto unset_pcd_netenv_scheme1;
+       if (!fif->is_shared_mac) {
+               ret = set_default_scheme(dpaa_intf);
+               if (ret) {
+                       DPAA_PMD_ERR("Set PCD NetEnv and Scheme: Failed");
+                       goto unset_pcd_netenv_scheme1;
+               }
        }
 
        /* Set Port PCD */