get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 74314,
    "url": "http://patchwork.dpdk.org/api/patches/74314/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20200717094935.9337-15-somnath.kotur@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": "<20200717094935.9337-15-somnath.kotur@broadcom.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200717094935.9337-15-somnath.kotur@broadcom.com",
    "date": "2020-07-17T09:49:35",
    "name": "[14/14] net/bnxt: add debug logs to the TF-ULP layer",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "70487ab980131fbe7907771615e9789054fe958b",
    "submitter": {
        "id": 908,
        "url": "http://patchwork.dpdk.org/api/people/908/?format=api",
        "name": "Somnath Kotur",
        "email": "somnath.kotur@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/20200717094935.9337-15-somnath.kotur@broadcom.com/mbox/",
    "series": [
        {
            "id": 11123,
            "url": "http://patchwork.dpdk.org/api/series/11123/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=11123",
            "date": "2020-07-17T09:49:21",
            "name": "bnxt patches",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/11123/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/74314/comments/",
    "check": "warning",
    "checks": "http://patchwork.dpdk.org/api/patches/74314/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 3675DA053D;\n\tFri, 17 Jul 2020 11:56:55 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id B8EE61C0AC;\n\tFri, 17 Jul 2020 11:55:18 +0200 (CEST)",
            "from relay.smtp.broadcom.com (unknown [192.19.232.149])\n by dpdk.org (Postfix) with ESMTP id 084561C026\n for <dev@dpdk.org>; Fri, 17 Jul 2020 11:55:12 +0200 (CEST)",
            "from dhcp-10-123-153-55.dhcp.broadcom.net\n (dhcp-10-123-153-55.dhcp.broadcom.net [10.123.153.55])\n by relay.smtp.broadcom.com (Postfix) with ESMTP id A41971BBB1D;\n Fri, 17 Jul 2020 02:55:11 -0700 (PDT)"
        ],
        "DKIM-Filter": "OpenDKIM Filter v2.10.3 relay.smtp.broadcom.com A41971BBB1D",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com;\n s=dkimrelay; t=1594979712;\n bh=Z3+Ad8CYcssvo6x8He1nuY3h4crDbmLYJQlWWQWuwX0=;\n h=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n b=E6I9nJof4xLvwsgnMPjLoaANCaeNGPJD2TShVhYDD6w1MMHO2xtmxeQe3zWr46FcM\n VZmOHStoHa/cf3pFRdh4MSrEtN24XGg6Z8aU8GkUJL76IbtnIT7S4aTOmaBDN3Fy3r\n EkOrvGeJNvLwfwPSw2HJaeW/pB6P46M0G+fmExps=",
        "From": "Somnath Kotur <somnath.kotur@broadcom.com>",
        "To": "dev@dpdk.org",
        "Cc": "ferruh.yigit@intel.com",
        "Date": "Fri, 17 Jul 2020 15:19:35 +0530",
        "Message-Id": "<20200717094935.9337-15-somnath.kotur@broadcom.com>",
        "X-Mailer": "git-send-email 2.10.1.613.g2cc2e70",
        "In-Reply-To": "<20200717094935.9337-1-somnath.kotur@broadcom.com>",
        "References": "<20200717094935.9337-1-somnath.kotur@broadcom.com>",
        "Subject": "[dpdk-dev] [PATCH 14/14] net/bnxt: add debug logs to the TF-ULP\n\tlayer",
        "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": "Adding debug logs to the TF-ULP, introducing new debug files for\nthe same\n\nSigned-off-by: Somnath Kotur <somnath.kotur@broadcom.com>\n---\n drivers/net/bnxt/meson.build                       |    2 +\n drivers/net/bnxt/tf_ulp/Makefile                   |   10 +\n drivers/net/bnxt/tf_ulp/bnxt_tf_common.h           |    6 +\n drivers/net/bnxt/tf_ulp/bnxt_ulp.c                 |    6 +\n drivers/net/bnxt/tf_ulp/bnxt_ulp_flow.c            |   10 +\n drivers/net/bnxt/tf_ulp/ulp_mapper.c               |  130 ++-\n drivers/net/bnxt/tf_ulp/ulp_matcher.c              |    4 +\n drivers/net/bnxt/tf_ulp/ulp_port_db.c              |    8 +-\n drivers/net/bnxt/tf_ulp/ulp_template_debug.c       |  595 ++++++++++\n drivers/net/bnxt/tf_ulp/ulp_template_debug.h       |  329 ++++++\n drivers/net/bnxt/tf_ulp/ulp_template_debug_proto.h |   72 ++\n drivers/net/bnxt/tf_ulp/ulp_tf_debug.c             | 1161 ++++++++++++++++++++\n drivers/net/bnxt/tf_ulp/ulp_tf_debug.h             |   26 +\n drivers/net/bnxt/tf_ulp/ulp_utils.c                |    2 +-\n 14 files changed, 2325 insertions(+), 36 deletions(-)\n create mode 100644 drivers/net/bnxt/tf_ulp/ulp_template_debug.c\n create mode 100644 drivers/net/bnxt/tf_ulp/ulp_template_debug.h\n create mode 100644 drivers/net/bnxt/tf_ulp/ulp_template_debug_proto.h\n create mode 100644 drivers/net/bnxt/tf_ulp/ulp_tf_debug.c\n create mode 100644 drivers/net/bnxt/tf_ulp/ulp_tf_debug.h",
    "diff": "diff --git a/drivers/net/bnxt/meson.build b/drivers/net/bnxt/meson.build\nindex 8529b33..cfe9b7c 100644\n--- a/drivers/net/bnxt/meson.build\n+++ b/drivers/net/bnxt/meson.build\n@@ -64,6 +64,8 @@ sources = files('bnxt_cpr.c',\n \t'tf_ulp/ulp_port_db.c',\n \t'tf_ulp/ulp_def_rules.c',\n \t'tf_ulp/ulp_fc_mgr.c',\n+\t'tf_ulp/ulp_template_debug.c',\n+\t'tf_ulp/ulp_tf_debug.c',\n \n \t'rte_pmd_bnxt.c')\n \ndiff --git a/drivers/net/bnxt/tf_ulp/Makefile b/drivers/net/bnxt/tf_ulp/Makefile\nindex abb6815..4312986 100644\n--- a/drivers/net/bnxt/tf_ulp/Makefile\n+++ b/drivers/net/bnxt/tf_ulp/Makefile\n@@ -18,3 +18,13 @@ SRCS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += tf_ulp/ulp_flow_db.c\n SRCS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += tf_ulp/ulp_port_db.c\n SRCS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += tf_ulp/ulp_def_rules.c\n SRCS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += tf_ulp/ulp_fc_mgr.c\n+\n+SRCS-$(CONFIG_RTE_LIBRTE_BNXT_TRUFLOW_DEBUG) += tf_ulp/ulp_template_debug.c\n+SRCS-$(CONFIG_RTE_LIBRTE_BNXT_TRUFLOW_DEBUG) += tf_ulp/ulp_tf_debug.c\n+\n+#\n+## Export include files\n+#\n+#\n+SYMLINK-y-include +=\n+SYMLINK-$(CONFIG_RTE_LIBRTE_BNXT_PMD)-include += tf_ulp/ulp_tf_debug.h\ndiff --git a/drivers/net/bnxt/tf_ulp/bnxt_tf_common.h b/drivers/net/bnxt/tf_ulp/bnxt_tf_common.h\nindex f0633f0..3aa358c 100644\n--- a/drivers/net/bnxt/tf_ulp/bnxt_tf_common.h\n+++ b/drivers/net/bnxt/tf_ulp/bnxt_tf_common.h\n@@ -13,6 +13,12 @@\n \n #define BNXT_TF_DBG(lvl, fmt, args...)\tPMD_DRV_LOG(lvl, fmt, ## args)\n \n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+#define BNXT_TF_INF(fmt, args...)\tPMD_DRV_LOG(INFO, fmt, ## args)\n+#else\n+#define BNXT_TF_INF(fmt, args...)\n+#endif\n+\n #define BNXT_ULP_EM_FLOWS\t\t\t8192\n #define BNXT_ULP_1M_FLOWS\t\t\t1000000\n #define BNXT_EEM_RX_GLOBAL_ID_MASK\t\t(BNXT_ULP_1M_FLOWS - 1)\ndiff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c\nindex 0869231..f9a303f 100644\n--- a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c\n+++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c\n@@ -263,6 +263,12 @@ ulp_eem_tbl_scope_init(struct bnxt *bp)\n \t\treturn rc;\n \t}\n \n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+\tBNXT_TF_DBG(DEBUG, \"TableScope=0x%0x %d\\n\",\n+\t\t    params.tbl_scope_id,\n+\t\t    params.tbl_scope_id);\n+#endif\n+\n \trc = bnxt_ulp_cntxt_tbl_scope_id_set(bp->ulp_ctx, params.tbl_scope_id);\n \tif (rc) {\n \t\tBNXT_TF_DBG(ERR, \"Unable to set table scope id\\n\");\ndiff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp_flow.c b/drivers/net/bnxt/tf_ulp/bnxt_ulp_flow.c\nindex 89fffcf..4d2bb1d 100644\n--- a/drivers/net/bnxt/tf_ulp/bnxt_ulp_flow.c\n+++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp_flow.c\n@@ -11,6 +11,9 @@\n #include \"ulp_mapper.h\"\n #include \"ulp_fc_mgr.h\"\n #include <rte_malloc.h>\n+#ifdef\tRTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+#include \"ulp_template_debug_proto.h\"\n+#endif\n \n static int32_t\n bnxt_ulp_flow_validate_args(const struct rte_flow_attr *attr,\n@@ -130,6 +133,13 @@ bnxt_ulp_flow_create(struct rte_eth_dev *dev,\n \tif (ret != BNXT_TF_RC_SUCCESS)\n \t\tgoto parse_error;\n \n+#ifdef\tRTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+\t/* Dump the rte flow pattern */\n+\tulp_parser_hdr_info_dump(&params);\n+\t/* Dump the rte flow action */\n+\tulp_parser_act_info_dump(&params);\n+#endif\n+\n \tret = ulp_matcher_pattern_match(&params, &class_id);\n \tif (ret != BNXT_TF_RC_SUCCESS)\n \t\tgoto parse_error;\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_mapper.c b/drivers/net/bnxt/tf_ulp/ulp_mapper.c\nindex 051a095..ef685ee 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_mapper.c\n+++ b/drivers/net/bnxt/tf_ulp/ulp_mapper.c\n@@ -18,6 +18,11 @@\n #include \"ulp_mapper.h\"\n #include \"tf_util.h\"\n \n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+#include \"ulp_template_debug_proto.h\"\n+#include \"ulp_tf_debug.h\"\n+#endif\n+\n static struct bnxt_ulp_glb_resource_info *\n ulp_mapper_glb_resource_info_list_get(uint32_t *num_entries)\n {\n@@ -102,7 +107,7 @@ ulp_mapper_resource_ident_allocate(struct bnxt_ulp_context *ulp_ctx,\n \trc = tf_alloc_identifier(tfp, &iparms);\n \tif (rc) {\n \t\tBNXT_TF_DBG(ERR, \"Failed to alloc identifier [%s][%d]\\n\",\n-\t\t\t    (iparms.dir == TF_DIR_RX) ? \"RX\" : \"TX\",\n+\t\t\t    tf_dir_2_str(iparms.dir),\n \t\t\t    iparms.ident_type);\n \t\treturn rc;\n \t}\n@@ -120,6 +125,11 @@ ulp_mapper_resource_ident_allocate(struct bnxt_ulp_context *ulp_ctx,\n \t\ttf_free_identifier(tfp, &fparms);\n \t\treturn rc;\n \t}\n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+\tBNXT_TF_DBG(DEBUG, \"Allocated Glb Res Ident [%s][%d][%d] = 0x%04x\\n\",\n+\t\t    tf_dir_2_str(iparms.dir),\n+\t\t    glb_res->glb_regfile_index, iparms.ident_type, iparms.id);\n+#endif\n \treturn rc;\n }\n \n@@ -160,8 +170,7 @@ ulp_mapper_resource_index_tbl_alloc(struct bnxt_ulp_context *ulp_ctx,\n \trc = tf_alloc_tbl_entry(tfp, &aparms);\n \tif (rc) {\n \t\tBNXT_TF_DBG(ERR, \"Failed to alloc identifier [%s][%d]\\n\",\n-\t\t\t    (aparms.dir == TF_DIR_RX) ? \"RX\" : \"TX\",\n-\t\t\t    aparms.type);\n+\t\t\t    tf_dir_2_str(aparms.dir), aparms.type);\n \t\treturn rc;\n \t}\n \n@@ -178,6 +187,11 @@ ulp_mapper_resource_index_tbl_alloc(struct bnxt_ulp_context *ulp_ctx,\n \t\ttf_free_tbl_entry(tfp, &free_parms);\n \t\treturn rc;\n \t}\n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+\tBNXT_TF_DBG(DEBUG, \"Allocated Glb Res Index [%s][%d][%d] = 0x%04x\\n\",\n+\t\t    tf_dir_2_str(aparms.dir),\n+\t\t    glb_res->glb_regfile_index, aparms.type, aparms.idx);\n+#endif\n \treturn rc;\n }\n \n@@ -484,8 +498,7 @@ ulp_mapper_cache_entry_free(struct bnxt_ulp_context *ulp,\n \tif (rc)\n \t\tBNXT_TF_DBG(ERR, \"Failed to free tcam [%d][%s][0x%04x] rc=%d\\n\",\n \t\t\t    table_type,\n-\t\t\t    (res->direction == TF_DIR_RX) ? \"RX\" : \"TX\",\n-\t\t\t    tcam_parms.idx, rc);\n+\t\t\t    tf_dir_2_str(res->direction), tcam_parms.idx, rc);\n \n \t/*\n \t * Free the identifiers associated with the tcam entry.  Entries with\n@@ -503,7 +516,7 @@ ulp_mapper_cache_entry_free(struct bnxt_ulp_context *ulp,\n \t\t\tBNXT_TF_DBG(ERR, \"Failed to free identifier \"\n \t\t\t\t    \"[%d][%s][0x%04x] rc=%d\\n\",\n \t\t\t\t    ident_parms.ident_type,\n-\t\t\t\t    (res->direction == TF_DIR_RX) ? \"RX\" : \"TX\",\n+\t\t\t\t    tf_dir_2_str(res->direction),\n \t\t\t\t    ident_parms.id, trc);\n \t\t\trc = trc;\n \t\t}\n@@ -625,11 +638,13 @@ ulp_mapper_ident_process(struct bnxt_ulp_mapper_parms *parms,\n \n \trc = tf_alloc_identifier(tfp, &iparms);\n \tif (rc) {\n-\t\tBNXT_TF_DBG(ERR, \"Alloc ident %s:%d failed.\\n\",\n-\t\t\t    (iparms.dir == TF_DIR_RX) ? \"RX\" : \"TX\",\n-\t\t\t    iparms.ident_type);\n+\t\tBNXT_TF_DBG(ERR, \"Alloc ident %s: failed.\\n\",\n+\t\t\t    tf_dir_2_str(iparms.dir));\n \t\treturn rc;\n \t}\n+\tBNXT_TF_INF(\"Alloc ident %s:%s.success.\\n\",\n+\t\t    tf_dir_2_str(iparms.dir),\n+\t\t    tf_tbl_type_2_str(iparms.ident_type));\n \n \tid = (uint64_t)tfp_cpu_to_be_64(iparms.id);\n \tif (!ulp_regfile_write(parms->regfile, idx, id)) {\n@@ -662,6 +677,10 @@ ulp_mapper_ident_process(struct bnxt_ulp_mapper_parms *parms,\n \t\t*val = iparms.id;\n \t}\n \n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+\tulp_mapper_ident_field_dump(\"Ident\", ident, tbl, iparms.id);\n+#endif\n+\n \treturn 0;\n \n error:\n@@ -674,7 +693,7 @@ ulp_mapper_ident_process(struct bnxt_ulp_mapper_parms *parms,\n \n \tBNXT_TF_DBG(ERR, \"Ident process failed for %s:%s\\n\",\n \t\t    ident->description,\n-\t\t    (tbl->direction == TF_DIR_RX) ? \"RX\" : \"TX\");\n+\t\t    tf_dir_2_str(tbl->direction));\n \treturn rc;\n }\n \n@@ -725,7 +744,7 @@ ulp_mapper_ident_extract(struct bnxt_ulp_mapper_parms *parms,\n \t\t\t    sparms.search_id);\n \t\treturn rc;\n \t}\n-\tBNXT_TF_DBG(INFO, \"Search ident %s:%x.success.\\n\",\n+\tBNXT_TF_INF(\"Search ident %s:%x.success.\\n\",\n \t\t    tf_dir_2_str(sparms.dir),\n \t\t    sparms.search_id);\n \n@@ -782,6 +801,9 @@ ulp_mapper_result_field_process(struct bnxt_ulp_mapper_parms *parms,\n {\n \tuint16_t idx, size_idx;\n \tuint8_t\t *val = NULL;\n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+\tuint16_t write_idx = blob->write_idx;\n+#endif\n \tuint64_t regval;\n \tuint32_t val_size = 0, field_size = 0;\n \tuint64_t act_bit;\n@@ -1006,6 +1028,11 @@ ulp_mapper_result_field_process(struct bnxt_ulp_mapper_parms *parms,\n \t\t\t    fld->result_opcode);\n \t\treturn -EINVAL;\n \t}\n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+\tif (fld->result_opcode != BNXT_ULP_MAPPER_OPC_SET_TO_ZERO)\n+\t\tulp_mapper_result_field_dump(name, fld, blob,\n+\t\t\t\t\t     write_idx, val, val_size);\n+#endif\n \treturn 0;\n }\n \n@@ -1140,6 +1167,10 @@ ulp_mapper_keymask_field_process(struct bnxt_ulp_mapper_parms *parms,\n \t\treturn -EINVAL;\n \t\tbreak;\n \t}\n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+\tif (opcode != BNXT_ULP_MAPPER_OPC_SET_TO_ZERO)\n+\t\tulp_mapper_key_fld_dump(name, fld, blob, val);\n+#endif\n \n \treturn 0;\n }\n@@ -1452,12 +1483,14 @@ ulp_mapper_tcam_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n \n \t\trc = tf_set_tcam_entry(tfp, &sparms);\n \t\tif (rc) {\n-\t\t\tBNXT_TF_DBG(ERR, \"tcam[%d][%s][%d] write failed.\\n\",\n-\t\t\t\t    sparms.tcam_tbl_type,\n-\t\t\t\t    (sparms.dir == TF_DIR_RX) ? \"RX\" : \"TX\",\n-\t\t\t\t    sparms.idx);\n+\t\t\tBNXT_TF_DBG(ERR, \"tcam[%s][%s][%x] write failed.\\n\",\n+\t\t\t\t    tf_tcam_tbl_2_str(sparms.tcam_tbl_type),\n+\t\t\t\t    tf_dir_2_str(sparms.dir), sparms.idx);\n \t\t\tgoto error;\n \t\t}\n+\t\tBNXT_TF_INF(\"tcam[%s][%s][%x] write success.\\n\",\n+\t\t\t    tf_tcam_tbl_2_str(sparms.tcam_tbl_type),\n+\t\t\t    tf_dir_2_str(sparms.dir), sparms.idx);\n \n \t\t/* Update cache with TCAM index if the was cache allocated. */\n \t\tif (parms->tcam_tbl_opc ==\n@@ -1475,6 +1508,10 @@ ulp_mapper_tcam_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n \t\tif (rc)\n \t\t\tgoto error;\n \n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+\t\tulp_mapper_tcam_entry_dump(\"TCAM\", aparms.idx, tbl,\n+\t\t\t\t\t   &key, &mask, &data);\n+#endif\n \t} else {\n \t\tstruct bnxt_ulp_mapper_ident_info *idents;\n \t\tuint32_t num_idents;\n@@ -1611,6 +1648,9 @@ ulp_mapper_em_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n \t\t\treturn rc;\n \t\t}\n \t}\n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+\tulp_mapper_result_dump(\"EEM Result\", tbl, &data);\n+#endif\n \n \t/* do the transpose for the internal EM keys */\n \tif (tbl->resource_func == BNXT_ULP_RESOURCE_FUNC_INT_EM_TABLE)\n@@ -1641,6 +1681,10 @@ ulp_mapper_em_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n \t\treturn rc;\n \t}\n \n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+\tulp_mapper_em_dump(\"EM\", &key, &data, &iparms);\n+\t/* tf_dump_tables(tfp, iparms.tbl_scope_id); */\n+#endif\n \t/* Mark action process */\n \tif (mtype == BNXT_ULP_FLOW_MEM_TYPE_EXT &&\n \t    tbl->resource_type == TF_MEM_EXTERNAL)\n@@ -1761,6 +1805,10 @@ ulp_mapper_index_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n \t/* if encap bit swap is enabled perform the bit swap */\n \tif (parms->device_params->encap_byte_swap && encap_flds) {\n \t\tulp_blob_perform_encap_swap(&data);\n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+\t\tBNXT_TF_DBG(INFO, \"Dump after encap swap\\n\");\n+\t\tulp_mapper_blob_dump(&data);\n+#endif\n \t}\n \n \t/*\n@@ -1790,13 +1838,15 @@ ulp_mapper_index_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n \t\trc = tf_set_tbl_entry(tfp, &sparms);\n \t\tif (rc) {\n \t\t\tBNXT_TF_DBG(ERR,\n-\t\t\t\t    \"Glbl Set table[%d][%s][%d] failed rc=%d\\n\",\n-\t\t\t\t    sparms.type,\n-\t\t\t\t    (sparms.dir == TF_DIR_RX) ? \"RX\" : \"TX\",\n-\t\t\t\t    sparms.idx,\n-\t\t\t\t    rc);\n+\t\t\t\t    \"Glbl Index table[%s][%s][%x] failed rc=%d\\n\",\n+\t\t\t\t    tf_tbl_type_2_str(sparms.type),\n+\t\t\t\t    tf_dir_2_str(sparms.dir),\n+\t\t\t\t    sparms.idx, rc);\n \t\t\treturn rc;\n \t\t}\n+\t\tBNXT_TF_INF(\"Glbl Index table[%s][%s][%x] success.\\n\",\n+\t\t\t    tf_tbl_type_2_str(sparms.type),\n+\t\t\t    tf_dir_2_str(sparms.dir), sparms.idx);\n \t\treturn 0; /* success */\n \t}\n \n@@ -1811,10 +1861,9 @@ ulp_mapper_index_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n \t/* All failures after the alloc succeeds require a free */\n \trc = tf_alloc_tbl_entry(tfp, &aparms);\n \tif (rc) {\n-\t\tBNXT_TF_DBG(ERR, \"Alloc table[%d][%s] failed rc=%d\\n\",\n-\t\t\t    aparms.type,\n-\t\t\t    (aparms.dir == TF_DIR_RX) ? \"RX\" : \"TX\",\n-\t\t\t    rc);\n+\t\tBNXT_TF_DBG(ERR, \"Alloc table[%s][%s] failed rc=%d\\n\",\n+\t\t\t    tf_tbl_type_2_str(aparms.type),\n+\t\t\t    tf_dir_2_str(aparms.dir), rc);\n \t\treturn rc;\n \t}\n \n@@ -1850,13 +1899,15 @@ ulp_mapper_index_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n \n \t\trc = tf_set_tbl_entry(tfp, &sparms);\n \t\tif (rc) {\n-\t\t\tBNXT_TF_DBG(ERR, \"Set table[%d][%s][%d] failed rc=%d\\n\",\n-\t\t\t\t    sparms.type,\n-\t\t\t\t    (sparms.dir == TF_DIR_RX) ? \"RX\" : \"TX\",\n-\t\t\t\t    sparms.idx,\n-\t\t\t\t    rc);\n+\t\t\tBNXT_TF_DBG(ERR, \"Set table[%s][%s][%x] failed rc=%d\\n\",\n+\t\t\t\t    tf_tbl_type_2_str(sparms.type),\n+\t\t\t\t    tf_dir_2_str(sparms.dir),\n+\t\t\t\t    sparms.idx, rc);\n \t\t\tgoto error;\n \t\t}\n+\t\tBNXT_TF_INF(\"Index set table[%s][%s][%x] passed\\n\",\n+\t\t\t    tf_tbl_type_2_str(sparms.type),\n+\t\t\t    tf_dir_2_str(sparms.dir), sparms.idx);\n \t}\n \n \t/* Link the resource to the flow in the flow db */\n@@ -1960,6 +2011,9 @@ ulp_mapper_cache_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n \t\t\t\t\t\t (tbl->resource_sub_type << 1 |\n \t\t\t\t\t\t (tbl->direction & 0x1)),\n \t\t\t\t\t\t *ckey);\n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+\tBNXT_TF_DBG(DEBUG, \"The cache key is (0x%04x)\\n\", *ckey);\n+#endif\n \n \t/*\n \t * Get the identifier list for processing by both the hit and miss\n@@ -2005,6 +2059,11 @@ ulp_mapper_cache_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n \t\t\t\t\t    \"Failed to write to regfile\\n\");\n \t\t\t\treturn -EINVAL;\n \t\t\t}\n+\t\t\tBNXT_TF_INF(\"Ident [%s]:[%s]:[0x%04x]:%x\\n\",\n+\t\t\t\t    tf_dir_2_str(tbl->direction),\n+\t\t\t\t    tf_ident_2_str(idents[i].ident_type),\n+\t\t\t\t    cache_entry->tcam_idx,\n+\t\t\t\t    cache_entry->idents[i]);\n \t\t}\n \t\t/*\n \t\t * The cached entry is being used, so let the tcam processing\n@@ -2120,13 +2179,16 @@ ulp_mapper_if_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n \n \trc = tf_set_if_tbl_entry(tfp, &iftbl_params);\n \tif (rc) {\n-\t\tBNXT_TF_DBG(ERR, \"Set table[%d][%s][%d] failed rc=%d\\n\",\n-\t\t\t    iftbl_params.type,\n-\t\t\t    (iftbl_params.dir == TF_DIR_RX) ? \"RX\" : \"TX\",\n-\t\t\t    iftbl_params.idx,\n-\t\t\t    rc);\n+\t\tBNXT_TF_DBG(ERR, \"Set table[%d][%s][%x] failed rc=%d\\n\",\n+\t\t\t    iftbl_params.type,/* TBD: add tf_if_tbl_2_str */\n+\t\t\t    tf_dir_2_str(iftbl_params.dir),\n+\t\t\t    iftbl_params.idx, rc);\n \t\treturn rc;\n \t}\n+\tBNXT_TF_INF(\"Set table[%s][%s][%x] success.\\n\",\n+\t\t    tf_if_tbl_2_str(iftbl_params.type),\n+\t\t    tf_dir_2_str(iftbl_params.dir),\n+\t\t    iftbl_params.idx);\n \n \t/*\n \t * TBD: Need to look at the need to store idx in flow db for restore\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_matcher.c b/drivers/net/bnxt/tf_ulp/ulp_matcher.c\nindex 9112647..b87705a 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_matcher.c\n+++ b/drivers/net/bnxt/tf_ulp/ulp_matcher.c\n@@ -6,6 +6,10 @@\n #include \"ulp_matcher.h\"\n #include \"ulp_utils.h\"\n \n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+#include \"ulp_template_debug_proto.h\"\n+#endif\n+\n /* Utility function to calculate the class matcher hash */\n static uint32_t\n ulp_matcher_class_hash_calculate(uint64_t hi_sig, uint64_t lo_sig)\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_port_db.c b/drivers/net/bnxt/tf_ulp/ulp_port_db.c\nindex 0fc7c0a..eee2860 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_port_db.c\n+++ b/drivers/net/bnxt/tf_ulp/ulp_port_db.c\n@@ -9,6 +9,10 @@\n #include \"bnxt_tf_common.h\"\n #include \"ulp_port_db.h\"\n \n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+#include \"ulp_tf_debug.h\"\n+#endif\n+\n static uint32_t\n ulp_port_db_allocate_ifindex(struct bnxt_ulp_port_db *port_db)\n {\n@@ -193,7 +197,9 @@ int32_t\tulp_port_db_dev_port_intf_update(struct bnxt_ulp_context *ulp_ctxt,\n \t\tport_data->port_vport = bnxt_get_vport(port_id);\n \t\tport_data->port_valid = true;\n \t}\n-\n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+\tulp_port_db_dump(port_db, intf, port_id);\n+#endif\n \treturn 0;\n }\n \ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_template_debug.c b/drivers/net/bnxt/tf_ulp/ulp_template_debug.c\nnew file mode 100644\nindex 0000000..5f07bef\n--- /dev/null\n+++ b/drivers/net/bnxt/tf_ulp/ulp_template_debug.c\n@@ -0,0 +1,595 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2014-2019 Broadcom\n+ * All rights reserved.\n+ */\n+\n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+#include \"bnxt.h\"\n+#include \"ulp_utils.h\"\n+#include \"ulp_template_db_enum.h\"\n+#include \"ulp_template_struct.h\"\n+#include \"ulp_template_debug.h\"\n+#include \"ulp_template_debug_proto.h\"\n+#include \"bnxt_tf_common.h\"\n+\n+/* #define RTE_LIBRTE_BNXT_TRUFLOW_DEBUG_DETAIL\t1 */\n+\n+const char *ulp_rte_hdr_comp_field_names[] = {\n+\t\"BNXT_ULP_CF_IDX_NOT_USED\",\n+\t\"BNXT_ULP_CF_IDX_MPLS_TAG_NUM\",\n+\t\"BNXT_ULP_CF_IDX_O_VTAG_NUM\",\n+\t\"BNXT_ULP_CF_IDX_O_NO_VTAG\",\n+\t\"BNXT_ULP_CF_IDX_O_ONE_VTAG\",\n+\t\"BNXT_ULP_CF_IDX_O_TWO_VTAGS\",\n+\t\"BNXT_ULP_CF_IDX_I_VTAG_NUM\",\n+\t\"BNXT_ULP_CF_IDX_I_NO_VTAG\",\n+\t\"BNXT_ULP_CF_IDX_I_ONE_VTAG\",\n+\t\"BNXT_ULP_CF_IDX_I_TWO_VTAGS\",\n+\t\"BNXT_ULP_CF_IDX_INCOMING_IF\",\n+\t\"BNXT_ULP_CF_IDX_DIRECTION\",\n+\t\"BNXT_ULP_CF_IDX_SVIF_FLAG\",\n+\t\"BNXT_ULP_CF_IDX_O_L3\",\n+\t\"BNXT_ULP_CF_IDX_I_L3\",\n+\t\"BNXT_ULP_CF_IDX_O_L4\",\n+\t\"BNXT_ULP_CF_IDX_I_L4\",\n+\t\"BNXT_ULP_CF_IDX_DEV_PORT_ID\",\n+\t\"BNXT_ULP_CF_IDX_PMD_FUNC_SVIF\",\n+\t\"BNXT_ULP_CF_IDX_PMD_FUNC_SPIF\",\n+\t\"BNXT_ULP_CF_IDX_PMD_FUNC_PARIF\",\n+\t\"BNXT_ULP_CF_IDX_PMD_FUNC_VNIC\",\n+\t\"BNXT_ULP_CF_IDX_PMD_FUNC_PHY_PORT\",\n+\t\"BNXT_ULP_CF_IDX_VF_FUNC_SVIF\",\n+\t\"BNXT_ULP_CF_IDX_VF_FUNC_SPIF\",\n+\t\"BNXT_ULP_CF_IDX_VF_FUNC_PARIF\",\n+\t\"BNXT_ULP_CF_IDX_VF_FUNC_VNIC\",\n+\t\"BNXT_ULP_CF_IDX_PHY_PORT_SVIF\",\n+\t\"BNXT_ULP_CF_IDX_PHY_PORT_SPIF\",\n+\t\"BNXT_ULP_CF_IDX_PHY_PORT_PARIF\",\n+\t\"BNXT_ULP_CF_IDX_PHY_PORT_VPORT\",\n+\t\"BNXT_ULP_CF_IDX_ACT_ENCAP_IPV4_FLAG\",\n+\t\"BNXT_ULP_CF_IDX_ACT_ENCAP_IPV6_FLAG\",\n+\t\"BNXT_ULP_CF_IDX_ACT_DEC_TTL\",\n+\t\"BNXT_ULP_CF_IDX_ACT_T_DEC_TTL\",\n+\t\"BNXT_ULP_CF_IDX_ACT_PORT_IS_SET\",\n+\t\"BNXT_ULP_CF_IDX_ACT_PORT_TYPE\",\n+\t\"BNXT_ULP_CF_IDX_MATCH_PORT_TYPE\",\n+\t\"BNXT_ULP_CF_IDX_VF_TO_VF\",\n+\t\"BNXT_ULP_CF_IDX_LAST\"\n+};\n+\n+const char *ulp_rte_hdr_svif_names[] = {\n+\t\"SVIF\",\n+};\n+\n+const char *ulp_rte_hdr_eth_field_names[] = {\n+\t\"Dst Mac\",\n+\t\"Src Mac\",\n+\t\"Ether Type\",\n+};\n+\n+const char *ulp_rte_hdr_vlan_field_names[] = {\n+\t\"Priority\",\n+\t\"Vlan Id\",\n+\t\"Vlan-Ether Type\",\n+};\n+\n+const char *ulp_rte_hdr_ipv4_field_names[] = {\n+\t\"Version\",\n+\t\"Type of Service\",\n+\t\"Length\",\n+\t\"Fragment Id\",\n+\t\"Fragment Offset\",\n+\t\"TTL\",\n+\t\"Next Proto\",\n+\t\"Checksum\",\n+\t\"Src Addr\",\n+\t\"Dst Addr\"\n+};\n+\n+const char *ulp_rte_hdr_ipv6_field_names[] = {\n+\t\"Flow\",\n+\t\"Length\",\n+\t\"Proto\",\n+\t\"Hop limits\",\n+\t\"Src Addr\",\n+\t\"Dst Addr\"\n+};\n+\n+const char *ulp_rte_hdr_udp_field_names[] = {\n+\t\"Src Port\",\n+\t\"Dst Port\",\n+\t\"Length\",\n+\t\"Checksum\"\n+};\n+\n+const char *ulp_rte_hdr_vxlan_field_names[] = {\n+\t\"Vxlan Flags\",\n+\t\"Reserved\",\n+\t\"VNI\",\n+\t\"Reserved\"\n+};\n+\n+const char *ulp_rte_hdr_tcp_field_names[] = {\n+\t\"Src Port\",\n+\t\"Dst Port\",\n+\t\"Sent Seq\",\n+\t\"Recv Ack\",\n+\t\"Data Offset\",\n+\t\"Tcp flags\",\n+\t\"Rx Window\",\n+\t\"Checksum\",\n+\t\"URP\",\n+};\n+\n+/* Utility Function to dump a simple buffer of a given length. */\n+static void dump_hex(uint8_t *ptr, uint32_t size)\n+{\n+\tuint32_t i;\n+\tuint8_t lbuffer[1024];\n+\tuint8_t *lbuffer_ptr = lbuffer;\n+\tint32_t\tret;\n+\n+\tmemset(lbuffer, 0, sizeof(lbuffer));\n+\tret = sprintf((char *)lbuffer_ptr, \"\\t\\t\\t\");\n+\tlbuffer_ptr += ret;\n+\tfor (i = 0; i < size; i++, ptr++) {\n+\t\tif (i && !(i % 16)) {\n+\t\t\tret = sprintf((char *)lbuffer_ptr, \"\\t\\t\\t\\t\");\n+\t\t\tlbuffer_ptr += ret;\n+\t\t}\n+\t\tret = sprintf((char *)lbuffer_ptr, \"0x%02x \", *ptr);\n+\t\tlbuffer_ptr += ret;\n+\t\tif ((i & 0x0F) == 0x0F) {\n+\t\t\tret = sprintf((char *)lbuffer_ptr, \"\\n\");\n+\t\t\tlbuffer_ptr += ret;\n+\t\t}\n+\t}\n+\tif (size & 0x0F)\n+\t\tsprintf((char *)lbuffer_ptr, \"\\n\");\n+\tBNXT_TF_DBG(DEBUG, \"%s\", lbuffer);\n+}\n+\n+/* Utility Function to dump the computed field properties */\n+static void\n+ulp_parser_comp_field_dump(struct ulp_rte_parser_params\t*params,\n+\t\t\t   const char *field_names[],\n+\t\t\t   uint32_t count_list)\n+{\n+\tuint32_t idx = 0;\n+\n+\tBNXT_TF_DBG(DEBUG, \"Default computed fields\\n\");\n+\tfor (idx = 0; idx < count_list; idx++) {\n+\t\tBNXT_TF_DBG(DEBUG, \"\\t%s =\\n\", field_names[idx]);\n+\t\tdump_hex((uint8_t *)&params->comp_fld[idx], sizeof(uint32_t));\n+\t}\n+}\n+\n+/* Utility Function to dump the field properties.*/\n+static void\n+ulp_parser_field_dump(struct ulp_rte_hdr_field  *hdr_field,\n+\t\t      const char *field_names[],\n+\t\t      uint32_t\tstart_idx,\n+\t\t      uint32_t\tcount_list)\n+{\n+\tuint32_t f_idx = 0, idx = 0;\n+\n+\tfor (f_idx = start_idx; f_idx < (start_idx + count_list); f_idx++) {\n+\t\tif (hdr_field[f_idx].size) {\n+\t\t\tBNXT_TF_DBG(DEBUG, \"\\t%s =\\n\", field_names[idx]);\n+\t\t\tdump_hex(hdr_field[f_idx].spec, hdr_field[f_idx].size);\n+\t\t\tdump_hex(hdr_field[f_idx].mask, hdr_field[f_idx].size);\n+\t\t}\n+\t\tidx++;\n+\t}\n+}\n+\n+/* Utility Function to dump the field properties.*/\n+static inline void\n+ulp_parser_vlan_dump(struct ulp_rte_hdr_field *hdr_field,\n+\t\t     uint32_t f_idx)\n+{\n+\tulp_parser_field_dump(hdr_field, ulp_rte_hdr_vlan_field_names,\n+\t\t\t      f_idx, BNXT_ULP_PROTO_HDR_S_VLAN_NUM);\n+}\n+\n+/* Function to dump the Pattern header bitmaps and fields. */\n+void\n+ulp_parser_hdr_info_dump(struct ulp_rte_parser_params *params)\n+{\n+\tuint32_t idx = 0, f_idx = 0;\n+\tuint32_t\tnum_idx;\n+\tuint64_t\thdr_bit;\n+\tstruct ulp_rte_hdr_bitmap\t*hdr_bitmap = &params->hdr_bitmap;\n+\tstruct ulp_rte_hdr_field\t*hdr_field = params->hdr_field;\n+\n+\tBNXT_TF_DBG(DEBUG, \"Configured Header Protocols for matching\\n\");\n+\tif (ULP_BITMAP_ISSET(hdr_bitmap->bits, BNXT_ULP_FLOW_DIR_BITMASK_EGR))\n+\t\tBNXT_TF_DBG(DEBUG, \"It is a Egress Flow - %x\\n\",\n+\t\t\t    params->dir_attr);\n+\telse\n+\t\tBNXT_TF_DBG(DEBUG, \"It is a Ingress Flow - %x\\n\",\n+\t\t\t    params->dir_attr);\n+\tulp_parser_comp_field_dump(params, ulp_rte_hdr_comp_field_names,\n+\t\t\t\t   BNXT_ULP_CF_IDX_LAST);\n+\n+\tnum_idx = sizeof(bnxt_ulp_hdr_bit_names) /\n+\t\tsizeof(bnxt_ulp_hdr_bit_names[0]);\n+\n+\t/* Print the svif details, there is no bitmap for this field */\n+\tulp_parser_field_dump(hdr_field, ulp_rte_hdr_svif_names, f_idx,\n+\t\t\t      BNXT_ULP_PROTO_HDR_SVIF_NUM);\n+\tf_idx += BNXT_ULP_PROTO_HDR_SVIF_NUM;\n+\n+\tfor (idx = 0; idx < num_idx; idx++) {\n+\t\thdr_bit = 1UL << idx;\n+\t\tif (!ULP_BITMAP_ISSET(hdr_bitmap->bits, hdr_bit)) {\n+\t\t\tif (ULP_BITMAP_ISSET(hdr_bit,\n+\t\t\t\t\t     BNXT_ULP_HDR_BIT_OO_VLAN) ||\n+\t\t\t    ULP_BITMAP_ISSET(hdr_bit,\n+\t\t\t\t\t     BNXT_ULP_HDR_BIT_OI_VLAN) ||\n+\t\t\t    ULP_BITMAP_ISSET(hdr_bit,\n+\t\t\t\t\t     BNXT_ULP_HDR_BIT_IO_VLAN) ||\n+\t\t\t    ULP_BITMAP_ISSET(hdr_bit,\n+\t\t\t\t\t     BNXT_ULP_HDR_BIT_II_VLAN)) {\n+\t\t\t\tf_idx += BNXT_ULP_PROTO_HDR_S_VLAN_NUM;\n+\t\t\t}\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tBNXT_TF_DBG(DEBUG, \"%s\\n\", bnxt_ulp_hdr_bit_names[idx]);\n+\t\tif (ULP_BITMAP_ISSET(hdr_bit, BNXT_ULP_HDR_BIT_O_ETH)) {\n+\t\t\tulp_parser_field_dump(hdr_field,\n+\t\t\t\t\t      ulp_rte_hdr_eth_field_names,\n+\t\t\t\t\t      f_idx,\n+\t\t\t\t\t      BNXT_ULP_PROTO_HDR_ETH_NUM);\n+\t\t\tf_idx += BNXT_ULP_PROTO_HDR_ETH_NUM;\n+\t\t} else if (ULP_BITMAP_ISSET(hdr_bit, BNXT_ULP_HDR_BIT_I_ETH)) {\n+\t\t\tulp_parser_field_dump(hdr_field,\n+\t\t\t\t\t      ulp_rte_hdr_eth_field_names,\n+\t\t\t\t\t      f_idx,\n+\t\t\t\t\t      BNXT_ULP_PROTO_HDR_ETH_NUM);\n+\t\t\tf_idx += BNXT_ULP_PROTO_HDR_ETH_NUM;\n+\t\t} else if (ULP_BITMAP_ISSET(hdr_bit,\n+\t\t\t\t\t    BNXT_ULP_HDR_BIT_OO_VLAN)) {\n+\t\t\tulp_parser_vlan_dump(hdr_field, f_idx);\n+\t\t\tf_idx += BNXT_ULP_PROTO_HDR_S_VLAN_NUM;\n+\t\t} else if (ULP_BITMAP_ISSET(hdr_bit,\n+\t\t\t\t\t    BNXT_ULP_HDR_BIT_OI_VLAN)) {\n+\t\t\tulp_parser_vlan_dump(hdr_field, f_idx);\n+\t\t\tf_idx += BNXT_ULP_PROTO_HDR_S_VLAN_NUM;\n+\t\t} else if (ULP_BITMAP_ISSET(hdr_bit,\n+\t\t\t\t\t    BNXT_ULP_HDR_BIT_IO_VLAN)) {\n+\t\t\tulp_parser_vlan_dump(hdr_field, f_idx);\n+\t\t\tf_idx += BNXT_ULP_PROTO_HDR_S_VLAN_NUM;\n+\t\t} else if (ULP_BITMAP_ISSET(hdr_bit,\n+\t\t\t\t\t    BNXT_ULP_HDR_BIT_II_VLAN)) {\n+\t\t\tulp_parser_vlan_dump(hdr_field, f_idx);\n+\t\t\tf_idx += BNXT_ULP_PROTO_HDR_S_VLAN_NUM;\n+\t\t} else if (ULP_BITMAP_ISSET(hdr_bit, BNXT_ULP_HDR_BIT_O_IPV4)) {\n+\t\t\tulp_parser_field_dump(hdr_field,\n+\t\t\t\t\t      ulp_rte_hdr_ipv4_field_names,\n+\t\t\t\t\t      f_idx,\n+\t\t\t\t\t      BNXT_ULP_PROTO_HDR_IPV4_NUM);\n+\t\t\tf_idx += BNXT_ULP_PROTO_HDR_IPV4_NUM;\n+\t\t} else if (ULP_BITMAP_ISSET(hdr_bit, BNXT_ULP_HDR_BIT_O_IPV6)) {\n+\t\t\tulp_parser_field_dump(hdr_field,\n+\t\t\t\t\t      ulp_rte_hdr_ipv6_field_names,\n+\t\t\t\t\t      f_idx,\n+\t\t\t\t\t      BNXT_ULP_PROTO_HDR_IPV6_NUM);\n+\t\t\tf_idx += BNXT_ULP_PROTO_HDR_IPV6_NUM;\n+\t\t} else if (ULP_BITMAP_ISSET(hdr_bit, BNXT_ULP_HDR_BIT_O_UDP)) {\n+\t\t\tulp_parser_field_dump(hdr_field,\n+\t\t\t\t\t      ulp_rte_hdr_udp_field_names,\n+\t\t\t\t\t      f_idx,\n+\t\t\t\t\t      BNXT_ULP_PROTO_HDR_UDP_NUM);\n+\t\t\tf_idx += BNXT_ULP_PROTO_HDR_UDP_NUM;\n+\t\t} else if (ULP_BITMAP_ISSET(hdr_bit, BNXT_ULP_HDR_BIT_O_TCP)) {\n+\t\t\tulp_parser_field_dump(hdr_field,\n+\t\t\t\t\t      ulp_rte_hdr_tcp_field_names,\n+\t\t\t\t\t      f_idx,\n+\t\t\t\t\t      BNXT_ULP_PROTO_HDR_TCP_NUM);\n+\t\t\tf_idx += BNXT_ULP_PROTO_HDR_TCP_NUM;\n+\t\t} else if (ULP_BITMAP_ISSET(hdr_bit,\n+\t\t\t\t\t    BNXT_ULP_HDR_BIT_T_VXLAN)) {\n+\t\t\tulp_parser_field_dump(hdr_field,\n+\t\t\t\t\t      ulp_rte_hdr_vxlan_field_names,\n+\t\t\t\t\t      f_idx,\n+\t\t\t\t\t      BNXT_ULP_PROTO_HDR_VXLAN_NUM);\n+\t\t\tf_idx += BNXT_ULP_PROTO_HDR_VXLAN_NUM;\n+\t\t}\n+\t}\n+\tBNXT_TF_DBG(DEBUG, \"******************************************\\n\");\n+}\n+\n+static void\n+ulp_parser_action_prop_dump(struct ulp_rte_act_prop\t*act_prop,\n+\t\t\t    uint32_t\t\t\tstart_idx,\n+\t\t\t    uint32_t\t\t\tdump_size)\n+{\n+\tBNXT_TF_DBG(DEBUG, \"\\t%s =\\n\",\n+\t\t    bnxt_ulp_rte_parser_action_prop_names[start_idx]);\n+\tdump_hex(&act_prop->act_details[start_idx], dump_size);\n+}\n+\n+/* Function to dump the Action header bitmaps and properties. */\n+void\n+ulp_parser_act_info_dump(struct ulp_rte_parser_params *params)\n+{\n+\tuint32_t idx = 0;\n+\tuint32_t num_idx = 0;\n+\tuint64_t act_bit;\n+\tstruct ulp_rte_act_bitmap\t*act_bitmap = &params->act_bitmap;\n+\tstruct ulp_rte_act_prop\t\t*act_prop = &params->act_prop;\n+\n+\tBNXT_TF_DBG(DEBUG, \"Configured actions for matching\\n\");\n+\tBNXT_TF_DBG(DEBUG, \"Default computed fields\\n\");\n+\tulp_parser_action_prop_dump(act_prop,\n+\t\t\t\t    BNXT_ULP_ACT_PROP_IDX_ENCAP_TUN_SZ,\n+\t\t\t\t    BNXT_ULP_ACT_PROP_SZ_ENCAP_TUN_SZ);\n+\tulp_parser_action_prop_dump(act_prop,\n+\t\t\t\t    BNXT_ULP_ACT_PROP_IDX_ENCAP_IP_SZ,\n+\t\t\t\t    BNXT_ULP_ACT_PROP_SZ_ENCAP_IP_SZ);\n+\tulp_parser_action_prop_dump(act_prop,\n+\t\t\t\t    BNXT_ULP_ACT_PROP_IDX_ENCAP_VTAG_SZ,\n+\t\t\t\t    BNXT_ULP_ACT_PROP_SZ_ENCAP_VTAG_SZ);\n+\tulp_parser_action_prop_dump(act_prop,\n+\t\t\t\t    BNXT_ULP_ACT_PROP_IDX_ENCAP_VTAG_TYPE,\n+\t\t\t\t    BNXT_ULP_ACT_PROP_SZ_ENCAP_VTAG_TYPE);\n+\tulp_parser_action_prop_dump(act_prop,\n+\t\t\t\t    BNXT_ULP_ACT_PROP_IDX_ENCAP_VTAG_NUM,\n+\t\t\t\t    BNXT_ULP_ACT_PROP_SZ_ENCAP_VTAG_NUM);\n+\tulp_parser_action_prop_dump(act_prop,\n+\t\t\t\t    BNXT_ULP_ACT_PROP_IDX_ENCAP_L3_TYPE,\n+\t\t\t\t    BNXT_ULP_ACT_PROP_SZ_ENCAP_L3_TYPE);\n+\tulp_parser_action_prop_dump(act_prop,\n+\t\t\t\t    BNXT_ULP_ACT_PROP_IDX_VNIC,\n+\t\t\t\t    BNXT_ULP_ACT_PROP_SZ_VNIC);\n+\tulp_parser_action_prop_dump(act_prop,\n+\t\t\t\t    BNXT_ULP_ACT_PROP_IDX_VPORT,\n+\t\t\t\t    BNXT_ULP_ACT_PROP_SZ_VPORT);\n+\n+\tnum_idx = sizeof(bnxt_ulp_action_bit_names) /\n+\t\t sizeof(bnxt_ulp_action_bit_names[0]);\n+\n+\tfor (idx = 0; idx < num_idx; idx++) {\n+\t\tenum bnxt_ulp_act_prop_idx\ttmp_act_p;\n+\t\tenum bnxt_ulp_act_prop_sz\ttmp_act_sz;\n+\n+\t\tact_bit = 1UL << idx;\n+\t\tif (!ULP_BITMAP_ISSET(act_bitmap->bits, act_bit))\n+\t\t\tcontinue;\n+\n+\t\tBNXT_TF_DBG(DEBUG, \"%s\\n\", bnxt_ulp_action_bit_names[idx]);\n+\t\tif (ULP_BITMAP_ISSET(act_bit, BNXT_ULP_ACTION_BIT_MARK)) {\n+\t\t\tulp_parser_action_prop_dump(act_prop,\n+\t\t\t\t\t\t    BNXT_ULP_ACT_PROP_IDX_MARK,\n+\t\t\t\t\t\t    BNXT_ULP_ACT_PROP_SZ_MARK);\n+\t\t} else if (ULP_BITMAP_ISSET(act_bit,\n+\t\t\t\t\t    BNXT_ULP_ACTION_BIT_VXLAN_ENCAP)) {\n+\t\t\ttmp_act_p = BNXT_ULP_ACT_PROP_IDX_ENCAP_L2_DMAC;\n+\t\t\ttmp_act_sz = BNXT_ULP_ACT_PROP_IDX_LAST -\n+\t\t\t    BNXT_ULP_ACT_PROP_IDX_ENCAP_L2_DMAC;\n+\t\t\tprintf(\"size %d and %d\\n\", tmp_act_p, tmp_act_sz);\n+\t\t\tulp_parser_action_prop_dump(act_prop, tmp_act_p,\n+\t\t\t\t\t\t    tmp_act_sz);\n+\t\t} else if (ULP_BITMAP_ISSET(act_bit,\n+\t\t\t\t\t    BNXT_ULP_ACTION_BIT_COUNT)) {\n+\t\t\tulp_parser_action_prop_dump(act_prop,\n+\t\t\t\t\t\t    BNXT_ULP_ACT_PROP_IDX_COUNT,\n+\t\t\t\t\t\t    BNXT_ULP_ACT_PROP_SZ_COUNT);\n+\t\t} else if (ULP_BITMAP_ISSET(act_bit,\n+\t\t\t\t\t    BNXT_ULP_ACTION_BIT_PUSH_VLAN)) {\n+\t\t\ttmp_act_p = BNXT_ULP_ACT_PROP_IDX_PUSH_VLAN;\n+\t\t\ttmp_act_sz = BNXT_ULP_ACT_PROP_SZ_PUSH_VLAN;\n+\t\t\tulp_parser_action_prop_dump(act_prop,\n+\t\t\t\t\t\t    tmp_act_p,\n+\t\t\t\t\t\t    tmp_act_sz);\n+\t\t} else if (ULP_BITMAP_ISSET(act_bit,\n+\t\t\t\t\t    BNXT_ULP_ACTION_BIT_SET_IPV4_SRC)) {\n+\t\t\ttmp_act_p = BNXT_ULP_ACT_PROP_IDX_SET_IPV4_SRC;\n+\t\t\ttmp_act_sz = BNXT_ULP_ACT_PROP_SZ_SET_IPV4_SRC;\n+\t\t\tulp_parser_action_prop_dump(act_prop,\n+\t\t\t\t\t\t    tmp_act_p,\n+\t\t\t\t\t\t    tmp_act_sz);\n+\t\t} else if (ULP_BITMAP_ISSET(act_bit,\n+\t\t\t\t\t    BNXT_ULP_ACTION_BIT_SET_IPV4_DST)) {\n+\t\t\ttmp_act_p = BNXT_ULP_ACT_PROP_IDX_SET_IPV4_DST;\n+\t\t\ttmp_act_sz = BNXT_ULP_ACT_PROP_SZ_SET_IPV4_DST;\n+\t\t\tulp_parser_action_prop_dump(act_prop,\n+\t\t\t\t\t\t    tmp_act_p,\n+\t\t\t\t\t\t    tmp_act_sz);\n+\t\t} else if (ULP_BITMAP_ISSET(act_bit,\n+\t\t\t\t\t    BNXT_ULP_ACTION_BIT_SET_TP_SRC)) {\n+\t\t\ttmp_act_p = BNXT_ULP_ACT_PROP_IDX_SET_TP_SRC;\n+\t\t\ttmp_act_sz = BNXT_ULP_ACT_PROP_SZ_SET_TP_SRC;\n+\t\t\tulp_parser_action_prop_dump(act_prop,\n+\t\t\t\t\t\t    tmp_act_p,\n+\t\t\t\t\t\t    tmp_act_sz);\n+\t\t} else if (ULP_BITMAP_ISSET(act_bit,\n+\t\t\t\t\t    BNXT_ULP_ACTION_BIT_SET_TP_DST)) {\n+\t\t\ttmp_act_p = BNXT_ULP_ACT_PROP_IDX_SET_TP_DST;\n+\t\t\ttmp_act_sz = BNXT_ULP_ACT_PROP_SZ_SET_TP_DST;\n+\t\t\tulp_parser_action_prop_dump(act_prop,\n+\t\t\t\t\t\t    tmp_act_p,\n+\t\t\t\t\t\t    tmp_act_sz);\n+\t\t}\n+\t}\n+\tBNXT_TF_DBG(DEBUG, \"******************************************\\n\");\n+}\n+\n+/* Function to dump the error field during matching. */\n+void\n+ulp_matcher_act_field_dump(uint32_t\tidx,\n+\t\t\t   uint32_t\tjdx,\n+\t\t\t   uint32_t\tmask_id)\n+{\n+\tBNXT_TF_DBG(DEBUG, \"Match failed template=%d,field=%s,mask=%s\\n\",\n+\t\t    idx,\n+\t\t    bnxt_ulp_rte_template_field_names[(jdx +\n+\t\t    (idx + 1) * 1)],\n+\t\t    bnxt_ulp_flow_matcher_field_mask_opcode_names[mask_id]);\n+}\n+\n+/* Function to dump the blob during the mapper processing. */\n+void\n+ulp_mapper_result_field_dump(const char *name,\n+\t\t\t     struct bnxt_ulp_mapper_result_field_info *fld,\n+\t\t\t     struct ulp_blob *blob,\n+\t\t\t     uint16_t write_idx,\n+\t\t\t     uint8_t *val,\n+\t\t\t     uint32_t field_size)\n+{\n+\tuint32_t len = 0, slen = 0;\n+\tuint8_t lbuffer[64];\n+\tuint8_t *lbuffer_ptr = lbuffer;\n+\tuint32_t\tret = 0, idx = 0;\n+\tuint32_t\tp_size;\n+\n+\tif (!val || !blob)\n+\t\treturn;\n+\n+\tif (fld->result_opcode == BNXT_ULP_MAPPER_OPC_SET_TO_ENCAP_ACT_PROP_SZ)\n+\t\tslen = field_size;\n+\telse\n+\t\tslen = fld->field_bit_size;\n+\n+\tif (slen % 8)\n+\t\tlen = (slen / 8) + 1;\n+\telse\n+\t\tlen = (slen / 8);\n+\n+\tmemset(lbuffer, 0, sizeof(lbuffer));\n+\twhile (len > 0 && idx < 32) {\n+\t\tret = sprintf((char *)lbuffer_ptr, \"%02x\", val[idx]);\n+\t\tlbuffer_ptr += ret;\n+\t\tlen--;\n+\t\tidx++;\n+\t}\n+\n+\tBNXT_TF_DBG(DEBUG,\n+\t\t    \"%-16s %-20s, bits = %-3d and pos = %-3d val = 0x%s\\n\",\n+\t\t    name, fld->description, slen, write_idx, lbuffer);\n+\tp_size = (write_idx + slen + 7) / 8;\n+\tdump_hex((uint8_t *)blob->data, p_size);\n+}\n+\n+/* Function to dump the blob during the mapper processing. */\n+void\n+ulp_mapper_key_fld_dump(const char *name,\n+\t\t\tstruct bnxt_ulp_mapper_class_key_field_info *fld,\n+\t\t\tstruct ulp_blob *blob,\n+\t\t\tuint8_t *val)\n+{\n+\tuint32_t len = fld->field_bit_size / 8;\n+\tuint8_t lbuffer[64];\n+\tuint8_t *lbuffer_ptr = lbuffer;\n+\tuint32_t\tret = 0, idx = 0;\n+\n+\tif (!val)\n+\t\treturn;\n+\n+\t/* The value was already written, so calculate the write_idx. */\n+\tuint16_t write_idx = blob->write_idx - fld->field_bit_size;\n+\n+\tif (fld->field_bit_size % 8)\n+\t\tlen++;\n+\n+\tmemset(lbuffer, 0, sizeof(lbuffer));\n+\twhile (len > 0 && idx < 32) {\n+\t\tret = sprintf((char *)lbuffer_ptr, \"%02x\", val[idx]);\n+\t\tlbuffer_ptr += ret;\n+\t\tlen--;\n+\t\tidx++;\n+\t}\n+\n+\tBNXT_TF_DBG(DEBUG, \"%-16s %-20s, bits = %-3d pos = %-3d val = 0x%s\\n\",\n+\t\t    name, fld->description, fld->field_bit_size,\n+\t\t    write_idx, lbuffer);\n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG_DETAIL\n+\tdump_hex((uint8_t *)blob->data, 16);\n+#endif\n+}\n+\n+void\n+ulp_mapper_ident_field_dump(const char *name,\n+\t\t\t    struct bnxt_ulp_mapper_ident_info *ident,\n+\t\t\t    struct bnxt_ulp_mapper_tbl_info *tbl,\n+\t\t\t    int32_t id)\n+{\n+\tBNXT_TF_DBG(DEBUG, \"%-16s alloc %-16s, dir= %s, id = 0x%x\\n\",\n+\t\t    name, ident->description,\n+\t\t    (tbl->direction == TF_DIR_RX) ? \"RX\" : \"TX\", id);\n+}\n+\n+void\n+ulp_mapper_tcam_entry_dump(const char *name,\n+\t\t\t   uint32_t idx,\n+\t\t\t   struct bnxt_ulp_mapper_tbl_info *tbl,\n+\t\t\t   struct ulp_blob *key,\n+\t\t\t   struct ulp_blob *mask,\n+\t\t\t   struct ulp_blob *result)\n+{\n+\tBNXT_TF_DBG(DEBUG, \"%-16s [%s][0x%0x],keysz=%-3d resultsz=%-3d\\n\",\n+\t\t    name,\n+\t\t    (tbl->direction == TF_DIR_RX) ? \"RX\" : \"TX\",\n+\t\t    idx, key->write_idx, result->write_idx);\n+\tdump_hex((uint8_t *)key->data, (key->bitlen + 7) / 8);\n+\tdump_hex((uint8_t *)mask->data, (key->bitlen + 7) / 8);\n+\tdump_hex((uint8_t *)result->data, (key->bitlen + 7) / 8);\n+}\n+\n+void\n+ulp_mapper_result_dump(const char *name,\n+\t\t       struct bnxt_ulp_mapper_tbl_info *tbl,\n+\t\t       struct ulp_blob *result)\n+{\n+\tBNXT_TF_DBG(DEBUG, \"%-16s [%s], bitlen=%-3d\\n\",\n+\t\t    name,\n+\t\t    (tbl->direction == TF_DIR_RX) ? \"RX\" : \"TX\",\n+\t\t    result->write_idx);\n+\tdump_hex((uint8_t *)result->data, (result->bitlen + 7) / 8);\n+}\n+\n+void\n+ulp_mapper_act_dump(const char *name,\n+\t\t    struct bnxt_ulp_mapper_tbl_info *tbl,\n+\t\t    struct ulp_blob *data)\n+{\n+\tBNXT_TF_DBG(DEBUG, \"%-16s [%s], bitlen=%-3d\\n\",\n+\t\t    name,\n+\t\t    (tbl->direction == TF_DIR_RX) ? \"RX\" : \"TX\",\n+\t\t    data->write_idx);\n+\tdump_hex((uint8_t *)data->data, (data->bitlen + 7) / 8);\n+}\n+\n+void\n+ulp_mapper_em_dump(const char *name,\n+\t\t   struct ulp_blob *key,\n+\t\t   struct ulp_blob *data,\n+\t\t   struct tf_insert_em_entry_parms *iparms)\n+{\n+\tBNXT_TF_DBG(DEBUG, \"%s ins %s[%s] scope=0x%02x keysz=%d recsz=%d\\n\",\n+\t\t    name,\n+\t\t    (iparms->mem == TF_MEM_EXTERNAL) ? \"EXT\" : \"INT\",\n+\t\t    (iparms->dir == TF_DIR_RX) ? \"RX\" : \"TX\",\n+\t\t    iparms->tbl_scope_id,\n+\t\t    iparms->key_sz_in_bits,\n+\t\t    iparms->em_record_sz_in_bits);\n+\n+\tBNXT_TF_DBG(DEBUG, \"FlowHdl=0x%016\" PRIx64 \" FlowID=0x%016\" PRIx64 \"\\n\",\n+\t\t    iparms->flow_handle, iparms->flow_id);\n+\n+\tBNXT_TF_DBG(DEBUG, \"Key Size %d, Data Size %d\\n\",\n+\t\t    key->write_idx, data->write_idx);\n+\n+\tdump_hex(iparms->key, (key->write_idx + 7) / 8);\n+\tdump_hex(iparms->em_record, (data->write_idx + 7) / 8);\n+}\n+\n+void\n+ulp_mapper_blob_dump(struct ulp_blob *blob)\n+{\n+\tdump_hex(blob->data, (blob->write_idx + 7) / 8);\n+}\n+\n+#endif /* RTE_LIBRTE_BNXT_TRUFLOW_DEBUG */\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_template_debug.h b/drivers/net/bnxt/tf_ulp/ulp_template_debug.h\nnew file mode 100644\nindex 0000000..706562b\n--- /dev/null\n+++ b/drivers/net/bnxt/tf_ulp/ulp_template_debug.h\n@@ -0,0 +1,329 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2014-2019 Broadcom\n+ * All rights reserved.\n+ */\n+\n+#ifndef ULP_TEMPLATE_DEBUG_H_\n+#define ULP_TEMPLATE_DEBUG_H_\n+\n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+\n+/*\n+ * THIS FILE IS AUTOGENERATED AND MUST NOT BE MODIFIED WITHOUT FEEDING BACK\n+ * TO THE TEMPLATE COMPILER.\n+ */\n+\n+const char *bnxt_ulp_hdr_bit_names[] = {\n+\t\"BNXT_ULP_HDR_BIT_O_ETH\",\n+\t\"BNXT_ULP_HDR_BIT_OO_VLAN\",\n+\t\"BNXT_ULP_HDR_BIT_OI_VLAN\",\n+\t\"BNXT_ULP_HDR_BIT_O_IPV4\",\n+\t\"BNXT_ULP_HDR_BIT_O_IPV6\",\n+\t\"BNXT_ULP_HDR_BIT_O_TCP\",\n+\t\"BNXT_ULP_HDR_BIT_O_UDP\",\n+\t\"BNXT_ULP_HDR_BIT_T_VXLAN\",\n+\t\"BNXT_ULP_HDR_BIT_T_GRE\",\n+\t\"BNXT_ULP_HDR_BIT_I_ETH\",\n+\t\"BNXT_ULP_HDR_BIT_IO_VLAN\",\n+\t\"BNXT_ULP_HDR_BIT_II_VLAN\",\n+\t\"BNXT_ULP_HDR_BIT_I_IPV4\",\n+\t\"BNXT_ULP_HDR_BIT_I_IPV6\",\n+\t\"BNXT_ULP_HDR_BIT_I_TCP\",\n+\t\"BNXT_ULP_HDR_BIT_I_UDP\",\n+\t\"BNXT_ULP_HDR_PROTO_LAST\",\n+};\n+\n+const char *bnxt_ulp_action_bit_names[] = {\n+\t\"BNXT_ULP_ACTION_BIT_MARK\",\n+\t\"BNXT_ULP_ACTION_BIT_DROP\",\n+\t\"BNXT_ULP_ACTION_BIT_COUNT\",\n+\t\"BNXT_ULP_ACTION_BIT_RSS\",\n+\t\"BNXT_ULP_ACTION_BIT_METER\",\n+\t\"BNXT_ULP_ACTION_BIT_VXLAN_DECAP\",\n+\t\"BNXT_ULP_ACTION_BIT_NVGRE_DECAP\",\n+\t\"BNXT_ULP_ACTION_BIT_OF_POP_MPLS\",\n+\t\"BNXT_ULP_ACTION_BIT_OF_PUSH_MPLS\",\n+\t\"BNXT_ULP_ACTION_BIT_MAC_SWAP\",\n+\t\"BNXT_ULP_ACTION_BIT_SET_MAC_SRC\",\n+\t\"BNXT_ULP_ACTION_BIT_SET_MAC_DST\",\n+\t\"BNXT_ULP_ACTION_BIT_POP_VLAN\",\n+\t\"BNXT_ULP_ACTION_BIT_PUSH_VLAN\",\n+\t\"BNXT_ULP_ACTION_BIT_SET_VLAN_PCP\",\n+\t\"BNXT_ULP_ACTION_BIT_SET_VLAN_VID\",\n+\t\"BNXT_ULP_ACTION_BIT_SET_IPV4_SRC\",\n+\t\"BNXT_ULP_ACTION_BIT_SET_IPV4_DST\",\n+\t\"BNXT_ULP_ACTION_BIT_SET_IPV6_SRC\",\n+\t\"BNXT_ULP_ACTION_BIT_SET_IPV6_DST\",\n+\t\"BNXT_ULP_ACTION_BIT_DEC_TTL\",\n+\t\"BNXT_ULP_ACTION_BIT_SET_TP_SRC\",\n+\t\"BNXT_ULP_ACTION_BIT_SET_TP_DST\",\n+\t\"BNXT_ULP_ACTION_BIT_VXLAN_ENCAP\",\n+\t\"BNXT_ULP_ACTION_BIT_NVGRE_ENCAP\",\n+\t\"BNXT_ULP_ACTION_BIT_LAST\"\n+};\n+\n+const char *bnxt_ulp_rte_parser_action_prop_names[] = {\n+\t[BNXT_ULP_ACT_PROP_IDX_ENCAP_TUN_SZ] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_ENCAP_TUN_SZ\",\n+\t[BNXT_ULP_ACT_PROP_IDX_ENCAP_IP_SZ] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_ENCAP_IP_SZ\",\n+\t[BNXT_ULP_ACT_PROP_IDX_ENCAP_VTAG_SZ] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_ENCAP_VTAG_SZ\",\n+\t[BNXT_ULP_ACT_PROP_IDX_ENCAP_VTAG_TYPE] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_ENCAP_VTAG_TYPE\",\n+\t[BNXT_ULP_ACT_PROP_IDX_ENCAP_VTAG_NUM] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_ENCAP_VTAG_NUM\",\n+\t[BNXT_ULP_ACT_PROP_IDX_ENCAP_L3_TYPE] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_ENCAP_L3_TYPE\",\n+\t[BNXT_ULP_ACT_PROP_IDX_MPLS_POP_NUM] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_MPLS_POP_NUM\",\n+\t[BNXT_ULP_ACT_PROP_IDX_MPLS_PUSH_NUM] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_MPLS_PUSH_NUM\",\n+\t[BNXT_ULP_ACT_PROP_IDX_PORT_ID] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_PORT_ID\",\n+\t[BNXT_ULP_ACT_PROP_IDX_VNIC] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_VNIC\",\n+\t[BNXT_ULP_ACT_PROP_IDX_VPORT] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_VPORT\",\n+\t[BNXT_ULP_ACT_PROP_IDX_MARK] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_MARK\",\n+\t[BNXT_ULP_ACT_PROP_IDX_COUNT] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_COUNT\",\n+\t[BNXT_ULP_ACT_PROP_IDX_METER] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_METER\",\n+\t[BNXT_ULP_ACT_PROP_IDX_SET_MAC_SRC] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_SET_MAC_SRC\",\n+\t[BNXT_ULP_ACT_PROP_IDX_SET_MAC_DST] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_SET_MAC_DST\",\n+\t[BNXT_ULP_ACT_PROP_IDX_PUSH_VLAN] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_PUSH_VLAN\",\n+\t[BNXT_ULP_ACT_PROP_IDX_SET_VLAN_PCP] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_SET_VLAN_PCP\",\n+\t[BNXT_ULP_ACT_PROP_IDX_SET_VLAN_VID] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_SET_VLAN_VID\",\n+\t[BNXT_ULP_ACT_PROP_IDX_SET_IPV4_SRC] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_SET_IPV4_SRC\",\n+\t[BNXT_ULP_ACT_PROP_IDX_SET_IPV4_DST] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_SET_IPV4_DST\",\n+\t[BNXT_ULP_ACT_PROP_IDX_SET_IPV6_SRC] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_SET_IPV6_SRC\",\n+\t[BNXT_ULP_ACT_PROP_IDX_SET_IPV6_DST] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_SET_IPV6_DST\",\n+\t[BNXT_ULP_ACT_PROP_IDX_SET_TP_SRC] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_SET_TP_SRC\",\n+\t[BNXT_ULP_ACT_PROP_IDX_SET_TP_DST] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_SET_TP_DST\",\n+\t[BNXT_ULP_ACT_PROP_IDX_OF_PUSH_MPLS_0] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_OF_PUSH_MPLS_0\",\n+\t[BNXT_ULP_ACT_PROP_IDX_OF_PUSH_MPLS_1] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_OF_PUSH_MPLS_1\",\n+\t[BNXT_ULP_ACT_PROP_IDX_OF_PUSH_MPLS_2] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_OF_PUSH_MPLS_2\",\n+\t[BNXT_ULP_ACT_PROP_IDX_OF_PUSH_MPLS_3] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_OF_PUSH_MPLS_3\",\n+\t[BNXT_ULP_ACT_PROP_IDX_OF_PUSH_MPLS_4] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_OF_PUSH_MPLS_4\",\n+\t[BNXT_ULP_ACT_PROP_IDX_OF_PUSH_MPLS_5] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_OF_PUSH_MPLS_5\",\n+\t[BNXT_ULP_ACT_PROP_IDX_OF_PUSH_MPLS_6] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_OF_PUSH_MPLS_6\",\n+\t[BNXT_ULP_ACT_PROP_IDX_OF_PUSH_MPLS_7] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_OF_PUSH_MPLS_7\",\n+\t[BNXT_ULP_ACT_PROP_IDX_ENCAP_L2_DMAC] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_ENCAP_L2_DMAC\",\n+\t[BNXT_ULP_ACT_PROP_IDX_ENCAP_L2_SMAC] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_ENCAP_L2_SMAC\",\n+\t[BNXT_ULP_ACT_PROP_IDX_ENCAP_VTAG] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_ENCAP_VTAG\",\n+\t[BNXT_ULP_ACT_PROP_IDX_ENCAP_IP] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_ENCAP_IP\",\n+\t[BNXT_ULP_ACT_PROP_IDX_ENCAP_IP_SRC] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_ENCAP_IP_SRC\",\n+\t[BNXT_ULP_ACT_PROP_IDX_ENCAP_UDP] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_ENCAP_UDP\",\n+\t[BNXT_ULP_ACT_PROP_IDX_ENCAP_TUN] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_ENCAP_TUN\",\n+\t[BNXT_ULP_ACT_PROP_IDX_LAST] =\n+\t\t\"BNXT_ULP_ACT_PROP_IDX_LAST\"\n+};\n+\n+const char *bnxt_ulp_flow_matcher_field_mask_opcode_names[] = {\n+\t\"MASK_IGNORE\",\n+\t\"MASK_ANY\",\n+\t\"MASK_EXACT\",\n+\t\"MASK_WC\",\n+\t\"MASK_LAST\",\n+};\n+\n+const char *bnxt_ulp_rte_template_field_names[] = {\n+\t/* Ingress Template 0 */\n+\t\"BNXT_ULP_HF0_SVIF_INDEX\",\n+\t\"BNXT_ULP_HF0_O_ETH_DMAC\",\n+\t\"BNXT_ULP_HF0_O_ETH_SMAC\",\n+\t\"BNXT_ULP_HF0_O_ETH_TYPE\",\n+\t\"BNXT_ULP_HF0_OO_VLAN_CFI_PRI\",\n+\t\"BNXT_ULP_HF0_OO_VLAN_VID\",\n+\t\"BNXT_ULP_HF0_OO_VLAN_TYPE\",\n+\t\"BNXT_ULP_HF0_OI_VLAN_CFI_PRI\",\n+\t\"BNXT_ULP_HF0_OI_VLAN_VID\",\n+\t\"BNXT_ULP_HF0_OI_VLAN_TYPE\",\n+\t\"BNXT_ULP_HF0_O_IPV4_VER\",\n+\t\"BNXT_ULP_HF0_O_IPV4_TOS\",\n+\t\"BNXT_ULP_HF0_O_IPV4_LEN\",\n+\t\"BNXT_ULP_HF0_O_IPV4_FRAG_ID\",\n+\t\"BNXT_ULP_HF0_O_IPV4_FRAG_OFF\",\n+\t\"BNXT_ULP_HF0_O_IPV4_TTL\",\n+\t\"BNXT_ULP_HF0_O_IPV4_NEXT_PID\",\n+\t\"BNXT_ULP_HF0_O_IPV4_CSUM\",\n+\t\"BNXT_ULP_HF0_O_IPV4_SRC_ADDR\",\n+\t\"BNXT_ULP_HF0_O_IPV4_DST_ADDR\",\n+\t\"BNXT_ULP_HF0_O_UDP_SRC_PORT\",\n+\t\"BNXT_ULP_HF0_O_UDP_DST_PORT\",\n+\t\"BNXT_ULP_HF0_O_UDP_LENGTH\",\n+\t\"BNXT_ULP_HF0_O_UDP_CSUM\",\n+\t\"BNXT_ULP_HF0_VXLAN_FLAGS\",\n+\t\"BNXT_ULP_HF0_VXLAN_RSVD0\",\n+\t\"BNXT_ULP_HF0_VXLAN_VNI\",\n+\t\"BNXT_ULP_HF0_VXLAN_RSVD1\",\n+\t\"BNXT_ULP_HF0_I_ETH_DMAC\",\n+\t\"BNXT_ULP_HF0_I_ETH_SMAC\",\n+\t\"BNXT_ULP_HF0_I_ETH_TYPE\",\n+\t\"BNXT_ULP_HF0_IO_VLAN_CFI_PRI\",\n+\t\"BNXT_ULP_HF0_IO_VLAN_VID\",\n+\t\"BNXT_ULP_HF0_IO_VLAN_TYPE\",\n+\t\"BNXT_ULP_HF0_II_VLAN_CFI_PRI\",\n+\t\"BNXT_ULP_HF0_II_VLAN_VID\",\n+\t\"BNXT_ULP_HF0_II_VLAN_TYPE\",\n+\t\"BNXT_ULP_HF0_I_IPV4_VER\",\n+\t\"BNXT_ULP_HF0_I_IPV4_TOS\",\n+\t\"BNXT_ULP_HF0_I_IPV4_LEN\",\n+\t\"BNXT_ULP_HF0_I_IPV4_FRAG_ID\",\n+\t\"BNXT_ULP_HF0_I_IPV4_FRAG_OFF\",\n+\t\"BNXT_ULP_HF0_I_IPV4_TTL\",\n+\t\"BNXT_ULP_HF0_I_IPV4_NEXT_PID\",\n+\t\"BNXT_ULP_HF0_I_IPV4_CSUM\",\n+\t\"BNXT_ULP_HF0_I_IPV4_SRC_ADDR\",\n+\t\"BNXT_ULP_HF0_I_IPV4_DST_ADDR\",\n+\t\"BNXT_ULP_HF0_I_TCP_SRC_PORT\",\n+\t\"BNXT_ULP_HF0_I_TCP_DST_PORT\",\n+\t\"BNXT_ULP_HF0_I_TCP_SENT_SEQ\",\n+\t\"BNXT_ULP_HF0_I_TCP_RECV_ACK\",\n+\t\"BNXT_ULP_HF0_I_TCP_DATA_OFF\",\n+\t\"BNXT_ULP_HF0_I_TCP_TCP_FLAGS\",\n+\t\"BNXT_ULP_HF0_I_TCP_RX_WIN\",\n+\t\"BNXT_ULP_HF0_I_TCP_CSUM\",\n+\t\"BNXT_ULP_HF0_I_TCP_UR\",\n+\n+\t/* Ingress template 1 */\n+\t\"BNXT_ULP_HF1_MPLS_TAG_NUM\",\n+\t\"BNXT_ULP_HF1_O_VTAG_NUM\",\n+\t\"BNXT_ULP_HF1_I_VTAG_NUM\",\n+\t\"BNXT_ULP_HF1_SVIF_INDEX\",\n+\t\"BNXT_ULP_HF1_O_ETH_DMAC\",\n+\t\"BNXT_ULP_HF1_O_ETH_SMAC\",\n+\t\"BNXT_ULP_HF1_O_ETH_TYPE\",\n+\t\"BNXT_ULP_HF1_O_OVLAN_CFI_PRI\",\n+\t\"BNXT_ULP_HF1_O_OVLAN_VID\",\n+\t\"BNXT_ULP_HF1_O_OVLAN_TYPE\",\n+\t\"BNXT_ULP_HF1_O_IVLAN_CFI_PRI\",\n+\t\"BNXT_ULP_HF1_O_IVLAN_VID\",\n+\t\"BNXT_ULP_HF1_O_IVLAN_TYPE\",\n+\t\"BNXT_ULP_HF1_O_IPV4_VER\",\n+\t\"BNXT_ULP_HF1_O_IPV4_TOS\",\n+\t\"BNXT_ULP_HF1_O_IPV4_LEN\",\n+\t\"BNXT_ULP_HF1_O_IPV4_FRAG_ID\",\n+\t\"BNXT_ULP_HF1_O_IPV4_FRAG_OFF\",\n+\t\"BNXT_ULP_HF1_O_IPV4_TTL\",\n+\t\"BNXT_ULP_HF1_O_IPV4_NEXT_PID\",\n+\t\"BNXT_ULP_HF1_O_IPV4_CSUM\",\n+\t\"BNXT_ULP_HF1_O_IPV4_SRC_ADDR\",\n+\t\"BNXT_ULP_HF1_O_IPV4_DST_ADDR\",\n+\t\"BNXT_ULP_HF1_O_UDP_SRC_PORT\",\n+\t\"BNXT_ULP_HF1_O_UDP_DST_PORT\",\n+\t\"BNXT_ULP_HF1_O_UDP_LENGTH\",\n+\t\"BNXT_ULP_HF1_O_UDP_CSUM\",\n+\t\"BNXT_ULP_HF1_VXLAN_FLAGS\",\n+\t\"BNXT_ULP_HF1_VXLAN_RSVD0\",\n+\t\"BNXT_ULP_HF1_VXLAN_VNI\",\n+\t\"BNXT_ULP_HF1_VXLAN_RSVD1\",\n+\t\"BNXT_ULP_HF1_I_ETH_DMAC\",\n+\t\"BNXT_ULP_HF1_I_ETH_SMAC\",\n+\t\"BNXT_ULP_HF1_I_ETH_TYPE\",\n+\t\"BNXT_ULP_HF1_I_OVLAN_CFI_PRI\",\n+\t\"BNXT_ULP_HF1_I_OVLAN_VID\",\n+\t\"BNXT_ULP_HF1_I_OVLAN_TYPE\",\n+\t\"BNXT_ULP_HF1_I_IVLAN_CFI_PRI\",\n+\t\"BNXT_ULP_HF1_I_IVLAN_VID\",\n+\t\"BNXT_ULP_HF1_I_IVLAN_TYPE\",\n+\t\"BNXT_ULP_HF1_I_IPV4_VER\",\n+\t\"BNXT_ULP_HF1_I_IPV4_TOS\",\n+\t\"BNXT_ULP_HF1_I_IPV4_LEN\",\n+\t\"BNXT_ULP_HF1_I_IPV4_FRAG_ID\",\n+\t\"BNXT_ULP_HF1_I_IPV4_FRAG_OFF\",\n+\t\"BNXT_ULP_HF1_I_IPV4_TTL\",\n+\t\"BNXT_ULP_HF1_I_IPV4_NEXT_PID\",\n+\t\"BNXT_ULP_HF1_I_IPV4_CSUM\",\n+\t\"BNXT_ULP_HF1_I_IPV4_SRC_ADDR\",\n+\t\"BNXT_ULP_HF1_I_IPV4_DST_ADDR\",\n+\t\"BNXT_ULP_HF1_I_UDP_SRC_PORT\",\n+\t\"BNXT_ULP_HF1_I_UDP_DST_PORT\",\n+\t\"BNXT_ULP_HF1_I_UDP_UR\",\n+\n+\t/* Egress template 2 */\n+\t\"BNXT_ULP_HF2_MPLS_TAG_NUM\",\n+\t\"BNXT_ULP_HF2_O_VTAG_NUM\",\n+\t\"BNXT_ULP_HF2_I_VTAG_NUM\",\n+\t\"BNXT_ULP_HF2_SVIF_INDEX\",\n+\t\"BNXT_ULP_HF2_O_ETH_DMAC\",\n+\t\"BNXT_ULP_HF2_O_ETH_SMAC\",\n+\t\"BNXT_ULP_HF2_O_ETH_TYPE\",\n+\t\"BNXT_ULP_HF2_O_OVLAN_CFI_PRI\",\n+\t\"BNXT_ULP_HF2_O_OVLAN_VID\",\n+\t\"BNXT_ULP_HF2_O_OVLAN_TYPE\",\n+\t\"BNXT_ULP_HF2_O_IVLAN_CFI_PRI\",\n+\t\"BNXT_ULP_HF2_O_IVLAN_VID\",\n+\t\"BNXT_ULP_HF2_O_IVLAN_TYPE\",\n+\t\"BNXT_ULP_HF2_O_IPV4_VER\",\n+\t\"BNXT_ULP_HF2_O_IPV4_TOS\",\n+\t\"BNXT_ULP_HF2_O_IPV4_LEN\",\n+\t\"BNXT_ULP_HF2_O_IPV4_FRAG_ID\",\n+\t\"BNXT_ULP_HF2_O_IPV4_FRAG_OFF\",\n+\t\"BNXT_ULP_HF2_O_IPV4_TTL\",\n+\t\"BNXT_ULP_HF2_O_IPV4_NEXT_PID\",\n+\t\"BNXT_ULP_HF2_O_IPV4_CSUM\",\n+\t\"BNXT_ULP_HF2_O_IPV4_SRC_ADDR\",\n+\t\"BNXT_ULP_HF2_O_IPV4_DST_ADDR\",\n+\t\"BNXT_ULP_HF2_O_UDP_SRC_PORT\",\n+\t\"BNXT_ULP_HF2_O_UDP_DST_PORT\",\n+\t\"BNXT_ULP_HF2_O_UDP_LENGTH\",\n+\t\"BNXT_ULP_HF2_O_UDP_CSUM\",\n+\t\"BNXT_ULP_HF2_VXLAN_FLAGS\",\n+\t\"BNXT_ULP_HF2_VXLAN_RSVD0\",\n+\t\"BNXT_ULP_HF2_VXLAN_VNI\",\n+\t\"BNXT_ULP_HF2_VXLAN_RSVD1\",\n+\t\"BNXT_ULP_HF2_I_ETH_DMAC\",\n+\t\"BNXT_ULP_HF2_I_ETH_SMAC\",\n+\t\"BNXT_ULP_HF2_I_ETH_TYPE\",\n+\t\"BNXT_ULP_HF2_I_OVLAN_CFI_PRI\",\n+\t\"BNXT_ULP_HF2_I_OVLAN_VID\",\n+\t\"BNXT_ULP_HF2_I_OVLAN_TYPE\",\n+\t\"BNXT_ULP_HF2_I_IVLAN_CFI_PRI\",\n+\t\"BNXT_ULP_HF2_I_IVLAN_VID\",\n+\t\"BNXT_ULP_HF2_I_IVLAN_TYPE\",\n+\t\"BNXT_ULP_HF2_I_IPV4_VER\",\n+\t\"BNXT_ULP_HF2_I_IPV4_TOS\",\n+\t\"BNXT_ULP_HF2_I_IPV4_LEN\",\n+\t\"BNXT_ULP_HF2_I_IPV4_FRAG_ID\",\n+\t\"BNXT_ULP_HF2_I_IPV4_FRAG_OFF\",\n+\t\"BNXT_ULP_HF2_I_IPV4_TTL\",\n+\t\"BNXT_ULP_HF2_I_IPV4_NEXT_PID\",\n+\t\"BNXT_ULP_HF2_I_IPV4_CSUM\",\n+\t\"BNXT_ULP_HF2_I_IPV4_SRC_ADDR\",\n+\t\"BNXT_ULP_HF2_I_IPV4_DST_ADDR\",\n+\t\"BNXT_ULP_HF2_I_UDP_SRC_PORT\",\n+\t\"BNXT_ULP_HF2_I_UDP_DST_PORT\",\n+\t\"BNXT_ULP_HF2_I_UDP_UR\",\n+};\n+\n+#endif /* RTE_LIBRTE_BNXT_TRUFLOW_DEBUG */\n+#endif\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_template_debug_proto.h b/drivers/net/bnxt/tf_ulp/ulp_template_debug_proto.h\nnew file mode 100644\nindex 0000000..6148f58\n--- /dev/null\n+++ b/drivers/net/bnxt/tf_ulp/ulp_template_debug_proto.h\n@@ -0,0 +1,72 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2014-2019 Broadcom\n+ * All rights reserved.\n+ **/\n+\n+#ifndef ULP_TEMPLATE_DEBUG_PROTO_H_\n+#define ULP_TEMPLATE_DEBUG_PROTO_H_\n+\n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+\n+/* Function to dump the rte flow pattern. */\n+void\n+ulp_parser_hdr_info_dump(struct ulp_rte_parser_params\t*params);\n+\n+/* Function to dump the rte flow actions. */\n+void\n+ulp_parser_act_info_dump(struct ulp_rte_parser_params\t*params);\n+\n+/* Function to dump the error field during matching. */\n+void\n+ulp_matcher_act_field_dump(uint32_t\tidx,\n+\t\t\t   uint32_t\tjdx,\n+\t\t\t   uint32_t\tmask_id);\n+\n+/* * Function to dump the blob during the mapper processing. */\n+void\n+ulp_mapper_result_field_dump(const char *name,\n+\t\t\t     struct bnxt_ulp_mapper_result_field_info *fld,\n+\t\t\t     struct ulp_blob *blob,\n+\t\t\t     uint16_t write_idx,\n+\t\t\t     uint8_t *val,\n+\t\t\t     uint32_t field_size);\n+/* Function to dump the blob during the mapper processing. */\n+void\n+ulp_mapper_key_fld_dump(const char *name,\n+\t\t\tstruct bnxt_ulp_mapper_class_key_field_info *fld,\n+\t\t\tstruct ulp_blob *blob,\n+\t\t\tuint8_t *val);\n+/* Function to dump the identifiers during the mapper processing. */\n+void\n+ulp_mapper_ident_field_dump(const char *name,\n+\t\t\t    struct bnxt_ulp_mapper_ident_info *ident,\n+\t\t\t    struct bnxt_ulp_mapper_tbl_info *tbl,\n+\t\t\t    int32_t id);\n+void\n+ulp_mapper_tcam_entry_dump(const char *name,\n+\t\t\t   uint32_t idx,\n+\t\t\t   struct bnxt_ulp_mapper_tbl_info *tbl,\n+\t\t\t   struct ulp_blob *key,\n+\t\t\t   struct ulp_blob *mask,\n+\t\t\t   struct ulp_blob *result);\n+void\n+ulp_mapper_result_dump(const char *name,\n+\t\t       struct bnxt_ulp_mapper_tbl_info *tbl,\n+\t\t       struct ulp_blob *result);\n+\n+void\n+ulp_mapper_act_dump(const char *name,\n+\t\t    struct bnxt_ulp_mapper_tbl_info *tbl,\n+\t\t    struct ulp_blob *data);\n+\n+void\n+ulp_mapper_em_dump(const char *name,\n+\t\t   struct ulp_blob *key,\n+\t\t   struct ulp_blob *data,\n+\t\t   struct tf_insert_em_entry_parms *iparms);\n+\n+void\n+ulp_mapper_blob_dump(struct ulp_blob *blob);\n+\n+#endif /* RTE_LIBRTE_BNXT_TRUFLOW_DEBUG */\n+#endif\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_tf_debug.c b/drivers/net/bnxt/tf_ulp/ulp_tf_debug.c\nnew file mode 100644\nindex 0000000..79a3611\n--- /dev/null\n+++ b/drivers/net/bnxt/tf_ulp/ulp_tf_debug.c\n@@ -0,0 +1,1161 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2014-2019 Broadcom\n+ * All rights reserved.\n+ */\n+\n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+\n+#include \"bnxt.h\"\n+#include <rte_dev.h>\n+#include <rte_ethdev_pci.h>\n+#include \"ulp_tf_debug.h\"\n+#include \"bnxt_tf_common.h\"\n+\n+/* #define TF_EEM_DEBUG */\n+#include \"tf_core.h\"\n+#include \"tf_em.h\"\n+#include \"tf_msg.h\"\n+#include \"tfp.h\"\n+#include \"tf_ext_flow_handle.h\"\n+\n+#include \"ulp_port_db.h\"\n+\n+/* Enable EEM table dump. */\n+#define TF_EEM_DUMP\n+\n+#if 0 // def TF_EEM_DEBUG\n+static void dump_raw(uint8_t *data, uint32_t size, const char *msg)\n+{\n+\tuint32_t i;\n+\tuint8_t lbuffer[1024];\n+\tuint8_t *lbuffer_ptr = lbuffer;\n+\tint32_t\tret, amt;\n+\n+\tamt = sizeof(lbuffer) - 1;\n+\n+\tmemset(lbuffer, 0, sizeof(lbuffer));\n+\n+\tret = snprintf((char *)lbuffer_ptr, amt, \"\\n%15s:\\n\", msg);\n+\tif (ret >= amt)\n+\t\tgoto printit;\n+\tlbuffer_ptr += ret;\n+\tamt -= ret;\n+\n+\tfor (i = 0; i < (size / 4); i++) {\n+\t\tret = snprintf((char *)lbuffer_ptr, amt, \"+-------\");\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tlbuffer_ptr += ret;\n+\t\tamt -= ret;\n+\t}\n+\n+\tret = snprintf((char *)lbuffer_ptr, amt, \"\\n\");\n+\tif (ret >= amt)\n+\t\tgoto printit;\n+\tlbuffer_ptr += ret;\n+\tamt -= ret;\n+\n+\tfor (i = 0; i < size; i++) {\n+\t\tret = snprintf((char *)lbuffer_ptr, amt, \"%02x\", *data);\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tlbuffer_ptr += ret;\n+\t\tamt -= ret;\n+\t\tdata++;\n+\t}\n+\n+\tsnprintf((char *)lbuffer_ptr, amt, \"\\n\");\n+printit:\n+\tBNXT_TF_DBG(DEBUG, \"%s\", lbuffer);\n+}\n+#endif\n+\n+#if 0 //def TF_EEM_DUMP\n+/************************ DEBBUG *******************************/\n+enum {B_TE, B_RE, B_RXP, B_A0, B_A1, B_C0, B_C1, B_C2, B_ALL };\n+\n+enum {P_LOW, P_HIGH, P_OUT, P_IN, P_INTDIS,\n+\tP_INTEN, P_APE, P_CHIMP, P_NORMAL,\n+\tP_SHARE, P_PORT, P_PF, P_VF };\n+\n+#define STR_CMD_SIZE 32\n+#define KEY_ENTRY_SIZE 64\n+#define EAR_RECORD_SIZE 16\n+#define MAX_BUF_SIZE 1024\n+\n+/*\n+ * Keep a selection of action record pointers to display action records.\n+ * The actual number of action records could be huge and detecting a\n+ * valid action record in memory is not easy so we since this code is\n+ * just a debug facility we keep just a small number.\n+ */\n+#define TF_MAX_ACT_REC_PTRS 256\n+struct tf_act_rec_ref {\n+\tuint32_t ptr;\n+\tuint32_t size;\n+};\n+\n+static struct tf_act_rec_ref act_rec_data[TF_DIR_MAX][TF_MAX_ACT_REC_PTRS];\n+static uint32_t act_rec_counts[TF_DIR_MAX];\n+\n+static int cdbg_cfa_eem_host_key_decode(int dir,\n+\t\t\t\t\tuint32_t index,\n+\t\t\t\t\tuint8_t *eem_buf);\n+static uint32_t getbits(uint32_t *data, int offset, int blen);\n+\n+static void eem_decode_hdr(uint32_t type)\n+{\n+\tuint8_t lbuffer[1024];\n+\tuint8_t *lbuffer_ptr = lbuffer;\n+\tint32_t\tret, amt;\n+\n+\tamt = sizeof(lbuffer) - 1;\n+\n+\tmemset(lbuffer, 0, sizeof(lbuffer));\n+\n+\tswitch (type) {\n+\tcase 0:\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"\\n\\n=============== EEM KEY0 TABLE ============\"\n+\t\t\t       \"==========================\\n\");\n+\t\tbreak;\n+\tcase 1:\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"\\n\\n=============== EEM KEY1 TABLE ============\"\n+\t\t\t       \"==========================\\n\");\n+\t\tbreak;\n+\tcase 2:\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"\\n\\n=============== EEM RECORD TABLE ==========\"\n+\t\t\t       \"============================\\n\");\n+\t\tbreak;\n+\tcase 3:\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"\\n\\n=============== EEM EFC TABLE =============\"\n+\t\t\t       \"=========================\\n\");\n+\t\tbreak;\n+\t}\n+\n+\tif (ret >= amt)\n+\t\tgoto printit;\n+\tif (ret > 0) {\n+\t\tlbuffer_ptr += ret;\n+\t\tamt -= ret;\n+\t}\n+\n+\tswitch (type) {\n+\tcase 0:\n+\tcase 1:\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"          |  |  |     |     | Act| ext|\"\n+\t\t\t       \"      Act|     |    |\\n\");\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"          |  |  | KEY | Rec | Rec| flw|\"\n+\t\t\t       \"      Rec|  EM | EM | EM\\n\");\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"      id V| C| S| Size| Size| int| ctr|\"\n+\t\t\t       \"      Ptr| Prof| Msk| KEY\\n\");\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"======== =|==|==|=====|=====|====|====|\"\n+\t\t\t       \"=========|=====|====|=============\\n\");\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\t\tbreak;\n+\tcase 2:\n+\tcase 3:\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"Only showing first %d action records\\n\",\n+\t\t\t       TF_MAX_ACT_REC_PTRS);\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"         |    |   |   |    |vnic |    |\"\n+\t\t\t       \"   TTL   |Meter|      \"\n+\t\t\t       \"NAT          |  Encap  |  TCP   | Flow|\"\n+\t\t\t       \"  |   |   |Flow\\n\");\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \" Offset  |Drop|Mrr|Mtr|VLAN|vport|Dcap|\"\n+\t\t\t       \"TD D TR R| Ptr |SPort \"\n+\t\t\t       \"SIP Dport DIP|int  Ptr |Ma Mi Ke|e  Fl|\"\n+\t\t\t       \"Rt|Agg|Age| Id\\n\");\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"======== |====|===|===|====|=====|====\"\n+\t\t\t       \"|== = == =|=====|===== \"\n+\t\t\t       \"=== ===== ===|=== =====|== == ==|== ==\"\n+\t\t\t       \"|==|===|===|====\\n\");\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\n+\t\tbreak;\n+\t}\n+printit:\n+\tBNXT_TF_DBG(DEBUG, \"%s\", lbuffer);\n+}\n+\n+static uint32_t getbits(uint32_t *data, int offset, int blen)\n+{\n+\tint start = offset >> 5;\n+\tint end = (offset + blen - 1) >> 5;\n+\tuint32_t val = data[start] >> (offset & 0x1f);\n+\n+\tif (start != end)\n+\t\tval |= (data[start + 1] << (32 - (offset & 0x1f)));\n+\treturn (blen == 32) ? val : (val & ((1 << blen) - 1));\n+}\n+\n+static int cdbg_cfa_eem_host_key_decode(int dir,\n+\t\t\t\t\tuint32_t index,\n+\t\t\t\t\tuint8_t *eem_buf)\n+{\n+\tstatic const char * const strength[] = { \"Lo\", \"M1\", \"M2\", \"Hi\" };\n+\tuint32_t valid, cache, internal_act_rec, external_fc;\n+\tuint32_t key_size_bits, record_size_bytes, profile_id;\n+\tuint32_t *eem_buf_ptr = (uint32_t *)eem_buf;\n+\tuint32_t key_id, em_mask;\n+\tuint64_t act_record_ptr;\n+\tchar lbuffer[2048];\n+\tchar *lbuffer_ptr = lbuffer;\n+\tint32_t\tamt;\n+\tint ret = 0;\n+\n+\tamt = sizeof(lbuffer) - 1;\n+\n+\tmemset(lbuffer, 0, sizeof(lbuffer));\n+\tret = snprintf((char *)lbuffer_ptr, amt, \"\\n\");\n+\tif (ret >= amt)\n+\t\tgoto printit;\n+\tif (ret > 0) {\n+\t\tlbuffer_ptr += ret;\n+\t\tamt -= ret;\n+\t}\n+\n+#ifdef TF_EEM_DEBUG\n+\tint i;\n+\n+\tfor (i = 0; i < 64; i += 4) {\n+\t\tif (eem_buf[i] != 0 ||\n+\t\t    eem_buf[i + 1] != 0 ||\n+\t\t    eem_buf[i + 2] != 0 ||\n+\t\t    eem_buf[i + 3] != 0)\n+\t\t\tbreak;\n+\t}\n+\n+\tif (i >= 64)\n+\t\treturn 0;\n+\n+\tfor (i = 0; i < 64; i++) {\n+\t\tret = snprintf((char *)lbuffer_ptr, amt, \"%02x\", eem_buf[i]);\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\t}\n+\tret = snprintf((char *)lbuffer_ptr, amt, \"\\n\");\n+\tif (ret >= amt)\n+\t\tgoto printit;\n+\tif (ret > 0) {\n+\t\tlbuffer_ptr += ret;\n+\t\tamt -= ret;\n+\t}\n+\n+\tfor (i = 63; i >= 0; i--) {\n+\t\tret = snprintf((char *)lbuffer_ptr, amt, \"%02x\", eem_buf[i]);\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\t}\n+\tret = snprintf((char *)lbuffer_ptr, amt, \"\\n\");\n+\tif (ret >= amt)\n+\t\tgoto printit;\n+\tif (ret > 0) {\n+\t\tlbuffer_ptr += ret;\n+\t\tamt -= ret;\n+\t}\n+#endif\n+\n+\tvalid = getbits(eem_buf_ptr, 511, 1);\n+\tif (!valid)\n+\t\treturn 0;\n+\n+\tcache = getbits(eem_buf_ptr, 510, 1);\n+\n+\tkey_size_bits = getbits(eem_buf_ptr, 488, 9);\n+\trecord_size_bytes = (getbits(eem_buf_ptr, 483, 5) + 1) * 16;\n+\tinternal_act_rec = getbits(eem_buf_ptr, 482, 1);\n+\texternal_fc = getbits(eem_buf_ptr, 481, 1);\n+\tact_record_ptr = getbits(eem_buf_ptr, 448, 32) +\n+\t\t((uint64_t)getbits(eem_buf_ptr, 480, 1) << 32);\n+\n+\tif (!internal_act_rec) {\n+\t\tif (act_rec_counts[dir] < TF_MAX_ACT_REC_PTRS) {\n+\t\t\tact_rec_data[dir][act_rec_counts[dir]].ptr =\n+\t\t\t\tact_record_ptr << 4;\n+\t\t\tact_rec_data[dir][act_rec_counts[dir]].size =\n+\t\t\t\trecord_size_bytes;\n+\t\t\tact_rec_counts[dir]++;\n+\t\t}\n+\t}\n+\tprofile_id = getbits(eem_buf_ptr, 440, 8);\n+\n+\tif (key_size_bits == 197)\n+\t\tkey_id = 21; /* Matches example flow create in DPDK */\n+\telse if (key_size_bits == 173)\n+\t\tkey_id = 3;\n+\telse if (key_size_bits == 109)\n+\t\tkey_id = 2;\n+\telse\n+\t\tkey_id = 21;\n+\n+\tem_mask = 0;\n+\n+\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t       \"%08x %x  %x %s  %4d  %4d    %x\"\n+\t\t       \"    %x %p    %d    %d\",\n+\t\t       index,\n+\t\t       valid,\n+\t\t       cache,\n+\t\t       strength[getbits(eem_buf_ptr, 508, 2)],\n+\t\t       key_size_bits,\n+\t\t       record_size_bytes,\n+\t\t       internal_act_rec,\n+\t\t       external_fc,\n+\t\t       (void *)((uintptr_t)act_record_ptr),\n+\t\t       profile_id,\n+\t\t       em_mask);\n+\n+\tif (ret >= amt)\n+\t\tgoto printit;\n+\tif (ret > 0) {\n+\t\tlbuffer_ptr += ret;\n+\t\tamt -= ret;\n+\t}\n+\n+\tswitch (key_id) {\n+\tcase 0:\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"  parif-%x svif-%x dst-%02x:%02x:%02x:\"\n+\t\t\t       \"%02x:%02x:%02x iv-%x etype-%x cos-%x\\n\\n\",\n+\t\t\t       getbits(eem_buf_ptr, 430, 4),\n+\t\t\t       getbits(eem_buf_ptr, 426, 8),\n+\t\t\t       getbits(eem_buf_ptr, 418, 8),\n+\t\t\t       getbits(eem_buf_ptr, 410, 8),\n+\t\t\t       getbits(eem_buf_ptr, 402, 8),\n+\t\t\t       getbits(eem_buf_ptr, 394, 8),\n+\t\t\t       getbits(eem_buf_ptr, 386, 8),\n+\t\t\t       getbits(eem_buf_ptr, 374, 12),\n+\t\t\t       getbits(eem_buf_ptr, 358, 16),\n+\t\t\t       getbits(eem_buf_ptr, 355, 3),\n+\t\t\t       0);\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\t\tbreak;\n+\tcase 1:\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"  parif-%x svif-%2x dst-%02x%02x:%02x%02x:\"\n+\t\t\t       \"%02x%02x src-%02x%02x:%02x%02x:%02x%02x\\n\",\n+\t\t\t       getbits(eem_buf_ptr, 430, 4),\n+\t\t\t       getbits(eem_buf_ptr, 426, 8),\n+\t\t\t       getbits(eem_buf_ptr, 418, 8),\n+\t\t\t       getbits(eem_buf_ptr, 410, 8), /* dst */\n+\t\t\t       getbits(eem_buf_ptr, 402, 8),\n+\t\t\t       getbits(eem_buf_ptr, 394, 8),\n+\t\t\t       getbits(eem_buf_ptr, 386, 8), /* dst */\n+\t\t\t       getbits(eem_buf_ptr, 378, 8),\n+\t\t\t       getbits(eem_buf_ptr, 370, 8),\n+\t\t\t       getbits(eem_buf_ptr, 362, 8), /* src */\n+\t\t\t       getbits(eem_buf_ptr, 354, 8),\n+\t\t\t       getbits(eem_buf_ptr, 346, 8),\n+\t\t\t       getbits(eem_buf_ptr, 334, 8), /* src */\n+\t\t\t       getbits(eem_buf_ptr, 326, 8)\n+\t\t\t      );\n+\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"                      ov-%x iv-%x etype-%x\"\n+\t\t\t       \" dip-%x.%x.%x.%x proto:%x cos:%x\\n\\n\",\n+\t\t\t       getbits(eem_buf_ptr, 322, 12),\n+\t\t\t       getbits(eem_buf_ptr, 310, 12),\n+\t\t\t       getbits(eem_buf_ptr, 294, 16), /* ov iv etype */\n+\t\t\t       getbits(eem_buf_ptr, 286, 8),\n+\t\t\t       getbits(eem_buf_ptr, 278, 8),\n+\t\t\t       getbits(eem_buf_ptr, 270, 8),\n+\t\t\t       getbits(eem_buf_ptr, 262, 8), /* l3_dst */\n+\t\t\t       getbits(eem_buf_ptr, 254, 8),\n+\t\t\t       getbits(eem_buf_ptr, 251, 3) /* l3_pro, l_cos */\n+\t\t\t      );\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\t\tbreak;\n+\tcase 2:\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"  ctx-%x sip-%02x.%02x.%02x.%02x\",\n+\t\t\t       getbits(eem_buf_ptr, 430, 10),\n+\t\t\t       getbits(eem_buf_ptr, 422, 8), /* SIP */\n+\t\t\t       getbits(eem_buf_ptr, 414, 8),\n+\t\t\t       getbits(eem_buf_ptr, 406, 8),\n+\t\t\t       getbits(eem_buf_ptr, 398, 8)\n+\t\t\t      );\n+\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \" dip-%02x.%02x.%02x.%02x prot-%x dport-%x\"\n+\t\t\t       \" cos-%x\\n\\n\",\n+\t\t\t       getbits(eem_buf_ptr, 390, 8), /* DIP */\n+\t\t\t       getbits(eem_buf_ptr, 382, 8),\n+\t\t\t       getbits(eem_buf_ptr, 374, 8),\n+\t\t\t       getbits(eem_buf_ptr, 366, 8),\n+\t\t\t       getbits(eem_buf_ptr, 358, 8), /* L3 Proto */\n+\t\t\t       getbits(eem_buf_ptr, 342, 16),/* L4 Dest */\n+\t\t\t       getbits(eem_buf_ptr, 339, 3)  /* COS */\n+\t\t\t      );\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\t\tbreak;\n+\tcase 3:\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"  ctx-%x smac-%02x:%02x:%02x:%02x:%02x:\"\n+\t\t\t       \"%02x sip-%02x.%02x.%02x.%02x\",\n+\t\t\t       getbits(eem_buf_ptr, 430, 10),\n+\t\t\t       getbits(eem_buf_ptr, 422, 8), /* SMAC */\n+\t\t\t       getbits(eem_buf_ptr, 414, 8),\n+\t\t\t       getbits(eem_buf_ptr, 406, 8),\n+\t\t\t       getbits(eem_buf_ptr, 398, 8),\n+\t\t\t       getbits(eem_buf_ptr, 390, 8),\n+\t\t\t       getbits(eem_buf_ptr, 382, 8),\n+\t\t\t       getbits(eem_buf_ptr, 374, 8), /* SIP */\n+\t\t\t       getbits(eem_buf_ptr, 366, 8),\n+\t\t\t       getbits(eem_buf_ptr, 358, 8),\n+\t\t\t       getbits(eem_buf_ptr, 350, 8)\n+\t\t\t      );\n+\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \" dip-%02x.%02x.%02x.%02x prot-%x sport-%x\"\n+\t\t\t       \" dport-%x cos-%x\\n\\n\",\n+\t\t\t       getbits(eem_buf_ptr, 342, 8), /* DIP */\n+\t\t\t       getbits(eem_buf_ptr, 334, 8),\n+\t\t\t       getbits(eem_buf_ptr, 326, 8),\n+\t\t\t       getbits(eem_buf_ptr, 318, 8),\n+\t\t\t       getbits(eem_buf_ptr, 310, 8), /* L3 Proto */\n+\t\t\t       getbits(eem_buf_ptr, 294, 16),/* L4 Scr */\n+\t\t\t       getbits(eem_buf_ptr, 278, 16),/* L4 Dest */\n+\t\t\t       getbits(eem_buf_ptr, 275, 3)  /*  COS */\n+\t\t\t      );\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\t\tbreak;\n+\tcase 4:\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"  ctx-%x dmac-%02x:%02x:%02x:%02x:%02x:%02x\"\n+\t\t\t       \" dip-%02x.%02x.%02x.%02x\",\n+\t\t\t       getbits(eem_buf_ptr, 430, 10),\n+\t\t\t       getbits(eem_buf_ptr, 422, 8),\n+\t\t\t       getbits(eem_buf_ptr, 414, 8),\n+\t\t\t       getbits(eem_buf_ptr, 406, 8), /* src */\n+\t\t\t       getbits(eem_buf_ptr, 398, 8),\n+\t\t\t       getbits(eem_buf_ptr, 390, 8),\n+\t\t\t       getbits(eem_buf_ptr, 382, 8), /* src */\n+\t\t\t       getbits(eem_buf_ptr, 374, 8),\n+\t\t\t       getbits(eem_buf_ptr, 366, 8),\n+\t\t\t       getbits(eem_buf_ptr, 358, 8),\n+\t\t\t       getbits(eem_buf_ptr, 350, 8) /* l3_dst */\n+\t\t\t      );\n+\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \" dip-%02x.%02x.%02x.%02x prot-%x sport-%x\"\n+\t\t\t       \" dport-%x cos-%x\\n\\n\",\n+\t\t\t       getbits(eem_buf_ptr, 342, 8),\n+\t\t\t       getbits(eem_buf_ptr, 334, 8),\n+\t\t\t       getbits(eem_buf_ptr, 326, 8),\n+\t\t\t       getbits(eem_buf_ptr, 318, 8), /* l3_dst */\n+\t\t\t       getbits(eem_buf_ptr, 310, 8),\n+\t\t\t       getbits(eem_buf_ptr, 294, 16),\n+\t\t\t       getbits(eem_buf_ptr, 278, 16),\n+\t\t\t       getbits(eem_buf_ptr, 275, 3)  /*\n+\t\t\t\t\t\t\t      * l3_pro,l4_src,\n+\t\t\t\t\t\t\t      * l4_dst,l_cos\n+\t\t\t\t\t\t\t      */\n+\t\t\t      );\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\t\tbreak;\n+\tcase 7:\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"  ctx-%x dst-%02x%02x:%02x%02x:%02x%02x \"\n+\t\t\t       \"src-%02x%02x:%02x%02x:%02x%02x\\n\",\n+\t\t\t       getbits(eem_buf_ptr, 430, 10),\n+\t\t\t       getbits(eem_buf_ptr, 420, 8),\n+\t\t\t       getbits(eem_buf_ptr, 412, 8),\n+\t\t\t       getbits(eem_buf_ptr, 404, 8), /* dst */\n+\t\t\t       getbits(eem_buf_ptr, 396, 8),\n+\t\t\t       getbits(eem_buf_ptr, 388, 8),\n+\t\t\t       getbits(eem_buf_ptr, 380, 8), /* dst */\n+\t\t\t       getbits(eem_buf_ptr, 372, 8),\n+\t\t\t       getbits(eem_buf_ptr, 364, 8),\n+\t\t\t       getbits(eem_buf_ptr, 356, 8), /* src */\n+\t\t\t       getbits(eem_buf_ptr, 348, 8),\n+\t\t\t       getbits(eem_buf_ptr, 340, 8),\n+\t\t\t       getbits(eem_buf_ptr, 328, 8)  /* src */\n+\t\t\t      );\n+\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \" sip-%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\"\n+\t\t\t       \" dip-%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\\n\",\n+\t\t\t       getbits(eem_buf_ptr, 312, 16),\n+\t\t\t       getbits(eem_buf_ptr, 296, 16),\n+\t\t\t       getbits(eem_buf_ptr, 280, 16), /* l3_src_v6 */\n+\t\t\t       getbits(eem_buf_ptr, 264, 16),\n+\t\t\t       getbits(eem_buf_ptr, 248, 16),\n+\t\t\t       getbits(eem_buf_ptr, 232, 16), /* l3_src_v6 */\n+\t\t\t       getbits(eem_buf_ptr, 372, 16),\n+\t\t\t       getbits(eem_buf_ptr, 364, 16),\n+\t\t\t       getbits(eem_buf_ptr, 356, 16), /* l3_dst_v6 */\n+\t\t\t       getbits(eem_buf_ptr, 348, 16),\n+\t\t\t       getbits(eem_buf_ptr, 340, 16),\n+\t\t\t       getbits(eem_buf_ptr, 328, 16),  /* l3_dst_v6 */\n+\t\t\t       getbits(eem_buf_ptr, 328, 16),\n+\t\t\t       getbits(eem_buf_ptr, 328, 16),\n+\t\t\t       getbits(eem_buf_ptr, 328, 16),\n+\t\t\t       getbits(eem_buf_ptr, 328, 16)\n+\t\t\t      );\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\t\tbreak;\n+\tcase 12:\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"  ctx-%x dst-%02x:%02x:%02x:%02x:%02x:%02x\"\n+\t\t\t       \" iv-%x etype-%x cos-%x\\n\\n\",\n+\t\t\t       getbits(eem_buf_ptr, 430, 10),\n+\t\t\t       getbits(eem_buf_ptr, 422, 8),\n+\t\t\t       getbits(eem_buf_ptr, 414, 8),\n+\t\t\t       getbits(eem_buf_ptr, 406, 8),\n+\t\t\t       getbits(eem_buf_ptr, 398, 8),\n+\t\t\t       getbits(eem_buf_ptr, 390, 8),\n+\t\t\t       getbits(eem_buf_ptr, 382, 8),\n+\t\t\t       getbits(eem_buf_ptr, 370, 12),\n+\t\t\t       getbits(eem_buf_ptr, 354, 16),\n+\t\t\t       getbits(eem_buf_ptr, 351, 3)\n+\t\t\t      );\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\t\tbreak;\n+\tcase 21:\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"  ctx-%x tid-%x smac-%02x:%02x:%02x:%02x:\"\n+\t\t\t       \"%02x:%02x\",\n+\t\t\t       getbits(eem_buf_ptr, 430, 10),\n+\t\t\t       getbits(eem_buf_ptr, 406, 24), /* ctx, tid */\n+\t\t\t       getbits(eem_buf_ptr, 398, 8),\n+\t\t\t       getbits(eem_buf_ptr, 390, 8),\n+\t\t\t       getbits(eem_buf_ptr, 382, 8), /* src */\n+\t\t\t       getbits(eem_buf_ptr, 374, 8),\n+\t\t\t       getbits(eem_buf_ptr, 366, 8),\n+\t\t\t       getbits(eem_buf_ptr, 358, 8)  /* src */\n+\t\t\t      );\n+\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \" sip-%02x.%02x.%02x.%02x dip-%02x.%02x.\"\n+\t\t\t       \"%02x.%02x prot-%x sport-%x dport-%x cos-%x\\n\\n\",\n+\t\t\t       getbits(eem_buf_ptr, 350, 8),\n+\t\t\t       getbits(eem_buf_ptr, 342, 8),\n+\t\t\t       getbits(eem_buf_ptr, 334, 8),\n+\t\t\t       getbits(eem_buf_ptr, 326, 8), /* l3_src */\n+\t\t\t       getbits(eem_buf_ptr, 318, 8),\n+\t\t\t       getbits(eem_buf_ptr, 310, 8),\n+\t\t\t       getbits(eem_buf_ptr, 302, 8),\n+\t\t\t       getbits(eem_buf_ptr, 294, 8), /* l3_dst */\n+\t\t\t       getbits(eem_buf_ptr, 286, 8),\n+\t\t\t       getbits(eem_buf_ptr, 270, 16),\n+\t\t\t       getbits(eem_buf_ptr, 254, 16),\n+\t\t\t       getbits(eem_buf_ptr, 251, 3)\n+\t\t\t      );\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\t\tbreak;\n+\n+\tdefault:\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \" doesn't support yet\\n\\n\");\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\t\tbreak;\n+\t}\n+\n+printit:\n+\tPMD_DRV_LOG(DEBUG, \"%s\", lbuffer);\n+\n+\treturn 1;\n+}\n+\n+\n+static int cdbg_cfa_eem_host_record_decode(uint32_t index,\n+\t\t\t\t\t   uint8_t *eem_buf)\n+{\n+\tuint32_t *data = (uint32_t *)eem_buf;\n+\tuint8_t lbuffer[2048];\n+\tuint8_t *lbuffer_ptr = lbuffer;\n+\tuint8_t count_enable;\n+\tuint8_t count_type;\n+\tint32_t ret, amt;\n+\tint j;\n+\n+\tamt = sizeof(lbuffer) - 1;\n+\n+\tmemset(lbuffer, 0, sizeof(lbuffer));\n+\tret = snprintf((char *)lbuffer_ptr, amt, \"\\n\");\n+\tif (ret >= amt)\n+\t\tgoto printit;\n+\tif (ret > 0) {\n+\t\tlbuffer_ptr += ret;\n+\t\tamt -= ret;\n+\t}\n+\n+\tfor (j = 0; j < 4; j++) {\n+\t\tif (data[j] != 0)\n+\t\t\tbreak;\n+\t}\n+\n+\tif (j >= 4)\n+\t\treturn 0;\n+\n+#ifdef TF_EEM_DEBUG\n+\tfor (j = 0; j < 16; j += 4) {\n+\t\tret = snprintf((char *)lbuffer_ptr, amt, \"%02x%02x%02x%02x\",\n+\t\t\t       eem_buf[j],\n+\t\t\t       eem_buf[j + 1],\n+\t\t\t       eem_buf[j + 2],\n+\t\t\t       eem_buf[j + 3]);\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\t}\n+\tret = snprintf((char *)lbuffer_ptr, amt, \"\\n\");\n+\tif (ret >= amt)\n+\t\tgoto printit;\n+\tif (ret > 0) {\n+\t\tlbuffer_ptr += ret;\n+\t\tamt -= ret;\n+\t}\n+\tfor (j = 0; j < 4; j++) {\n+\t\tret = snprintf((char *)lbuffer_ptr, amt, \"%08x\", data[j]);\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\t}\n+\tret = snprintf((char *)lbuffer_ptr, amt, \"\\n\");\n+\tif (ret >= amt)\n+\t\tgoto printit;\n+\tif (ret > 0) {\n+\t\tlbuffer_ptr += ret;\n+\t\tamt -= ret;\n+\t}\n+#endif\n+\n+\tcount_type = getbits(data, 17, 1);\n+\tcount_enable = getbits(data, 18, 1);\n+\n+\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t       \"%8x     %d  %d   %d    %d   %3x   %2x   \"\n+\t\t       \"%d %d  %d %d  %3x   %4x %3x  %4x %3x   \"\n+\t\t       \"%d   %3x  %d  %d %2x  %d  %d  %d  %d   %d %4x %p\\n\",\n+\t\t       index,\n+\t\t       getbits(data, 127, 1),\n+\t\t       getbits(data, 125, 2),\n+\t\t       getbits(data, 124, 1),\n+\t\t       getbits(data, 123, 1),\n+\t\t       getbits(data, 111, 12),\n+\t\t       getbits(data, 107, 4),\n+\t\t       getbits(data, 106, 1),\n+\t\t       getbits(data, 105, 1),\n+\t\t       getbits(data, 104, 1),\n+\t\t       getbits(data, 103, 1),\n+\t\t       getbits(data, 93, 10),\n+\t\t       getbits(data, 77, 16),\n+\t\t       getbits(data, 67, 10),\n+\t\t       getbits(data, 51, 16),\n+\t\t       getbits(data, 41, 10),\n+\t\t       getbits(data, 40, 1),\n+\t\t       getbits(data, 29, 11),\n+\t\t       getbits(data, 28, 1),\n+\t\t       getbits(data, 27, 1),\n+\t\t       getbits(data, 19, 8),\n+\t\t       getbits(data, 18, 1),\n+\t\t       getbits(data, 17, 1),\n+\t\t       getbits(data, 16, 1),\n+\t\t       getbits(data, 15, 1),\n+\t\t       getbits(data, 14, 1),\n+\t\t       getbits(data, 0, 14),\n+\t\t       data);\n+\tif (ret >= amt)\n+\t\tgoto printit;\n+\tif (ret > 0) {\n+\t\tlbuffer_ptr += ret;\n+\t\tamt -= ret;\n+\t}\n+\n+\tif (count_type == 1 && count_enable == 1) {\n+\t\tuint32_t ch;\n+\t\tuint32_t cl;\n+\t\tuint32_t *ptr;\n+\n+\t\tdata += 4;\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"EFC: ByteCntPtr:0x%x PktCntPtr:0x%x \",\n+\t\t\t       *((uint32_t *)data),\n+\t\t\t       *((uint32_t *)(data + 1)));\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\n+\t\tptr = data + ((((*data & 0xffff) << 3)) / 4) - 4;\n+\t\tcl = *ptr;\n+\t\tch = *(ptr + 1);\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"B:0x%08x%08x \", ch, cl);\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\n+\t\tptr = data + ((((*(data + 1) & 0xffff) << 3)) / 4) - 4;\n+\t\tcl = *ptr;\n+\t\tch = *(ptr + 1);\n+\t\tret = snprintf((char *)lbuffer_ptr, amt,\n+\t\t\t       \"P:0x%08x%08x\\n\", ch, cl);\n+\t\tif (ret >= amt)\n+\t\t\tgoto printit;\n+\t\tif (ret > 0) {\n+\t\t\tlbuffer_ptr += ret;\n+\t\t\tamt -= ret;\n+\t\t}\n+\t}\n+\n+printit:\n+\tPMD_DRV_LOG(DEBUG, \"%s\", lbuffer);\n+\n+\treturn 0;\n+}\n+\n+static\n+void tf_diag_dump_table(struct tf_tbl_scope_cb *tbl_scope_cb,\n+\t\t\tstruct tf_em_ctx_mem_info *eem_ctx_info)\n+{\n+\tuint32_t key0_count = 0;\n+\tuint32_t key1_count = 0;\n+\tuint32_t num_entries;\n+\tuint32_t entry_size;\n+\tuint8_t *eem_entry;\n+\tuint8_t *table;\n+\tuint32_t offset;\n+\tint dir = 0;\n+\tuint32_t i;\n+\n+\tact_rec_counts[TF_DIR_TX] = 0;\n+\tact_rec_counts[TF_DIR_RX] = 0;\n+\n+\tfor (dir = 0; dir < 2; dir++) {\n+\t\tnum_entries =\n+\t\t\teem_ctx_info[dir].em_tables[KEY0_TABLE].num_entries;\n+\t\tPMD_DRV_LOG(DEBUG, \"\\n\\n\");\n+\t\tPMD_DRV_LOG(DEBUG, \"\\n>>>>>>>>>>>>>>> Dir:%s <<<<<<<<<<<<\\n\",\n+\t\t\t    (dir == TF_DIR_TX ? \"Tx\" : \"Rx\"));\n+\n+\t\tentry_size = 64;\n+\t\ttable = tf_em_get_table_page(tbl_scope_cb,\n+\t\t\t\t\t     dir,\n+\t\t\t\t\t     0,\n+\t\t\t\t\t     KEY0_TABLE);\n+\t\tif (table == NULL) {\n+\t\t\tPMD_DRV_LOG(DEBUG, \"EEM Not configured\\n\");\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\teem_decode_hdr(KEY0_TABLE);\n+\n+\t\tfor (i = 0, offset = 0; i < num_entries; i++) {\n+\t\t\tif ((offset % TF_EM_PAGE_SIZE) == 0) {\n+\t\t\t\ttable =\n+\t\t\t\t\ttf_em_get_table_page(tbl_scope_cb,\n+\t\t\t\t\t\t\t     dir,\n+\t\t\t\t\t\t\t     offset,\n+\t\t\t\t\t\t\t     KEY0_TABLE);\n+#ifdef TF_EEM_DUMP_DEBUG\n+\t\t\t\tPMD_DRV_LOG(DEBUG,\n+\t\t\t\t\t    \"----- Page:%d %p -----\\n\",\n+\t\t\t\t\t    (offset / TF_EM_PAGE_SIZE),\n+\t\t\t\t\t    table);\n+#endif\n+\t\t\t}\n+\n+\t\t\teem_entry = table + (offset % TF_EM_PAGE_SIZE);\n+\n+\t\t\tif (cdbg_cfa_eem_host_key_decode(dir,\n+\t\t\t\t\t\t\t i,\n+\t\t\t\t\t\t\t eem_entry)) {\n+#ifdef TF_EEM_DUMP_DEBUG\n+\t\t\t\tPMD_DRV_LOG(DEBUG, \"Page:%p entry:%p\"\n+\t\t\t\t\t    \" offset:0x%x\"\n+\t\t\t\t\t    \" page-offset:0x%x\\n\",\n+\t\t\t\t\t    table,\n+\t\t\t\t\t    eem_entry,\n+\t\t\t\t\t    offset,\n+\t\t\t\t\t    (offset % TF_EM_PAGE_SIZE));\n+#endif\n+\t\t\t\tkey0_count++;\n+\t\t\t}\n+\n+\t\t\toffset += entry_size;\n+\t\t}\n+\n+\t\teem_decode_hdr(KEY1_TABLE);\n+\t\ttable = tf_em_get_table_page(tbl_scope_cb,\n+\t\t\t\t\t     dir,\n+\t\t\t\t\t     0,\n+\t\t\t\t\t     KEY1_TABLE);\n+\n+\t\tfor (i = 0, offset = 0; i < num_entries; i++) {\n+\t\t\tif ((offset % TF_EM_PAGE_SIZE) == 0) {\n+\t\t\t\ttable =\n+\t\t\t\t\ttf_em_get_table_page(tbl_scope_cb,\n+\t\t\t\t\t\t\t     dir,\n+\t\t\t\t\t\t\t     offset,\n+\t\t\t\t\t\t\t     KEY1_TABLE);\n+#ifdef TF_EEM_DUMP_DEBUG\n+\t\t\t\tPMD_DRV_LOG(DEBUG,\n+\t\t\t\t\t    \"----- Page:%d %p -----\\n\",\n+\t\t\t\t\t    (offset / TF_EM_PAGE_SIZE),\n+\t\t\t\t\t    table);\n+#endif\n+\t\t\t}\n+\n+\t\t\teem_entry = table + (offset % TF_EM_PAGE_SIZE);\n+\n+\t\t\tif (cdbg_cfa_eem_host_key_decode(dir,\n+\t\t\t\t\t\t\t i,\n+\t\t\t\t\t\t\t eem_entry))\n+\t\t\t\tkey1_count++;\n+\n+\t\t\toffset += entry_size;\n+\t\t}\n+\n+\t\tPMD_DRV_LOG(DEBUG, \"Key0 table has %d entries and Key1\"\n+\t\t\t    \" table has %d entries, total:%d\\n\\n\",\n+\t\t\t    key0_count,\n+\t\t\t    key1_count,\n+\t\t\t    (key0_count + key1_count));\n+\n+\t\tentry_size = 16;\n+\t\teem_decode_hdr(RECORD_TABLE);\n+\t\ttable = tf_em_get_table_page(tbl_scope_cb,\n+\t\t\t\t\t     dir,\n+\t\t\t\t\t     0,\n+\t\t\t\t\t     RECORD_TABLE);\n+#if 0\n+\t\tfor (i = 0, offset = 0; i < num_entries; i++) {\n+\t\t\tif ((offset % TF_EM_PAGE_SIZE) == 0) {\n+\t\t\t\ttable =\n+\t\t\t\t\ttf_em_get_table_page(tbl_scope_cb,\n+\t\t\t\t\t\t\t     dir,\n+\t\t\t\t\t\t\t     offset,\n+\t\t\t\t\t\t\t     RECORD_TABLE);\n+#ifdef TF_EEM_DUMP_DEBUG\n+\t\t\t\tprintf(\"----- Page:%d %p -----\\n\",\n+\t\t\t\t       (offset / TF_EM_PAGE_SIZE),\n+\t\t\t\t       table);\n+#endif\n+\t\t\t}\n+\n+\t\t\teem_entry = table + (offset % TF_EM_PAGE_SIZE);\n+\t\t\tcdbg_cfa_eem_host_record_decode(i, eem_entry);\n+\t\t\toffset += entry_size;\n+\t\t}\n+#else\n+\t\tfor (i = 0; i < act_rec_counts[dir]; i++) {\n+\t\t\toffset = act_rec_data[dir][i].ptr;\n+\t\t\t/* printf(\"Offset:0x%x\\n\", offset); */\n+\t\t\tif ((offset % TF_EM_PAGE_SIZE) == 0) {\n+\t\t\t\ttable =\n+\t\t\t\t\ttf_em_get_table_page(tbl_scope_cb,\n+\t\t\t\t\t\t\t     dir,\n+\t\t\t\t\t\t\t     offset,\n+\t\t\t\t\t\t\t     RECORD_TABLE);\n+#ifdef TF_EEM_DUMP_DEBUG\n+\t\t\t\tPMD_DRV_LOG(DEBUG,\n+\t\t\t\t\t    \"----- Page:%d %p -----\\n\",\n+\t\t\t\t\t    (offset / TF_EM_PAGE_SIZE),\n+\t\t\t\t\t    table);\n+#endif\n+\t\t\t}\n+\n+\t\t\teem_entry = table + (offset % TF_EM_PAGE_SIZE);\n+\t\t\tcdbg_cfa_eem_host_record_decode(offset,\n+\t\t\t\t\t\t\teem_entry);\n+\t\t\toffset += entry_size;\n+\t\t}\n+#endif\n+\t}\n+}\n+\n+void tf_dump_tables(struct tf *tfp, uint32_t tbl_scope_id);\n+struct tf_tbl_scope_cb *tbl_scope_cb_find(struct tf_session *session,\n+\t\t\t\t\t  uint32_t tbl_scope_id);\n+\n+void tf_dump_tables(struct tf *tfp, uint32_t tbl_scope_id)\n+{\n+\tstruct tf_session      *session;\n+\tstruct tf_tbl_scope_cb *tbl_scope_cb;\n+\n+\tBNXT_TF_DBG(DEBUG, \"called %s\\n\", __func__);\n+\n+\t/* find session struct */\n+\tsession = (struct tf_session *)tfp->session->core_data;\n+\n+\t/* find control block for table scope */\n+\ttbl_scope_cb = tbl_scope_cb_find(session,\n+\t\t\t\t\t tbl_scope_id);\n+\tif (tbl_scope_cb == NULL)\n+\t\tBNXT_TF_DBG(ERR, \"No table scope\\n\");\n+\n+\ttf_diag_dump_table(tbl_scope_cb,\n+\t\t\t   tbl_scope_cb->em_ctx_info);\n+}\n+#endif\n+\n+/****************************** End of DEBUG *************************/\n+\n+static struct bnxt *bnxt_get_bp(uint16_t port)\n+{\n+\tstruct bnxt *bp;\n+\tstruct rte_eth_dev *dev;\n+\n+\tif (!rte_eth_dev_is_valid_port(port)) {\n+\t\tBNXT_TF_DBG(ERR,\n+\t\t\t    \"Invalid port %d\\n\", port);\n+\t\treturn NULL;\n+\t}\n+\n+\tdev = &rte_eth_devices[port];\n+\n+\tif (!is_bnxt_supported(dev)) {\n+\t\tBNXT_TF_DBG(ERR,\n+\t\t\t    \"Device %d not supported\\n\",\n+\t\t\t    port);\n+\t\treturn NULL;\n+\t}\n+\n+\tbp = (struct bnxt *)dev->data->dev_private;\n+\treturn bp;\n+}\n+\n+void bnxt_ulp_cli_tf_dump_tables(uint16_t port,\n+\t\t\t\t uint32_t tbl_scope_id __rte_unused)\n+{\n+\tstruct bnxt *bp;\n+\n+\tbp = bnxt_get_bp(port);\n+\n+\tif (!bp) {\n+\t\tBNXT_TF_DBG(ERR,\n+\t\t\t    \"Failed to get bp for port:%d\\n\", port);\n+\t\treturn;\n+\t}\n+\n+\t//tf_dump_tables(&bp->tfp, tbl_scope_id);\n+}\n+\n+void\n+ulp_port_db_dump(struct bnxt_ulp_port_db *port_db,\n+\t\t struct ulp_interface_info *intf,\n+\t\t uint32_t port_id)\n+{\n+\tstruct ulp_func_if_info *func;\n+\tstruct ulp_phy_port_info *port_data;\n+\n+\tBNXT_TF_DBG(INFO, \"*****Dump for DPDK port_id %d ******\\n\", port_id);\n+\tBNXT_TF_DBG(INFO, \"type=0x%0x, drv_func_id=0x%0x, vf_func_id=0x%0x\\n\",\n+\t\t    intf->type, intf->drv_func_id, intf->vf_func_id);\n+\n+\tfunc = &port_db->ulp_func_id_tbl[intf->drv_func_id];\n+\tBNXT_TF_DBG(INFO, \"drv_func_svif=0x%0x, drv_func_spif=0x%0x,\"\n+\t\t    \"drv_func_parif=0x%0x, drv_default_vnic=0x%0x\\n\",\n+\t\t    func->func_svif, func->func_spif, func->func_parif,\n+\t\t    func->func_vnic);\n+\n+\tif (intf->type == BNXT_ULP_INTF_TYPE_VF_REP) {\n+\t\tfunc = &port_db->ulp_func_id_tbl[intf->vf_func_id];\n+\t\tBNXT_TF_DBG(INFO, \" vf_func_svif=0x%0x,  vf_func_spif=0x%0x,\"\n+\t\t\t    \" vf_func_parif=0x%0x,  vf_default_vnic=0x%0x\\n\",\n+\t\t\t    func->func_svif, func->func_spif, func->func_parif,\n+\t\t\t    func->func_vnic);\n+\t}\n+\tport_data = &port_db->phy_port_list[func->phy_port_id];\n+\tBNXT_TF_DBG(INFO, \"phy_port_svif=0x%0x, phy_port_spif=0x%0x,\"\n+\t\t    \"phy_port_parif=0x%0x, phy_port_vport=0x%0x\\n\",\n+\t\t    port_data->port_svif, port_data->port_spif,\n+\t\t    port_data->port_parif, port_data->port_vport);\n+\tBNXT_TF_DBG(INFO, \"***** dump complete ******\\n\");\n+}\n+\n+const char *\n+tf_if_tbl_2_str(uint32_t type)\n+{\n+\tenum tf_if_tbl_type id_type = type;\n+\n+\tswitch (id_type) {\n+\tcase TF_IF_TBL_TYPE_PROF_SPIF_DFLT_L2_CTXT:\n+\t\treturn \"spif dflt l2 ctxt\";\n+\tcase TF_IF_TBL_TYPE_PROF_PARIF_DFLT_ACT_REC_PTR:\n+\t\treturn \"parif act rec ptr\";\n+\tcase TF_IF_TBL_TYPE_PROF_PARIF_ERR_ACT_REC_PTR:\n+\t\treturn \"parif err act rec ptr\";\n+\tcase TF_IF_TBL_TYPE_LKUP_PARIF_DFLT_ACT_REC_PTR:\n+\t\treturn \"lkup parif act rec ptr\";\n+\tcase TF_IF_TBL_TYPE_ILT:\n+\t\treturn \"ilt tbl\";\n+\tcase TF_IF_TBL_TYPE_VNIC_SVIF:\n+\t\treturn \"vnic svif tbl\";\n+\tdefault:\n+\t\treturn \"Invalid identifier\";\n+\t}\n+}\n+\n+#endif /* RTE_LIBRTE_BNXT_TRUFLOW_DEBUG */\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_tf_debug.h b/drivers/net/bnxt/tf_ulp/ulp_tf_debug.h\nnew file mode 100644\nindex 0000000..cc6dace\n--- /dev/null\n+++ b/drivers/net/bnxt/tf_ulp/ulp_tf_debug.h\n@@ -0,0 +1,26 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2014-2019 Broadcom\n+ * All rights reserved.\n+ */\n+\n+#ifndef _ULP_TF_DEBUG_H_\n+#define _ULP_TF_DEBUG_H_\n+\n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+struct tf;\n+struct ulp_interface_info;\n+struct bnxt_ulp_port_db;\n+\n+void bnxt_ulp_cli_tf_dump_tables(uint16_t port, uint32_t tbl_scope_id);\n+void tf_dump_tables(struct tf *tfp, uint32_t tbl_scope_id);\n+void\n+ulp_port_db_dump(struct bnxt_ulp_port_db *port_db,\n+\t\t struct ulp_interface_info *intf,\n+\t\t uint32_t port_id);\n+\n+const char *\n+tf_if_tbl_2_str(uint32_t id_type);\n+\n+#endif\n+\n+#endif\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_utils.c b/drivers/net/bnxt/tf_ulp/ulp_utils.c\nindex a923da8..85eb42b 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_utils.c\n+++ b/drivers/net/bnxt/tf_ulp/ulp_utils.c\n@@ -411,7 +411,7 @@ ulp_blob_pad_push(struct ulp_blob *blob,\n {\n \tif (datalen > (uint32_t)(blob->bitlen - blob->write_idx)) {\n \t\tBNXT_TF_DBG(ERR, \"Pad too large for blob\\n\");\n-\t\treturn 0;\n+\t\treturn -1;\n \t}\n \n \tblob->write_idx += datalen;\n",
    "prefixes": [
        "14/14"
    ]
}