@@ -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,
@@ -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 *
@@ -1894,7 +1894,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];
@@ -1904,6 +1908,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];
@@ -4542,7 +4564,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];
@@ -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;
}
@@ -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. */
@@ -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;
}
}
@@ -1317,7 +1324,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",