net/mvpp2: support DSA mode
authorLiron Himi <lironh@marvell.com>
Wed, 27 Jan 2021 16:09:27 +0000 (18:09 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 29 Jan 2021 17:16:11 +0000 (18:16 +0100)
Extend the config file with 'dsa-mode' field.
Currently 'eth' (default) and 'dsa' headers are supported.

Signed-off-by: Liron Himi <lironh@marvell.com>
doc/guides/nics/mvpp2.rst
drivers/net/mvpp2/mrvl_ethdev.c
drivers/net/mvpp2/mrvl_qos.c
drivers/net/mvpp2/mrvl_qos.h

index e1246ef..324a170 100644 (file)
@@ -40,7 +40,7 @@ Features of the MVPP2 PMD are:
 - :ref:`Extended stats <extstats>`
 - RX flow control
 - Scattered TX frames
-- :ref:`QoS <qossupport>`
+- :ref:`QoS <extconf>`
 - :ref:`Flow API <flowapi>`
 - :ref:`Traffic metering and policing <mtrapi>`
 - :ref:`Traffic Management API <tmapi>`
@@ -188,12 +188,12 @@ MVPP2 PMD supports the following extended statistics:
        - ``tx_errors``: number of TX MAC errors
 
 
-.. _qossupport:
+.. _extconf:
 
-QoS Configuration
------------------
+External Configuration
+----------------------
 
-QoS configuration is done through external configuration file. Path to the
+Several driver configuration (e.g. QoS) can be done through external configuration file. Path to the
 file must be given as `cfg` in driver's vdev parameter list.
 
 Configuration syntax
@@ -209,6 +209,7 @@ Configuration syntax
    cbs = <cbs>
 
    [port <portnum> default]
+   dsa_mode = <dsa_mode>
    default_tc = <default_tc>
    mapping_priority = <mapping_priority>
 
@@ -241,6 +242,8 @@ Where:
 
 - ``<portnum>``: DPDK Port number (0..n).
 
+- ``<dsa_mode>``: Indicate what is the dsa header mode (`none`, `dsa`, or `ext_dsa`).
+
 - ``<default_tc>``: Default traffic class (e.g. 0)
 
 - ``<mapping_priority>``: QoS priority for mapping (`ip`, `vlan`, `ip/vlan` or `vlan/ip`).
@@ -537,7 +540,7 @@ MVPP2 PMD supports DPDK traffic metering and policing that allows the following:
 
 For an additional description please refer to DPDK :doc:`Traffic Metering and Policing API <../prog_guide/traffic_metering_and_policing>`.
 
-The policer objects defined by this feature can work with the default policer defined via config file as described in :ref:`QoS Support <qossupport>`.
+The policer objects defined by this feature can work with the default policer defined via config file as described in :ref:`QoS Support <extconf>`.
 
 Limitations
 ~~~~~~~~~~~
index 43dd4c4..6448f44 100644 (file)
@@ -689,6 +689,10 @@ mrvl_dev_start(struct rte_eth_dev *dev)
        snprintf(match, sizeof(match), "ppio-%d:%d",
                 priv->pp_id, priv->ppio_id);
        priv->ppio_params.match = match;
+       priv->ppio_params.eth_start_hdr = PP2_PPIO_HDR_ETH;
+       if (mrvl_qos_cfg)
+               priv->ppio_params.eth_start_hdr =
+                       mrvl_qos_cfg->port[dev->data->port_id].eth_start_hdr;
 
        /*
         * Calculate the minimum bpool size for refill feature as follows:
index 7fd9703..976cb06 100644 (file)
 
 /* Parsing tokens. Defined conveniently, so that any correction is easy. */
 #define MRVL_TOK_DEFAULT "default"
+#define MRVL_TOK_DSA_MODE "dsa_mode"
+#define MRVL_TOK_DSA_MODE_NONE "none"
+#define MRVL_TOK_DSA_MODE_DSA "dsa"
+#define MRVL_TOK_DSA_MODE_EXT_DSA "ext_dsa"
 #define MRVL_TOK_DEFAULT_TC "default_tc"
 #define MRVL_TOK_DSCP "dscp"
 #define MRVL_TOK_MAPPING_PRIORITY "mapping_priority"
@@ -494,16 +498,19 @@ mrvl_get_qoscfg(const char *key __rte_unused, const char *path,
        const char *entry;
        char sec_name[32];
 
-       if (file == NULL)
-               rte_exit(EXIT_FAILURE, "Cannot load configuration %s\n", path);
+       if (file == NULL) {
+               MRVL_LOG(ERR, "Cannot load configuration %s\n", path);
+               return -1;
+       }
 
        /* Create configuration. This is never accessed on the fast path,
         * so we can ignore socket.
         */
        *cfg = rte_zmalloc("mrvl_qos_cfg", sizeof(struct mrvl_qos_cfg), 0);
-       if (*cfg == NULL)
-               rte_exit(EXIT_FAILURE, "Cannot allocate configuration %s\n",
-                       path);
+       if (*cfg == NULL) {
+               MRVL_LOG(ERR, "Cannot allocate configuration %s\n", path);
+               return -1;
+       }
 
        n = rte_cfgfile_num_sections(file, MRVL_TOK_PORT,
                sizeof(MRVL_TOK_PORT) - 1);
@@ -528,6 +535,31 @@ mrvl_get_qoscfg(const char *key __rte_unused, const char *path,
                        continue;
                }
 
+               entry = rte_cfgfile_get_entry(file, sec_name,
+                               MRVL_TOK_DSA_MODE);
+               if (entry) {
+                       if (!strncmp(entry, MRVL_TOK_DSA_MODE_NONE,
+                               sizeof(MRVL_TOK_DSA_MODE_NONE)))
+                               (*cfg)->port[n].eth_start_hdr =
+                               PP2_PPIO_HDR_ETH;
+                       else if (!strncmp(entry, MRVL_TOK_DSA_MODE_DSA,
+                               sizeof(MRVL_TOK_DSA_MODE_DSA)))
+                               (*cfg)->port[n].eth_start_hdr =
+                               PP2_PPIO_HDR_ETH_DSA;
+                       else if (!strncmp(entry, MRVL_TOK_DSA_MODE_EXT_DSA,
+                               sizeof(MRVL_TOK_DSA_MODE_EXT_DSA))) {
+                               (*cfg)->port[n].eth_start_hdr =
+                               PP2_PPIO_HDR_ETH_EXT_DSA;
+                       } else {
+                               MRVL_LOG(ERR,
+                                       "Error in parsing %s value (%s)!\n",
+                                       MRVL_TOK_DSA_MODE, entry);
+                               return -1;
+                       }
+               } else {
+                       (*cfg)->port[n].eth_start_hdr = PP2_PPIO_HDR_ETH;
+               }
+
                /*
                 * Read per-port rate limiting. Setting that will
                 * disable per-queue rate limiting.
@@ -575,13 +607,15 @@ mrvl_get_qoscfg(const char *key __rte_unused, const char *path,
                                (*cfg)->port[n].mapping_priority =
                                        PP2_CLS_QOS_TBL_IP_PRI;
                        else if (!strncmp(entry, MRVL_TOK_VLAN,
-                               sizeof(MRVL_TOK_VLAN)))
+                               sizeof(MRVL_TOK_VLAN))) {
                                (*cfg)->port[n].mapping_priority =
                                        PP2_CLS_QOS_TBL_VLAN_PRI;
-                       else
-                               rte_exit(EXIT_FAILURE,
+                       } else {
+                               MRVL_LOG(ERR,
                                        "Error in parsing %s value (%s)!\n",
                                        MRVL_TOK_MAPPING_PRIORITY, entry);
+                               return -1;
+                       }
                } else {
                        (*cfg)->port[n].mapping_priority =
                                PP2_CLS_QOS_TBL_VLAN_IP_PRI;
@@ -604,18 +638,22 @@ mrvl_get_qoscfg(const char *key __rte_unused, const char *path,
 
                for (i = 0; i < MRVL_PP2_RXQ_MAX; ++i) {
                        ret = get_outq_cfg(file, n, i, *cfg);
-                       if (ret < 0)
-                               rte_exit(EXIT_FAILURE,
+                       if (ret < 0) {
+                               MRVL_LOG(ERR,
                                        "Error %d parsing port %d outq %d!\n",
                                        ret, n, i);
+                               return -1;
+                       }
                }
 
                for (i = 0; i < MRVL_PP2_TC_MAX; ++i) {
                        ret = parse_tc_cfg(file, n, i, *cfg);
-                       if (ret < 0)
-                               rte_exit(EXIT_FAILURE,
+                       if (ret < 0) {
+                               MRVL_LOG(ERR,
                                        "Error %d parsing port %d tc %d!\n",
                                        ret, n, i);
+                               return -1;
+                       }
                }
 
                entry = rte_cfgfile_get_entry(file, sec_name,
@@ -628,7 +666,8 @@ mrvl_get_qoscfg(const char *key __rte_unused, const char *path,
                } else {
                        if ((*cfg)->port[n].use_global_defaults == 0) {
                                MRVL_LOG(ERR,
-                                        "Default Traffic Class required in custom configuration!");
+                                        "Default Traffic Class required in "
+                                        "custom configuration!");
                                return -1;
                        }
                }
index f03e773..0934752 100644 (file)
@@ -20,6 +20,7 @@
 /* QoS config. */
 struct mrvl_qos_cfg {
        struct port_cfg {
+               enum pp2_ppio_eth_start_hdr eth_start_hdr;
                int rate_limit_enable;
                struct pp2_ppio_rate_limit_params rate_limit_params;
                struct {