get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/73534/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 73534,
    "url": "https://patches.dpdk.org/api/patches/73534/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1594219387-240274-5-git-send-email-bingz@mellanox.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1594219387-240274-5-git-send-email-bingz@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1594219387-240274-5-git-send-email-bingz@mellanox.com",
    "date": "2020-07-08T14:43:06",
    "name": "[4/5] net/mlx5: adding Devx command for flex parsers",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "85bf0b07d28973beef16998b19a20b3400336128",
    "submitter": {
        "id": 1357,
        "url": "https://patches.dpdk.org/api/people/1357/?format=api",
        "name": "Bing Zhao",
        "email": "bingz@mellanox.com"
    },
    "delegate": {
        "id": 3268,
        "url": "https://patches.dpdk.org/api/users/3268/?format=api",
        "username": "rasland",
        "first_name": "Raslan",
        "last_name": "Darawsheh",
        "email": "rasland@nvidia.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1594219387-240274-5-git-send-email-bingz@mellanox.com/mbox/",
    "series": [
        {
            "id": 10893,
            "url": "https://patches.dpdk.org/api/series/10893/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=10893",
            "date": "2020-07-08T14:43:02",
            "name": "add eCPRI support in mlx5 driver",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/10893/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/73534/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/73534/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 7B7F8A0527;\n\tWed,  8 Jul 2020 16:43:54 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id B0F811E4B1;\n\tWed,  8 Jul 2020 16:43:26 +0200 (CEST)",
            "from git-send-mailer.rdmz.labs.mlnx (unknown [37.142.13.130])\n by dpdk.org (Postfix) with ESMTP id C6A351E49D\n for <dev@dpdk.org>; Wed,  8 Jul 2020 16:43:24 +0200 (CEST)"
        ],
        "From": "Bing Zhao <bingz@mellanox.com>",
        "To": "orika@mellanox.com,\n\tviacheslavo@mellanox.com",
        "Cc": "rasland@mellanox.com, matan@mellanox.com, dev@dpdk.org,\n Netanel Gonen <netanelg@r-arch-host16.mtr.labs.mlnx>,\n Netanel Gonen <netanelg@mellanox.com>",
        "Date": "Wed,  8 Jul 2020 22:43:06 +0800",
        "Message-Id": "<1594219387-240274-5-git-send-email-bingz@mellanox.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1594219387-240274-1-git-send-email-bingz@mellanox.com>",
        "References": "<1594219387-240274-1-git-send-email-bingz@mellanox.com>",
        "Subject": "[dpdk-dev] [PATCH 4/5] net/mlx5: adding Devx command for flex\n\tparsers",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Netanel Gonen <netanelg@r-arch-host16.mtr.labs.mlnx>\n\nIn order to use dynamic flex parser to parse protocols that is not\nsupported natively, two steps are needed.\n\nFirstly, creating the parse graph node. There are three parts of the\nflex parser: node, arc and sample. Node is the whole structure of a\nflex parser, when creating, the length of the protocol should be\nspecified. Then the input arc(s) is(are) mandatory, it will tell the\nHW when to use this parser to parse the packet. For a single parser\nnode, up to 8 input arcs could be supported and it gives SW ability\nto support this protocol over multiple layers. The output arc is\noptional and also up to 8 arcs could be supported. If the protocol\nis the last header of the stack, then output arc should be NULL. Or\nelse it should be specified. The protocol type in the arc is used to\nindicate the parser pointing to or from this flex parser node. For\noutput arc, the next header type field offset and size should be set\nin the node structure, then the HW could get the proper type of the\nnext header and decide which parser to point to.\nNote: the parsers have two types now, native parser and flex parser.\nThe arc between two flex parsers are not supported in this stage.\n\nSecondly, querying the sample IDs. If the protocol header parsed\nwith flex parser needs to used in flow rule offloading, the DW\nsamples are needed when creating the parse graph node. The offset\nof bytes starting from the header needs to be set. After creating\nthe node successfully, a general object handle will be returned.\nThis object could be queryed with Devx command to get the sample\nIDs.\nWhen creating a flow, sample IDs could be used to sample a DW from\nthe parsed header - 4 continuous bytes starting from the offset. The\nflow entry could specify some mask to use part of this DW for\nmatching. Up to 8 samples could be supported for a single parse\ngraph node. The offset should not exceed the header length.\n\nThe HW resources have some limitation, low layer driver error should\nbe checked once there is a failure of creating parse graph node.\n\nSigned-off-by: Netanel Gonen <netanelg@mellanox.com>\nSigned-off-by: Bing Zhao <bingz@mellanox.com>\n---\n drivers/common/mlx5/mlx5_devx_cmds.c            | 168 +++++++++++++++++++++++-\n drivers/common/mlx5/mlx5_devx_cmds.h            |   8 ++\n drivers/common/mlx5/mlx5_prm.h                  |  69 +++++++++-\n drivers/common/mlx5/rte_common_mlx5_version.map |   2 +\n 4 files changed, 240 insertions(+), 7 deletions(-)",
    "diff": "diff --git a/drivers/common/mlx5/mlx5_devx_cmds.c b/drivers/common/mlx5/mlx5_devx_cmds.c\nindex ec92eb6..4bad466 100644\n--- a/drivers/common/mlx5/mlx5_devx_cmds.c\n+++ b/drivers/common/mlx5/mlx5_devx_cmds.c\n@@ -396,6 +396,165 @@ struct mlx5_devx_obj *\n \t}\n }\n \n+int\n+mlx5_devx_cmd_query_parse_samples(struct mlx5_devx_obj *flex_obj,\n+\t\t\t\t  uint32_t ids[], uint32_t num)\n+{\n+\tuint32_t in[MLX5_ST_SZ_DW(general_obj_in_cmd_hdr)] = {0};\n+\tuint32_t out[MLX5_ST_SZ_DW(create_flex_parser_out)] = {0};\n+\tvoid *hdr = MLX5_ADDR_OF(create_flex_parser_out, in, hdr);\n+\tvoid *flex = MLX5_ADDR_OF(create_flex_parser_out, out, flex);\n+\tvoid *sample = MLX5_ADDR_OF(parse_graph_flex, flex, sample_table);\n+\tint ret;\n+\tuint32_t idx = 0;\n+\tuint32_t i;\n+\n+\tif (num > 8) {\n+\t\trte_errno = EINVAL;\n+\t\tDRV_LOG(ERR, \"Too many sample IDs to be fetched.\");\n+\t\treturn -rte_errno;\n+\t}\n+\tMLX5_SET(general_obj_in_cmd_hdr, hdr, opcode,\n+\t\t MLX5_CMD_OP_QUERY_GENERAL_OBJECT);\n+\tMLX5_SET(general_obj_in_cmd_hdr, hdr, obj_type,\n+\t\t MLX5_GENERAL_OBJ_TYPE_FLEX_PARSE_GRAPH);\n+\tMLX5_SET(general_obj_in_cmd_hdr, hdr, obj_id, flex_obj->id);\n+\tret = mlx5_glue->devx_obj_query(flex_obj->obj, in, sizeof(in),\n+\t\t\t\t\tout, sizeof(out));\n+\tif (ret) {\n+\t\trte_errno = errno;\n+\t\tDRV_LOG(ERR, \"Failed to query sample IDs with object %p.\",\n+\t\t\tflex_obj);\n+\t\treturn -rte_errno;\n+\t}\n+\tfor (i = 0; i < 8; i++) {\n+\t\tvoid *s_off = (void *)((char *)sample + i *\n+\t\t\t      MLX5_ST_SZ_BYTES(parse_graph_flow_match_sample));\n+\t\tuint32_t en;\n+\n+\t\ten = MLX5_GET(parse_graph_flow_match_sample, s_off,\n+\t\t\t      flow_match_sample_en);\n+\t\tif (!en)\n+\t\t\tcontinue;\n+\t\tids[idx++] = MLX5_GET(parse_graph_flow_match_sample, s_off,\n+\t\t\t\t  flow_match_sample_field_id);\n+\t}\n+\tif (num != idx) {\n+\t\trte_errno = EINVAL;\n+\t\tDRV_LOG(ERR, \"Number of sample IDs are not as expected.\");\n+\t\treturn -rte_errno;\n+\t}\n+\treturn ret;\n+}\n+\n+\n+struct mlx5_devx_obj *\n+mlx5_devx_cmd_create_flex_parser(void* ctx,\n+\t\t\t      struct mlx5_devx_graph_node_attr *data)\n+{\n+\tuint32_t in[MLX5_ST_SZ_DW(create_flex_parser_in)] = {0};\n+\tuint32_t out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)] = {0};\n+\tvoid *hdr = MLX5_ADDR_OF(create_flex_parser_in, in, hdr);\n+\tvoid *flex = MLX5_ADDR_OF(create_flex_parser_in, in, flex);\n+\tvoid *sample = MLX5_ADDR_OF(parse_graph_flex, flex, sample_table);\n+\tvoid *in_arc = MLX5_ADDR_OF(parse_graph_flex, flex, input_arc);\n+\tvoid *out_arc = MLX5_ADDR_OF(parse_graph_flex, flex, output_arc);\n+\tstruct mlx5_devx_obj *parse_flex_obj = NULL;\n+\tuint32_t i;\n+\n+\tparse_flex_obj = rte_calloc(__func__, 1, sizeof(*parse_flex_obj), 0);\n+\tif (!parse_flex_obj) {\n+\t\tDRV_LOG(ERR, \"Failed to allocate flex parser data\");\n+\t\trte_errno = ENOMEM;\n+\t\trte_free(in);\n+\t\treturn NULL;\n+\t}\n+\tMLX5_SET(general_obj_in_cmd_hdr, hdr, opcode,\n+\t\t MLX5_CMD_OP_CREATE_GENERAL_OBJECT);\n+\tMLX5_SET(general_obj_in_cmd_hdr, hdr, obj_type,\n+\t\t MLX5_GENERAL_OBJ_TYPE_FLEX_PARSE_GRAPH);\n+\tMLX5_SET(parse_graph_flex, flex, header_length_mode,\n+\t\t data->header_length_mode);\n+\tMLX5_SET(parse_graph_flex, flex, header_length_base_value,\n+\t\t data->header_length_base_value);\n+\tMLX5_SET(parse_graph_flex, flex, header_length_field_offset,\n+\t\t data->header_length_field_offset);\n+\tMLX5_SET(parse_graph_flex, flex, header_length_field_shift,\n+\t\t data->header_length_field_shift);\n+\tMLX5_SET(parse_graph_flex, flex, header_length_field_mask,\n+\t\t data->header_length_field_mask);\n+\tfor (i = 0; i < 8; i++) {\n+\t\tstruct mlx5_devx_match_sample_attr *s = &data->sample[i];\n+\t\tvoid *s_off = (void *)((char *)sample + i *\n+\t\t\t      MLX5_ST_SZ_BYTES(parse_graph_flow_match_sample));\n+\n+\t\tif (!s->flow_match_sample_en)\n+\t\t\tcontinue;\n+\t\tMLX5_SET(parse_graph_flow_match_sample, s_off,\n+\t\t\t flow_match_sample_en, !!s->flow_match_sample_en);\n+\t\tMLX5_SET(parse_graph_flow_match_sample, s_off,\n+\t\t\t flow_match_sample_field_offset,\n+\t\t\t s->flow_match_sample_field_offset);\n+\t\tMLX5_SET(parse_graph_flow_match_sample, s_off,\n+\t\t\t flow_match_sample_offset_mode,\n+\t\t\t s->flow_match_sample_offset_mode);\n+\t\tMLX5_SET(parse_graph_flow_match_sample, s_off,\n+\t\t\t flow_match_sample_field_offset_mask,\n+\t\t\t s->flow_match_sample_field_offset_mask);\n+\t\tMLX5_SET(parse_graph_flow_match_sample, s_off,\n+\t\t\t flow_match_sample_field_offset_shift,\n+\t\t\t s->flow_match_sample_field_offset_shift);\n+\t\tMLX5_SET(parse_graph_flow_match_sample, s_off,\n+\t\t\t flow_match_sample_field_base_offset,\n+\t\t\t s->flow_match_sample_field_base_offset);\n+\t\tMLX5_SET(parse_graph_flow_match_sample, s_off,\n+\t\t\t flow_match_sample_tunnel_mode,\n+\t\t\t s->flow_match_sample_tunnel_mode);\n+\t}\n+\tfor (i = 0; i < 8; i++) {\n+\t\tstruct mlx5_devx_graph_arc_attr *ia = &data->in[i];\n+\t\tstruct mlx5_devx_graph_arc_attr *oa = &data->out[i];\n+\t\tvoid *in_off = (void *)((char *)in_arc + i *\n+\t\t\t      MLX5_ST_SZ_BYTES(parse_graph_arc));\n+\t\tvoid *out_off = (void *)((char *)out_arc + i *\n+\t\t\t      MLX5_ST_SZ_BYTES(parse_graph_arc));\n+\n+\t\tif (ia->arc_parse_graph_node != 0) {\n+\t\t\tMLX5_SET(parse_graph_arc, in_off,\n+\t\t\t\t compare_condition_value,\n+\t\t\t\t ia->compare_condition_value);\n+\t\t\tMLX5_SET(parse_graph_arc, in_off, start_inner_tunnel,\n+\t\t\t\t ia->start_inner_tunnel);\n+\t\t\tMLX5_SET(parse_graph_arc, in_off, arc_parse_graph_node,\n+\t\t\t\t ia->arc_parse_graph_node);\n+\t\t\tMLX5_SET(parse_graph_arc, in_off, parse_graph_node_handle,\n+\t\t\t\t ia->parse_graph_node_handle);\n+\t\t}\n+\t\tif (oa->arc_parse_graph_node != 0) {\n+\t\t\tMLX5_SET(parse_graph_arc, out_off,\n+\t\t\t\t compare_condition_value,\n+\t\t\t\t oa->compare_condition_value);\n+\t\t\tMLX5_SET(parse_graph_arc, out_off, start_inner_tunnel,\n+\t\t\t\t oa->start_inner_tunnel);\n+\t\t\tMLX5_SET(parse_graph_arc, out_off, arc_parse_graph_node,\n+\t\t\t\t oa->arc_parse_graph_node);\n+\t\t\tMLX5_SET(parse_graph_arc, out_off, parse_graph_node_handle,\n+\t\t\t\t oa->parse_graph_node_handle);\n+\t\t}\n+\t}\n+\tparse_flex_obj->obj = mlx5_glue->devx_obj_create(ctx, in, sizeof(in),\n+\t\t\t\t\t\t\t out, sizeof(out));\n+\tif (!parse_flex_obj->obj) {\n+\t\trte_errno = errno;\n+\t\tDRV_LOG(ERR, \"Failed to create FLEX PARSE GRAPH object \"\n+\t\t\t\"by using DevX.\");\n+\t\trte_free(parse_flex_obj);\n+\t\treturn NULL;\n+\t}\n+\tparse_flex_obj->id = MLX5_GET(general_obj_out_cmd_hdr, out, obj_id);\n+\treturn parse_flex_obj;\n+}\n+\n /**\n  * Query HCA attributes.\n  * Using those attributes we can check on run time if the device\n@@ -467,6 +626,9 @@ struct mlx5_devx_obj *\n \tattr->vdpa.queue_counters_valid = !!(MLX5_GET64(cmd_hca_cap, hcattr,\n \t\t\t\t\t\t\tgeneral_obj_types) &\n \t\t\t\t  MLX5_GENERAL_OBJ_TYPES_CAP_VIRTIO_Q_COUNTERS);\n+\tattr->parse_graph_flex_node = !!(MLX5_GET64(cmd_hca_cap, hcattr,\n+\t\t\t\t\t general_obj_types) &\n+\t\t\t      MLX5_GENERAL_OBJ_TYPES_CAP_PARSE_GRAPH_FLEX_NODE);\n \tif (attr->qos.sup) {\n \t\tMLX5_SET(query_hca_cap_in, in, op_mod,\n \t\t\t MLX5_GET_HCA_CAP_OP_MOD_QOS_CAP |\n@@ -1024,7 +1186,7 @@ struct mlx5_devx_obj *\n \tif (ret) {\n \t\tDRV_LOG(ERR, \"Failed to modify SQ using DevX\");\n \t\trte_errno = errno;\n-\t\treturn -errno;\n+\t\treturn -rte_errno;\n \t}\n \treturn ret;\n }\n@@ -1337,7 +1499,7 @@ struct mlx5_devx_obj *\n \tif (ret) {\n \t\tDRV_LOG(ERR, \"Failed to modify VIRTQ using DevX.\");\n \t\trte_errno = errno;\n-\t\treturn -errno;\n+\t\treturn -rte_errno;\n \t}\n \treturn ret;\n }\n@@ -1540,7 +1702,7 @@ struct mlx5_devx_obj *\n \tif (ret) {\n \t\tDRV_LOG(ERR, \"Failed to modify QP using DevX.\");\n \t\trte_errno = errno;\n-\t\treturn -errno;\n+\t\treturn -rte_errno;\n \t}\n \treturn ret;\n }\ndiff --git a/drivers/common/mlx5/mlx5_devx_cmds.h b/drivers/common/mlx5/mlx5_devx_cmds.h\nindex faabfb1..9a91649 100644\n--- a/drivers/common/mlx5/mlx5_devx_cmds.h\n+++ b/drivers/common/mlx5/mlx5_devx_cmds.h\n@@ -68,6 +68,7 @@ struct mlx5_hca_attr {\n \tuint32_t eswitch_manager:1;\n \tuint32_t flow_counters_dump:1;\n \tuint32_t log_max_rqt_size:5;\n+\tuint32_t parse_graph_flex_node:1;\n \tuint8_t flow_counter_bulk_alloc_bitmap;\n \tuint32_t eth_net_offloads:1;\n \tuint32_t eth_virt:1;\n@@ -416,6 +417,13 @@ int mlx5_devx_cmd_modify_qp_state(struct mlx5_devx_obj *qp,\n __rte_internal\n int mlx5_devx_cmd_modify_rqt(struct mlx5_devx_obj *rqt,\n \t\t\t     struct mlx5_devx_rqt_attr *rqt_attr);\n+__rte_internal\n+int mlx5_devx_cmd_query_parse_samples(struct mlx5_devx_obj *flex_obj,\n+\t\t\t\t      uint32_t ids[], uint32_t num);\n+\n+__rte_internal\n+struct mlx5_devx_obj *mlx5_devx_cmd_create_flex_parser(void* ctx,\n+\t\t\t\t\tstruct mlx5_devx_graph_node_attr *data);\n \n /**\n  * Create virtio queue counters object DevX API.\ndiff --git a/drivers/common/mlx5/mlx5_prm.h b/drivers/common/mlx5/mlx5_prm.h\nindex 9fed365..2b63d5a 100644\n--- a/drivers/common/mlx5/mlx5_prm.h\n+++ b/drivers/common/mlx5/mlx5_prm.h\n@@ -961,10 +961,9 @@ enum {\n \tMLX5_GET_HCA_CAP_OP_MOD_VDPA_EMULATION = 0x13 << 1,\n };\n \n-enum {\n-\tMLX5_GENERAL_OBJ_TYPES_CAP_VIRTQ_NET_Q = (1ULL << 0xd),\n-\tMLX5_GENERAL_OBJ_TYPES_CAP_VIRTIO_Q_COUNTERS = (1ULL << 0x1c),\n-};\n+#define MLX5_GENERAL_OBJ_TYPES_CAP_VIRTQ_NET_Q\t\t\t(1ULL << 0xd)\n+#define MLX5_GENERAL_OBJ_TYPES_CAP_VIRTIO_Q_COUNTERS\t\t(1ULL << 0x1c)\n+#define MLX5_GENERAL_OBJ_TYPES_CAP_PARSE_GRAPH_FLEX_NODE\t(1ULL << 0x22)\n \n enum {\n \tMLX5_HCA_CAP_OPMOD_GET_MAX   = 0,\n@@ -2022,6 +2021,7 @@ struct mlx5_ifc_create_cq_in_bits {\n enum {\n \tMLX5_GENERAL_OBJ_TYPE_VIRTQ = 0x000d,\n \tMLX5_GENERAL_OBJ_TYPE_VIRTIO_Q_COUNTERS = 0x001c,\n+\tMLX5_GENERAL_OBJ_TYPE_FLEX_PARSE_GRAPH = 0x0022,\n };\n \n struct mlx5_ifc_general_obj_in_cmd_hdr_bits {\n@@ -2500,6 +2500,67 @@ struct mlx5_ifc_query_qp_in_bits {\n \tu8 reserved_at_60[0x20];\n };\n \n+struct mlx5_ifc_parse_graph_arc_bits {\n+\tu8 start_inner_tunnel[0x1];\n+\tu8 reserved_at_1[0x7];\n+\tu8 arc_parse_graph_node[0x8];\n+\tu8 compare_condition_value[0x10];\n+\tu8 parse_graph_node_handle[0x20];\n+\tu8 reserved_at_40[0x40];\n+};\n+\n+struct mlx5_ifc_parse_graph_flow_match_sample_bits {\n+\tu8 flow_match_sample_en[0x1];\n+\tu8 reserved_at_1[0x3];\n+\tu8 flow_match_sample_offset_mode[0x4];\n+\tu8 reserved_at_5[0x8];\n+\tu8 flow_match_sample_field_offset[0x10];\n+\tu8 reserved_at_32[0x4];\n+\tu8 flow_match_sample_field_offset_shift[0x4];\n+\tu8 flow_match_sample_field_base_offset[0x8];\n+\tu8 reserved_at_48[0xd];\n+\tu8 flow_match_sample_tunnel_mode[0x3];\n+\tu8 flow_match_sample_field_offset_mask[0x20];\n+\tu8 flow_match_sample_field_id[0x20];\n+};\n+\n+struct mlx5_ifc_parse_graph_flex_bits {\n+\tu8 modify_field_select[0x40];\n+\tu8 reserved_at_64[0x20];\n+\tu8 header_length_base_value[0x10];\n+\tu8 reserved_at_112[0x4];\n+\tu8 header_length_field_shift[0x4];\n+\tu8 reserved_at_120[0x4];\n+\tu8 header_length_mode[0x4];\n+\tu8 header_length_field_offset[0x10];\n+\tu8 next_header_field_offset[0x10];\n+\tu8 reserved_at_160[0x1b];\n+\tu8 next_header_field_size[0x5];\n+\tu8 header_length_field_mask[0x20];\n+\tu8 reserved_at_224[0x20];\n+\tstruct mlx5_ifc_parse_graph_flow_match_sample_bits sample_table[0x8];\n+\tstruct mlx5_ifc_parse_graph_arc_bits input_arc[0x8];\n+\tstruct mlx5_ifc_parse_graph_arc_bits output_arc[0x8];\n+};\n+\n+struct mlx5_ifc_create_flex_parser_in_bits {\n+\tstruct mlx5_ifc_general_obj_in_cmd_hdr_bits hdr;\n+\tstruct mlx5_ifc_parse_graph_flex_bits flex;\n+};\n+\n+struct mlx5_ifc_create_flex_parser_out_bits {\n+\tstruct mlx5_ifc_general_obj_in_cmd_hdr_bits hdr;\n+\tstruct mlx5_ifc_parse_graph_flex_bits flex;\n+};\n+\n+struct mlx5_ifc_parse_graph_flex_out_bits {\n+\tu8 status[0x8];\n+\tu8 reserved_at_8[0x18];\n+\tu8 syndrome[0x20];\n+\tu8 reserved_at_40[0x40];\n+\tstruct mlx5_ifc_parse_graph_flex_bits capability;\n+};\n+\n /* CQE format mask. */\n #define MLX5E_CQE_FORMAT_MASK 0xc\n \ndiff --git a/drivers/common/mlx5/rte_common_mlx5_version.map b/drivers/common/mlx5/rte_common_mlx5_version.map\nindex ae57ebd..c86497f 100644\n--- a/drivers/common/mlx5/rte_common_mlx5_version.map\n+++ b/drivers/common/mlx5/rte_common_mlx5_version.map\n@@ -11,6 +11,7 @@ INTERNAL {\n \tmlx5_dev_to_pci_addr;\n \n \tmlx5_devx_cmd_create_cq;\n+\tmlx5_devx_cmd_create_flex_parser;\n \tmlx5_devx_cmd_create_qp;\n \tmlx5_devx_cmd_create_rq;\n \tmlx5_devx_cmd_create_rqt;\n@@ -32,6 +33,7 @@ INTERNAL {\n \tmlx5_devx_cmd_modify_virtq;\n \tmlx5_devx_cmd_qp_query_tis_td;\n \tmlx5_devx_cmd_query_hca_attr;\n+\tmlx5_devx_cmd_query_parse_samples;\n \tmlx5_devx_cmd_query_virtio_q_counters;\n \tmlx5_devx_cmd_query_virtq;\n \tmlx5_devx_get_out_command_status;\n",
    "prefixes": [
        "4/5"
    ]
}