get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 129068,
    "url": "http://patchwork.dpdk.org/api/patches/129068/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20230628162927.92858-11-ajit.khaparde@broadcom.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<20230628162927.92858-11-ajit.khaparde@broadcom.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230628162927.92858-11-ajit.khaparde@broadcom.com",
    "date": "2023-06-28T16:29:26",
    "name": "[v4,10/11] net/bnxt: add support for eCPRI packet parsing",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "40ebec292e654969f16761adb90415eb0fc7ad47",
    "submitter": {
        "id": 501,
        "url": "http://patchwork.dpdk.org/api/people/501/?format=api",
        "name": "Ajit Khaparde",
        "email": "ajit.khaparde@broadcom.com"
    },
    "delegate": {
        "id": 1766,
        "url": "http://patchwork.dpdk.org/api/users/1766/?format=api",
        "username": "ajitkhaparde",
        "first_name": "Ajit",
        "last_name": "Khaparde",
        "email": "ajit.khaparde@broadcom.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20230628162927.92858-11-ajit.khaparde@broadcom.com/mbox/",
    "series": [
        {
            "id": 28693,
            "url": "http://patchwork.dpdk.org/api/series/28693/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=28693",
            "date": "2023-06-28T16:29:16",
            "name": "sync Truflow support with latest release",
            "version": 4,
            "mbox": "http://patchwork.dpdk.org/series/28693/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/129068/comments/",
    "check": "warning",
    "checks": "http://patchwork.dpdk.org/api/patches/129068/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 mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 4E39942D82;\n\tWed, 28 Jun 2023 18:32:52 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 9B95342D36;\n\tWed, 28 Jun 2023 18:31:34 +0200 (CEST)",
            "from mail-pl1-f174.google.com (mail-pl1-f174.google.com\n [209.85.214.174])\n by mails.dpdk.org (Postfix) with ESMTP id AB7E542D36\n for <dev@dpdk.org>; Wed, 28 Jun 2023 18:31:33 +0200 (CEST)",
            "by mail-pl1-f174.google.com with SMTP id\n d9443c01a7336-1b7db2e162cso709175ad.1\n for <dev@dpdk.org>; Wed, 28 Jun 2023 09:31:33 -0700 (PDT)",
            "from localhost.localdomain ([192.19.252.250])\n by smtp.gmail.com with ESMTPSA id\n h12-20020a170902f7cc00b001b8229942a0sm3092403plw.34.2023.06.28.09.31.27\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Wed, 28 Jun 2023 09:31:29 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=broadcom.com; s=google; t=1687969892; x=1690561892;\n h=mime-version:references:in-reply-to:message-id:date:subject:cc:to\n :from:from:to:cc:subject:date:message-id:reply-to;\n bh=BOgLDfzEcETScn4v1rkoUT75jTyXwbr/8Nz5ivOtOqI=;\n b=h2XEAHoL/gvF9FyzaQhqOzCuPOeORu76HHRS9xX2+37pco9oToOjZPJKGqGrvlCOuN\n QQSVgzwuzt53XTTwoEYeGqcgzWP6LrWSxAx9GcSmBrZGmb/HblHYWGE0ZAqJdFzUrKaV\n pBf84DWrIX5nKLoPiBlguJfPbWgWYUPnswcTs=",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20221208; t=1687969892; x=1690561892;\n h=mime-version:references:in-reply-to:message-id:date:subject:cc:to\n :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;\n bh=BOgLDfzEcETScn4v1rkoUT75jTyXwbr/8Nz5ivOtOqI=;\n b=And+2+/zNyVR5GpqiLm9zLc3uC/D5ITiBMTzNkEbWM+NpQouCd82jHMoIVnXO9fumw\n 82iHAZBP8vYCgWd9YCKgW/XrGbpeD9kz083NVGZO3NTa6XdfBzzAGBTtlT37e3afgCwD\n QFXxLaz08DhK/zbmVZzcjj+P4aATgfSVy53LnqQX6UVxjgv3gqlpBsVz9IIJNPG7U31t\n mg049Za7FwePzI7IfbegGq+qpW/iu5obs/BwpWHNtjsOw5gpnyvuOUVR+KJunOmdC8p2\n evSIMDuu6CXqwXNKXKGiKTpLK34QJBm9NFVtdMXdfRh+rujFSigJcH86dBClTk4d72Zk\n YfYw==",
        "X-Gm-Message-State": "AC+VfDw/UWTXQd98Hp5A7DxBUIhSEqk2BukkK3J3bnO3OPEJcXFcZOWY\n nW9jMzC2qMvxVPUzg1dyIzZ8f/CfhUG5tv35YreyBfeYKq2czhVL3dA2oLGjtVPD/8y2eB9i3K8\n 5NPzrabbSmXxcZP+TgPphxaV5i7zhvcYO5vaamFYqBPTbA1+5ldU0xmFbuQMOX2Ract0qGX8=",
        "X-Google-Smtp-Source": "\n ACHHUZ5gMuC8JZ32eNZ8dPGE2WaSU1g0nGRJTeLcM4dv0+Quww8A8bJVIy8AWQCorw2Cc5sYbwTTWQ==",
        "X-Received": "by 2002:a17:902:da84:b0:1b6:78a1:93c7 with SMTP id\n j4-20020a170902da8400b001b678a193c7mr11813607plx.39.1687969891959;\n Wed, 28 Jun 2023 09:31:31 -0700 (PDT)",
        "From": "Ajit Khaparde <ajit.khaparde@broadcom.com>",
        "To": "dev@dpdk.org",
        "Cc": "ferruh.yigit@intel.com, thomas@monjalon.net,\n Randy Schacher <stuart.schacher@broadcom.com>,\n Shahaji Bhosle <sbhosle@broadcom.com>,\n Manish Kurup <manish.kurup@broadcom.com>",
        "Subject": "[PATCH v4 10/11] net/bnxt: add support for eCPRI packet parsing",
        "Date": "Wed, 28 Jun 2023 09:29:26 -0700",
        "Message-Id": "<20230628162927.92858-11-ajit.khaparde@broadcom.com>",
        "X-Mailer": "git-send-email 2.39.2 (Apple Git-143)",
        "In-Reply-To": "<20230628162927.92858-1-ajit.khaparde@broadcom.com>",
        "References": "<1826961.atdPhlSkOF@thomas>\n <20230628162927.92858-1-ajit.khaparde@broadcom.com>",
        "MIME-Version": "1.0",
        "Content-Type": "multipart/signed; protocol=\"application/pkcs7-signature\";\n micalg=sha-256; boundary=\"000000000000da5afb05ff331d37\"",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "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"
    },
    "content": "From: Randy Schacher <stuart.schacher@broadcom.com>\n\nAdd eCPRI parsing and offload support in the TruFlow ULP layer.\n\nSigned-off-by: Randy Schacher <stuart.schacher@broadcom.com>\nSigned-off-by: Shahaji Bhosle <sbhosle@broadcom.com>\nReviewed-by: Manish Kurup <manish.kurup@broadcom.com>\nReviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>\n---\n .mailmap                                      |   1 +\n doc/guides/nics/features/bnxt.ini             |   1 +\n drivers/net/bnxt/bnxt.h                       |   4 +\n drivers/net/bnxt/bnxt_ethdev.c                |  35 +++++\n drivers/net/bnxt/bnxt_hwrm.c                  |  17 +++\n drivers/net/bnxt/bnxt_txr.c                   |  10 +-\n drivers/net/bnxt/bnxt_vnic.c                  |   5 +-\n drivers/net/bnxt/tf_ulp/bnxt_tf_pmd_shim.c    |   7 +-\n drivers/net/bnxt/tf_ulp/bnxt_tf_pmd_shim.h    |   1 +\n drivers/net/bnxt/tf_ulp/bnxt_ulp.c            |  24 ++++\n drivers/net/bnxt/tf_ulp/bnxt_ulp.h            |   9 +-\n drivers/net/bnxt/tf_ulp/ulp_mapper.c          |  18 +++\n drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c |   4 +\n drivers/net/bnxt/tf_ulp/ulp_rte_parser.c      | 120 +++++++++++++++++-\n drivers/net/bnxt/tf_ulp/ulp_rte_parser.h      |   5 +\n drivers/net/bnxt/tf_ulp/ulp_template_struct.h |   2 +\n 16 files changed, 256 insertions(+), 7 deletions(-)",
    "diff": "diff --git a/.mailmap b/.mailmap\nindex 0062d08f41..6c600baa62 100644\n--- a/.mailmap\n+++ b/.mailmap\n@@ -830,6 +830,7 @@ Malvika Gupta <malvika.gupta@arm.com>\n Mandal Purna Chandra <purna.chandra.mandal@intel.com>\n Mandeep Rohilla <mrohilla@brocade.com>\n Manish Chopra <manishc@marvell.com>\n+Manish Kurup <manish.kurup@broadcom.com>\n Manish Tomar <manish.tomar@nxp.com>\n Mao Jiang <maox.jiang@intel.com>\n Mao YingMing <maoyingming@baidu.com>\ndiff --git a/doc/guides/nics/features/bnxt.ini b/doc/guides/nics/features/bnxt.ini\nindex 8b523e3bef..bd4e2295dc 100644\n--- a/doc/guides/nics/features/bnxt.ini\n+++ b/doc/guides/nics/features/bnxt.ini\n@@ -57,6 +57,7 @@ Perf doc             = Y\n \n [rte_flow items]\n any                  = Y\n+ecpri                = Y\n eth                  = P\n ipv4                 = Y\n ipv6                 = Y\ndiff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h\nindex 08791b8a17..ed21ba7f29 100644\n--- a/drivers/net/bnxt/bnxt.h\n+++ b/drivers/net/bnxt/bnxt.h\n@@ -844,10 +844,14 @@ struct bnxt {\n \tuint8_t\t\t\tport_cnt;\n \tuint8_t\t\t\tvxlan_port_cnt;\n \tuint8_t\t\t\tgeneve_port_cnt;\n+\tuint8_t\t\t\tecpri_port_cnt;\n \tuint16_t\t\tvxlan_port;\n \tuint16_t\t\tgeneve_port;\n+\tuint16_t\t\tecpri_port;\n \tuint16_t\t\tvxlan_fw_dst_port_id;\n \tuint16_t\t\tgeneve_fw_dst_port_id;\n+\tuint16_t\t\tecpri_fw_dst_port_id;\n+\tuint16_t\t\tecpri_upar_in_use;\n \tuint32_t\t\tfw_ver;\n \tuint32_t\t\thwrm_spec_code;\n \ndiff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c\nindex ea817e1fdd..ee1552452a 100644\n--- a/drivers/net/bnxt/bnxt_ethdev.c\n+++ b/drivers/net/bnxt/bnxt_ethdev.c\n@@ -2405,6 +2405,20 @@ bnxt_udp_tunnel_port_add_op(struct rte_eth_dev *eth_dev,\n \t\ttunnel_type =\n \t\t\tHWRM_TUNNEL_DST_PORT_ALLOC_INPUT_TUNNEL_TYPE_GENEVE;\n \t\tbreak;\n+\tcase RTE_ETH_TUNNEL_TYPE_ECPRI:\n+\t\tif (bp->ecpri_port_cnt) {\n+\t\t\tPMD_DRV_LOG(ERR, \"Tunnel Port %d already programmed\\n\",\n+\t\t\t\tudp_tunnel->udp_port);\n+\t\t\tif (bp->ecpri_port != udp_tunnel->udp_port) {\n+\t\t\t\tPMD_DRV_LOG(ERR, \"Only one port allowed\\n\");\n+\t\t\t\treturn -ENOSPC;\n+\t\t\t}\n+\t\t\tbp->ecpri_port_cnt++;\n+\t\t\treturn 0;\n+\t\t}\n+\t\ttunnel_type =\n+\t\t\tHWRM_TUNNEL_DST_PORT_ALLOC_INPUT_TUNNEL_TYPE_ECPRI;\n+\t\tbreak;\n \tdefault:\n \t\tPMD_DRV_LOG(ERR, \"Tunnel type is not supported\\n\");\n \t\treturn -ENOTSUP;\n@@ -2423,6 +2437,10 @@ bnxt_udp_tunnel_port_add_op(struct rte_eth_dev *eth_dev,\n \t    HWRM_TUNNEL_DST_PORT_ALLOC_INPUT_TUNNEL_TYPE_GENEVE)\n \t\tbp->geneve_port_cnt++;\n \n+\tif (tunnel_type ==\n+\t    HWRM_TUNNEL_DST_PORT_ALLOC_INPUT_TUNNEL_TYPE_ECPRI)\n+\t\tbp->ecpri_port_cnt++;\n+\n \treturn rc;\n }\n \n@@ -2474,6 +2492,23 @@ bnxt_udp_tunnel_port_del_op(struct rte_eth_dev *eth_dev,\n \t\t\tHWRM_TUNNEL_DST_PORT_FREE_INPUT_TUNNEL_TYPE_GENEVE;\n \t\tport = bp->geneve_fw_dst_port_id;\n \t\tbreak;\n+\tcase RTE_ETH_TUNNEL_TYPE_ECPRI:\n+\t\tif (!bp->ecpri_port_cnt) {\n+\t\t\tPMD_DRV_LOG(ERR, \"No Tunnel port configured yet\\n\");\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\t\tif (bp->ecpri_port != udp_tunnel->udp_port) {\n+\t\t\tPMD_DRV_LOG(ERR, \"Req Port: %d. Configured port: %d\\n\",\n+\t\t\t\tudp_tunnel->udp_port, bp->ecpri_port);\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\t\tif (--bp->ecpri_port_cnt)\n+\t\t\treturn 0;\n+\n+\t\ttunnel_type =\n+\t\t\tHWRM_TUNNEL_DST_PORT_FREE_INPUT_TUNNEL_TYPE_ECPRI;\n+\t\tport = bp->ecpri_fw_dst_port_id;\n+\t\tbreak;\n \tdefault:\n \t\tPMD_DRV_LOG(ERR, \"Tunnel type is not supported\\n\");\n \t\treturn -ENOTSUP;\ndiff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c\nindex edad84c262..b944547656 100644\n--- a/drivers/net/bnxt/bnxt_hwrm.c\n+++ b/drivers/net/bnxt/bnxt_hwrm.c\n@@ -2969,6 +2969,10 @@ bnxt_free_tunnel_ports(struct bnxt *bp)\n \tif (bp->geneve_port_cnt)\n \t\tbnxt_hwrm_tunnel_dst_port_free(bp, bp->geneve_fw_dst_port_id,\n \t\t\tHWRM_TUNNEL_DST_PORT_FREE_INPUT_TUNNEL_TYPE_GENEVE);\n+\n+\tif (bp->ecpri_port_cnt)\n+\t\tbnxt_hwrm_tunnel_dst_port_free(bp, bp->ecpri_fw_dst_port_id,\n+\t\t\tHWRM_TUNNEL_DST_PORT_FREE_INPUT_TUNNEL_TYPE_ECPRI);\n }\n \n void bnxt_free_all_hwrm_resources(struct bnxt *bp)\n@@ -4075,6 +4079,12 @@ int bnxt_hwrm_tunnel_dst_port_alloc(struct bnxt *bp, uint16_t port,\n \t\t\trte_le_to_cpu_16(resp->tunnel_dst_port_id);\n \t\tbp->geneve_port = port;\n \t\tbreak;\n+\tcase HWRM_TUNNEL_DST_PORT_ALLOC_INPUT_TUNNEL_TYPE_ECPRI:\n+\t\tbp->ecpri_fw_dst_port_id =\n+\t\t\trte_le_to_cpu_16(resp->tunnel_dst_port_id);\n+\t\tbp->ecpri_port = port;\n+\t\tbp->ecpri_upar_in_use = resp->upar_in_use;\n+\t\tbreak;\n \tdefault:\n \t\tbreak;\n \t}\n@@ -4142,6 +4152,13 @@ int bnxt_hwrm_tunnel_dst_port_free(struct bnxt *bp, uint16_t port,\n \t\tbp->geneve_port_cnt = 0;\n \t}\n \n+\tif (tunnel_type ==\n+\t    HWRM_TUNNEL_DST_PORT_FREE_INPUT_TUNNEL_TYPE_ECPRI) {\n+\t\tbp->ecpri_port = 0;\n+\t\tbp->ecpri_upar_in_use = 0;\n+\t\tbp->ecpri_port_cnt = 0;\n+\t}\n+\n \treturn rc;\n }\n \ndiff --git a/drivers/net/bnxt/bnxt_txr.c b/drivers/net/bnxt/bnxt_txr.c\nindex 6a11f5c8dc..899986764f 100644\n--- a/drivers/net/bnxt/bnxt_txr.c\n+++ b/drivers/net/bnxt/bnxt_txr.c\n@@ -150,10 +150,14 @@ bnxt_check_pkt_needs_ts(struct rte_mbuf *m)\n \tstruct rte_ether_hdr _eth_hdr;\n \tuint16_t eth_type, proto;\n \tuint32_t off = 0;\n-\n+\t/*\n+\t * Check that the received packet is a eCPRI packet\n+\t */\n \teth_hdr = rte_pktmbuf_read(m, off, sizeof(_eth_hdr), &_eth_hdr);\n \teth_type = rte_be_to_cpu_16(eth_hdr->ether_type);\n \toff += sizeof(*eth_hdr);\n+\tif (eth_type == RTE_ETHER_TYPE_ECPRI)\n+\t\treturn true;\n \t/* Check for single tagged and double tagged VLANs */\n \tif (eth_type == RTE_ETHER_TYPE_VLAN) {\n \t\tconst struct rte_vlan_hdr *vh;\n@@ -164,6 +168,8 @@ bnxt_check_pkt_needs_ts(struct rte_mbuf *m)\n \t\t\treturn false;\n \t\toff += sizeof(*vh);\n \t\tproto = rte_be_to_cpu_16(vh->eth_proto);\n+\t\tif (proto == RTE_ETHER_TYPE_ECPRI)\n+\t\t\treturn true;\n \t\tif (proto == RTE_ETHER_TYPE_VLAN) {\n \t\t\tconst struct rte_vlan_hdr *vh;\n \t\t\tstruct rte_vlan_hdr vh_copy;\n@@ -173,6 +179,8 @@ bnxt_check_pkt_needs_ts(struct rte_mbuf *m)\n \t\t\t\treturn false;\n \t\t\toff += sizeof(*vh);\n \t\t\tproto = rte_be_to_cpu_16(vh->eth_proto);\n+\t\t\tif (proto == RTE_ETHER_TYPE_ECPRI)\n+\t\t\t\treturn true;\n \t\t}\n \t}\n \treturn false;\ndiff --git a/drivers/net/bnxt/bnxt_vnic.c b/drivers/net/bnxt/bnxt_vnic.c\nindex be9c127b64..2be456956d 100644\n--- a/drivers/net/bnxt/bnxt_vnic.c\n+++ b/drivers/net/bnxt/bnxt_vnic.c\n@@ -258,7 +258,8 @@ uint16_t bnxt_rte_to_hwrm_hash_types(uint64_t rte_type)\n {\n \tuint16_t hwrm_type = 0;\n \n-\tif (rte_type & RTE_ETH_RSS_IPV4)\n+\tif ((rte_type & RTE_ETH_RSS_IPV4) ||\n+\t    (rte_type & RTE_ETH_RSS_ECPRI))\n \t\thwrm_type |= HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV4;\n \tif (rte_type & RTE_ETH_RSS_NONFRAG_IPV4_TCP)\n \t\thwrm_type |= HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_TCP_IPV4;\n@@ -277,7 +278,7 @@ uint16_t bnxt_rte_to_hwrm_hash_types(uint64_t rte_type)\n int bnxt_rte_to_hwrm_hash_level(struct bnxt *bp, uint64_t hash_f, uint32_t lvl)\n {\n \tuint32_t mode = HWRM_VNIC_RSS_CFG_INPUT_HASH_MODE_FLAGS_DEFAULT;\n-\tbool l3 = (hash_f & (RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_IPV6));\n+\tbool l3 = (hash_f & (RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_ECPRI));\n \tbool l4 = (hash_f & (RTE_ETH_RSS_NONFRAG_IPV4_UDP |\n \t\t\t     RTE_ETH_RSS_NONFRAG_IPV6_UDP |\n \t\t\t     RTE_ETH_RSS_NONFRAG_IPV4_TCP |\ndiff --git a/drivers/net/bnxt/tf_ulp/bnxt_tf_pmd_shim.c b/drivers/net/bnxt/tf_ulp/bnxt_tf_pmd_shim.c\nindex 474854d59b..239191e14e 100644\n--- a/drivers/net/bnxt/tf_ulp/bnxt_tf_pmd_shim.c\n+++ b/drivers/net/bnxt/tf_ulp/bnxt_tf_pmd_shim.c\n@@ -543,12 +543,15 @@ bnxt_pmd_global_tunnel_set(uint16_t port_id, uint8_t type,\n \tcase BNXT_GLOBAL_REGISTER_TUNNEL_VXLAN:\n \t\thwtype = HWRM_TUNNEL_DST_PORT_ALLOC_INPUT_TUNNEL_TYPE_VXLAN;\n \t\tbreak;\n+\tcase BNXT_GLOBAL_REGISTER_TUNNEL_ECPRI:\n+\t\thwtype = HWRM_TUNNEL_DST_PORT_ALLOC_INPUT_TUNNEL_TYPE_ECPRI;\n+\t\tbreak;\n \tdefault:\n \t\tBNXT_TF_DBG(ERR, \"Tunnel Type (%d) invalid\\n\", type);\n \t\treturn -EINVAL;\n \t}\n \n-\tif (!udp_port) {\n+\tif (!udp_port && type != BNXT_GLOBAL_REGISTER_TUNNEL_ECPRI) {\n \t\t/* Free based on the handle */\n \t\tif (!handle) {\n \t\t\tBNXT_TF_DBG(ERR, \"Free with invalid handle\\n\");\n@@ -589,7 +592,7 @@ bnxt_pmd_global_tunnel_set(uint16_t port_id, uint8_t type,\n \t\tif (!rc) {\n \t\t\tulp_global_tunnel_db[type].ref_cnt++;\n \t\t\tulp_global_tunnel_db[type].dport = udp_port;\n-\t\t\tbnxt_pmd_global_reg_data_to_hndl(port_id, 0,\n+\t\t\tbnxt_pmd_global_reg_data_to_hndl(port_id, bp->ecpri_upar_in_use,\n \t\t\t\t\t\t\t type, handle);\n \t\t}\n \t}\ndiff --git a/drivers/net/bnxt/tf_ulp/bnxt_tf_pmd_shim.h b/drivers/net/bnxt/tf_ulp/bnxt_tf_pmd_shim.h\nindex b76e4b849d..18feab6cac 100644\n--- a/drivers/net/bnxt/tf_ulp/bnxt_tf_pmd_shim.h\n+++ b/drivers/net/bnxt/tf_ulp/bnxt_tf_pmd_shim.h\n@@ -19,6 +19,7 @@ struct bnxt_global_tunnel_info {\n enum bnxt_global_register_tunnel_type {\n \tBNXT_GLOBAL_REGISTER_TUNNEL_UNUSED = 0,\n \tBNXT_GLOBAL_REGISTER_TUNNEL_VXLAN,\n+\tBNXT_GLOBAL_REGISTER_TUNNEL_ECPRI,\n \tBNXT_GLOBAL_REGISTER_TUNNEL_MAX\n };\n \ndiff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c\nindex 500c177039..b696b6dc3e 100644\n--- a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c\n+++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c\n@@ -456,6 +456,7 @@ bnxt_ulp_cntxt_app_caps_init(struct bnxt *bp,\n \n \t\tbnxt_ulp_vxlan_ip_port_set(ulp_ctx, info[i].vxlan_ip_port);\n \t\tbnxt_ulp_vxlan_port_set(ulp_ctx, info[i].vxlan_port);\n+\t\tbnxt_ulp_ecpri_udp_port_set(ulp_ctx, info[i].ecpri_udp_port);\n \n \t\t/* set the shared session support from firmware */\n \t\tfw = info[i].upgrade_fw_update;\n@@ -479,6 +480,29 @@ bnxt_ulp_cntxt_app_caps_init(struct bnxt *bp,\n \treturn 0;\n }\n \n+/* Function to retrieve the vxlan_ip (ecpri) port from the context. */\n+int\n+bnxt_ulp_ecpri_udp_port_set(struct bnxt_ulp_context *ulp_ctx,\n+\t\t\t   uint32_t ecpri_udp_port)\n+{\n+\tif (!ulp_ctx || !ulp_ctx->cfg_data)\n+\t\treturn -EINVAL;\n+\n+\tulp_ctx->cfg_data->ecpri_udp_port = ecpri_udp_port;\n+\n+\treturn 0;\n+}\n+\n+/* Function to retrieve the vxlan_ip (ecpri) port from the context. */\n+unsigned int\n+bnxt_ulp_ecpri_udp_port_get(struct bnxt_ulp_context *ulp_ctx)\n+{\n+\tif (!ulp_ctx || !ulp_ctx->cfg_data)\n+\t\treturn 0;\n+\n+\treturn (unsigned int)ulp_ctx->cfg_data->ecpri_udp_port;\n+}\n+\n /* Function to set the number for vxlan_ip (custom vxlan) port into the context */\n int\n bnxt_ulp_vxlan_ip_port_set(struct bnxt_ulp_context *ulp_ctx,\ndiff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp.h b/drivers/net/bnxt/tf_ulp/bnxt_ulp.h\nindex 92db7751fe..258801f633 100644\n--- a/drivers/net/bnxt/tf_ulp/bnxt_ulp.h\n+++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp.h\n@@ -113,6 +113,7 @@ struct bnxt_ulp_data {\n \tstruct bnxt_flow_app_tun_ent\tapp_tun[BNXT_ULP_MAX_TUN_CACHE_ENTRIES];\n \tuint32_t\t\t\tvxlan_port;\n \tuint32_t\t\t\tvxlan_ip_port;\n+\tuint32_t\t\t\tecpri_udp_port;\n \tuint8_t\t\t\t\thu_reg_state;\n \tuint8_t\t\t\t\thu_reg_cnt;\n \tuint32_t\t\t\thu_session_type;\n@@ -367,12 +368,19 @@ bnxt_ulp_vxlan_port_set(struct bnxt_ulp_context *ulp_ctx,\n \t\t\tuint32_t vxlan_port);\n unsigned int\n bnxt_ulp_vxlan_port_get(struct bnxt_ulp_context *ulp_ctx);\n+\n int\n bnxt_ulp_vxlan_ip_port_set(struct bnxt_ulp_context *ulp_ctx,\n \t\t\t   uint32_t vxlan_ip_port);\n unsigned int\n bnxt_ulp_vxlan_ip_port_get(struct bnxt_ulp_context *ulp_ctx);\n \n+int\n+bnxt_ulp_ecpri_udp_port_set(struct bnxt_ulp_context *ulp_ctx,\n+\t\t\t    uint32_t ecpri_udp_port);\n+unsigned int\n+bnxt_ulp_ecpri_udp_port_get(struct bnxt_ulp_context *ulp_ctx);\n+\n int32_t\n bnxt_flow_meter_init(struct bnxt *bp);\n \n@@ -391,5 +399,4 @@ bnxt_ulp_ha_reg_cnt_get(struct bnxt_ulp_context *ulp_ctx);\n \n struct tf*\n bnxt_ulp_bp_tfp_get(struct bnxt *bp, enum bnxt_ulp_session_type type);\n-\n #endif /* _BNXT_ULP_H_ */\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_mapper.c b/drivers/net/bnxt/tf_ulp/ulp_mapper.c\nindex e5f1d266d7..6d345e12c7 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_mapper.c\n+++ b/drivers/net/bnxt/tf_ulp/ulp_mapper.c\n@@ -3298,6 +3298,11 @@ ulp_mapper_global_res_free(struct bnxt_ulp_context *ulp __rte_unused,\n \t\trc = bnxt_pmd_global_tunnel_set(port_id, ttype, dport,\n \t\t\t\t\t\t&handle);\n \t\tbreak;\n+\tcase BNXT_ULP_RESOURCE_SUB_TYPE_GLOBAL_REGISTER_CUST_ECPRI:\n+\t\tttype = BNXT_GLOBAL_REGISTER_TUNNEL_ECPRI;\n+\t\trc = bnxt_pmd_global_tunnel_set(port_id, ttype, dport,\n+\t\t\t\t\t\t&handle);\n+\t\tbreak;\n \tdefault:\n \t\trc = -EINVAL;\n \t\tBNXT_TF_DBG(ERR, \"Invalid ulp global resource type %d\\n\",\n@@ -3362,6 +3367,19 @@ ulp_mapper_global_register_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n \t\t\treturn rc;\n \t\t}\n \t\tbreak;\n+\tcase BNXT_ULP_RESOURCE_SUB_TYPE_GLOBAL_REGISTER_CUST_ECPRI:\n+\t\ttmp_data = ulp_blob_data_get(&data, &data_len);\n+\t\tudp_port = *((uint16_t *)tmp_data);\n+\t\tudp_port = tfp_be_to_cpu_16(udp_port);\n+\t\tttype = BNXT_GLOBAL_REGISTER_TUNNEL_ECPRI;\n+\n+\t\trc = bnxt_pmd_global_tunnel_set(parms->port_id, ttype,\n+\t\t\t\t\t\tudp_port, &handle);\n+\t\tif (rc) {\n+\t\t\tBNXT_TF_DBG(ERR, \"Unable to set eCPRI UDP port\\n\");\n+\t\t\treturn rc;\n+\t\t}\n+\tbreak;\n \tdefault:\n \t\trc = -EINVAL;\n \t\tBNXT_TF_DBG(ERR, \"Invalid ulp global resource type %d\\n\",\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c b/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c\nindex af02f857d3..51b2e98103 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c\n+++ b/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c\n@@ -408,6 +408,10 @@ struct bnxt_ulp_rte_hdr_info ulp_hdr_info[] = {\n \t.hdr_type                = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,\n \t.proto_hdr_func          = NULL\n \t},\n+\t[RTE_FLOW_ITEM_TYPE_ECPRI] = {\n+\t.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,\n+\t.proto_hdr_func          = ulp_rte_ecpri_hdr_handler\n+\t},\n \t[RTE_FLOW_ITEM_TYPE_PORT_REPRESENTOR] = {\n \t.hdr_type                = BNXT_ULP_HDR_TYPE_SUPPORTED,\n \t.proto_hdr_func          = ulp_rte_port_hdr_handler\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c\nindex d64c9e4968..0937d0dbe4 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c\n+++ b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c\n@@ -143,7 +143,7 @@ bnxt_ulp_rte_parser_hdr_parse(const struct rte_flow_item pattern[],\n \t\t\thdr_info = &ulp_vendor_hdr_info[item->type -\n \t\t\t\tBNXT_RTE_FLOW_ITEM_TYPE_END];\n \t\t} else {\n-\t\t\tif (item->type > RTE_FLOW_ITEM_TYPE_HIGIG2)\n+\t\t\tif (item->type > RTE_FLOW_ITEM_TYPE_ECPRI)\n \t\t\t\tgoto hdr_parser_error;\n \t\t\thdr_info = &ulp_hdr_info[item->type];\n \t\t}\n@@ -612,6 +612,10 @@ ulp_rte_l2_proto_type_update(struct ulp_rte_parser_params *param,\n \t} else if (type == tfp_cpu_to_be_16(RTE_ETHER_TYPE_VLAN)) {\n \t\thas_vlan_mask = 1;\n \t\thas_vlan = 1;\n+\t} else if (type == tfp_cpu_to_be_16(RTE_ETHER_TYPE_ECPRI)) {\n+\t\t/* Update the hdr_bitmap with eCPRI */\n+\t\tULP_BITMAP_SET(param->hdr_fp_bit.bits,\n+\t\t\t\tBNXT_ULP_HDR_BIT_O_ECPRI);\n \t} else if (type == tfp_cpu_to_be_16(ULP_RTE_ETHER_TYPE_ROE)) {\n \t\t/* Update the hdr_bitmap with RoE */\n \t\tULP_BITMAP_SET(param->hdr_fp_bit.bits,\n@@ -1660,6 +1664,120 @@ ulp_rte_icmp6_hdr_handler(const struct rte_flow_item *item,\n \treturn BNXT_TF_RC_SUCCESS;\n }\n \n+/* Function to handle the parsing of RTE Flow item ECPRI Header. */\n+int32_t\n+ulp_rte_ecpri_hdr_handler(const struct rte_flow_item *item,\n+\t\t\t  struct ulp_rte_parser_params *params)\n+{\n+\tconst struct rte_flow_item_ecpri *ecpri_spec = item->spec;\n+\tconst struct rte_flow_item_ecpri *ecpri_mask = item->mask;\n+\tstruct rte_flow_item_ecpri l_ecpri_spec, l_ecpri_mask;\n+\tstruct rte_flow_item_ecpri *p_ecpri_spec = &l_ecpri_spec;\n+\tstruct rte_flow_item_ecpri *p_ecpri_mask = &l_ecpri_mask;\n+\tstruct ulp_rte_hdr_bitmap *hdr_bitmap = &params->hdr_bitmap;\n+\tuint32_t idx = 0, cnt;\n+\tuint32_t size;\n+\n+\tif (ulp_rte_prsr_fld_size_validate(params, &idx,\n+\t\t\t\t\t   BNXT_ULP_PROTO_HDR_ECPRI_NUM)) {\n+\t\tBNXT_TF_DBG(ERR, \"Error parsing protocol header\\n\");\n+\t\treturn BNXT_TF_RC_ERROR;\n+\t}\n+\n+\t/* Figure out if eCPRI is within L4(UDP), unsupported, for now */\n+\tcnt = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_L4_HDR_CNT);\n+\tif (cnt >= 1) {\n+\t\tBNXT_TF_DBG(ERR, \"Parse Err: L4 header stack >= 2 not supported\\n\");\n+\t\treturn BNXT_TF_RC_ERROR;\n+\t}\n+\n+\tif (!ecpri_spec || !ecpri_mask)\n+\t\tgoto parser_set_ecpri_hdr_bit;\n+\n+\tmemcpy(p_ecpri_spec, ecpri_spec, sizeof(*ecpri_spec));\n+\tmemcpy(p_ecpri_mask, ecpri_mask, sizeof(*ecpri_mask));\n+\n+\tp_ecpri_spec->hdr.common.u32 = rte_be_to_cpu_32(p_ecpri_spec->hdr.common.u32);\n+\tp_ecpri_mask->hdr.common.u32 = rte_be_to_cpu_32(p_ecpri_mask->hdr.common.u32);\n+\n+\t/*\n+\t * Init eCPRI spec+mask to correct defaults, also clear masks of fields\n+\t * we ignore in the TCAM.\n+\t */\n+\n+\tl_ecpri_spec.hdr.common.size = 0;\n+\tl_ecpri_spec.hdr.common.c = 0;\n+\tl_ecpri_spec.hdr.common.res = 0;\n+\tl_ecpri_spec.hdr.common.revision = 1;\n+\tl_ecpri_mask.hdr.common.size = 0;\n+\tl_ecpri_mask.hdr.common.c = 1;\n+\tl_ecpri_mask.hdr.common.res = 0;\n+\tl_ecpri_mask.hdr.common.revision = 0xf;\n+\n+\tswitch (p_ecpri_spec->hdr.common.type) {\n+\tcase RTE_ECPRI_MSG_TYPE_IQ_DATA:\n+\t\tl_ecpri_mask.hdr.type0.seq_id = 0;\n+\t\tbreak;\n+\n+\tcase RTE_ECPRI_MSG_TYPE_BIT_SEQ:\n+\t\tl_ecpri_mask.hdr.type1.seq_id = 0;\n+\t\tbreak;\n+\n+\tcase RTE_ECPRI_MSG_TYPE_RTC_CTRL:\n+\t\tl_ecpri_mask.hdr.type2.seq_id = 0;\n+\t\tbreak;\n+\n+\tcase RTE_ECPRI_MSG_TYPE_GEN_DATA:\n+\t\tl_ecpri_mask.hdr.type3.seq_id = 0;\n+\t\tbreak;\n+\n+\tcase RTE_ECPRI_MSG_TYPE_RM_ACC:\n+\t\tl_ecpri_mask.hdr.type4.rr = 0;\n+\t\tl_ecpri_mask.hdr.type4.rw = 0;\n+\t\tl_ecpri_mask.hdr.type4.rma_id = 0;\n+\t\tbreak;\n+\n+\tcase RTE_ECPRI_MSG_TYPE_DLY_MSR:\n+\t\tl_ecpri_spec.hdr.type5.act_type = 0;\n+\t\tbreak;\n+\n+\tcase RTE_ECPRI_MSG_TYPE_RMT_RST:\n+\t\tl_ecpri_spec.hdr.type6.rst_op = 0;\n+\t\tbreak;\n+\n+\tcase RTE_ECPRI_MSG_TYPE_EVT_IND:\n+\t\tl_ecpri_spec.hdr.type7.evt_type = 0;\n+\t\tl_ecpri_spec.hdr.type7.seq = 0;\n+\t\tl_ecpri_spec.hdr.type7.number = 0;\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\tp_ecpri_spec->hdr.common.u32 = rte_cpu_to_be_32(p_ecpri_spec->hdr.common.u32);\n+\tp_ecpri_mask->hdr.common.u32 = rte_cpu_to_be_32(p_ecpri_mask->hdr.common.u32);\n+\n+\t/* Type */\n+\tsize = sizeof(((struct rte_flow_item_ecpri *)NULL)->hdr.common.u32);\n+\tulp_rte_prsr_fld_mask(params, &idx, size,\n+\t\t\t      ulp_deference_struct(p_ecpri_spec, hdr.common.u32),\n+\t\t\t      ulp_deference_struct(p_ecpri_mask, hdr.common.u32),\n+\t\t\t      ULP_PRSR_ACT_DEFAULT);\n+\n+\t/* PC/RTC/MSR_ID */\n+\tsize = sizeof(((struct rte_flow_item_ecpri *)NULL)->hdr.dummy[0]);\n+\tulp_rte_prsr_fld_mask(params, &idx, size,\n+\t\t\t      ulp_deference_struct(p_ecpri_spec, hdr.dummy),\n+\t\t\t      ulp_deference_struct(p_ecpri_mask, hdr.dummy),\n+\t\t\t      ULP_PRSR_ACT_DEFAULT);\n+\n+parser_set_ecpri_hdr_bit:\n+\t/* Update the hdr_bitmap with eCPRI */\n+\tULP_BITMAP_SET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_O_ECPRI);\n+\treturn BNXT_TF_RC_SUCCESS;\n+}\n+\n /* Function to handle the parsing of RTE Flow item void Header */\n int32_t\n ulp_rte_void_hdr_handler(const struct rte_flow_item *item __rte_unused,\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h\nindex 74c7170a45..9dd7ebcb76 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h\n+++ b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h\n@@ -149,6 +149,11 @@ int32_t\n ulp_rte_icmp6_hdr_handler(const struct rte_flow_item *item,\n \t\t\t  struct ulp_rte_parser_params *params);\n \n+/* Function to handle the parsing of RTE Flow item ECPRI Header. */\n+int32_t\n+ulp_rte_ecpri_hdr_handler(const struct rte_flow_item *item,\n+\t\t\t  struct ulp_rte_parser_params *params);\n+\n /* Function to handle the parsing of RTE Flow item void Header. */\n int32_t\n ulp_rte_void_hdr_handler(const struct rte_flow_item *item,\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_template_struct.h b/drivers/net/bnxt/tf_ulp/ulp_template_struct.h\nindex fb6fb3553b..9e11b3e305 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_template_struct.h\n+++ b/drivers/net/bnxt/tf_ulp/ulp_template_struct.h\n@@ -29,6 +29,7 @@\n #define BNXT_ULP_PROTO_HDR_VXLAN_NUM\t4\n #define BNXT_ULP_PROTO_HDR_GRE_NUM\t2\n #define BNXT_ULP_PROTO_HDR_ICMP_NUM\t5\n+#define BNXT_ULP_PROTO_HDR_ECPRI_NUM\t2\n #define BNXT_ULP_PROTO_HDR_MAX\t\t128\n #define BNXT_ULP_PROTO_HDR_ENCAP_MAX\t64\n #define BNXT_ULP_PROTO_HDR_FIELD_SVIF_IDX\t1\n@@ -364,6 +365,7 @@ struct bnxt_ulp_app_capabilities_info {\n \tuint8_t\t\t\t\tapp_id;\n \tuint32_t\t\t\tvxlan_port;\n \tuint32_t\t\t\tvxlan_ip_port;\n+\tuint32_t\t\t\tecpri_udp_port;\n \tenum bnxt_ulp_device_id\t\tdevice_id;\n \tuint32_t\t\t\tupgrade_fw_update;\n \tuint8_t\t\t\t\tha_pool_id;\n",
    "prefixes": [
        "v4",
        "10/11"
    ]
}