get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 71153,
    "url": "https://patches.dpdk.org/api/patches/71153/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20200610114427.22146-18-somnath.kotur@broadcom.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20200610114427.22146-18-somnath.kotur@broadcom.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200610114427.22146-18-somnath.kotur@broadcom.com",
    "date": "2020-06-10T11:44:08",
    "name": "[17/36] net/bnxt: extend index table processing to process action templates",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "debcac7f7a9896198ade1f9da1471b608eafd949",
    "submitter": {
        "id": 908,
        "url": "https://patches.dpdk.org/api/people/908/?format=api",
        "name": "Somnath Kotur",
        "email": "somnath.kotur@broadcom.com"
    },
    "delegate": {
        "id": 1766,
        "url": "https://patches.dpdk.org/api/users/1766/?format=api",
        "username": "ajitkhaparde",
        "first_name": "Ajit",
        "last_name": "Khaparde",
        "email": "ajit.khaparde@broadcom.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20200610114427.22146-18-somnath.kotur@broadcom.com/mbox/",
    "series": [
        {
            "id": 10380,
            "url": "https://patches.dpdk.org/api/series/10380/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=10380",
            "date": "2020-06-10T11:43:51",
            "name": "bnxt patches",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/10380/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/71153/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/71153/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 CA36CA051B;\n\tWed, 10 Jun 2020 13:52:02 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 737E91BEE5;\n\tWed, 10 Jun 2020 13:49:21 +0200 (CEST)",
            "from relay.smtp.broadcom.com (relay.smtp.broadcom.com\n [192.19.232.149]) by dpdk.org (Postfix) with ESMTP id AA4DC1BED0\n for <dev@dpdk.org>; Wed, 10 Jun 2020 13:49:17 +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 096D01BD53A;\n Wed, 10 Jun 2020 04:49:16 -0700 (PDT)"
        ],
        "DKIM-Filter": "OpenDKIM Filter v2.10.3 relay.smtp.broadcom.com 096D01BD53A",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com;\n s=dkimrelay; t=1591789757;\n bh=WUDy7hw4FVbThYdvmgTFfLOaaxH2PEZ4aXl6QZqIdVg=;\n h=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n b=XaRAQoBKMvvLwAKmVCFXgXhveOQRM4KI2ONNX5HFHJp+jnv8pZtJqd61C0TnE3NBJ\n ply86kzq1zJ+mkblsTc8g6hIplHA91ULJGX562XMf1bDrEMO9OhKVBq+ob1pp9vvDc\n 5/bOr4kx3478WJ6/ODJN4aAu7ohvFNVfx4YiL6IU=",
        "From": "Somnath Kotur <somnath.kotur@broadcom.com>",
        "To": "dev@dpdk.org",
        "Cc": "ferruh.yigit@intel.com",
        "Date": "Wed, 10 Jun 2020 17:14:08 +0530",
        "Message-Id": "<20200610114427.22146-18-somnath.kotur@broadcom.com>",
        "X-Mailer": "git-send-email 2.10.1.613.g2cc2e70",
        "In-Reply-To": "<20200610114427.22146-1-somnath.kotur@broadcom.com>",
        "References": "<20200610114427.22146-1-somnath.kotur@broadcom.com>",
        "Subject": "[dpdk-dev] [PATCH 17/36] net/bnxt: extend index table processing to\n\tprocess action templates",
        "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: Kishore Padmanabha <kishore.padmanabha@broadcom.com>\n\nThe index table processing is extended to address encapsulation fields\nso that action template index table can be processed by a common index\nprocessing function that can process both class and action index\ntables.\n\nSigned-off-by: Kishore Padmanabha <kishore.padmanabha@broadcom.com>\nReviewed-by: Michael Baucom <michael.baucom@broadcom.com>\nSigned-off-by: Somnath Kotur <somnath.kotur@broadcom.com>\n---\n drivers/net/bnxt/tf_ulp/ulp_mapper.c          | 305 ++++++++------------------\n drivers/net/bnxt/tf_ulp/ulp_mapper.h          |   5 +-\n drivers/net/bnxt/tf_ulp/ulp_template_db.c     |   9 +-\n drivers/net/bnxt/tf_ulp/ulp_template_struct.h |  21 +-\n 4 files changed, 109 insertions(+), 231 deletions(-)",
    "diff": "diff --git a/drivers/net/bnxt/tf_ulp/ulp_mapper.c b/drivers/net/bnxt/tf_ulp/ulp_mapper.c\nindex a0b77c0..7f7335a 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_mapper.c\n+++ b/drivers/net/bnxt/tf_ulp/ulp_mapper.c\n@@ -159,7 +159,7 @@ ulp_mapper_act_prop_size_get(uint32_t idx)\n  *\n  * Returns An array of action tables to implement the flow, or NULL on error.\n  */\n-static struct bnxt_ulp_mapper_act_tbl_info *\n+static struct bnxt_ulp_mapper_tbl_info *\n ulp_mapper_action_tbl_list_get(uint32_t dev_id,\n \t\t\t       uint32_t tid,\n \t\t\t       uint32_t *num_tbls)\n@@ -196,7 +196,7 @@ ulp_mapper_action_tbl_list_get(uint32_t dev_id,\n  * returns An array of classifier tables to implement the flow, or NULL on\n  * error\n  */\n-static struct bnxt_ulp_mapper_class_tbl_info *\n+static struct bnxt_ulp_mapper_tbl_info *\n ulp_mapper_class_tbl_list_get(uint32_t dev_id,\n \t\t\t      uint32_t tid,\n \t\t\t      uint32_t *num_tbls)\n@@ -228,7 +228,7 @@ ulp_mapper_class_tbl_list_get(uint32_t dev_id,\n  * Returns array of Key fields, or NULL on error.\n  */\n static struct bnxt_ulp_mapper_class_key_field_info *\n-ulp_mapper_key_fields_get(struct bnxt_ulp_mapper_class_tbl_info *tbl,\n+ulp_mapper_key_fields_get(struct bnxt_ulp_mapper_tbl_info *tbl,\n \t\t\t  uint32_t *num_flds)\n {\n \tuint32_t idx;\n@@ -255,7 +255,7 @@ ulp_mapper_key_fields_get(struct bnxt_ulp_mapper_class_tbl_info *tbl,\n  * Returns array of data fields, or NULL on error.\n  */\n static struct bnxt_ulp_mapper_result_field_info *\n-ulp_mapper_result_fields_get(struct bnxt_ulp_mapper_class_tbl_info *tbl,\n+ulp_mapper_result_fields_get(struct bnxt_ulp_mapper_tbl_info *tbl,\n \t\t\t     uint32_t *num_flds)\n {\n \tuint32_t idx;\n@@ -280,7 +280,7 @@ ulp_mapper_result_fields_get(struct bnxt_ulp_mapper_class_tbl_info *tbl,\n  * Returns array of data fields, or NULL on error.\n  */\n static struct bnxt_ulp_mapper_result_field_info *\n-ulp_mapper_act_result_fields_get(struct bnxt_ulp_mapper_act_tbl_info *tbl,\n+ulp_mapper_act_result_fields_get(struct bnxt_ulp_mapper_tbl_info *tbl,\n \t\t\t\t uint32_t *num_rslt_flds,\n \t\t\t\t uint32_t *num_encap_flds)\n {\n@@ -307,7 +307,7 @@ ulp_mapper_act_result_fields_get(struct bnxt_ulp_mapper_act_tbl_info *tbl,\n  * returns array of ident fields, or NULL on error\n  */\n static struct bnxt_ulp_mapper_ident_info *\n-ulp_mapper_ident_fields_get(struct bnxt_ulp_mapper_class_tbl_info *tbl,\n+ulp_mapper_ident_fields_get(struct bnxt_ulp_mapper_tbl_info *tbl,\n \t\t\t    uint32_t *num_flds)\n {\n \tuint32_t idx;\n@@ -522,7 +522,7 @@ ulp_mapper_mark_free(struct bnxt_ulp_context *ulp,\n  */\n static int32_t\n ulp_mapper_ident_process(struct bnxt_ulp_mapper_parms *parms,\n-\t\t\t struct bnxt_ulp_mapper_class_tbl_info *tbl,\n+\t\t\t struct bnxt_ulp_mapper_tbl_info *tbl,\n \t\t\t struct bnxt_ulp_mapper_ident_info *ident,\n \t\t\t uint16_t *val)\n {\n@@ -892,185 +892,9 @@ ulp_mapper_keymask_field_process(struct bnxt_ulp_mapper_parms *parms,\n \treturn 0;\n }\n \n-/* Function to alloc action record and set the table. */\n-static int32_t\n-ulp_mapper_action_alloc_and_set(struct bnxt_ulp_mapper_parms *parms,\n-\t\t\t\tstruct ulp_blob *blob)\n-{\n-\tstruct ulp_flow_db_res_params\t\tfid_parms;\n-\tstruct tf_alloc_tbl_entry_parms\t\talloc_parms = { 0 };\n-\tstruct tf_free_tbl_entry_parms\t\tfree_parms = { 0 };\n-\tstruct bnxt_ulp_mapper_act_tbl_info\t*atbls = parms->atbls;\n-\tint32_t\t\t\t\t\trc = 0;\n-\tint32_t trc;\n-\tuint64_t\t\t\t\tidx;\n-\tuint32_t tbl_scope_id;\n-\n-\tbnxt_ulp_cntxt_tbl_scope_id_get(parms->ulp_ctx, &tbl_scope_id);\n-\n-\t/* Set the allocation parameters for the table*/\n-\talloc_parms.dir = atbls->direction;\n-\talloc_parms.type = atbls->resource_type;\n-\talloc_parms.search_enable = atbls->srch_b4_alloc;\n-\talloc_parms.result = ulp_blob_data_get(blob,\n-\t\t\t\t\t       &alloc_parms.result_sz_in_bytes);\n-\talloc_parms.tbl_scope_id = tbl_scope_id;\n-\tif (!alloc_parms.result) {\n-\t\tBNXT_TF_DBG(ERR, \"blob is not populated\\n\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\trc = tf_alloc_tbl_entry(parms->tfp, &alloc_parms);\n-\tif (rc) {\n-\t\tBNXT_TF_DBG(ERR, \"table type= [%d] dir = [%s] alloc failed\\n\",\n-\t\t\t    alloc_parms.type,\n-\t\t\t    (alloc_parms.dir == TF_DIR_RX) ? \"RX\" : \"TX\");\n-\t\treturn rc;\n-\t}\n-\n-\t/* Need to calculate the idx for the result record */\n-\tuint64_t tmpidx = alloc_parms.idx;\n-\n-\tif (atbls->resource_type == TF_TBL_TYPE_EXT)\n-\t\ttmpidx = TF_ACT_REC_OFFSET_2_PTR(alloc_parms.idx);\n-\telse\n-\t\ttmpidx = alloc_parms.idx;\n-\n-\tidx = tfp_cpu_to_be_64(tmpidx);\n-\n-\t/* Store the allocated index for future use in the regfile */\n-\trc = ulp_regfile_write(parms->regfile, atbls->regfile_wr_idx, idx);\n-\tif (!rc) {\n-\t\tBNXT_TF_DBG(ERR, \"regfile[%d] write failed\\n\",\n-\t\t\t    atbls->regfile_wr_idx);\n-\t\trc = -EINVAL;\n-\t\tgoto error;\n-\t}\n-\n-\t/*\n-\t * The set_tbl_entry API if search is not enabled or searched entry\n-\t * is not found.\n-\t */\n-\tif (!atbls->srch_b4_alloc || !alloc_parms.hit) {\n-\t\tstruct tf_set_tbl_entry_parms set_parm = { 0 };\n-\t\tuint16_t\tlength;\n-\n-\t\tset_parm.dir\t= atbls->direction;\n-\t\tset_parm.type\t= atbls->resource_type;\n-\t\tset_parm.idx\t= alloc_parms.idx;\n-\t\tset_parm.data\t= ulp_blob_data_get(blob, &length);\n-\t\tset_parm.data_sz_in_bytes = length / 8;\n-\n-\t\tif (set_parm.type == TF_TBL_TYPE_EXT)\n-\t\t\tset_parm.tbl_scope_id = tbl_scope_id;\n-\n-\t\t/* set the table entry */\n-\t\trc = tf_set_tbl_entry(parms->tfp, &set_parm);\n-\t\tif (rc) {\n-\t\t\tBNXT_TF_DBG(ERR, \"table[%d][%s][%d] set failed\\n\",\n-\t\t\t\t    set_parm.type,\n-\t\t\t\t    (set_parm.dir == TF_DIR_RX) ? \"RX\" : \"TX\",\n-\t\t\t\t    set_parm.idx);\n-\t\t\tgoto error;\n-\t\t}\n-\t}\n-\n-\t/* Link the resource to the flow in the flow db */\n-\tmemset(&fid_parms, 0, sizeof(fid_parms));\n-\tfid_parms.direction\t\t= atbls->direction;\n-\tfid_parms.resource_func\t\t= atbls->resource_func;\n-\tfid_parms.resource_type\t\t= atbls->resource_type;\n-\tfid_parms.resource_hndl\t\t= alloc_parms.idx;\n-\tfid_parms.critical_resource\t= 0;\n-\n-\trc = ulp_flow_db_resource_add(parms->ulp_ctx,\n-\t\t\t\t      parms->tbl_idx,\n-\t\t\t\t      parms->fid,\n-\t\t\t\t      &fid_parms);\n-\tif (rc) {\n-\t\tBNXT_TF_DBG(ERR, \"Failed to link resource to flow rc = %d\\n\",\n-\t\t\t    rc);\n-\t\trc = -EINVAL;\n-\t\tgoto error;\n-\t}\n-\n-\treturn 0;\n-error:\n-\n-\tfree_parms.dir\t= alloc_parms.dir;\n-\tfree_parms.type\t= alloc_parms.type;\n-\tfree_parms.idx\t= alloc_parms.idx;\n-\n-\ttrc = tf_free_tbl_entry(parms->tfp, &free_parms);\n-\tif (trc)\n-\t\tBNXT_TF_DBG(ERR, \"Failed to free table entry on failure\\n\");\n-\n-\treturn rc;\n-}\n-\n-/*\n- * Function to process the action Info. Iterate through the list\n- * action info templates and process it.\n- */\n-static int32_t\n-ulp_mapper_action_info_process(struct bnxt_ulp_mapper_parms *parms,\n-\t\t\t       struct bnxt_ulp_mapper_act_tbl_info *tbl)\n-{\n-\tstruct ulp_blob\t\t\t\t\tblob;\n-\tstruct bnxt_ulp_mapper_result_field_info\t*flds, *fld;\n-\tuint32_t\t\t\t\t\tnum_flds = 0;\n-\tuint32_t\t\t\t\t\tencap_flds = 0;\n-\tuint32_t\t\t\t\t\ti;\n-\tint32_t\t\t\t\t\t\trc;\n-\tuint16_t\t\t\t\t\tbit_size;\n-\n-\tif (!tbl || !parms->act_prop || !parms->act_bitmap || !parms->regfile)\n-\t\treturn -EINVAL;\n-\n-\t/* use the max size if encap is enabled */\n-\tif (tbl->encap_num_fields)\n-\t\tbit_size = BNXT_ULP_FLMP_BLOB_SIZE_IN_BITS;\n-\telse\n-\t\tbit_size = tbl->result_bit_size;\n-\tif (!ulp_blob_init(&blob, bit_size, parms->device_params->byte_order)) {\n-\t\tBNXT_TF_DBG(ERR, \"action blob init failed\\n\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tflds = ulp_mapper_act_result_fields_get(tbl, &num_flds, &encap_flds);\n-\tif (!flds || !num_flds) {\n-\t\tBNXT_TF_DBG(ERR, \"Template undefined for action\\n\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tfor (i = 0; i < (num_flds + encap_flds); i++) {\n-\t\tfld = &flds[i];\n-\t\trc = ulp_mapper_result_field_process(parms,\n-\t\t\t\t\t\t     tbl->direction,\n-\t\t\t\t\t\t     fld,\n-\t\t\t\t\t\t     &blob,\n-\t\t\t\t\t\t     \"Action\");\n-\t\tif (rc) {\n-\t\t\tBNXT_TF_DBG(ERR, \"Action field failed\\n\");\n-\t\t\treturn rc;\n-\t\t}\n-\t\t/* set the swap index if 64 bit swap is enabled */\n-\t\tif (parms->device_params->encap_byte_swap && encap_flds) {\n-\t\t\tif ((i + 1) == num_flds)\n-\t\t\t\tulp_blob_encap_swap_idx_set(&blob);\n-\t\t\t/* if 64 bit swap is enabled perform the 64bit swap */\n-\t\t\tif ((i + 1) == (num_flds + encap_flds))\n-\t\t\t\tulp_blob_perform_encap_swap(&blob);\n-\t\t}\n-\t}\n-\n-\trc = ulp_mapper_action_alloc_and_set(parms, &blob);\n-\treturn rc;\n-}\n-\n static int32_t\n ulp_mapper_mark_gfid_process(struct bnxt_ulp_mapper_parms *parms,\n-\t\t\t     struct bnxt_ulp_mapper_class_tbl_info *tbl,\n+\t\t\t     struct bnxt_ulp_mapper_tbl_info *tbl,\n \t\t\t     uint64_t flow_id)\n {\n \tstruct ulp_flow_db_res_params fid_parms;\n@@ -1112,7 +936,7 @@ ulp_mapper_mark_gfid_process(struct bnxt_ulp_mapper_parms *parms,\n \n static int32_t\n ulp_mapper_mark_act_ptr_process(struct bnxt_ulp_mapper_parms *parms,\n-\t\t\t\tstruct bnxt_ulp_mapper_class_tbl_info *tbl)\n+\t\t\t\tstruct bnxt_ulp_mapper_tbl_info *tbl)\n {\n \tstruct ulp_flow_db_res_params fid_parms;\n \tuint32_t act_idx, mark, mark_flag;\n@@ -1160,7 +984,7 @@ ulp_mapper_mark_act_ptr_process(struct bnxt_ulp_mapper_parms *parms,\n \n static int32_t\n ulp_mapper_tcam_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n-\t\t\t    struct bnxt_ulp_mapper_class_tbl_info *tbl)\n+\t\t\t    struct bnxt_ulp_mapper_tbl_info *tbl)\n {\n \tstruct bnxt_ulp_mapper_class_key_field_info\t*kflds;\n \tstruct ulp_blob key, mask, data;\n@@ -1397,7 +1221,7 @@ ulp_mapper_tcam_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n \n static int32_t\n ulp_mapper_em_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n-\t\t\t  struct bnxt_ulp_mapper_class_tbl_info *tbl)\n+\t\t\t  struct bnxt_ulp_mapper_tbl_info *tbl)\n {\n \tstruct bnxt_ulp_mapper_class_key_field_info\t*kflds;\n \tstruct bnxt_ulp_mapper_result_field_info *dflds;\n@@ -1538,7 +1362,8 @@ ulp_mapper_em_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n \n static int32_t\n ulp_mapper_index_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n-\t\t\t     struct bnxt_ulp_mapper_class_tbl_info *tbl)\n+\t\t\t     struct bnxt_ulp_mapper_tbl_info *tbl,\n+\t\t\t     bool is_class_tbl)\n {\n \tstruct bnxt_ulp_mapper_result_field_info *flds;\n \tstruct ulp_flow_db_res_params\tfid_parms;\n@@ -1552,22 +1377,49 @@ ulp_mapper_index_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n \tstruct tf_free_tbl_entry_parms\tfree_parms = { 0 };\n \tuint32_t tbl_scope_id;\n \tstruct tf *tfp = bnxt_ulp_cntxt_tfp_get(parms->ulp_ctx);\n+\tuint16_t bit_size;\n+\tuint32_t encap_flds = 0;\n+\n+\t/* Get the scope id first */\n+\trc = bnxt_ulp_cntxt_tbl_scope_id_get(parms->ulp_ctx, &tbl_scope_id);\n+\tif (rc) {\n+\t\tBNXT_TF_DBG(ERR, \"Failed to get table scope rc=%d\\n\", rc);\n+\t\treturn rc;\n+\t}\n \n-\tbnxt_ulp_cntxt_tbl_scope_id_get(parms->ulp_ctx, &tbl_scope_id);\n+\t/* use the max size if encap is enabled */\n+\tif (tbl->encap_num_fields)\n+\t\tbit_size = BNXT_ULP_FLMP_BLOB_SIZE_IN_BITS;\n+\telse\n+\t\tbit_size = tbl->result_bit_size;\n \n-\tif (!ulp_blob_init(&data, tbl->result_bit_size,\n+\t/* Initialize the blob data */\n+\tif (!ulp_blob_init(&data, bit_size,\n \t\t\t   parms->device_params->byte_order)) {\n \t\tBNXT_TF_DBG(ERR, \"Failed initial index table blob\\n\");\n \t\treturn -EINVAL;\n \t}\n \n-\tflds = ulp_mapper_result_fields_get(tbl, &num_flds);\n+\t/* Get the result fields list */\n+\tif (is_class_tbl)\n+\t\tflds = ulp_mapper_result_fields_get(tbl, &num_flds);\n+\telse\n+\t\tflds = ulp_mapper_act_result_fields_get(tbl, &num_flds,\n+\t\t\t\t\t\t\t&encap_flds);\n+\n \tif (!flds || !num_flds) {\n-\t\tBNXT_TF_DBG(ERR, \"Template undefined for action\\n\");\n+\t\tBNXT_TF_DBG(ERR, \"template undefined for the index table\\n\");\n \t\treturn -EINVAL;\n \t}\n \n-\tfor (i = 0; i < num_flds; i++) {\n+\t/* process the result fields, loop through them */\n+\tfor (i = 0; i < (num_flds + encap_flds); i++) {\n+\t\t/* set the swap index if encap swap bit is enabled */\n+\t\tif (parms->device_params->encap_byte_swap && encap_flds &&\n+\t\t    ((i + 1) == num_flds))\n+\t\t\tulp_blob_encap_swap_idx_set(&data);\n+\n+\t\t/* Process the result fields */\n \t\trc = ulp_mapper_result_field_process(parms,\n \t\t\t\t\t\t     tbl->direction,\n \t\t\t\t\t\t     &flds[i],\n@@ -1577,27 +1429,50 @@ ulp_mapper_index_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n \t\t\tBNXT_TF_DBG(ERR, \"data field failed\\n\");\n \t\t\treturn rc;\n \t\t}\n+\n+\t\t/* if encap bit swap is enabled perform the bit swap */\n+\t\tif (parms->device_params->encap_byte_swap && encap_flds) {\n+\t\t\tif ((i + 1) == (num_flds + encap_flds))\n+\t\t\t\tulp_blob_perform_encap_swap(&data);\n+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG\n+\t\t\tif ((i + 1) == (num_flds + encap_flds)) {\n+\t\t\t\tBNXT_TF_DBG(INFO, \"Dump fter encap swap\\n\");\n+\t\t\t\tulp_mapper_blob_dump(&data);\n+\t\t\t}\n+#endif\n+\t\t}\n \t}\n \n+\t/* Perform the tf table allocation by filling the alloc params */\n \taparms.dir\t\t= tbl->direction;\n \taparms.type\t\t= tbl->resource_type;\n \taparms.search_enable\t= tbl->srch_b4_alloc;\n \taparms.result\t\t= ulp_blob_data_get(&data, &tmplen);\n-\taparms.result_sz_in_bytes = ULP_SZ_BITS2BYTES(tbl->result_bit_size);\n+\taparms.result_sz_in_bytes = ULP_BITS_2_BYTE(tmplen);\n \taparms.tbl_scope_id\t= tbl_scope_id;\n \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    tbl->resource_type,\n-\t\t\t    (tbl->direction == TF_DIR_RX) ? \"RX\" : \"TX\",\n+\t\t\t    aparms.type,\n+\t\t\t    (aparms.dir == TF_DIR_RX) ? \"RX\" : \"TX\",\n \t\t\t    rc);\n \t\treturn rc;\n \t}\n \n+\t/*\n+\t * calculate the idx for the result record, for external EM the offset\n+\t * needs to be shifted accordingly. If external non-inline table types\n+\t * are used then need to revisit this logic.\n+\t */\n+\tif (aparms.type == TF_TBL_TYPE_EXT)\n+\t\tidx = TF_ACT_REC_OFFSET_2_PTR(aparms.idx);\n+\telse\n+\t\tidx = aparms.idx;\n+\n \t/* Always storing values in Regfile in BE */\n-\tidx = tfp_cpu_to_be_64(aparms.idx);\n+\tidx = tfp_cpu_to_be_64(idx);\n \trc = ulp_regfile_write(parms->regfile, tbl->regfile_wr_idx, idx);\n \tif (!rc) {\n \t\tBNXT_TF_DBG(ERR, \"Write regfile[%d] failed\\n\",\n@@ -1605,23 +1480,22 @@ ulp_mapper_index_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n \t\tgoto error;\n \t}\n \n-\tif (!tbl->srch_b4_alloc) {\n+\t/* Perform the tf table set by filling the set params */\n+\tif (!tbl->srch_b4_alloc || !aparms.hit) {\n \t\tsparms.dir\t\t= tbl->direction;\n \t\tsparms.type\t\t= tbl->resource_type;\n \t\tsparms.data\t\t= ulp_blob_data_get(&data, &tmplen);\n-\t\tsparms.data_sz_in_bytes =\n-\t\t\tULP_SZ_BITS2BYTES(tbl->result_bit_size);\n+\t\tsparms.data_sz_in_bytes = ULP_BITS_2_BYTE(tmplen);\n \t\tsparms.idx\t\t= aparms.idx;\n \t\tsparms.tbl_scope_id\t= tbl_scope_id;\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    tbl->resource_type,\n-\t\t\t\t    (tbl->direction == TF_DIR_RX) ? \"RX\" : \"TX\",\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-\n \t\t\tgoto error;\n \t\t}\n \t}\n@@ -1664,7 +1538,7 @@ ulp_mapper_index_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n \n static int32_t\n ulp_mapper_cache_tbl_process(struct bnxt_ulp_mapper_parms *parms,\n-\t\t\t     struct bnxt_ulp_mapper_class_tbl_info *tbl)\n+\t\t\t     struct bnxt_ulp_mapper_tbl_info *tbl)\n {\n \tstruct bnxt_ulp_mapper_class_key_field_info *kflds;\n \tstruct bnxt_ulp_mapper_cache_entry *cache_entry;\n@@ -1858,6 +1732,7 @@ ulp_mapper_action_tbls_process(struct bnxt_ulp_mapper_parms *parms)\n {\n \tuint32_t\ti;\n \tint32_t\t\trc = 0;\n+\tstruct bnxt_ulp_mapper_tbl_info *tbl;\n \n \tif (!parms->atbls || !parms->num_atbls) {\n \t\tBNXT_TF_DBG(ERR, \"No action tables for template[%d][%d].\\n\",\n@@ -1866,9 +1741,21 @@ ulp_mapper_action_tbls_process(struct bnxt_ulp_mapper_parms *parms)\n \t}\n \n \tfor (i = 0; i < parms->num_atbls; i++) {\n-\t\trc = ulp_mapper_action_info_process(parms, &parms->atbls[i]);\n-\t\tif (rc)\n-\t\t\treturn rc;\n+\t\ttbl = &parms->atbls[i];\n+\t\tswitch (tbl->resource_func) {\n+\t\tcase BNXT_ULP_RESOURCE_FUNC_INDEX_TABLE:\n+\t\t\trc = ulp_mapper_index_tbl_process(parms, tbl, false);\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tBNXT_TF_DBG(ERR, \"Unexpected action resource %d\\n\",\n+\t\t\t\t    tbl->resource_func);\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\t}\n+\tif (rc) {\n+\t\tBNXT_TF_DBG(ERR, \"Resource type %d failed\\n\",\n+\t\t\t    tbl->resource_func);\n+\t\treturn rc;\n \t}\n \n \treturn rc;\n@@ -1891,7 +1778,7 @@ ulp_mapper_class_tbls_process(struct bnxt_ulp_mapper_parms *parms)\n \t}\n \n \tfor (i = 0; i < parms->num_ctbls; i++) {\n-\t\tstruct bnxt_ulp_mapper_class_tbl_info *tbl = &parms->ctbls[i];\n+\t\tstruct bnxt_ulp_mapper_tbl_info *tbl = &parms->ctbls[i];\n \n \t\tswitch (tbl->resource_func) {\n \t\tcase BNXT_ULP_RESOURCE_FUNC_TCAM_TABLE:\n@@ -1901,7 +1788,7 @@ ulp_mapper_class_tbls_process(struct bnxt_ulp_mapper_parms *parms)\n \t\t\trc = ulp_mapper_em_tbl_process(parms, tbl);\n \t\t\tbreak;\n \t\tcase BNXT_ULP_RESOURCE_FUNC_INDEX_TABLE:\n-\t\t\trc = ulp_mapper_index_tbl_process(parms, tbl);\n+\t\t\trc = ulp_mapper_index_tbl_process(parms, tbl, true);\n \t\t\tbreak;\n \t\tcase BNXT_ULP_RESOURCE_FUNC_CACHE_TABLE:\n \t\t\trc = ulp_mapper_cache_tbl_process(parms, tbl);\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_mapper.h b/drivers/net/bnxt/tf_ulp/ulp_mapper.h\nindex 0c9bb86..67410c9 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_mapper.h\n+++ b/drivers/net/bnxt/tf_ulp/ulp_mapper.h\n@@ -15,7 +15,6 @@\n #include \"bnxt_ulp.h\"\n #include \"ulp_utils.h\"\n \n-#define ULP_SZ_BITS2BYTES(x) (((x) + 7) / 8)\n #define ULP_IDENTS_INVALID ((uint16_t)0xffff)\n \n /*\n@@ -56,10 +55,10 @@ struct bnxt_ulp_mapper_data {\n struct bnxt_ulp_mapper_parms {\n \tuint32_t\t\t\t\tdev_id;\n \tuint32_t\t\t\t\tact_tid;\n-\tstruct bnxt_ulp_mapper_act_tbl_info\t*atbls;\n+\tstruct bnxt_ulp_mapper_tbl_info\t\t*atbls; /* action table */\n \tuint32_t\t\t\t\tnum_atbls;\n \tuint32_t\t\t\t\tclass_tid;\n-\tstruct bnxt_ulp_mapper_class_tbl_info\t*ctbls;\n+\tstruct bnxt_ulp_mapper_tbl_info\t\t*ctbls; /* class table */\n \tuint32_t\t\t\t\tnum_ctbls;\n \tstruct ulp_rte_act_prop\t\t\t*act_prop;\n \tstruct ulp_rte_act_bitmap\t\t*act_bitmap;\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_template_db.c b/drivers/net/bnxt/tf_ulp/ulp_template_db.c\nindex 395d33b..bac3bce 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_template_db.c\n+++ b/drivers/net/bnxt/tf_ulp/ulp_template_db.c\n@@ -587,7 +587,7 @@ struct bnxt_ulp_mapper_tbl_list_info ulp_class_tmpl_list[] = {\n \t}\n };\n \n-struct bnxt_ulp_mapper_class_tbl_info ulp_class_tbl_list[] = {\n+struct bnxt_ulp_mapper_tbl_info ulp_class_tbl_list[] = {\n \t{\n \t.resource_func = BNXT_ULP_RESOURCE_FUNC_CACHE_TABLE,\n \t.resource_type = TF_TCAM_TBL_TYPE_L2_CTXT_TCAM,\n@@ -602,6 +602,7 @@ struct bnxt_ulp_mapper_class_tbl_info ulp_class_tbl_list[] = {\n \t.result_start_idx = 0,\n \t.result_bit_size = 10,\n \t.result_num_fields = 1,\n+\t.encap_num_fields = 0,\n \t.ident_start_idx = 0,\n \t.ident_nums = 1,\n \t.mark_enable = BNXT_ULP_MARK_ENABLE_NO,\n@@ -623,6 +624,7 @@ struct bnxt_ulp_mapper_class_tbl_info ulp_class_tbl_list[] = {\n \t.result_start_idx = 1,\n \t.result_bit_size = 64,\n \t.result_num_fields = 13,\n+\t.encap_num_fields = 0,\n \t.ident_start_idx = 1,\n \t.ident_nums = 0,\n \t.mark_enable = BNXT_ULP_MARK_ENABLE_NO,\n@@ -644,6 +646,7 @@ struct bnxt_ulp_mapper_class_tbl_info ulp_class_tbl_list[] = {\n \t.result_start_idx = 14,\n \t.result_bit_size = 10,\n \t.result_num_fields = 1,\n+\t.encap_num_fields = 0,\n \t.ident_start_idx = 1,\n \t.ident_nums = 1,\n \t.mark_enable = BNXT_ULP_MARK_ENABLE_NO,\n@@ -665,6 +668,7 @@ struct bnxt_ulp_mapper_class_tbl_info ulp_class_tbl_list[] = {\n \t.result_start_idx = 15,\n \t.result_bit_size = 38,\n \t.result_num_fields = 8,\n+\t.encap_num_fields = 0,\n \t.ident_start_idx = 2,\n \t.ident_nums = 0,\n \t.mark_enable = BNXT_ULP_MARK_ENABLE_NO,\n@@ -686,6 +690,7 @@ struct bnxt_ulp_mapper_class_tbl_info ulp_class_tbl_list[] = {\n \t.result_start_idx = 23,\n \t.result_bit_size = 64,\n \t.result_num_fields = 9,\n+\t.encap_num_fields = 0,\n \t.ident_start_idx = 2,\n \t.ident_nums = 0,\n \t.mark_enable = BNXT_ULP_MARK_ENABLE_YES,\n@@ -1615,7 +1620,7 @@ struct bnxt_ulp_mapper_tbl_list_info ulp_act_tmpl_list[] = {\n \t}\n };\n \n-struct bnxt_ulp_mapper_act_tbl_info ulp_act_tbl_list[] = {\n+struct bnxt_ulp_mapper_tbl_info ulp_act_tbl_list[] = {\n \t{\n \t.resource_func = BNXT_ULP_RESOURCE_FUNC_INDEX_TABLE,\n \t.resource_type = TF_TBL_TYPE_EXT,\ndiff --git a/drivers/net/bnxt/tf_ulp/ulp_template_struct.h b/drivers/net/bnxt/tf_ulp/ulp_template_struct.h\nindex b51cca2..df3519d 100644\n--- a/drivers/net/bnxt/tf_ulp/ulp_template_struct.h\n+++ b/drivers/net/bnxt/tf_ulp/ulp_template_struct.h\n@@ -155,7 +155,7 @@ struct bnxt_ulp_mapper_tbl_list_info {\n \tuint32_t\tnum_tbls;\n };\n \n-struct bnxt_ulp_mapper_class_tbl_info {\n+struct bnxt_ulp_mapper_tbl_info {\n \tenum bnxt_ulp_resource_func\tresource_func;\n \tuint32_t\t\t\tresource_type; /* TF_ enum type */\n \tenum bnxt_ulp_resource_sub_type\tresource_sub_type;\n@@ -175,6 +175,7 @@ struct bnxt_ulp_mapper_class_tbl_info {\n \tuint32_t\tresult_start_idx;\n \tuint16_t\tresult_bit_size;\n \tuint16_t\tresult_num_fields;\n+\tuint16_t\tencap_num_fields;\n \n \t/* Information for accessing the ulp_ident_list */\n \tuint32_t\tident_start_idx;\n@@ -185,20 +186,6 @@ struct bnxt_ulp_mapper_class_tbl_info {\n \tenum bnxt_ulp_vfr_flag\t\tvfr_flag;\n };\n \n-struct bnxt_ulp_mapper_act_tbl_info {\n-\tenum bnxt_ulp_resource_func\tresource_func;\n-\tuint32_t\t\t\tresource_type; /* TF_ enum type */\n-\tenum bnxt_ulp_resource_sub_type\tresource_sub_type;\n-\tuint8_t\t\tdirection;\n-\tuint8_t\t\tsrch_b4_alloc;\n-\tuint32_t\tresult_start_idx;\n-\tuint16_t\tresult_bit_size;\n-\tuint16_t\tencap_num_fields;\n-\tuint16_t\tresult_num_fields;\n-\n-\tenum bnxt_ulp_regfile_index\tregfile_wr_idx;\n-};\n-\n struct bnxt_ulp_mapper_class_key_field_info {\n \tuint8_t\t\t\tdescription[64];\n \tenum bnxt_ulp_mask_opc\tmask_opcode;\n@@ -263,8 +250,8 @@ extern struct bnxt_ulp_mapper_tbl_list_info\tulp_act_tmpl_list[];\n  * table entry to include the start index and number of instructions in the\n  * field lists.\n  */\n-extern struct bnxt_ulp_mapper_class_tbl_info\tulp_class_tbl_list[];\n-extern struct bnxt_ulp_mapper_act_tbl_info\tulp_act_tbl_list[];\n+extern struct bnxt_ulp_mapper_tbl_info\tulp_class_tbl_list[];\n+extern struct bnxt_ulp_mapper_tbl_info\tulp_act_tbl_list[];\n \n /*\n  * The ulp_class_result_field_list provides the instructions for creating result\n",
    "prefixes": [
        "17/36"
    ]
}