get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 132712,
    "url": "http://patchwork.dpdk.org/api/patches/132712/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20231017054545.1692509-23-chaoyong.he@corigine.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": "<20231017054545.1692509-23-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20231017054545.1692509-23-chaoyong.he@corigine.com",
    "date": "2023-10-17T05:45:42",
    "name": "[22/25] drivers: add the datapath update logic",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "f5d7a4dc17c578290c9701c1cdbeae8152115e76",
    "submitter": {
        "id": 2554,
        "url": "http://patchwork.dpdk.org/api/people/2554/?format=api",
        "name": "Chaoyong He",
        "email": "chaoyong.he@corigine.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patchwork.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20231017054545.1692509-23-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 29865,
            "url": "http://patchwork.dpdk.org/api/series/29865/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=29865",
            "date": "2023-10-17T05:45:20",
            "name": "add the NFP vDPA PMD",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/29865/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/132712/comments/",
    "check": "warning",
    "checks": "http://patchwork.dpdk.org/api/patches/132712/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 881C943186;\n\tTue, 17 Oct 2023 07:49:00 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 9D969410F2;\n\tTue, 17 Oct 2023 07:47:24 +0200 (CEST)",
            "from NAM10-MW2-obe.outbound.protection.outlook.com\n (mail-mw2nam10on2116.outbound.protection.outlook.com [40.107.94.116])\n by mails.dpdk.org (Postfix) with ESMTP id 73764410F2\n for <dev@dpdk.org>; Tue, 17 Oct 2023 07:47:23 +0200 (CEST)",
            "from PH0PR13MB5568.namprd13.prod.outlook.com (2603:10b6:510:12b::16)\n by SJ0PR13MB5272.namprd13.prod.outlook.com (2603:10b6:a03:3e3::21)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.46; Tue, 17 Oct\n 2023 05:47:19 +0000",
            "from PH0PR13MB5568.namprd13.prod.outlook.com\n ([fe80::b070:92e1:931e:fee7]) by PH0PR13MB5568.namprd13.prod.outlook.com\n ([fe80::b070:92e1:931e:fee7%4]) with mapi id 15.20.6863.047; Tue, 17 Oct 2023\n 05:47:19 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=GBRjvehAQRH+8BaTnPg0DEmGiquJ9MxDVPnO0Ikw51E699NlBFgLafKjQr7fnZg8NWL/UmCH9BlVmPbRQjZ7a/L+ETYBnDBH4sZ9yQRgQrcSooILuEdmiF7rC5CUeK7MB6Go82cgrMJnqNFri2PY8ooQkMSIuyPmFNaWF6DTEfOAeQwVMcUG9ymXWnl8BaOWOQPYR1AOfQd3zCn367UgxD6frDaeaR0hhBL2PqdCOnfFoeZ7TTFoiAcXrGv8lSLyJSyKtKVXGz/qojsjJkgXyJkCbjHFXWiPVDkMQaDNm3C35yPTtrrkOJUXWOtj1G6rSjYxVViFiVJ3nXDDA4SbVg==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=CRjIkFOAgtqQO6MucvhuRNntT4IojwKrYXbnkxEmJj4=;\n b=Y5N0fVDkAYLLWh8ypBzViIvfYbD/1saTHzaxFEMgz8YjT9yg3ePh7UqdBjOHnE8HZ1CknztiTdbcRfGAjTYVumCUg9Y0F4yXVJvhzb3nLunI0FTkGH4bQGuLzNJI6CGsgltkTScfhKutpOYnOdauYxkrQmvTW5r12N+zu6dF7fYADGcFwEVu10/n/gtvX9l3A4Q2nlid5sGYenvh2+NRMki8kNry6GgoMKD9f5NkInz+Iho4e4zJyRFsXXyDgwDfZlkoKjzO7UqHRzSlCctSc3rNUSj/GbVxdCccvIDfIrCUYe3AYMqULaZFI04wqiGktoCpeu7s03jMSAsAGoW2cQ==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com;\n dkim=pass header.d=corigine.com; arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=CRjIkFOAgtqQO6MucvhuRNntT4IojwKrYXbnkxEmJj4=;\n b=Otwujda9DgSZu34t1SFfZJelpCQ8AH5584Uhp95yAgrft5hB5VtC/aukT7uU6s2oTcaQXo4/WblTdoi7Q2X1xWYO3/MfsS/gje+jfXaiwkra64uU0aHwEAZ2N5M3ZRlF035K7AQypWZkpOkRcvKipWbD9UiABYK331ZShLYaKCs=",
        "Authentication-Results": "dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=corigine.com;",
        "From": "Chaoyong He <chaoyong.he@corigine.com>",
        "To": "dev@dpdk.org",
        "Cc": "oss-drivers@corigine.com, Chaoyong He <chaoyong.he@corigine.com>,\n Shujing Dong <shujing.dong@corigine.com>, Long Wu <long.wu@corigine.com>,\n Peng Zhang <peng.zhang@corigine.com>",
        "Subject": "[PATCH 22/25] drivers: add the datapath update logic",
        "Date": "Tue, 17 Oct 2023 13:45:42 +0800",
        "Message-Id": "<20231017054545.1692509-23-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 2.39.1",
        "In-Reply-To": "<20231017054545.1692509-1-chaoyong.he@corigine.com>",
        "References": "<20231017054545.1692509-1-chaoyong.he@corigine.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "PH7PR17CA0069.namprd17.prod.outlook.com\n (2603:10b6:510:325::29) To PH0PR13MB5568.namprd13.prod.outlook.com\n (2603:10b6:510:12b::16)",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "PH0PR13MB5568:EE_|SJ0PR13MB5272:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "17daa154-f500-4578-fa4e-08dbced48552",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n 3OAyWuPGafkijePGeJQJJaoLqA7/Idl6NA+iPz6bmbH8Bmiql1lKE7YjegErSwiZGjWMmQMHLfzK4CeLnlPkzvaFpT+FtaUOHDZ5W9iC6jjnBoyD1BBbiaTahM/Z37EvSavWrtZZ7Ytoy0/1oFqPt8UVuU0JbQGwlCMw10IJYUvBtGpyEnY2mI8wtRkh34bQ6LtvM773HQz8EDuk6fnn/yDuNH7dY7gMeBNzdred463N5LfFP5vQONc7RgkMtTB/mcNO479A8dcTHWXUAP6QyrQWynKmaZDxQB2/BPB/o/8KsRQgxNHxcZNyJIUloAkC/jfohI2hdWnkv7eQD3519lSD5UnxZEyCS/Fn0WAwAsXMEfD9YPTmjeeLuLfuIyG8OA4R9f+xeYNKgSdvGqmXcU1aYtYUEQ1RCqjS7gjoAakxWezd2Z3O9+rrg2LleVMalZGplR9DjjE/u2YrgoPdNcpxWiVyof4akGbQ/B8EOx3E+Q2/V605l6zN8E0Zz4DL4KYPJV+hTYEewPXvnZwSUUy3n/kZUwRoDjBLkU1FKqCvsGWwoIsCV8FPLfHt7z3AGOxM8qmOJSi7uG3aBsiat+E+DOYUVJ0U0kryCKrmm097fEi1+VFOZHObxelG4hWTxsqu2ONauB2OeRkz4x03WtjLAm4/StHyxPKRFLmCUtk=",
        "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:PH0PR13MB5568.namprd13.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(13230031)(366004)(136003)(376002)(346002)(396003)(39830400003)(230922051799003)(451199024)(64100799003)(1800799009)(186009)(38350700005)(6916009)(66476007)(6666004)(66556008)(66946007)(6486002)(86362001)(54906003)(2616005)(83380400001)(478600001)(6512007)(38100700002)(316002)(1076003)(52116002)(26005)(107886003)(5660300002)(30864003)(6506007)(2906002)(4326008)(15650500001)(8676002)(36756003)(44832011)(41300700001)(8936002);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n NRtxs/kAcAK9j1FeY32NLIYxPO9Nwb2/1pr54we3UV9FwrqrQlXxp/AVJDyiCPRoS+//x+q/CyMIFdaNnieIokVbVe306B3VcRAhoWy5cU4M7M628zfZFhwyufbJPLOTvHyBspQ+04twNUptxK1sh436T9tVuaxcOriMeybB8nRDr/OaJ4m+udgvohoLp4w2c8YyDu7zQiqMGpyC/bxsYoJx4A9Ts4nfs9NAHEfenKWZL3UPzcaEf/luHYlR6qHnFwwMtsPStKj5QBt1SNch3qACFy21dXENFJUDNJ7Zy5EaweFtd6YDd1N6oFlespNedg5n+YiVXu5nrhBhUnbHh2mInwPNu1wZKAZoWKufI0z0p28kjLEY6Pwu2XZFjk/R6PRAUXpiyoV6sbkEFPJM5FRo/ywQxcirP14KvWqv5diS136XtOuCtv/WV7jOY1kJ2dSOfDvmrE9DBv3GzrOomt+JYbT/sthTMIoaJ95BVZ37/ZJl0tY8CT5uMSh6JE+yEh9W+jK81+GYP5Y56pjT+ji8g2phg/gYBWFAxsmy4NWg65yDY/6T9AL25GDAwJylM61hCgT1r6QXvazLkVQ6kdGqGk/uzO7noULzzV4n7NqIKBkMgrEOdXZlx5935fH9tBjF5JyizQVzNlSpWWfq8F7bT+Icp9ggqVYtskKQzARswTAIoTfLBlrdFIsKcMbrVWo2xOwu13MyC8821qpKcybj9JH9iL3CHg5Er3qTJ60vL/2IaIZchxcVywpYtUn+jmrnRyBteeTooSlMEbSqdE5FfGO1VC8R9bZTSi9xmhqk/N+LdPetj3umoXOKn8UfvGWv3oWoGbvK3ep67IHYqskiBNEc1UPTKXh7AlS2hN1xmHs5v0EuAhlhJj9yUnUPIGBaHhF9Z0apMIFLeTfTbnZY9Mvva85MeQ4c5mq5W1uF8EcMq9j40Qs6dKqoeOTESTQCetjiGFuuRMgRDxLCXCE8TPCetBarEmRZUoaErzsS4opz5iCFaHXqKZ45usreOoAms6iRXWOft6hpWATyJbqqDnZ9Cz/N4ZE1sC6KLDWu91ZHdbC3fFHP4Pl+zVWeijUaqEN3d7ix8mS9HifrxQMR1of2qAxEHgnvIhj+U84OjNakwGI1xNeMorDVpNPkDbKyrgCZ1VsceK45tBmkNkpE/vX+RlSls/INF4oIJbGIeQ16NFbYO4LXobivvEoNhEhbFvPjI9STeWMBsWN61fK2HfpJp3CHxKnSUhgQaQp2XqMGss8/nVh95T6SuXBhu0B38Ve6IkfuurFgSPjVPl8ccntqnsF0EWWZHXKR6FAFM2pQxrEdP6R8N7Z0COM3vplOv6fRcHE60cZi8yWjrX9RZJms9TDUaqTU52zZc9zmazyvvzPKcp+jp1Ng7bMo0SjtWXQk1qxT4bvwVa6kjm9+yRPCSfdNvuccAqPTGhEyXDYRAnfW8qcQKB32O8GW251KsKBGw7PY2EeO1OZyXxHhkMnu8hUXAfiCnyPmJf1frJqk9+U64g1sSZaGFVYTdi3+U0LFQDlVBcXtbU/PwW3qp3Ihp0TaRQbLCxF1NqWRJs7lJHhNPJjowmCbZoWc6XudgG340DznwyAclYNBZQ==",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 17daa154-f500-4578-fa4e-08dbced48552",
        "X-MS-Exchange-CrossTenant-AuthSource": "PH0PR13MB5568.namprd13.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "17 Oct 2023 05:47:19.1407 (UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "fe128f2c-073b-4c20-818e-7246a585940c",
        "X-MS-Exchange-CrossTenant-MailboxType": "HOSTED",
        "X-MS-Exchange-CrossTenant-UserPrincipalName": "\n zYf04xkJ4z7+VMCgPiHppgJD9gdRoTd14Ka2Qr9/I/WHobXJE2YCHPzocibXnw1Y6j3HshJw+dmHULZDirS7+RssjPKqcL54Uh5rR8JWqMw=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "SJ0PR13MB5272",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "Add the vDPA datapath update logic.\n\nSigned-off-by: Chaoyong He <chaoyong.he@corigine.com>\nSigned-off-by: Shujing Dong <shujing.dong@corigine.com>\nReviewed-by: Long Wu <long.wu@corigine.com>\nReviewed-by: Peng Zhang <peng.zhang@corigine.com>\n---\n drivers/common/nfp/nfp_common_ctrl.h |   1 +\n drivers/vdpa/nfp/nfp_vdpa.c          | 315 +++++++++++++++++++++++++++\n drivers/vdpa/nfp/nfp_vdpa_core.c     |  78 +++++++\n drivers/vdpa/nfp/nfp_vdpa_core.h     |  15 ++\n 4 files changed, 409 insertions(+)",
    "diff": "diff --git a/drivers/common/nfp/nfp_common_ctrl.h b/drivers/common/nfp/nfp_common_ctrl.h\nindex 3c8cd916cf..f92ce50fc0 100644\n--- a/drivers/common/nfp/nfp_common_ctrl.h\n+++ b/drivers/common/nfp/nfp_common_ctrl.h\n@@ -238,6 +238,7 @@ struct nfp_net_fw_ver {\n #define NFP_NET_CFG_CTRL_IPSEC            (0x1 << 1) /**< IPsec offload */\n #define NFP_NET_CFG_CTRL_IPSEC_SM_LOOKUP  (0x1 << 3) /**< SA short match lookup */\n #define NFP_NET_CFG_CTRL_IPSEC_LM_LOOKUP  (0x1 << 4) /**< SA long match lookup */\n+#define NFP_NET_CFG_CTRL_IN_ORDER         (0x1 << 11) /**< Virtio in-order flag */\n \n #define NFP_NET_CFG_CAP_WORD1           0x00a4\n \ndiff --git a/drivers/vdpa/nfp/nfp_vdpa.c b/drivers/vdpa/nfp/nfp_vdpa.c\nindex 00d8f7e007..465ee4841d 100644\n--- a/drivers/vdpa/nfp/nfp_vdpa.c\n+++ b/drivers/vdpa/nfp/nfp_vdpa.c\n@@ -4,6 +4,7 @@\n  */\n \n #include <pthread.h>\n+#include <sys/ioctl.h>\n \n #include <nfp_common_pci.h>\n #include <nfp_dev.h>\n@@ -15,6 +16,9 @@\n \n #define NFP_VDPA_DRIVER_NAME nfp_vdpa\n \n+#define MSIX_IRQ_SET_BUF_LEN (sizeof(struct vfio_irq_set) + \\\n+\t\tsizeof(int) * (NFP_VDPA_MAX_QUEUES * 2 + 1))\n+\n struct nfp_vdpa_dev {\n \tstruct rte_pci_device *pci_dev;\n \tstruct rte_vdpa_device *vdev;\n@@ -25,7 +29,15 @@ struct nfp_vdpa_dev {\n \tint vfio_dev_fd;\n \tint iommu_group;\n \n+\tint vid;\n \tuint16_t max_queues;\n+\tuint32_t started;\n+\tuint32_t dev_attached;\n+\tuint32_t running;\n+\trte_spinlock_t lock;\n+\n+\t/** Eventfd for used ring interrupt */\n+\tint intr_fd[NFP_VDPA_MAX_QUEUES * 2];\n };\n \n struct nfp_vdpa_dev_node {\n@@ -112,6 +124,302 @@ nfp_vdpa_vfio_teardown(struct nfp_vdpa_dev *device)\n \trte_vfio_container_destroy(device->vfio_container_fd);\n }\n \n+static int\n+nfp_vdpa_dma_do_unmap(struct rte_vhost_memory *mem,\n+\t\tuint32_t times,\n+\t\tint vfio_container_fd)\n+{\n+\tuint32_t i;\n+\tint ret = 0;\n+\tstruct rte_vhost_mem_region *region;\n+\n+\tfor (i = 0; i < times; i++) {\n+\t\tregion = &mem->regions[i];\n+\n+\t\tret = rte_vfio_container_dma_unmap(vfio_container_fd,\n+\t\t\t\tregion->host_user_addr, region->guest_phys_addr,\n+\t\t\t\tregion->size);\n+\t\tif (ret < 0) {\n+\t\t\t/* Here should not return, even error happened. */\n+\t\t\tDRV_VDPA_LOG(ERR, \"DMA unmap failed. Times: %u\", i);\n+\t\t}\n+\t}\n+\n+\treturn ret;\n+}\n+\n+static int\n+nfp_vdpa_dma_do_map(struct rte_vhost_memory *mem,\n+\t\tuint32_t times,\n+\t\tint vfio_container_fd)\n+{\n+\tint ret;\n+\tuint32_t i;\n+\tstruct rte_vhost_mem_region *region;\n+\n+\tfor (i = 0; i < times; i++) {\n+\t\tregion = &mem->regions[i];\n+\n+\t\tret = rte_vfio_container_dma_map(vfio_container_fd,\n+\t\t\t\tregion->host_user_addr, region->guest_phys_addr,\n+\t\t\t\tregion->size);\n+\t\tif (ret < 0) {\n+\t\t\tDRV_VDPA_LOG(ERR, \"DMA map failed.\");\n+\t\t\tnfp_vdpa_dma_do_unmap(mem, i, vfio_container_fd);\n+\t\t\treturn ret;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+nfp_vdpa_dma_map(struct nfp_vdpa_dev *device,\n+\t\tbool do_map)\n+{\n+\tint ret;\n+\tint vfio_container_fd;\n+\tstruct rte_vhost_memory *mem = NULL;\n+\n+\tret = rte_vhost_get_mem_table(device->vid, &mem);\n+\tif (ret < 0) {\n+\t\tDRV_VDPA_LOG(ERR, \"Failed to get memory layout.\");\n+\t\treturn ret;\n+\t}\n+\n+\tvfio_container_fd = device->vfio_container_fd;\n+\tDRV_VDPA_LOG(DEBUG, \"vfio_container_fd %d\", vfio_container_fd);\n+\n+\tif (do_map)\n+\t\tret = nfp_vdpa_dma_do_map(mem, mem->nregions, vfio_container_fd);\n+\telse\n+\t\tret = nfp_vdpa_dma_do_unmap(mem, mem->nregions, vfio_container_fd);\n+\n+\tfree(mem);\n+\n+\treturn ret;\n+}\n+\n+static uint64_t\n+nfp_vdpa_qva_to_gpa(int vid,\n+\t\tuint64_t qva)\n+{\n+\tint ret;\n+\tuint32_t i;\n+\tuint64_t gpa = 0;\n+\tstruct rte_vhost_memory *mem = NULL;\n+\tstruct rte_vhost_mem_region *region;\n+\n+\tret = rte_vhost_get_mem_table(vid, &mem);\n+\tif (ret < 0) {\n+\t\tDRV_VDPA_LOG(ERR, \"Failed to get memory layout.\");\n+\t\treturn gpa;\n+\t}\n+\n+\tfor (i = 0; i < mem->nregions; i++) {\n+\t\tregion = &mem->regions[i];\n+\n+\t\tif (qva >= region->host_user_addr &&\n+\t\t\t\tqva < region->host_user_addr + region->size) {\n+\t\t\tgpa = qva - region->host_user_addr + region->guest_phys_addr;\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\tfree(mem);\n+\n+\treturn gpa;\n+}\n+\n+static int\n+nfp_vdpa_start(struct nfp_vdpa_dev *device)\n+{\n+\tint ret;\n+\tint vid;\n+\tuint16_t i;\n+\tuint64_t gpa;\n+\tstruct rte_vhost_vring vring;\n+\tstruct nfp_vdpa_hw *vdpa_hw = &device->hw;\n+\n+\tvid = device->vid;\n+\tvdpa_hw->nr_vring = rte_vhost_get_vring_num(vid);\n+\n+\tret = rte_vhost_get_negotiated_features(vid, &vdpa_hw->req_features);\n+\tif (ret != 0)\n+\t\treturn ret;\n+\n+\tfor (i = 0; i < vdpa_hw->nr_vring; i++) {\n+\t\tret = rte_vhost_get_vhost_vring(vid, i, &vring);\n+\t\tif (ret != 0)\n+\t\t\treturn ret;\n+\n+\t\tgpa = nfp_vdpa_qva_to_gpa(vid, (uint64_t)(uintptr_t)vring.desc);\n+\t\tif (gpa == 0) {\n+\t\t\tDRV_VDPA_LOG(ERR, \"Fail to get GPA for descriptor ring.\");\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tvdpa_hw->vring[i].desc = gpa;\n+\n+\t\tgpa = nfp_vdpa_qva_to_gpa(vid, (uint64_t)(uintptr_t)vring.avail);\n+\t\tif (gpa == 0) {\n+\t\t\tDRV_VDPA_LOG(ERR, \"Fail to get GPA for available ring.\");\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tvdpa_hw->vring[i].avail = gpa;\n+\n+\t\tgpa = nfp_vdpa_qva_to_gpa(vid, (uint64_t)(uintptr_t)vring.used);\n+\t\tif (gpa == 0) {\n+\t\t\tDRV_VDPA_LOG(ERR, \"Fail to get GPA for used ring.\");\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tvdpa_hw->vring[i].used = gpa;\n+\n+\t\tvdpa_hw->vring[i].size = vring.size;\n+\n+\t\tret = rte_vhost_get_vring_base(vid, i,\n+\t\t\t\t&vdpa_hw->vring[i].last_avail_idx,\n+\t\t\t\t&vdpa_hw->vring[i].last_used_idx);\n+\t\tif (ret != 0)\n+\t\t\treturn ret;\n+\t}\n+\n+\treturn nfp_vdpa_hw_start(&device->hw, vid);\n+}\n+\n+static void\n+nfp_vdpa_stop(struct nfp_vdpa_dev *device)\n+{\n+\tint vid;\n+\tuint32_t i;\n+\tstruct nfp_vdpa_hw *vdpa_hw = &device->hw;\n+\n+\tnfp_vdpa_hw_stop(vdpa_hw);\n+\n+\tvid = device->vid;\n+\tfor (i = 0; i < vdpa_hw->nr_vring; i++)\n+\t\trte_vhost_set_vring_base(vid, i,\n+\t\t\t\tvdpa_hw->vring[i].last_avail_idx,\n+\t\t\t\tvdpa_hw->vring[i].last_used_idx);\n+}\n+\n+static int\n+nfp_vdpa_enable_vfio_intr(struct nfp_vdpa_dev *device)\n+{\n+\tint ret;\n+\tuint16_t i;\n+\tint *fd_ptr;\n+\tuint16_t nr_vring;\n+\tstruct vfio_irq_set *irq_set;\n+\tstruct rte_vhost_vring vring;\n+\tchar irq_set_buf[MSIX_IRQ_SET_BUF_LEN];\n+\n+\tnr_vring = rte_vhost_get_vring_num(device->vid);\n+\n+\tirq_set = (struct vfio_irq_set *)irq_set_buf;\n+\tirq_set->argsz = sizeof(irq_set_buf);\n+\tirq_set->count = nr_vring + 1;\n+\tirq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER;\n+\tirq_set->index = VFIO_PCI_MSIX_IRQ_INDEX;\n+\tirq_set->start = 0;\n+\n+\tfd_ptr = (int *)&irq_set->data;\n+\tfd_ptr[RTE_INTR_VEC_ZERO_OFFSET] = rte_intr_fd_get(device->pci_dev->intr_handle);\n+\n+\tfor (i = 0; i < nr_vring; i++)\n+\t\tdevice->intr_fd[i] = -1;\n+\n+\tfor (i = 0; i < nr_vring; i++) {\n+\t\trte_vhost_get_vhost_vring(device->vid, i, &vring);\n+\t\tfd_ptr[RTE_INTR_VEC_RXTX_OFFSET + i] = vring.callfd;\n+\t}\n+\n+\tret = ioctl(device->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);\n+\tif (ret != 0) {\n+\t\tDRV_VDPA_LOG(ERR, \"Error enabling MSI-X interrupts.\");\n+\t\treturn -EIO;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+nfp_vdpa_disable_vfio_intr(struct nfp_vdpa_dev *device)\n+{\n+\tint ret;\n+\tstruct vfio_irq_set *irq_set;\n+\tchar irq_set_buf[MSIX_IRQ_SET_BUF_LEN];\n+\n+\tirq_set = (struct vfio_irq_set *)irq_set_buf;\n+\tirq_set->argsz = sizeof(irq_set_buf);\n+\tirq_set->count = 0;\n+\tirq_set->flags = VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_ACTION_TRIGGER;\n+\tirq_set->index = VFIO_PCI_MSIX_IRQ_INDEX;\n+\tirq_set->start = 0;\n+\n+\tret = ioctl(device->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);\n+\tif (ret != 0) {\n+\t\tDRV_VDPA_LOG(ERR, \"Error disabling MSI-X interrupts.\");\n+\t\treturn -EIO;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+update_datapath(struct nfp_vdpa_dev *device)\n+{\n+\tint ret;\n+\n+\trte_spinlock_lock(&device->lock);\n+\n+\tif ((__atomic_load_n(&device->running, __ATOMIC_RELAXED) == 0) &&\n+\t\t\t(__atomic_load_n(&device->started, __ATOMIC_RELAXED) != 0) &&\n+\t\t\t(__atomic_load_n(&device->dev_attached, __ATOMIC_RELAXED) != 0)) {\n+\t\tret = nfp_vdpa_dma_map(device, true);\n+\t\tif (ret != 0)\n+\t\t\tgoto unlock_exit;\n+\n+\t\tret = nfp_vdpa_enable_vfio_intr(device);\n+\t\tif (ret != 0)\n+\t\t\tgoto dma_map_rollback;\n+\n+\t\tret = nfp_vdpa_start(device);\n+\t\tif (ret != 0)\n+\t\t\tgoto disable_vfio_intr;\n+\n+\t\t__atomic_store_n(&device->running, 1, __ATOMIC_RELAXED);\n+\t} else if ((__atomic_load_n(&device->running, __ATOMIC_RELAXED) != 0) &&\n+\t\t\t((__atomic_load_n(&device->started, __ATOMIC_RELAXED) != 0) ||\n+\t\t\t(__atomic_load_n(&device->dev_attached, __ATOMIC_RELAXED) != 0))) {\n+\n+\t\tnfp_vdpa_stop(device);\n+\n+\t\tret = nfp_vdpa_disable_vfio_intr(device);\n+\t\tif (ret != 0)\n+\t\t\tgoto unlock_exit;\n+\n+\t\tret = nfp_vdpa_dma_map(device, false);\n+\t\tif (ret != 0)\n+\t\t\tgoto unlock_exit;\n+\n+\t\t__atomic_store_n(&device->running, 0, __ATOMIC_RELAXED);\n+\t}\n+\n+\trte_spinlock_unlock(&device->lock);\n+\treturn 0;\n+\n+disable_vfio_intr:\n+\tnfp_vdpa_disable_vfio_intr(device);\n+dma_map_rollback:\n+\tnfp_vdpa_dma_map(device, false);\n+unlock_exit:\n+\trte_spinlock_unlock(&device->lock);\n+\treturn ret;\n+}\n+\n struct rte_vdpa_dev_ops nfp_vdpa_ops = {\n };\n \n@@ -156,6 +464,10 @@ nfp_vdpa_pci_probe(struct rte_pci_device *pci_dev)\n \tTAILQ_INSERT_TAIL(&vdpa_dev_list, node, next);\n \tpthread_mutex_unlock(&vdpa_list_lock);\n \n+\trte_spinlock_init(&device->lock);\n+\t__atomic_store_n(&device->started, 1, __ATOMIC_RELAXED);\n+\tupdate_datapath(device);\n+\n \treturn 0;\n \n vfio_teardown:\n@@ -185,6 +497,9 @@ nfp_vdpa_pci_remove(struct rte_pci_device *pci_dev)\n \n \tdevice = node->device;\n \n+\t__atomic_store_n(&device->started, 0, __ATOMIC_RELAXED);\n+\tupdate_datapath(device);\n+\n \tpthread_mutex_lock(&vdpa_list_lock);\n \tTAILQ_REMOVE(&vdpa_dev_list, node, next);\n \tpthread_mutex_unlock(&vdpa_list_lock);\ndiff --git a/drivers/vdpa/nfp/nfp_vdpa_core.c b/drivers/vdpa/nfp/nfp_vdpa_core.c\nindex a7e15fa88a..db9b8462b4 100644\n--- a/drivers/vdpa/nfp/nfp_vdpa_core.c\n+++ b/drivers/vdpa/nfp/nfp_vdpa_core.c\n@@ -5,6 +5,7 @@\n \n #include \"nfp_vdpa_core.h\"\n \n+#include <nfp_common.h>\n #include <rte_vhost.h>\n \n #include \"nfp_vdpa_log.h\"\n@@ -52,3 +53,80 @@ nfp_vdpa_hw_init(struct nfp_vdpa_hw *vdpa_hw,\n \n \treturn 0;\n }\n+\n+static uint32_t\n+nfp_vdpa_check_offloads(void)\n+{\n+\treturn NFP_NET_CFG_CTRL_SCATTER |\n+\t\t\tNFP_NET_CFG_CTRL_IN_ORDER;\n+}\n+\n+int\n+nfp_vdpa_hw_start(struct nfp_vdpa_hw *vdpa_hw,\n+\t\tint vid)\n+{\n+\tint ret;\n+\tuint32_t update;\n+\tuint32_t new_ctrl;\n+\tstruct timespec wait_tst;\n+\tstruct nfp_hw *hw = &vdpa_hw->super;\n+\tuint8_t mac_addr[RTE_ETHER_ADDR_LEN];\n+\n+\tnn_cfg_writeq(hw, NFP_NET_CFG_TXR_ADDR(0), vdpa_hw->vring[1].desc);\n+\tnn_cfg_writeb(hw, NFP_NET_CFG_TXR_SZ(0), rte_log2_u32(vdpa_hw->vring[1].size));\n+\tnn_cfg_writeq(hw, NFP_NET_CFG_TXR_ADDR(1), vdpa_hw->vring[1].avail);\n+\tnn_cfg_writeq(hw, NFP_NET_CFG_TXR_ADDR(2), vdpa_hw->vring[1].used);\n+\n+\tnn_cfg_writeq(hw, NFP_NET_CFG_RXR_ADDR(0), vdpa_hw->vring[0].desc);\n+\tnn_cfg_writeb(hw, NFP_NET_CFG_RXR_SZ(0), rte_log2_u32(vdpa_hw->vring[0].size));\n+\tnn_cfg_writeq(hw, NFP_NET_CFG_RXR_ADDR(1), vdpa_hw->vring[0].avail);\n+\tnn_cfg_writeq(hw, NFP_NET_CFG_RXR_ADDR(2), vdpa_hw->vring[0].used);\n+\n+\trte_wmb();\n+\n+\tnfp_disable_queues(hw);\n+\tnfp_enable_queues(hw, NFP_VDPA_MAX_QUEUES, NFP_VDPA_MAX_QUEUES);\n+\n+\tnew_ctrl = nfp_vdpa_check_offloads();\n+\n+\tnn_cfg_writel(hw, NFP_NET_CFG_MTU, 9216);\n+\tnn_cfg_writel(hw, NFP_NET_CFG_FLBUFSZ, 10240);\n+\n+\t/* TODO: Temporary set MAC to fixed value fe:1b:ac:05:a5:22 */\n+\tmac_addr[0] = 0xfe;\n+\tmac_addr[1] = 0x1b;\n+\tmac_addr[2] = 0xac;\n+\tmac_addr[3] = 0x05;\n+\tmac_addr[4] = 0xa5;\n+\tmac_addr[5] = (0x22 + vid);\n+\n+\t/* Writing new MAC to the specific port BAR address */\n+\tnfp_write_mac(hw, (uint8_t *)mac_addr);\n+\n+\t/* Enable device */\n+\tnew_ctrl |= NFP_NET_CFG_CTRL_ENABLE;\n+\n+\t/* Signal the NIC about the change */\n+\tupdate = NFP_NET_CFG_UPDATE_MACADDR |\n+\t\t\tNFP_NET_CFG_UPDATE_GEN |\n+\t\t\tNFP_NET_CFG_UPDATE_RING;\n+\n+\tret = nfp_reconfig(hw, new_ctrl, update);\n+\tif (ret < 0)\n+\t\treturn -EIO;\n+\n+\thw->ctrl = new_ctrl;\n+\n+\tDRV_CORE_LOG(DEBUG, \"Enabling the device, sleep 1 seconds...\");\n+\twait_tst.tv_sec = 1;\n+\twait_tst.tv_nsec = 0;\n+\tnanosleep(&wait_tst, 0);\n+\n+\treturn 0;\n+}\n+\n+void\n+nfp_vdpa_hw_stop(struct nfp_vdpa_hw *vdpa_hw)\n+{\n+\tnfp_disable_queues(&vdpa_hw->super);\n+}\ndiff --git a/drivers/vdpa/nfp/nfp_vdpa_core.h b/drivers/vdpa/nfp/nfp_vdpa_core.h\nindex c9403e0ea4..a88de768dd 100644\n--- a/drivers/vdpa/nfp/nfp_vdpa_core.h\n+++ b/drivers/vdpa/nfp/nfp_vdpa_core.h\n@@ -15,6 +15,15 @@\n #define NFP_VDPA_NOTIFY_ADDR_BASE        0x4000\n #define NFP_VDPA_NOTIFY_ADDR_INTERVAL    0x1000\n \n+struct nfp_vdpa_vring {\n+\tuint64_t desc;\n+\tuint64_t avail;\n+\tuint64_t used;\n+\tuint16_t size;\n+\tuint16_t last_avail_idx;\n+\tuint16_t last_used_idx;\n+};\n+\n struct nfp_vdpa_hw {\n \tstruct nfp_hw super;\n \n@@ -22,11 +31,17 @@ struct nfp_vdpa_hw {\n \tuint64_t req_features;\n \n \tuint8_t *notify_addr[NFP_VDPA_MAX_QUEUES * 2];\n+\tstruct nfp_vdpa_vring vring[NFP_VDPA_MAX_QUEUES * 2];\n \n \tuint8_t mac_addr[RTE_ETHER_ADDR_LEN];\n \tuint8_t notify_region;\n+\tuint8_t nr_vring;\n };\n \n int nfp_vdpa_hw_init(struct nfp_vdpa_hw *vdpa_hw, struct rte_pci_device *dev);\n \n+int nfp_vdpa_hw_start(struct nfp_vdpa_hw *vdpa_hw, int vid);\n+\n+void nfp_vdpa_hw_stop(struct nfp_vdpa_hw *vdpa_hw);\n+\n #endif /* __NFP_VDPA_CORE_H__ */\n",
    "prefixes": [
        "22/25"
    ]
}