net/mvpp2: support DSA mode

Extend the config file with 'dsa-mode' field.
Currently 'eth' (default) and 'dsa' headers are supported.

Signed-off-by: Liron Himi <lironh@marvell.com>
This commit is contained in:
Liron Himi 2021-01-27 18:09:27 +02:00 committed by Ferruh Yigit
parent 45ea4c59e8
commit c2b5ae61c0
4 changed files with 66 additions and 19 deletions

View 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
~~~~~~~~~~~

View 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:

View File

@ -19,6 +19,10 @@
/* 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;
}
}

View 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 {