[19/27] net/mlx5: add support for ASO return register
Checks
Commit Message
From: Bing Zhao <bingz@nvidia.com>
A REG_C_x metadata register is needed to store the result after an
ASO action. Like in the SWS, the meter color register is used for
all the ASO actions right now and this register was already filtered
out from the available tags.
It is assumed that all the devices are using the same meter color
register inside one application now.
In the next stage, the available tags and other metadata registers
allocation will be stored per device.
Signed-off-by: Bing Zhao <bingz@nvidia.com>
---
drivers/net/mlx5/mlx5_flow.c | 1 +
drivers/net/mlx5/mlx5_flow.h | 3 +++
drivers/net/mlx5/mlx5_flow_hw.c | 2 ++
3 files changed, 6 insertions(+)
@@ -49,6 +49,7 @@ struct flow_hw_port_info mlx5_flow_hw_port_infos[RTE_MAX_ETHPORTS];
*/
uint32_t mlx5_flow_hw_avl_tags_init_cnt;
enum modify_reg mlx5_flow_hw_avl_tags[MLX5_FLOW_HW_TAGS_MAX] = {REG_NON};
+enum modify_reg mlx5_flow_hw_aso_tag;
struct tunnel_default_miss_ctx {
uint16_t *queue;
@@ -1445,6 +1445,7 @@ extern struct flow_hw_port_info mlx5_flow_hw_port_infos[RTE_MAX_ETHPORTS];
#define MLX5_FLOW_HW_TAGS_MAX 8
extern uint32_t mlx5_flow_hw_avl_tags_init_cnt;
extern enum modify_reg mlx5_flow_hw_avl_tags[];
+extern enum modify_reg mlx5_flow_hw_aso_tag;
/*
* Get metadata match tag and mask for given rte_eth_dev port.
@@ -1517,6 +1518,8 @@ flow_hw_get_reg_id(enum rte_flow_item_type type, uint32_t id)
* REG_B case should be rejected on pattern template validation.
*/
return REG_A;
+ case RTE_FLOW_ITEM_TYPE_CONNTRACK:
+ return mlx5_flow_hw_aso_tag;
case RTE_FLOW_ITEM_TYPE_TAG:
MLX5_ASSERT(id < MLX5_FLOW_HW_TAGS_MAX);
return mlx5_flow_hw_avl_tags[id];
@@ -4903,6 +4903,7 @@ void flow_hw_init_tags_set(struct rte_eth_dev *dev)
unset |= 1 << (REG_C_1 - REG_C_0);
masks &= ~unset;
if (mlx5_flow_hw_avl_tags_init_cnt) {
+ MLX5_ASSERT(mlx5_flow_hw_aso_tag == priv->mtr_color_reg);
for (i = 0; i < MLX5_FLOW_HW_TAGS_MAX; i++) {
if (mlx5_flow_hw_avl_tags[i] != REG_NON && !!((1 << i) & masks)) {
copy[mlx5_flow_hw_avl_tags[i] - REG_C_0] =
@@ -4925,6 +4926,7 @@ void flow_hw_init_tags_set(struct rte_eth_dev *dev)
}
}
priv->sh->hws_tags = 1;
+ mlx5_flow_hw_aso_tag = (enum modify_reg)priv->mtr_color_reg;
mlx5_flow_hw_avl_tags_init_cnt++;
}