Show a patch.

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

{
    "id": 74677,
    "url": "https://patches.dpdk.org/api/patches/74677/",
    "web_url": "https://patches.dpdk.org/patch/74677/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/",
        "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"
    },
    "msgid": "<20200723115639.22357-16-somnath.kotur@broadcom.com>",
    "date": "2020-07-23T11:56:34",
    "name": "[v2,15/20] net/bnxt: delete VF FW rules when a representor is created",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "30c9983acb942850f64865b6051f9f05362b2ebb",
    "submitter": {
        "id": 908,
        "url": "https://patches.dpdk.org/api/people/908/",
        "name": "Somnath Kotur",
        "email": "somnath.kotur@broadcom.com"
    },
    "delegate": {
        "id": 1766,
        "url": "https://patches.dpdk.org/api/users/1766/",
        "username": "ajitkhaparde",
        "first_name": "Ajit",
        "last_name": "Khaparde",
        "email": "ajit.khaparde@broadcom.com"
    },
    "mbox": "https://patches.dpdk.org/patch/74677/mbox/",
    "series": [
        {
            "id": 11254,
            "url": "https://patches.dpdk.org/api/series/11254/",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=11254",
            "date": "2020-07-23T11:56:19",
            "name": "bnxt patches",
            "version": 2,
            "mbox": "https://patches.dpdk.org/series/11254/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/74677/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/74677/checks/",
    "tags": {},
    "headers": {
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "List-Post": "<mailto:dev@dpdk.org>",
        "MIME-Version": "1.0",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "DKIM-Filter": "OpenDKIM Filter v2.10.3 relay.smtp.broadcom.com 0C9DD29AD36",
        "References": "<20200723111329.21855-1-somnath.kotur@broadcom.com>\n <20200723115639.22357-1-somnath.kotur@broadcom.com>",
        "Subject": "[dpdk-dev] [PATCH v2 15/20] net/bnxt: delete VF FW rules when a\n\trepresentor is created",
        "Content-Type": "text/plain; charset=UTF-8",
        "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 90B5FA0521;\n\tThu, 23 Jul 2020 14:05:11 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 74D1D1C119;\n\tThu, 23 Jul 2020 14:02:41 +0200 (CEST)",
            "from relay.smtp.broadcom.com (relay.smtp.broadcom.com\n [192.19.211.62]) by dpdk.org (Postfix) with ESMTP id 73C4E1BFEB\n for <dev@dpdk.org>; Thu, 23 Jul 2020 14:02:06 +0200 (CEST)",
            "from dhcp-10-123-153-55.dhcp.broadcom.net\n (bgccx-dev-host-lnx35.bec.broadcom.net [10.123.153.55])\n by relay.smtp.broadcom.com (Postfix) with ESMTP id 0C9DD29AD36;\n Thu, 23 Jul 2020 05:02:06 -0700 (PDT)"
        ],
        "Sender": "\"dev\" <dev-bounces@dpdk.org>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "X-Mailer": "git-send-email 2.10.1.613.g2cc2e70",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com;\n s=dkimrelay; t=1595505726;\n bh=raQDN1gOVoNNo3SNeK+X0k1HcSLTmpsZ7SWCITvD9wc=;\n h=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n b=bnk4rSJmOkYr4U6DxXkhSraZF5ZOdJoAiYMDkOMbn7yzRT0yRyt0+RWYPOydi/nID\n 8CEyH8i1cIXZ2mEr0bmHM8yly9YKA5Y0VQB5ArDX0CR3/nLlslXZ+ucMJ+qEYY+btE\n /A985VRBglwoU2Mai65W6IT2aJoZ0ZszZ1+zK1gk=",
        "Date": "Thu, 23 Jul 2020 17:26:34 +0530",
        "Content-Transfer-Encoding": "8bit",
        "To": "dev@dpdk.org",
        "From": "Somnath Kotur <somnath.kotur@broadcom.com>",
        "X-BeenThere": "dev@dpdk.org",
        "In-Reply-To": "<20200723115639.22357-1-somnath.kotur@broadcom.com>",
        "Cc": "ferruh.yigit@intel.com",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Message-Id": "<20200723115639.22357-16-somnath.kotur@broadcom.com>",
        "Return-Path": "<dev-bounces@dpdk.org>"
    },
    "content": "From: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>\n\nTruflow stack adds VFR to VF and VF to VFR conduits when VF\nrepresentor is created. However, in the ingress direction the\nVF's fw rules conflict with Truflow rules, resulting in not hitting\nthe Truflow VFR rules. To fix this, fw is going to remove it’s\nVF rules when vf representor is created in Truflow mode and will\nrestore the removed rules when vf representor is destroyed.\n\nThis patch invokes the vf representor alloc and free hwrm commands\nas part of which fw will do the above mentioned actions.\n\nSigned-off-by: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>\nSigned-off-by: Somnath Kotur <somnath.kotur@broadcom.com>\nReviewed-by: Shahaji Bhosle <shahaji.bhosle@broadcom.com>\n---\n drivers/net/bnxt/bnxt_hwrm.c           |  49 ++++++++++++\n drivers/net/bnxt/bnxt_hwrm.h           |   2 +\n drivers/net/bnxt/bnxt_reps.c           |  19 ++++-\n drivers/net/bnxt/hsi_struct_def_dpdk.h | 138 +++++++++++++++++++++++++++++++++\n 4 files changed, 205 insertions(+), 3 deletions(-)",
    "diff": "diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c\nindex 7ea13a8..f5f0dfe 100644\n--- a/drivers/net/bnxt/bnxt_hwrm.c\n+++ b/drivers/net/bnxt/bnxt_hwrm.c\n@@ -5486,6 +5486,55 @@ int bnxt_hwrm_cfa_counter_qstats(struct bnxt *bp,\n \treturn 0;\n }\n \n+int bnxt_hwrm_cfa_vfr_alloc(struct bnxt *bp, uint16_t vf_idx)\n+{\n+\tstruct hwrm_cfa_vfr_alloc_output *resp = bp->hwrm_cmd_resp_addr;\n+\tstruct hwrm_cfa_vfr_alloc_input req = {0};\n+\tint rc;\n+\n+\tif (!(BNXT_PF(bp) || BNXT_VF_IS_TRUSTED(bp))) {\n+\t\tPMD_DRV_LOG(DEBUG,\n+\t\t\t    \"Not a PF or trusted VF. Command not supported\\n\");\n+\t\treturn 0;\n+\t}\n+\n+\tHWRM_PREP(&req, HWRM_CFA_VFR_ALLOC, BNXT_USE_CHIMP_MB);\n+\treq.vf_id = rte_cpu_to_le_16(vf_idx);\n+\tsnprintf(req.vfr_name, sizeof(req.vfr_name), \"%svfr%d\",\n+\t\t bp->eth_dev->data->name, vf_idx);\n+\n+\trc = bnxt_hwrm_send_message(bp, &req, sizeof(req), BNXT_USE_CHIMP_MB);\n+\tHWRM_CHECK_RESULT();\n+\n+\tHWRM_UNLOCK();\n+\tPMD_DRV_LOG(DEBUG, \"VFR %d allocated\\n\", vf_idx);\n+\treturn rc;\n+}\n+\n+int bnxt_hwrm_cfa_vfr_free(struct bnxt *bp, uint16_t vf_idx)\n+{\n+\tstruct hwrm_cfa_vfr_free_output *resp = bp->hwrm_cmd_resp_addr;\n+\tstruct hwrm_cfa_vfr_free_input req = {0};\n+\tint rc;\n+\n+\tif (!(BNXT_PF(bp) || BNXT_VF_IS_TRUSTED(bp))) {\n+\t\tPMD_DRV_LOG(DEBUG,\n+\t\t\t    \"Not a PF or trusted VF. Command not supported\\n\");\n+\t\treturn 0;\n+\t}\n+\n+\tHWRM_PREP(&req, HWRM_CFA_VFR_FREE, BNXT_USE_CHIMP_MB);\n+\treq.vf_id = rte_cpu_to_le_16(vf_idx);\n+\tsnprintf(req.vfr_name, sizeof(req.vfr_name), \"%svfr%d\",\n+\t\t bp->eth_dev->data->name, vf_idx);\n+\n+\trc = bnxt_hwrm_send_message(bp, &req, sizeof(req), BNXT_USE_CHIMP_MB);\n+\tHWRM_CHECK_RESULT();\n+\tHWRM_UNLOCK();\n+\tPMD_DRV_LOG(DEBUG, \"VFR %d freed\\n\", vf_idx);\n+\treturn rc;\n+}\n+\n #ifdef RTE_LIBRTE_BNXT_PMD_SYSTEM\n int\n bnxt_hwrm_oem_cmd(struct bnxt *bp, uint32_t entry_num)\ndiff --git a/drivers/net/bnxt/bnxt_hwrm.h b/drivers/net/bnxt/bnxt_hwrm.h\nindex 01201a7..4a2af13 100644\n--- a/drivers/net/bnxt/bnxt_hwrm.h\n+++ b/drivers/net/bnxt/bnxt_hwrm.h\n@@ -278,4 +278,6 @@ int bnxt_hwrm_port_phy_qcaps(struct bnxt *bp);\n int bnxt_hwrm_oem_cmd(struct bnxt *bp, uint32_t entry_num);\n int bnxt_clear_one_vnic_filter(struct bnxt *bp,\n \t\t\t       struct bnxt_filter_info *filter);\n+int bnxt_hwrm_cfa_vfr_alloc(struct bnxt *bp, uint16_t vf_idx);\n+int bnxt_hwrm_cfa_vfr_free(struct bnxt *bp, uint16_t vf_idx);\n #endif\ndiff --git a/drivers/net/bnxt/bnxt_reps.c b/drivers/net/bnxt/bnxt_reps.c\nindex c425e69..2f775e0 100644\n--- a/drivers/net/bnxt/bnxt_reps.c\n+++ b/drivers/net/bnxt/bnxt_reps.c\n@@ -272,7 +272,7 @@ static int bnxt_tf_vfr_alloc(struct rte_eth_dev *vfr_ethdev)\n \tif (rc) {\n \t\tBNXT_TF_DBG(DEBUG,\n \t\t\t    \"Default flow rule creation for VFR->VF failed!\\n\");\n-\t\treturn -EIO;\n+\t\tgoto err;\n \t}\n \n \tBNXT_TF_DBG(DEBUG, \"*** Default flow rule created for VFR->VF! ***\\n\");\n@@ -283,7 +283,7 @@ static int bnxt_tf_vfr_alloc(struct rte_eth_dev *vfr_ethdev)\n \tif (rc) {\n \t\tBNXT_TF_DBG(DEBUG,\n \t\t\t    \"Failed to get action_ptr for VFR->VF dflt rule\\n\");\n-\t\treturn -EIO;\n+\t\tgoto rep2vf_free;\n \t}\n \tBNXT_TF_DBG(DEBUG, \"tx_cfa_action = %d\\n\", vfr->vfr_tx_cfa_action);\n \trc = ulp_default_flow_create(parent_dev, param_list,\n@@ -292,13 +292,24 @@ static int bnxt_tf_vfr_alloc(struct rte_eth_dev *vfr_ethdev)\n \tif (rc) {\n \t\tBNXT_TF_DBG(DEBUG,\n \t\t\t    \"Default flow rule creation for VF->VFR failed!\\n\");\n-\t\treturn -EIO;\n+\t\tgoto rep2vf_free;\n \t}\n \n \tBNXT_TF_DBG(DEBUG, \"*** Default flow rule created for VF->VFR! ***\\n\");\n \tBNXT_TF_DBG(DEBUG, \"vfr2rep_flow_id = %d\\n\", vfr->vf2rep_flow_id);\n \n+\trc = bnxt_hwrm_cfa_vfr_alloc(parent_bp, vfr->vf_id);\n+\tif (rc)\n+\t\tgoto vf2rep_free;\n+\n \treturn 0;\n+\n+vf2rep_free:\n+\tulp_default_flow_destroy(vfr->parent_dev, vfr->vf2rep_flow_id);\n+rep2vf_free:\n+\tulp_default_flow_destroy(vfr->parent_dev, vfr->rep2vf_flow_id);\n+err:\n+\treturn -EIO;\n }\n \n static int bnxt_vfr_alloc(struct rte_eth_dev *vfr_ethdev)\n@@ -414,6 +425,8 @@ static int bnxt_vfr_free(struct bnxt_vf_representor *vfr)\n \tvfr->vfr_tx_cfa_action = 0;\n \tvfr->rx_cfa_code = 0;\n \n+\trc = bnxt_hwrm_cfa_vfr_free(parent_bp, vfr->vf_id);\n+\n \treturn rc;\n }\n \ndiff --git a/drivers/net/bnxt/hsi_struct_def_dpdk.h b/drivers/net/bnxt/hsi_struct_def_dpdk.h\nindex 598da71..3553935 100644\n--- a/drivers/net/bnxt/hsi_struct_def_dpdk.h\n+++ b/drivers/net/bnxt/hsi_struct_def_dpdk.h\n@@ -35127,6 +35127,144 @@ struct hwrm_cfa_pair_info_output {\n \tuint8_t\tvalid;\n } __rte_packed;\n \n+/**********************\n+ * hwrm_cfa_vfr_alloc *\n+ **********************/\n+\n+\n+/* hwrm_cfa_vfr_alloc_input (size:448b/56B) */\n+struct hwrm_cfa_vfr_alloc_input {\n+\t/* The HWRM command request type. */\n+\tuint16_t\treq_type;\n+\t/*\n+\t * The completion ring to send the completion event on. This should\n+\t * be the NQ ID returned from the `nq_alloc` HWRM command.\n+\t */\n+\tuint16_t\tcmpl_ring;\n+\t/*\n+\t * The sequence ID is used by the driver for tracking multiple\n+\t * commands. This ID is treated as opaque data by the firmware and\n+\t * the value is returned in the `hwrm_resp_hdr` upon completion.\n+\t */\n+\tuint16_t\tseq_id;\n+\t/*\n+\t * The target ID of the command:\n+\t * * 0x0-0xFFF8 - The function ID\n+\t * * 0xFFF8-0xFFFC, 0xFFFE - Reserved for internal processors\n+\t * * 0xFFFD - Reserved for user-space HWRM interface\n+\t * * 0xFFFF - HWRM\n+\t */\n+\tuint16_t\ttarget_id;\n+\t/*\n+\t * A physical address pointer pointing to a host buffer that the\n+\t * command's response data will be written. This can be either a host\n+\t * physical address (HPA) or a guest physical address (GPA) and must\n+\t * point to a physically contiguous block of memory.\n+\t */\n+\tuint64_t\tresp_addr;\n+\t/* Logical VF number (range: 0 -> MAX_VFS -1). */\n+\tuint16_t\tvf_id;\n+\t/*\n+\t * This field is reserved for the future use.\n+\t * It shall be set to 0.\n+\t */\n+\tuint16_t\treserved;\n+\tuint8_t\tunused_0[4];\n+\t/* VF Representor name (32 byte string). */\n+\tchar\tvfr_name[32];\n+} __attribute__((packed));\n+\n+/* hwrm_cfa_vfr_alloc_output (size:128b/16B) */\n+struct hwrm_cfa_vfr_alloc_output {\n+\t/* The specific error status for the command. */\n+\tuint16_t\terror_code;\n+\t/* The HWRM command request type. */\n+\tuint16_t\treq_type;\n+\t/* The sequence ID from the original command. */\n+\tuint16_t\tseq_id;\n+\t/* The length of the response data in number of bytes. */\n+\tuint16_t\tresp_len;\n+\t/* Rx CFA code. */\n+\tuint16_t\trx_cfa_code;\n+\t/* Tx CFA action. */\n+\tuint16_t\ttx_cfa_action;\n+\tuint8_t\tunused_0[3];\n+\t/*\n+\t * This field is used in Output records to indicate that the output\n+\t * is completely written to RAM.  This field should be read as '1'\n+\t * to indicate that the output has been completely written.\n+\t * When writing a command completion or response to an internal processor,\n+\t * the order of writes has to be such that this field is written last.\n+\t */\n+\tuint8_t\tvalid;\n+} __attribute__((packed));\n+\n+/*********************\n+ * hwrm_cfa_vfr_free *\n+ *********************/\n+\n+\n+/* hwrm_cfa_vfr_free_input (size:448b/56B) */\n+struct hwrm_cfa_vfr_free_input {\n+\t/* The HWRM command request type. */\n+\tuint16_t\treq_type;\n+\t/*\n+\t * The completion ring to send the completion event on. This should\n+\t * be the NQ ID returned from the `nq_alloc` HWRM command.\n+\t */\n+\tuint16_t\tcmpl_ring;\n+\t/*\n+\t * The sequence ID is used by the driver for tracking multiple\n+\t * commands. This ID is treated as opaque data by the firmware and\n+\t * the value is returned in the `hwrm_resp_hdr` upon completion.\n+\t */\n+\tuint16_t\tseq_id;\n+\t/*\n+\t * The target ID of the command:\n+\t * * 0x0-0xFFF8 - The function ID\n+\t * * 0xFFF8-0xFFFC, 0xFFFE - Reserved for internal processors\n+\t * * 0xFFFD - Reserved for user-space HWRM interface\n+\t * * 0xFFFF - HWRM\n+\t */\n+\tuint16_t\ttarget_id;\n+\t/*\n+\t * A physical address pointer pointing to a host buffer that the\n+\t * command's response data will be written. This can be either a host\n+\t * physical address (HPA) or a guest physical address (GPA) and must\n+\t * point to a physically contiguous block of memory.\n+\t */\n+\tuint64_t\tresp_addr;\n+\t/* VF Representor name (32 byte string). */\n+\tchar\t\tvfr_name[32];\n+\t/* Logical VF number (range: 0 -> MAX_VFS -1). */\n+\tuint16_t\tvf_id;\n+\tuint16_t\treserved;\n+\tuint8_t\t\tunused_0[4];\n+} __attribute__((packed));\n+\n+/* hwrm_cfa_vfr_free_output (size:128b/16B) */\n+struct hwrm_cfa_vfr_free_output {\n+\t/* The specific error status for the command. */\n+\tuint16_t\terror_code;\n+\t/* The HWRM command request type. */\n+\tuint16_t\treq_type;\n+\t/* The sequence ID from the original command. */\n+\tuint16_t\tseq_id;\n+\t/* The length of the response data in number of bytes. */\n+\tuint16_t\tresp_len;\n+\tuint8_t\tunused_0[7];\n+\t/*\n+\t * This field is used in Output records to indicate that the output\n+\t * is completely written to RAM.  This field should be read as '1'\n+\t * to indicate that the output has been completely written.\n+\t * When writing a command completion or response to an internal processor,\n+\t * the order of writes has to be such that this field is written last.\n+\t */\n+\tuint8_t\tvalid;\n+} __attribute__((packed));\n+\n+\n+\n /***************************************\n  * hwrm_cfa_redirect_query_tunnel_type *\n  ***************************************/\n",
    "prefixes": [
        "v2",
        "15/20"
    ]
}