Per newest PRM definition, sample_id stands for 3 parts
of information instead of single uint32_t id: sample_id +
modify_filed_id + format_select_dw.

Also new FW capability bits have been introduces to identify
the new capability.

Signed-off-by: Rongwei Liu <rongw...@nvidia.com>
Acked-by: Viacheslav Ovsiienko <viachesl...@nvidia.com>
---
 drivers/common/mlx5/mlx5_devx_cmds.c | 14 +++++++++++---
 drivers/common/mlx5/mlx5_devx_cmds.h |  7 ++++++-
 drivers/common/mlx5/mlx5_prm.h       | 28 ++++++++++++++++++++++++++--
 drivers/net/mlx5/mlx5.c              | 15 +++++++++++----
 drivers/net/mlx5/mlx5.h              |  3 ++-
 drivers/net/mlx5/mlx5_flow_flex.c    | 14 +++++++++++---
 6 files changed, 67 insertions(+), 14 deletions(-)

diff --git a/drivers/common/mlx5/mlx5_devx_cmds.c 
b/drivers/common/mlx5/mlx5_devx_cmds.c
index e3a4927d0f..1f65ea7dcb 100644
--- a/drivers/common/mlx5/mlx5_devx_cmds.c
+++ b/drivers/common/mlx5/mlx5_devx_cmds.c
@@ -607,7 +607,8 @@ mlx5_devx_cmd_query_hca_vdpa_attr(void *ctx,
 
 int
 mlx5_devx_cmd_query_parse_samples(struct mlx5_devx_obj *flex_obj,
-                                 uint32_t ids[], uint32_t num)
+                                 struct mlx5_ext_sample_id ids[],
+                                 uint32_t num, uint8_t *anchor)
 {
        uint32_t in[MLX5_ST_SZ_DW(general_obj_in_cmd_hdr)] = {0};
        uint32_t out[MLX5_ST_SZ_DW(create_flex_parser_out)] = {0};
@@ -636,6 +637,7 @@ mlx5_devx_cmd_query_parse_samples(struct mlx5_devx_obj 
*flex_obj,
                        (void *)flex_obj);
                return -rte_errno;
        }
+       *anchor = MLX5_GET(parse_graph_flex, flex, head_anchor_id);
        for (i = 0; i < MLX5_GRAPH_NODE_SAMPLE_NUM; i++) {
                void *s_off = (void *)((char *)sample + i *
                              MLX5_ST_SZ_BYTES(parse_graph_flow_match_sample));
@@ -645,8 +647,8 @@ mlx5_devx_cmd_query_parse_samples(struct mlx5_devx_obj 
*flex_obj,
                              flow_match_sample_en);
                if (!en)
                        continue;
-               ids[idx++] = MLX5_GET(parse_graph_flow_match_sample, s_off,
-                                 flow_match_sample_field_id);
+               ids[idx++].id = MLX5_GET(parse_graph_flow_match_sample, s_off,
+                                        flow_match_sample_field_id);
        }
        if (num != idx) {
                rte_errno = EINVAL;
@@ -794,6 +796,12 @@ mlx5_devx_cmd_query_hca_parse_graph_node_cap
                                         max_num_arc_out);
        attr->max_num_sample = MLX5_GET(parse_graph_node_cap, hcattr,
                                        max_num_sample);
+       attr->anchor_en = MLX5_GET(parse_graph_node_cap, hcattr, anchor_en);
+       attr->ext_sample_id = MLX5_GET(parse_graph_node_cap, hcattr, 
ext_sample_id);
+       attr->sample_tunnel_inner2 = MLX5_GET(parse_graph_node_cap, hcattr,
+                                             sample_tunnel_inner2);
+       attr->zero_size_supported = MLX5_GET(parse_graph_node_cap, hcattr,
+                                            zero_size_supported);
        attr->sample_id_in_out = MLX5_GET(parse_graph_node_cap, hcattr,
                                          sample_id_in_out);
        attr->max_base_header_length = MLX5_GET(parse_graph_node_cap, hcattr,
diff --git a/drivers/common/mlx5/mlx5_devx_cmds.h 
b/drivers/common/mlx5/mlx5_devx_cmds.h
index c94b9eac06..5b33010155 100644
--- a/drivers/common/mlx5/mlx5_devx_cmds.h
+++ b/drivers/common/mlx5/mlx5_devx_cmds.h
@@ -114,6 +114,10 @@ struct mlx5_hca_flex_attr {
        uint8_t  max_num_arc_out;
        uint8_t  max_num_sample;
        uint8_t  max_num_prog_sample:5; /* From HCA CAP 2 */
+       uint8_t  anchor_en:1;
+       uint8_t  ext_sample_id:1;
+       uint8_t  sample_tunnel_inner2:1;
+       uint8_t  zero_size_supported:1;
        uint8_t  sample_id_in_out:1;
        uint16_t max_base_header_length;
        uint8_t  max_sample_base_offset;
@@ -706,7 +710,8 @@ int mlx5_devx_cmd_modify_tir(struct mlx5_devx_obj *tir,
                             struct mlx5_devx_modify_tir_attr *tir_attr);
 __rte_internal
 int mlx5_devx_cmd_query_parse_samples(struct mlx5_devx_obj *flex_obj,
-                                     uint32_t ids[], uint32_t num);
+                                     struct mlx5_ext_sample_id ids[],
+                                     uint32_t num, uint8_t *anchor);
 
 __rte_internal
 struct mlx5_devx_obj *
diff --git a/drivers/common/mlx5/mlx5_prm.h b/drivers/common/mlx5/mlx5_prm.h
index 3790dc84b8..ce6cd98fd7 100644
--- a/drivers/common/mlx5/mlx5_prm.h
+++ b/drivers/common/mlx5/mlx5_prm.h
@@ -1893,7 +1893,11 @@ struct mlx5_ifc_parse_graph_node_cap_bits {
        u8 max_num_arc_in[0x08];
        u8 max_num_arc_out[0x08];
        u8 max_num_sample[0x08];
-       u8 reserved_at_78[0x07];
+       u8 reserved_at_78[0x03];
+       u8 anchor_en[0x1];
+       u8 ext_sample_id[0x1];
+       u8 sample_tunnel_inner2[0x1];
+       u8 zero_size_supported[0x1];
        u8 sample_id_in_out[0x1];
        u8 max_base_header_length[0x10];
        u8 reserved_at_90[0x08];
@@ -1903,6 +1907,24 @@ struct mlx5_ifc_parse_graph_node_cap_bits {
        u8 header_length_mask_width[0x08];
 };
 
+/* ext_sample_id structure, see PRM Table: Flow Match Sample ID Format. */
+struct mlx5_ext_sample_id {
+       union {
+               struct {
+#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
+                       uint32_t format_select_dw:8;
+                       uint32_t modify_field_id:12;
+                       uint32_t sample_id:12;
+#else
+                       uint32_t sample_id:12;
+                       uint32_t modify_field_id:12;
+                       uint32_t format_select_dw:8;
+#endif
+               };
+               uint32_t id;
+       };
+};
+
 struct mlx5_ifc_flow_table_prop_layout_bits {
        u8 ft_support[0x1];
        u8 flow_tag[0x1];
@@ -4522,7 +4544,9 @@ struct mlx5_ifc_parse_graph_flex_bits {
        u8 header_length_mode[0x4];
        u8 header_length_field_offset[0x10];
        u8 next_header_field_offset[0x10];
-       u8 reserved_at_160[0x1b];
+       u8 reserved_at_160[0x12];
+       u8 head_anchor_id[0x6];
+       u8 reserved_at_178[0x3];
        u8 next_header_field_size[0x5];
        u8 header_length_field_mask[0x20];
        u8 reserved_at_224[0x20];
diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index b8643cebdd..0b97c4e78d 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -964,11 +964,13 @@ int
 mlx5_flex_parser_ecpri_alloc(struct rte_eth_dev *dev)
 {
        struct mlx5_priv *priv = dev->data->dev_private;
+       struct mlx5_hca_flex_attr *attr = &priv->sh->cdev->config.hca_attr.flex;
        struct mlx5_ecpri_parser_profile *prf = &priv->sh->ecpri_parser;
        struct mlx5_devx_graph_node_attr node = {
                .modify_field_select = 0,
        };
-       uint32_t ids[8];
+       struct mlx5_ext_sample_id ids[8];
+       uint8_t anchor_id;
        int ret;
 
        if (!priv->sh->cdev->config.hca_attr.parse_graph_flex_node) {
@@ -1004,15 +1006,20 @@ mlx5_flex_parser_ecpri_alloc(struct rte_eth_dev *dev)
                return (rte_errno == 0) ? -ENODEV : -rte_errno;
        }
        prf->num = 2;
-       ret = mlx5_devx_cmd_query_parse_samples(prf->obj, ids, prf->num);
+       ret = mlx5_devx_cmd_query_parse_samples(prf->obj, ids, prf->num, 
&anchor_id);
        if (ret) {
                DRV_LOG(ERR, "Failed to query sample IDs.");
                return (rte_errno == 0) ? -ENODEV : -rte_errno;
        }
        prf->offset[0] = 0x0;
        prf->offset[1] = sizeof(uint32_t);
-       prf->ids[0] = ids[0];
-       prf->ids[1] = ids[1];
+       if (attr->ext_sample_id) {
+               prf->ids[0] = ids[0].sample_id;
+               prf->ids[1] = ids[1].sample_id;
+       } else {
+               prf->ids[0] = ids[0].id;
+               prf->ids[1] = ids[1].id;
+       }
        return 0;
 }
 
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index 16b33e1548..83fb316ad8 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -1307,9 +1307,10 @@ struct mlx5_lag {
 struct mlx5_flex_parser_devx {
        struct mlx5_list_entry entry;  /* List element at the beginning. */
        uint32_t num_samples;
+       uint8_t anchor_id;
        void *devx_obj;
        struct mlx5_devx_graph_node_attr devx_conf;
-       uint32_t sample_ids[MLX5_GRAPH_NODE_SAMPLE_NUM];
+       struct mlx5_ext_sample_id sample_ids[MLX5_GRAPH_NODE_SAMPLE_NUM];
 };
 
 /* Pattern field descriptor - how to translate flex pattern into samples. */
diff --git a/drivers/net/mlx5/mlx5_flow_flex.c 
b/drivers/net/mlx5/mlx5_flow_flex.c
index fb08910ddb..35f2a9923d 100644
--- a/drivers/net/mlx5/mlx5_flow_flex.c
+++ b/drivers/net/mlx5/mlx5_flow_flex.c
@@ -226,15 +226,18 @@ mlx5_flex_flow_translate_item(struct rte_eth_dev *dev,
        void *misc4_m = MLX5_ADDR_OF(fte_match_param, matcher,
                                     misc_parameters_4);
        void *misc4_v = MLX5_ADDR_OF(fte_match_param, key, misc_parameters_4);
+       struct mlx5_priv *priv = dev->data->dev_private;
+       struct mlx5_hca_flex_attr *attr = &priv->sh->cdev->config.hca_attr.flex;
        struct mlx5_flex_item *tp;
        uint32_t i, pos = 0;
+       uint32_t sample_id;
 
        RTE_SET_USED(dev);
        MLX5_ASSERT(item->spec && item->mask);
        spec = item->spec;
        mask = item->mask;
        tp = (struct mlx5_flex_item *)spec->handle;
-       MLX5_ASSERT(mlx5_flex_index(dev->data->dev_private, tp) >= 0);
+       MLX5_ASSERT(mlx5_flex_index(priv, tp) >= 0);
        for (i = 0; i < tp->mapnum; i++) {
                struct mlx5_flex_pattern_field *map = tp->map + i;
                uint32_t id = map->reg_id;
@@ -257,9 +260,13 @@ mlx5_flex_flow_translate_item(struct rte_eth_dev *dev,
                        MLX5_ASSERT(id < num_samples);
                        id += num_samples;
                }
+               if (attr->ext_sample_id)
+                       sample_id = tp->devx_fp->sample_ids[id].sample_id;
+               else
+                       sample_id = tp->devx_fp->sample_ids[id].id;
                mlx5_flex_set_match_sample(misc4_m, misc4_v,
                                           def, msk & def, val & msk & def,
-                                          tp->devx_fp->sample_ids[id], id);
+                                          sample_id, id);
                pos += map->width;
        }
 }
@@ -1298,7 +1305,8 @@ mlx5_flex_parser_create_cb(void *list_ctx, void *ctx)
        /* Query the firmware assigned sample ids. */
        ret = mlx5_devx_cmd_query_parse_samples(fp->devx_obj,
                                                fp->sample_ids,
-                                               fp->num_samples);
+                                               fp->num_samples,
+                                               &fp->anchor_id);
        if (ret)
                goto error;
        DRV_LOG(DEBUG, "DEVx flex parser %p created, samples num: %u",
-- 
2.27.0

Reply via email to