get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 71422,
    "url": "http://patches.dpdk.org/api/patches/71422/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200612132934.16488-31-somnath.kotur@broadcom.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20200612132934.16488-31-somnath.kotur@broadcom.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200612132934.16488-31-somnath.kotur@broadcom.com",
    "date": "2020-06-12T13:29:14",
    "name": "[30/50] net/bnxt: add global config set and get APIs",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "1b76dc1c1d2dc312c02b2ca79e906031de4143cd",
    "submitter": {
        "id": 908,
        "url": "http://patches.dpdk.org/api/people/908/?format=api",
        "name": "Somnath Kotur",
        "email": "somnath.kotur@broadcom.com"
    },
    "delegate": {
        "id": 1766,
        "url": "http://patches.dpdk.org/api/users/1766/?format=api",
        "username": "ajitkhaparde",
        "first_name": "Ajit",
        "last_name": "Khaparde",
        "email": "ajit.khaparde@broadcom.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20200612132934.16488-31-somnath.kotur@broadcom.com/mbox/",
    "series": [
        {
            "id": 10436,
            "url": "http://patches.dpdk.org/api/series/10436/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=10436",
            "date": "2020-06-12T13:28:44",
            "name": "add features for host-based flow management",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/10436/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/71422/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/71422/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 4E07AA00BE;\n\tFri, 12 Jun 2020 15:47:32 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id B71611C1D4;\n\tFri, 12 Jun 2020 15:34:49 +0200 (CEST)",
            "from relay.smtp.broadcom.com (unknown [192.19.232.149])\n by dpdk.org (Postfix) with ESMTP id 35B111C1A1\n for <dev@dpdk.org>; Fri, 12 Jun 2020 15:34:45 +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 0CD891BD7BE;\n Fri, 12 Jun 2020 06:34:43 -0700 (PDT)"
        ],
        "DKIM-Filter": "OpenDKIM Filter v2.10.3 relay.smtp.broadcom.com 0CD891BD7BE",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com;\n s=dkimrelay; t=1591968884;\n bh=wUKOyjUH5bXxPRMp8vTMUc8Ai3flPg7u5QZdrwk5U7Q=;\n h=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n b=iQFQu8yOh9PsK47zCBL/3i3VHtfBFTkRmANJ3kp6RjfUsH2GtPzuaw6coYO8vgfdq\n jz4x3vlGajq6OTuRw+BBC5SPX3vH+el0TccHVCn/JmpyXabCdIcYtLGOB+zEdLMCJl\n s5RgcvcyXAr9YSS4UN544mPBxA9EmXwYsiNgiQXo=",
        "From": "Somnath Kotur <somnath.kotur@broadcom.com>",
        "To": "dev@dpdk.org",
        "Cc": "ferruh.yigit@intel.com",
        "Date": "Fri, 12 Jun 2020 18:59:14 +0530",
        "Message-Id": "<20200612132934.16488-31-somnath.kotur@broadcom.com>",
        "X-Mailer": "git-send-email 2.10.1.613.g2cc2e70",
        "In-Reply-To": "<20200612132934.16488-1-somnath.kotur@broadcom.com>",
        "References": "<20200612132934.16488-1-somnath.kotur@broadcom.com>",
        "Subject": "[dpdk-dev] [PATCH 30/50] net/bnxt: add global config set and get\n\tAPIs",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Jay Ding <jay.ding@broadcom.com>\n\n- Add support to update global configuration for ACT_TECT\n  and ACT_ABCR.\n- Add support to allow Tunnel and Action global configuration.\n- Remove register read and write operations.\n- Remove the register read and write support.\n\nSigned-off-by: Jay Ding <jay.ding@broadcom.com>\nReviewed-by: Randy Schacher <stuart.schacher@broadcom.com>\nSigned-off-by: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>\n---\n drivers/net/bnxt/hcapi/hcapi_cfa.h       |   3 +\n drivers/net/bnxt/meson.build             |   1 +\n drivers/net/bnxt/tf_core/Makefile        |   2 +\n drivers/net/bnxt/tf_core/hwrm_tf.h       |  54 ++++++++-\n drivers/net/bnxt/tf_core/tf_core.c       | 137 +++++++++++++++++++++\n drivers/net/bnxt/tf_core/tf_core.h       |  77 ++++++++++++\n drivers/net/bnxt/tf_core/tf_device.c     |  20 ++++\n drivers/net/bnxt/tf_core/tf_device.h     |  33 +++++\n drivers/net/bnxt/tf_core/tf_device_p4.c  |   4 +\n drivers/net/bnxt/tf_core/tf_device_p4.h  |   5 +\n drivers/net/bnxt/tf_core/tf_global_cfg.c | 199 +++++++++++++++++++++++++++++++\n drivers/net/bnxt/tf_core/tf_global_cfg.h | 170 ++++++++++++++++++++++++++\n drivers/net/bnxt/tf_core/tf_msg.c        | 109 ++++++++++++++++-\n drivers/net/bnxt/tf_core/tf_msg.h        |  31 +++++\n 14 files changed, 840 insertions(+), 5 deletions(-)\n create mode 100644 drivers/net/bnxt/tf_core/tf_global_cfg.c\n create mode 100644 drivers/net/bnxt/tf_core/tf_global_cfg.h",
    "diff": "diff --git a/drivers/net/bnxt/hcapi/hcapi_cfa.h b/drivers/net/bnxt/hcapi/hcapi_cfa.h\nindex e95633b..95f6370 100644\n--- a/drivers/net/bnxt/hcapi/hcapi_cfa.h\n+++ b/drivers/net/bnxt/hcapi/hcapi_cfa.h\n@@ -242,6 +242,9 @@ int hcapi_cfa_p4_wc_tcam_rec_hwop(struct hcapi_cfa_hwop *op,\n \t\t\t\t  struct hcapi_cfa_data *obj_data);\n int hcapi_cfa_p4_mirror_hwop(struct hcapi_cfa_hwop *op,\n \t\t\t     struct hcapi_cfa_data *mirror);\n+int hcapi_cfa_p4_global_cfg_hwop(struct hcapi_cfa_hwop *op,\n+\t\t\t\t uint32_t type,\n+\t\t\t\t struct hcapi_cfa_data *config);\n #endif /* SUPPORT_CFA_HW_P4 */\n /**\n  *  HCAPI CFA device HW operation function callback definition\ndiff --git a/drivers/net/bnxt/meson.build b/drivers/net/bnxt/meson.build\nindex 54564e0..ace7353 100644\n--- a/drivers/net/bnxt/meson.build\n+++ b/drivers/net/bnxt/meson.build\n@@ -45,6 +45,7 @@ sources = files('bnxt_cpr.c',\n \t'tf_core/tf_util.c',\n \t'tf_core/tf_if_tbl.c',\n \t'tf_core/ll.c',\n+\t'tf_core/tf_global_cfg.c',\n \n \t'hcapi/hcapi_cfa_p4.c',\n \ndiff --git a/drivers/net/bnxt/tf_core/Makefile b/drivers/net/bnxt/tf_core/Makefile\nindex e1c65ca..d9110ca 100644\n--- a/drivers/net/bnxt/tf_core/Makefile\n+++ b/drivers/net/bnxt/tf_core/Makefile\n@@ -27,6 +27,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += tf_core/tf_shadow_tcam.c\n SRCS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += tf_core/tf_tcam.c\n SRCS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += tf_core/tf_util.c\n SRCS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += tf_core/tf_if_tbl.c\n+SRCS-$(CONFIG_RTE_LIBRTE_BNXT_PMD) += tf_core/tf_global_cfg.c\n \n \n SYMLINK-$(CONFIG_RTE_LIBRTE_BNXT_PMD)-include += tf_core/tf_core.h\n@@ -37,3 +38,4 @@ SYMLINK-$(CONFIG_RTE_LIBRTE_BNXT_PMD)-include += tf_core/tf_tbl.h\n SYMLINK-$(CONFIG_RTE_LIBRTE_BNXT_PMD)-include += tf_core/stack.h\n SYMLINK-$(CONFIG_RTE_LIBRTE_BNXT_PMD)-include += tf_core/tf_tcam.h\n SYMLINK-$(CONFIG_RTE_LIBRTE_BNXT_PMD)-include += tf_core/tf_if_tbl.h\n+SYMLINK-$(CONFIG_RTE_LIBRTE_BNXT_PMD)-include += tf_core/tf_global_cfg.h\ndiff --git a/drivers/net/bnxt/tf_core/hwrm_tf.h b/drivers/net/bnxt/tf_core/hwrm_tf.h\nindex 32f1523..7ade992 100644\n--- a/drivers/net/bnxt/tf_core/hwrm_tf.h\n+++ b/drivers/net/bnxt/tf_core/hwrm_tf.h\n@@ -13,8 +13,8 @@ typedef enum tf_type {\n } tf_type_t;\n \n typedef enum tf_subtype {\n-\tHWRM_TFT_REG_GET = 821,\n-\tHWRM_TFT_REG_SET = 822,\n+\tHWRM_TFT_GET_GLOBAL_CFG = 821,\n+\tHWRM_TFT_SET_GLOBAL_CFG = 822,\n \tHWRM_TFT_TBL_TYPE_BULK_GET = 825,\n \tHWRM_TFT_IF_TBL_SET = 827,\n \tHWRM_TFT_IF_TBL_GET = 828,\n@@ -66,18 +66,66 @@ typedef enum tf_subtype {\n #define TF_BITS2BYTES(x) (((x) + 7) >> 3)\n #define TF_BITS2BYTES_WORD_ALIGN(x) ((((x) + 31) >> 5) * 4)\n \n+struct tf_set_global_cfg_input;\n+struct tf_get_global_cfg_input;\n+struct tf_get_global_cfg_output;\n struct tf_tbl_type_bulk_get_input;\n struct tf_tbl_type_bulk_get_output;\n struct tf_if_tbl_set_input;\n struct tf_if_tbl_get_input;\n struct tf_if_tbl_get_output;\n+/* Input params for global config set */\n+typedef struct tf_set_global_cfg_input {\n+\t/* Session Id */\n+\tuint32_t\t\t\t fw_session_id;\n+\t/* flags */\n+\tuint32_t\t\t\t flags;\n+\t/* When set to 0, indicates the query apply to RX */\n+#define TF_SET_GLOBAL_CFG_INPUT_FLAGS_DIR_RX\t\t  (0x0)\n+\t/* When set to 1, indicates the query apply to TX */\n+#define TF_SET_GLOBAL_CFG_INPUT_FLAGS_DIR_TX\t\t  (0x1)\n+\t/* Config type */\n+\tuint32_t\t\t\t type;\n+\t/* Offset of the type */\n+\tuint32_t\t\t\t offset;\n+\t/* Size of the data to set in bytes */\n+\tuint16_t\t\t\t size;\n+\t/* Data to set */\n+\tuint8_t\t\t\t  data[TF_BULK_SEND];\n+} tf_set_global_cfg_input_t, *ptf_set_global_cfg_input_t;\n+\n+/* Input params for global config to get */\n+typedef struct tf_get_global_cfg_input {\n+\t/* Session Id */\n+\tuint32_t\t\t\t fw_session_id;\n+\t/* flags */\n+\tuint32_t\t\t\t flags;\n+\t/* When set to 0, indicates the query apply to RX */\n+#define TF_GET_GLOBAL_CFG_INPUT_FLAGS_DIR_RX\t\t  (0x0)\n+\t/* When set to 1, indicates the query apply to TX */\n+#define TF_GET_GLOBAL_CFG_INPUT_FLAGS_DIR_TX\t\t  (0x1)\n+\t/* Config to retrieve */\n+\tuint32_t\t\t\t type;\n+\t/* Offset to retrieve */\n+\tuint32_t\t\t\t offset;\n+\t/* Size of the data to set in bytes */\n+\tuint16_t\t\t\t size;\n+} tf_get_global_cfg_input_t, *ptf_get_global_cfg_input_t;\n+\n+/* Output params for global config */\n+typedef struct tf_get_global_cfg_output {\n+\t/* Size of the total data read in bytes */\n+\tuint16_t\t\t\t size;\n+\t/* Data to get */\n+\tuint8_t\t\t\t  data[TF_BULK_SEND];\n+} tf_get_global_cfg_output_t, *ptf_get_global_cfg_output_t;\n \n /* Input params for table type get */\n typedef struct tf_tbl_type_bulk_get_input {\n \t/* Session Id */\n \tuint32_t\t\t\t fw_session_id;\n \t/* flags */\n-\tuint16_t\t\t\t flags;\n+\tuint32_t\t\t\t flags;\n \t/* When set to 0, indicates the get apply to RX */\n #define TF_TBL_TYPE_BULK_GET_INPUT_FLAGS_DIR_RX\t   (0x0)\n \t/* When set to 1, indicates the get apply to TX */\ndiff --git a/drivers/net/bnxt/tf_core/tf_core.c b/drivers/net/bnxt/tf_core/tf_core.c\nindex 489c461..0f119b4 100644\n--- a/drivers/net/bnxt/tf_core/tf_core.c\n+++ b/drivers/net/bnxt/tf_core/tf_core.c\n@@ -11,6 +11,7 @@\n #include \"tf_tbl.h\"\n #include \"tf_em.h\"\n #include \"tf_rm.h\"\n+#include \"tf_global_cfg.h\"\n #include \"tf_msg.h\"\n #include \"tfp.h\"\n #include \"bitalloc.h\"\n@@ -277,6 +278,142 @@ int tf_delete_em_entry(struct tf *tfp,\n \treturn rc;\n }\n \n+/** Get global configuration API\n+ *\n+ *    returns:\n+ *    0       - Success\n+ *    -EINVAL - Error\n+ */\n+int tf_get_global_cfg(struct tf *tfp,\n+\t\t      struct tf_global_cfg_parms *parms)\n+{\n+\tint rc = 0;\n+\tstruct tf_session *tfs;\n+\tstruct tf_dev_info *dev;\n+\tstruct tf_dev_global_cfg_parms gparms = { 0 };\n+\n+\tTF_CHECK_PARMS2(tfp, parms);\n+\n+\t/* Retrieve the session information */\n+\trc = tf_session_get_session(tfp, &tfs);\n+\tif (rc) {\n+\t\tTFP_DRV_LOG(ERR,\n+\t\t\t    \"%s: Failed to lookup session, rc:%s\\n\",\n+\t\t\t    tf_dir_2_str(parms->dir),\n+\t\t\t    strerror(-rc));\n+\t\treturn rc;\n+\t}\n+\n+\t/* Retrieve the device information */\n+\trc = tf_session_get_device(tfs, &dev);\n+\tif (rc) {\n+\t\tTFP_DRV_LOG(ERR,\n+\t\t\t    \"%s: Failed to lookup device, rc:%s\\n\",\n+\t\t\t    tf_dir_2_str(parms->dir),\n+\t\t\t    strerror(-rc));\n+\t\treturn rc;\n+\t}\n+\n+\tif (parms->config == NULL ||\n+\t   parms->config_sz_in_bytes == 0) {\n+\t\tTFP_DRV_LOG(ERR, \"Invalid Argument(s)\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (dev->ops->tf_dev_get_global_cfg == NULL) {\n+\t\trc = -EOPNOTSUPP;\n+\t\tTFP_DRV_LOG(ERR,\n+\t\t\t    \"%s: Operation not supported, rc:%s\\n\",\n+\t\t\t    tf_dir_2_str(parms->dir),\n+\t\t\t    strerror(-rc));\n+\t\treturn -EOPNOTSUPP;\n+\t}\n+\n+\tgparms.dir = parms->dir;\n+\tgparms.type = parms->type;\n+\tgparms.offset = parms->offset;\n+\tgparms.config = parms->config;\n+\tgparms.config_sz_in_bytes = parms->config_sz_in_bytes;\n+\trc = dev->ops->tf_dev_get_global_cfg(tfp, &gparms);\n+\tif (rc) {\n+\t\tTFP_DRV_LOG(ERR,\n+\t\t\t    \"%s: Global Cfg get failed, rc:%s\\n\",\n+\t\t\t    tf_dir_2_str(parms->dir),\n+\t\t\t    strerror(-rc));\n+\t\treturn rc;\n+\t}\n+\n+\treturn rc;\n+}\n+\n+/** Set global configuration API\n+ *\n+ *    returns:\n+ *    0       - Success\n+ *    -EINVAL - Error\n+ */\n+int tf_set_global_cfg(struct tf *tfp,\n+\t\t      struct tf_global_cfg_parms *parms)\n+{\n+\tint rc = 0;\n+\tstruct tf_session *tfs;\n+\tstruct tf_dev_info *dev;\n+\tstruct tf_dev_global_cfg_parms gparms = { 0 };\n+\n+\tTF_CHECK_PARMS2(tfp, parms);\n+\n+\t/* Retrieve the session information */\n+\trc = tf_session_get_session(tfp, &tfs);\n+\tif (rc) {\n+\t\tTFP_DRV_LOG(ERR,\n+\t\t\t    \"%s: Failed to lookup session, rc:%s\\n\",\n+\t\t\t    tf_dir_2_str(parms->dir),\n+\t\t\t    strerror(-rc));\n+\t\treturn rc;\n+\t}\n+\n+\t/* Retrieve the device information */\n+\trc = tf_session_get_device(tfs, &dev);\n+\tif (rc) {\n+\t\tTFP_DRV_LOG(ERR,\n+\t\t\t    \"%s: Failed to lookup device, rc:%s\\n\",\n+\t\t\t    tf_dir_2_str(parms->dir),\n+\t\t\t    strerror(-rc));\n+\t\treturn rc;\n+\t}\n+\n+\tif (parms->config == NULL ||\n+\t   parms->config_sz_in_bytes == 0) {\n+\t\tTFP_DRV_LOG(ERR, \"Invalid Argument(s)\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (dev->ops->tf_dev_set_global_cfg == NULL) {\n+\t\trc = -EOPNOTSUPP;\n+\t\tTFP_DRV_LOG(ERR,\n+\t\t\t    \"%s: Operation not supported, rc:%s\\n\",\n+\t\t\t    tf_dir_2_str(parms->dir),\n+\t\t\t    strerror(-rc));\n+\t\treturn -EOPNOTSUPP;\n+\t}\n+\n+\tgparms.dir = parms->dir;\n+\tgparms.type = parms->type;\n+\tgparms.offset = parms->offset;\n+\tgparms.config = parms->config;\n+\tgparms.config_sz_in_bytes = parms->config_sz_in_bytes;\n+\trc = dev->ops->tf_dev_set_global_cfg(tfp, &gparms);\n+\tif (rc) {\n+\t\tTFP_DRV_LOG(ERR,\n+\t\t\t    \"%s: Global Cfg set failed, rc:%s\\n\",\n+\t\t\t    tf_dir_2_str(parms->dir),\n+\t\t\t    strerror(-rc));\n+\t\treturn rc;\n+\t}\n+\n+\treturn rc;\n+}\n+\n int\n tf_alloc_identifier(struct tf *tfp,\n \t\t    struct tf_alloc_identifier_parms *parms)\ndiff --git a/drivers/net/bnxt/tf_core/tf_core.h b/drivers/net/bnxt/tf_core/tf_core.h\nindex fea222b..3f54ab1 100644\n--- a/drivers/net/bnxt/tf_core/tf_core.h\n+++ b/drivers/net/bnxt/tf_core/tf_core.h\n@@ -1612,6 +1612,83 @@ int tf_search_em_entry(struct tf *tfp,\n \t\t       struct tf_search_em_entry_parms *parms);\n \n /**\n+ * @page global Global Configuration\n+ *\n+ * @ref tf_set_global_cfg\n+ *\n+ * @ref tf_get_global_cfg\n+ */\n+/**\n+ * Tunnel Encapsulation Offsets\n+ */\n+enum tf_tunnel_encap_offsets {\n+\tTF_TUNNEL_ENCAP_L2,\n+\tTF_TUNNEL_ENCAP_NAT,\n+\tTF_TUNNEL_ENCAP_MPLS,\n+\tTF_TUNNEL_ENCAP_VXLAN,\n+\tTF_TUNNEL_ENCAP_GENEVE,\n+\tTF_TUNNEL_ENCAP_NVGRE,\n+\tTF_TUNNEL_ENCAP_GRE,\n+\tTF_TUNNEL_ENCAP_FULL_GENERIC\n+};\n+/**\n+ * Global Configuration Table Types\n+ */\n+enum tf_global_config_type {\n+\tTF_TUNNEL_ENCAP,  /**< Tunnel Encap Config(TECT) */\n+\tTF_ACTION_BLOCK,  /**< Action Block Config(ABCR) */\n+\tTF_GLOBAL_CFG_TYPE_MAX\n+};\n+\n+/**\n+ * tf_global_cfg parameter definition\n+ */\n+struct tf_global_cfg_parms {\n+\t/**\n+\t * [in] receive or transmit direction\n+\t */\n+\tenum tf_dir dir;\n+\t/**\n+\t * [in] Global config type\n+\t */\n+\tenum tf_global_config_type type;\n+\t/**\n+\t * [in] Offset @ the type\n+\t */\n+\tuint32_t offset;\n+\t/**\n+\t * [in/out] Value of the configuration\n+\t * set - Read, Modify and Write\n+\t * get - Read the full configuration\n+\t */\n+\tuint8_t *config;\n+\t/**\n+\t * [in] struct containing size\n+\t */\n+\tuint16_t config_sz_in_bytes;\n+};\n+\n+/**\n+ * Get global configuration\n+ *\n+ * Retrieve the configuration\n+ *\n+ * Returns success or failure code.\n+ */\n+int tf_get_global_cfg(struct tf *tfp,\n+\t\t      struct tf_global_cfg_parms *parms);\n+\n+/**\n+ * Update the global configuration table\n+ *\n+ * Read, modify write the value.\n+ *\n+ * Returns success or failure code.\n+ */\n+int tf_set_global_cfg(struct tf *tfp,\n+\t\t      struct tf_global_cfg_parms *parms);\n+\n+/**\n  * @page if_tbl Interface Table Access\n  *\n  * @ref tf_set_if_tbl_entry\ndiff --git a/drivers/net/bnxt/tf_core/tf_device.c b/drivers/net/bnxt/tf_core/tf_device.c\nindex a3073c8..ead9584 100644\n--- a/drivers/net/bnxt/tf_core/tf_device.c\n+++ b/drivers/net/bnxt/tf_core/tf_device.c\n@@ -45,6 +45,7 @@ tf_dev_bind_p4(struct tf *tfp,\n \tstruct tf_tcam_cfg_parms tcam_cfg;\n \tstruct tf_em_cfg_parms em_cfg;\n \tstruct tf_if_tbl_cfg_parms if_tbl_cfg;\n+\tstruct tf_global_cfg_cfg_parms global_cfg;\n \n \tdev_handle->type = TF_DEVICE_TYPE_WH;\n \t/* Initial function initialization */\n@@ -128,6 +129,18 @@ tf_dev_bind_p4(struct tf *tfp,\n \t\tgoto fail;\n \t}\n \n+\t/*\n+\t * GLOBAL_CFG\n+\t */\n+\tglobal_cfg.num_elements = TF_GLOBAL_CFG_TYPE_MAX;\n+\tglobal_cfg.cfg = tf_global_cfg_p4;\n+\trc = tf_global_cfg_bind(tfp, &global_cfg);\n+\tif (rc) {\n+\t\tTFP_DRV_LOG(ERR,\n+\t\t\t    \"Global Cfg initialization failure\\n\");\n+\t\tgoto fail;\n+\t}\n+\n \t/* Final function initialization */\n \tdev_handle->ops = &tf_dev_ops_p4;\n \n@@ -207,6 +220,13 @@ tf_dev_unbind_p4(struct tf *tfp)\n \t\tfail = true;\n \t}\n \n+\trc = tf_global_cfg_unbind(tfp);\n+\tif (rc) {\n+\t\tTFP_DRV_LOG(ERR,\n+\t\t\t    \"Device unbind failed, Global Cfg Type\\n\");\n+\t\tfail = true;\n+\t}\n+\n \tif (fail)\n \t\treturn -1;\n \ndiff --git a/drivers/net/bnxt/tf_core/tf_device.h b/drivers/net/bnxt/tf_core/tf_device.h\nindex 5a0943a..1740a27 100644\n--- a/drivers/net/bnxt/tf_core/tf_device.h\n+++ b/drivers/net/bnxt/tf_core/tf_device.h\n@@ -11,6 +11,7 @@\n #include \"tf_tbl.h\"\n #include \"tf_tcam.h\"\n #include \"tf_if_tbl.h\"\n+#include \"tf_global_cfg.h\"\n \n struct tf;\n struct tf_session;\n@@ -606,6 +607,38 @@ struct tf_dev_ops {\n \t */\n \tint (*tf_dev_get_if_tbl)(struct tf *tfp,\n \t\t\t\t struct tf_if_tbl_get_parms *parms);\n+\n+\t/**\n+\t * Update global cfg\n+\t *\n+\t * [in] tfp\n+\t *   Pointer to TF handle\n+\t *\n+\t * [in] parms\n+\t *   Pointer to global cfg parameters\n+\t *\n+\t *    returns:\n+\t *    0       - Success\n+\t *    -EINVAL - Error\n+\t */\n+\tint (*tf_dev_set_global_cfg)(struct tf *tfp,\n+\t\t\t\t     struct tf_dev_global_cfg_parms *parms);\n+\n+\t/**\n+\t * Get global cfg\n+\t *\n+\t * [in] tfp\n+\t *   Pointer to TF handle\n+\t *\n+\t * [in] parms\n+\t *   Pointer to global cfg parameters\n+\t *\n+\t *    returns:\n+\t *    0       - Success\n+\t *    -EINVAL - Error\n+\t */\n+\tint (*tf_dev_get_global_cfg)(struct tf *tfp,\n+\t\t\t\t     struct tf_dev_global_cfg_parms *parms);\n };\n \n /**\ndiff --git a/drivers/net/bnxt/tf_core/tf_device_p4.c b/drivers/net/bnxt/tf_core/tf_device_p4.c\nindex 2dc34b8..6526082 100644\n--- a/drivers/net/bnxt/tf_core/tf_device_p4.c\n+++ b/drivers/net/bnxt/tf_core/tf_device_p4.c\n@@ -108,6 +108,8 @@ const struct tf_dev_ops tf_dev_ops_p4_init = {\n \t.tf_dev_free_tbl_scope = NULL,\n \t.tf_dev_set_if_tbl = NULL,\n \t.tf_dev_get_if_tbl = NULL,\n+\t.tf_dev_set_global_cfg = NULL,\n+\t.tf_dev_get_global_cfg = NULL,\n };\n \n /**\n@@ -140,4 +142,6 @@ const struct tf_dev_ops tf_dev_ops_p4 = {\n \t.tf_dev_free_tbl_scope = tf_em_ext_common_free,\n \t.tf_dev_set_if_tbl = tf_if_tbl_set,\n \t.tf_dev_get_if_tbl = tf_if_tbl_get,\n+\t.tf_dev_set_global_cfg = tf_global_cfg_set,\n+\t.tf_dev_get_global_cfg = tf_global_cfg_get,\n };\ndiff --git a/drivers/net/bnxt/tf_core/tf_device_p4.h b/drivers/net/bnxt/tf_core/tf_device_p4.h\nindex 3b03a7c..7fabb4b 100644\n--- a/drivers/net/bnxt/tf_core/tf_device_p4.h\n+++ b/drivers/net/bnxt/tf_core/tf_device_p4.h\n@@ -11,6 +11,7 @@\n #include \"tf_core.h\"\n #include \"tf_rm.h\"\n #include \"tf_if_tbl.h\"\n+#include \"tf_global_cfg.h\"\n \n struct tf_rm_element_cfg tf_ident_p4[TF_IDENT_TYPE_MAX] = {\n \t{ TF_RM_ELEM_CFG_HCAPI_BA, CFA_RESOURCE_TYPE_P4_L2_CTXT_REMAP },\n@@ -96,4 +97,8 @@ struct tf_if_tbl_cfg tf_if_tbl_p4[TF_IF_TBL_TYPE_MAX] = {\n \t{ TF_IF_TBL_CFG_NULL, CFA_IF_TBL_TYPE_INVALID }\n };\n \n+struct tf_global_cfg_cfg tf_global_cfg_p4[TF_GLOBAL_CFG_TYPE_MAX] = {\n+\t{ TF_GLOBAL_CFG_CFG_HCAPI, TF_TUNNEL_ENCAP },\n+\t{ TF_GLOBAL_CFG_CFG_HCAPI, TF_ACTION_BLOCK },\n+};\n #endif /* _TF_DEVICE_P4_H_ */\ndiff --git a/drivers/net/bnxt/tf_core/tf_global_cfg.c b/drivers/net/bnxt/tf_core/tf_global_cfg.c\nnew file mode 100644\nindex 0000000..4ed4039\n--- /dev/null\n+++ b/drivers/net/bnxt/tf_core/tf_global_cfg.c\n@@ -0,0 +1,199 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2019-2020 Broadcom\n+ * All rights reserved.\n+ */\n+\n+#include <rte_common.h>\n+\n+#include \"tf_global_cfg.h\"\n+#include \"tf_common.h\"\n+#include \"tf_util.h\"\n+#include \"tf_msg.h\"\n+#include \"tfp.h\"\n+\n+struct tf;\n+/**\n+ * Global Cfg DBs.\n+ */\n+static void *global_cfg_db[TF_DIR_MAX];\n+\n+/**\n+ * Init flag, set on bind and cleared on unbind\n+ */\n+static uint8_t init;\n+\n+/**\n+ * Get HCAPI type parameters for a single element\n+ */\n+struct tf_global_cfg_get_hcapi_parms {\n+\t/**\n+\t * [in] Global Cfg DB Handle\n+\t */\n+\tvoid *global_cfg_db;\n+\t/**\n+\t * [in] DB Index, indicates which DB entry to perform the\n+\t * action on.\n+\t */\n+\tuint16_t db_index;\n+\t/**\n+\t * [out] Pointer to the hcapi type for the specified db_index\n+\t */\n+\tuint16_t *hcapi_type;\n+};\n+\n+/**\n+ * Check global_cfg_type and return hwrm type.\n+ *\n+ * [in] global_cfg_type\n+ *   Global Cfg type\n+ *\n+ * [out] hwrm_type\n+ *   HWRM device data type\n+ *\n+ * Returns:\n+ *    0          - Success\n+ *   -EOPNOTSUPP - Type not supported\n+ */\n+static int\n+tf_global_cfg_get_hcapi_type(struct tf_global_cfg_get_hcapi_parms *parms)\n+{\n+\tstruct tf_global_cfg_cfg *global_cfg;\n+\tenum tf_global_cfg_cfg_type cfg_type;\n+\n+\tglobal_cfg = (struct tf_global_cfg_cfg *)parms->global_cfg_db;\n+\tcfg_type = global_cfg[parms->db_index].cfg_type;\n+\n+\tif (cfg_type != TF_GLOBAL_CFG_CFG_HCAPI)\n+\t\treturn -ENOTSUP;\n+\n+\t*parms->hcapi_type = global_cfg[parms->db_index].hcapi_type;\n+\n+\treturn 0;\n+}\n+\n+int\n+tf_global_cfg_bind(struct tf *tfp __rte_unused,\n+\t\t   struct tf_global_cfg_cfg_parms *parms)\n+{\n+\tTF_CHECK_PARMS2(tfp, parms);\n+\n+\tif (init) {\n+\t\tTFP_DRV_LOG(ERR,\n+\t\t\t    \"Global Cfg DB already initialized\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tglobal_cfg_db[TF_DIR_RX] = parms->cfg;\n+\tglobal_cfg_db[TF_DIR_TX] = parms->cfg;\n+\n+\tinit = 1;\n+\n+\tTFP_DRV_LOG(INFO,\n+\t\t    \"Global Cfg - initialized\\n\");\n+\n+\treturn 0;\n+}\n+\n+int\n+tf_global_cfg_unbind(struct tf *tfp __rte_unused)\n+{\n+\t/* Bail if nothing has been initialized */\n+\tif (!init) {\n+\t\tTFP_DRV_LOG(INFO,\n+\t\t\t    \"No Global Cfg DBs created\\n\");\n+\t\treturn 0;\n+\t}\n+\n+\tglobal_cfg_db[TF_DIR_RX] = NULL;\n+\tglobal_cfg_db[TF_DIR_TX] = NULL;\n+\tinit = 0;\n+\n+\treturn 0;\n+}\n+\n+int\n+tf_global_cfg_set(struct tf *tfp,\n+\t\t  struct tf_dev_global_cfg_parms *parms)\n+{\n+\tint rc;\n+\tstruct tf_global_cfg_get_hcapi_parms hparms;\n+\tuint16_t hcapi_type;\n+\n+\tTF_CHECK_PARMS3(tfp, parms, parms->config);\n+\n+\tif (!init) {\n+\t\tTFP_DRV_LOG(ERR,\n+\t\t\t    \"%s: No Global Cfg DBs created\\n\",\n+\t\t\t    tf_dir_2_str(parms->dir));\n+\t\treturn -EINVAL;\n+\t}\n+\n+\t/* Convert TF type to HCAPI type */\n+\thparms.global_cfg_db = global_cfg_db[parms->dir];\n+\thparms.db_index = parms->type;\n+\thparms.hcapi_type = &hcapi_type;\n+\trc = tf_global_cfg_get_hcapi_type(&hparms);\n+\tif (rc) {\n+\t\tTFP_DRV_LOG(ERR,\n+\t\t\t    \"%s, Failed type lookup, type:%d, rc:%s\\n\",\n+\t\t\t    tf_dir_2_str(parms->dir),\n+\t\t\t    parms->type,\n+\t\t\t    strerror(-rc));\n+\t\treturn rc;\n+\t}\n+\n+\trc = tf_msg_set_global_cfg(tfp, parms);\n+\tif (rc) {\n+\t\tTFP_DRV_LOG(ERR,\n+\t\t\t    \"%s, Set failed, type:%d, rc:%s\\n\",\n+\t\t\t    tf_dir_2_str(parms->dir),\n+\t\t\t    parms->type,\n+\t\t\t    strerror(-rc));\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int\n+tf_global_cfg_get(struct tf *tfp,\n+\t\t  struct tf_dev_global_cfg_parms *parms)\n+\n+{\n+\tint rc;\n+\tstruct tf_global_cfg_get_hcapi_parms hparms;\n+\tuint16_t hcapi_type;\n+\n+\tTF_CHECK_PARMS3(tfp, parms, parms->config);\n+\n+\tif (!init) {\n+\t\tTFP_DRV_LOG(ERR,\n+\t\t\t    \"%s: No Global Cfg DBs created\\n\",\n+\t\t\t    tf_dir_2_str(parms->dir));\n+\t\treturn -EINVAL;\n+\t}\n+\n+\thparms.global_cfg_db = global_cfg_db[parms->dir];\n+\thparms.db_index = parms->type;\n+\thparms.hcapi_type = &hcapi_type;\n+\trc = tf_global_cfg_get_hcapi_type(&hparms);\n+\tif (rc) {\n+\t\tTFP_DRV_LOG(ERR,\n+\t\t\t    \"%s, Failed type lookup, type:%d, rc:%s\\n\",\n+\t\t\t    tf_dir_2_str(parms->dir),\n+\t\t\t    parms->type,\n+\t\t\t    strerror(-rc));\n+\t\treturn rc;\n+\t}\n+\n+\t/* Get the entry */\n+\trc = tf_msg_get_global_cfg(tfp, parms);\n+\tif (rc) {\n+\t\tTFP_DRV_LOG(ERR,\n+\t\t\t    \"%s, Get failed, type:%d, rc:%s\\n\",\n+\t\t\t    tf_dir_2_str(parms->dir),\n+\t\t\t    parms->type,\n+\t\t\t    strerror(-rc));\n+\t}\n+\n+\treturn 0;\n+}\ndiff --git a/drivers/net/bnxt/tf_core/tf_global_cfg.h b/drivers/net/bnxt/tf_core/tf_global_cfg.h\nnew file mode 100644\nindex 0000000..5c73bb1\n--- /dev/null\n+++ b/drivers/net/bnxt/tf_core/tf_global_cfg.h\n@@ -0,0 +1,170 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2019-2020 Broadcom\n+ * All rights reserved.\n+ */\n+\n+#ifndef TF_GLOBAL_CFG_H_\n+#define TF_GLOBAL_CFG_H_\n+\n+#include \"tf_core.h\"\n+#include \"stack.h\"\n+\n+/**\n+ * The global cfg module provides processing of global cfg types.\n+ */\n+\n+struct tf;\n+\n+/**\n+ * Global cfg configuration enumeration.\n+ */\n+enum tf_global_cfg_cfg_type {\n+\t/**\n+\t * No configuration\n+\t */\n+\tTF_GLOBAL_CFG_CFG_NULL,\n+\t/**\n+\t * HCAPI 'controlled'\n+\t */\n+\tTF_GLOBAL_CFG_CFG_HCAPI,\n+};\n+\n+/**\n+ * Global cfg configuration structure, used by the Device to configure\n+ * how an individual global cfg type is configured in regard to the HCAPI type.\n+ */\n+struct tf_global_cfg_cfg {\n+\t/**\n+\t * Global cfg config controls how the DB for that element is\n+\t * processed.\n+\t */\n+\tenum tf_global_cfg_cfg_type cfg_type;\n+\n+\t/**\n+\t * HCAPI Type for the element. Used for TF to HCAPI type\n+\t * conversion.\n+\t */\n+\tuint16_t hcapi_type;\n+};\n+\n+/**\n+ * Global Cfg configuration parameters\n+ */\n+struct tf_global_cfg_cfg_parms {\n+\t/**\n+\t * Number of table types in the configuration array\n+\t */\n+\tuint16_t num_elements;\n+\t/**\n+\t * Table Type element configuration array\n+\t */\n+\tstruct tf_global_cfg_cfg *cfg;\n+};\n+\n+/**\n+ * global cfg parameters\n+ */\n+struct tf_dev_global_cfg_parms {\n+\t/**\n+\t * [in] Receive or transmit direction\n+\t */\n+\tenum tf_dir dir;\n+\t/**\n+\t * [in] Global config type\n+\t */\n+\tenum tf_global_config_type type;\n+\t/**\n+\t * [in] Offset @ the type\n+\t */\n+\tuint32_t offset;\n+\t/**\n+\t * [in/out] Value of the configuration\n+\t * set - Read, Modify and Write\n+\t * get - Read the full configuration\n+\t */\n+\tuint8_t *config;\n+\t/**\n+\t * [in] struct containing size\n+\t */\n+\tuint16_t config_sz_in_bytes;\n+};\n+\n+/**\n+ * @page global cfg\n+ *\n+ * @ref tf_global_cfg_bind\n+ *\n+ * @ref tf_global_cfg_unbind\n+ *\n+ * @ref tf_global_cfg_set\n+ *\n+ * @ref tf_global_cfg_get\n+ *\n+ */\n+/**\n+ * Initializes the Global Cfg module with the requested DBs. Must be\n+ * invoked as the first thing before any of the access functions.\n+ *\n+ * [in] tfp\n+ *   Pointer to TF handle\n+ *\n+ * [in] parms\n+ *   Pointer to Global Cfg configuration parameters\n+ *\n+ * Returns\n+ *   - (0) if successful.\n+ *   - (-EINVAL) on failure.\n+ */\n+int\n+tf_global_cfg_bind(struct tf *tfp,\n+\t\t   struct tf_global_cfg_cfg_parms *parms);\n+\n+/**\n+ * Cleans up the private DBs and releases all the data.\n+ *\n+ * [in] tfp\n+ *   Pointer to TF handle\n+ *\n+ * [in] parms\n+ *   Pointer to Global Cfg configuration parameters\n+ *\n+ * Returns\n+ *   - (0) if successful.\n+ *   - (-EINVAL) on failure.\n+ */\n+int\n+tf_global_cfg_unbind(struct tf *tfp);\n+\n+/**\n+ * Updates the global configuration table\n+ *\n+ * [in] tfp\n+ *   Pointer to TF handle, used for HCAPI communication\n+ *\n+ * [in] parms\n+ *   Pointer to global cfg parameters\n+ *\n+ * Returns\n+ *   - (0) if successful.\n+ *   - (-EINVAL) on failure.\n+ */\n+int tf_global_cfg_set(struct tf *tfp,\n+\t\t      struct tf_dev_global_cfg_parms *parms);\n+\n+/**\n+ * Get global configuration\n+ *\n+ * [in] tfp\n+ *   Pointer to TF handle, used for HCAPI communication\n+ *\n+ * [in] parms\n+ *   Pointer to global cfg parameters\n+ *\n+ * Returns\n+ *   - (0) if successful.\n+ *   - (-EINVAL) on failure.\n+ */\n+int tf_global_cfg_get(struct tf *tfp,\n+\t\t      struct tf_dev_global_cfg_parms *parms);\n+\n+#endif /* TF_GLOBAL_CFG_H */\ndiff --git a/drivers/net/bnxt/tf_core/tf_msg.c b/drivers/net/bnxt/tf_core/tf_msg.c\nindex 8c2dff8..035c094 100644\n--- a/drivers/net/bnxt/tf_core/tf_msg.c\n+++ b/drivers/net/bnxt/tf_core/tf_msg.c\n@@ -992,6 +992,111 @@ tf_msg_get_tbl_entry(struct tf *tfp,\n /* HWRM Tunneled messages */\n \n int\n+tf_msg_get_global_cfg(struct tf *tfp,\n+\t\t      struct tf_dev_global_cfg_parms *params)\n+{\n+\tint rc = 0;\n+\tstruct tfp_send_msg_parms parms = { 0 };\n+\ttf_get_global_cfg_input_t req = { 0 };\n+\ttf_get_global_cfg_output_t resp = { 0 };\n+\tuint32_t flags = 0;\n+\tuint8_t fw_session_id;\n+\tuint16_t resp_size = 0;\n+\n+\trc = tf_session_get_fw_session_id(tfp, &fw_session_id);\n+\tif (rc) {\n+\t\tTFP_DRV_LOG(ERR,\n+\t\t\t    \"%s: Unable to lookup FW id, rc:%s\\n\",\n+\t\t\t    tf_dir_2_str(params->dir),\n+\t\t\t    strerror(-rc));\n+\t\treturn rc;\n+\t}\n+\n+\tflags = (params->dir == TF_DIR_TX ?\n+\t\t TF_GET_GLOBAL_CFG_INPUT_FLAGS_DIR_TX :\n+\t\t TF_GET_GLOBAL_CFG_INPUT_FLAGS_DIR_RX);\n+\n+\t/* Populate the request */\n+\treq.fw_session_id = tfp_cpu_to_le_32(fw_session_id);\n+\treq.flags = tfp_cpu_to_le_32(flags);\n+\treq.type = tfp_cpu_to_le_32(params->type);\n+\treq.offset = tfp_cpu_to_le_32(params->offset);\n+\treq.size = tfp_cpu_to_le_32(params->config_sz_in_bytes);\n+\n+\tMSG_PREP(parms,\n+\t\t TF_KONG_MB,\n+\t\t HWRM_TF,\n+\t\t HWRM_TFT_GET_GLOBAL_CFG,\n+\t\t req,\n+\t\t resp);\n+\n+\trc = tfp_send_msg_tunneled(tfp, &parms);\n+\n+\tif (rc != 0)\n+\t\treturn rc;\n+\n+\t/* Verify that we got enough buffer to return the requested data */\n+\tresp_size = tfp_le_to_cpu_16(resp.size);\n+\tif (resp_size < params->config_sz_in_bytes)\n+\t\treturn -EINVAL;\n+\n+\tif (params->config)\n+\t\ttfp_memcpy(params->config,\n+\t\t\t   resp.data,\n+\t\t\t   resp_size);\n+\telse\n+\t\treturn -EFAULT;\n+\n+\treturn tfp_le_to_cpu_32(parms.tf_resp_code);\n+}\n+\n+int\n+tf_msg_set_global_cfg(struct tf *tfp,\n+\t\t      struct tf_dev_global_cfg_parms *params)\n+{\n+\tint rc = 0;\n+\tstruct tfp_send_msg_parms parms = { 0 };\n+\ttf_set_global_cfg_input_t req = { 0 };\n+\tuint32_t flags = 0;\n+\tuint8_t fw_session_id;\n+\n+\trc = tf_session_get_fw_session_id(tfp, &fw_session_id);\n+\tif (rc) {\n+\t\tTFP_DRV_LOG(ERR,\n+\t\t\t    \"%s: Unable to lookup FW id, rc:%s\\n\",\n+\t\t\t    tf_dir_2_str(params->dir),\n+\t\t\t    strerror(-rc));\n+\t\treturn rc;\n+\t}\n+\n+\tflags = (params->dir == TF_DIR_TX ?\n+\t\t TF_SET_GLOBAL_CFG_INPUT_FLAGS_DIR_TX :\n+\t\t TF_SET_GLOBAL_CFG_INPUT_FLAGS_DIR_RX);\n+\n+\t/* Populate the request */\n+\treq.fw_session_id = tfp_cpu_to_le_32(fw_session_id);\n+\treq.flags = tfp_cpu_to_le_32(flags);\n+\treq.type = tfp_cpu_to_le_32(params->type);\n+\treq.offset = tfp_cpu_to_le_32(params->offset);\n+\ttfp_memcpy(req.data, params->config,\n+\t\t   params->config_sz_in_bytes);\n+\treq.size = tfp_cpu_to_le_32(params->config_sz_in_bytes);\n+\n+\tMSG_PREP_NO_RESP(parms,\n+\t\t\t TF_KONG_MB,\n+\t\t\t HWRM_TF,\n+\t\t\t HWRM_TFT_SET_GLOBAL_CFG,\n+\t\t\t req);\n+\n+\trc = tfp_send_msg_tunneled(tfp, &parms);\n+\n+\tif (rc != 0)\n+\t\treturn rc;\n+\n+\treturn tfp_le_to_cpu_32(parms.tf_resp_code);\n+}\n+\n+int\n tf_msg_bulk_get_tbl_entry(struct tf *tfp,\n \t\t\t  enum tf_dir dir,\n \t\t\t  uint16_t hcapi_type,\n@@ -1066,8 +1171,8 @@ tf_msg_get_if_tbl_entry(struct tf *tfp,\n \t\treturn rc;\n \t}\n \n-\tflags = (params->dir == TF_DIR_TX ? TF_IF_TBL_SET_INPUT_FLAGS_DIR_TX :\n-\t\t TF_IF_TBL_SET_INPUT_FLAGS_DIR_RX);\n+\tflags = (params->dir == TF_DIR_TX ? TF_IF_TBL_GET_INPUT_FLAGS_DIR_TX :\n+\t\t TF_IF_TBL_GET_INPUT_FLAGS_DIR_RX);\n \n \t/* Populate the request */\n \treq.fw_session_id =\ndiff --git a/drivers/net/bnxt/tf_core/tf_msg.h b/drivers/net/bnxt/tf_core/tf_msg.h\nindex c02a520..195710e 100644\n--- a/drivers/net/bnxt/tf_core/tf_msg.h\n+++ b/drivers/net/bnxt/tf_core/tf_msg.h\n@@ -12,6 +12,7 @@\n #include \"tf_tbl.h\"\n #include \"tf_rm.h\"\n #include \"tf_tcam.h\"\n+#include \"tf_global_cfg.h\"\n \n struct tf;\n \n@@ -449,6 +450,36 @@ int tf_msg_get_tbl_entry(struct tf *tfp,\n /* HWRM Tunneled messages */\n \n /**\n+ * Sends global cfg read request to Firmware\n+ *\n+ * [in] tfp\n+ *   Pointer to TF handle\n+ *\n+ * [in] params\n+ *   Pointer to read parameters\n+ *\n+ * Returns:\n+ *   0 on Success else internal Truflow error\n+ */\n+int tf_msg_get_global_cfg(struct tf *tfp,\n+\t\t\t  struct tf_dev_global_cfg_parms *params);\n+\n+/**\n+ * Sends global cfg update request to Firmware\n+ *\n+ * [in] tfp\n+ *   Pointer to TF handle\n+ *\n+ * [in] params\n+ *   Pointer to write parameters\n+ *\n+ * Returns:\n+ *   0 on Success else internal Truflow error\n+ */\n+int tf_msg_set_global_cfg(struct tf *tfp,\n+\t\t\t  struct tf_dev_global_cfg_parms *params);\n+\n+/**\n  * Sends bulk get message of a Table Type element to the firmware.\n  *\n  * [in] tfp\n",
    "prefixes": [
        "30/50"
    ]
}