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:
parent
45ea4c59e8
commit
c2b5ae61c0
@ -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
|
||||
~~~~~~~~~~~
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user