get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 133465,
    "url": "http://patches.dpdk.org/api/patches/133465/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20231027030001.602639-23-chaoyong.he@corigine.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": "<20231027030001.602639-23-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20231027030001.602639-23-chaoyong.he@corigine.com",
    "date": "2023-10-27T02:59:59",
    "name": "[v4,22/24] vdpa/nfp: add datapath update",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "1d511aca7179ba64de4412d71eabc90eb60227a6",
    "submitter": {
        "id": 2554,
        "url": "http://patches.dpdk.org/api/people/2554/?format=api",
        "name": "Chaoyong He",
        "email": "chaoyong.he@corigine.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20231027030001.602639-23-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 30016,
            "url": "http://patches.dpdk.org/api/series/30016/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=30016",
            "date": "2023-10-27T02:59:37",
            "name": "add the NFP vDPA PMD",
            "version": 4,
            "mbox": "http://patches.dpdk.org/series/30016/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/133465/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/133465/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 A47024320F;\n\tFri, 27 Oct 2023 05:04:21 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 3E53142E26;\n\tFri, 27 Oct 2023 05:01:32 +0200 (CEST)",
            "from NAM04-DM6-obe.outbound.protection.outlook.com\n (mail-dm6nam04on2118.outbound.protection.outlook.com [40.107.102.118])\n by mails.dpdk.org (Postfix) with ESMTP id 21C0842E45\n for <dev@dpdk.org>; Fri, 27 Oct 2023 05:01:10 +0200 (CEST)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by SA0PR13MB4048.namprd13.prod.outlook.com (2603:10b6:806:97::13)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6933.24; Fri, 27 Oct\n 2023 03:01:08 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::45b3:d83c:cff2:4a1b]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::45b3:d83c:cff2:4a1b%6]) with mapi id 15.20.6933.022; Fri, 27 Oct 2023\n 03:01:08 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=LZ3DSWa8qrtnKtasFgdrLCl/m+Tn1mbzl1lSA2EOdKWSGca3a5fBhEWW0vZMnDu7yp6WqAxIWWkkUi9wuR5DpxUGW2zFqrgFlEcyXAsK3roM1ouZnpnTMv3j5+rrIIi/Q9hr5jDQhjXcAo59lok5ihHRDSz83TarwCthrmERwnoKFJ88TTFNMRtb4a//MuNSW8XD0lEy7zVBrwUqyUygPhTFph1AD/15ls78QbvpfrdP1SyJy3Jm23xy1DBCoCtICrh73vEBIv6jUWCW4C01IJwdNejn213yQXSbJ10P+pKcADEq1uHQG6RhksNyBNSBMdnH3B0nESY1NDSXb71pgg==",
        "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=YB/LcqT05BvqehMbYYSOhkaz8aoA2CxEadovUYwjKU8=;\n b=ObEEexpq4F508bnyNG6q24YuYM3U8iUCJ4HAMlAbgdjZ8YdTZZ35LJmU/HLIugq1rSF7bX8Clx5jDokty6mQdmBP/TskZsz1N6NtD2XacSoTmz3yRo7YM8ovW1igTQHbhtsJmhFNdX4xuqaAEtnOdRbXQ0ZTTBl2gfOPJVslIhCC4AC26Rl63BpT50Mg+lJAf3zG8CVDGHOCfSH065z9Fd429bwcI6/zIHeKwnmteXT3ICLmSy5qGJeH15o9fTxg4Old0zlLFFws5f1RMjGYD9uQwSkBdkQ5Rb5FclZWq9Pbk2wR0psUAtv1CuZ0dMiM3nOx3YrczYqfyO5IfSvRBA==",
        "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=YB/LcqT05BvqehMbYYSOhkaz8aoA2CxEadovUYwjKU8=;\n b=Bwud7/ECKlIQGUiSJSdd2CjWD0vmaT0TyWLhn8hnqfrzOLtbs9PhCdTIxBF8XhwjpB53oDRGIDAAndNihWnPE4uMB1NVgWMNqwXdL/eNAnkKmb5CbXsqusjW56H1gWYgdaYKsn5sHBEqP61RxBw4fQSQCcrUYsWqqOgSUTJ4zgY=",
        "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 v4 22/24] vdpa/nfp: add datapath update",
        "Date": "Fri, 27 Oct 2023 10:59:59 +0800",
        "Message-Id": "<20231027030001.602639-23-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 2.39.1",
        "In-Reply-To": "<20231027030001.602639-1-chaoyong.he@corigine.com>",
        "References": "<20231026064324.177531-1-chaoyong.he@corigine.com>\n <20231027030001.602639-1-chaoyong.he@corigine.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "BYAPR08CA0065.namprd08.prod.outlook.com\n (2603:10b6:a03:117::42) To SJ0PR13MB5545.namprd13.prod.outlook.com\n (2603:10b6:a03:424::5)",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "SJ0PR13MB5545:EE_|SA0PR13MB4048:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "696327f6-43af-49c3-437b-08dbd698f781",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n CSWIMOWh++udAOOl9M4ZLW2ph2IzQEiNag4br4z80YrrqprgC76XEGJTHEUMG7mjsyTHQI65RNYfSxb9WiEGCwuDF6aYCuid4JvybYg8X4cS3tzzEek69GEH+Lvcloxq8n/E6qWXy+OKFuUSebPIp62iDl/8FUFrKpkooYR64Ksrs92kK449hw+PVUt5BIWch7ib3UDzP4mh065tIZ0JFpFhBNf0OSdXh6G6gu6lKUXc6FZAtrVY41Ihu9waJwlCGuj+cP77e7RVogCaBBM0Rq/cJuwc/l4zTTGC52JeTwG439l7EuqzwMTVaupDyVfJ6AJ4eS+Bc1wnJdtpxCJinOD1yZZrM3BLqUzsN7XSsDgYbJO6vyGs9ORBBQA4Qxf+S7sNF0wf2pq4n7a0ynrCr0KvKfc2oEgVGN3es0n6PIBWlsBpQlDrvPuSVS16D1gvboEH3L+f+7vZvJIxxyueFToq3IRJ5WEFr2wNNPWFcoACXg54xeqMvOqo/T2acQjQS/nX3dubrMpNQ643DHEuoqbdP7E5xkuZpo8ceTbkDfqGOKn55GPU/9gy7JQ2jPvuEQX3Rt+A3q5rd3CWn2UTX5GZV6OdeMsmyiGTIbRqqdpKMI871+LUKj/HCqhWTDFYHl0jQ99kygH4NWtsjgDovsY80axrF+G/WMShVNKCK9Q=",
        "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(13230031)(376002)(396003)(39840400004)(366004)(346002)(136003)(230922051799003)(64100799003)(186009)(1800799009)(451199024)(6512007)(6666004)(52116002)(6506007)(6486002)(86362001)(36756003)(478600001)(38100700002)(15650500001)(30864003)(2906002)(6916009)(41300700001)(83380400001)(1076003)(107886003)(26005)(2616005)(38350700005)(66946007)(316002)(66556008)(66476007)(4326008)(8936002)(8676002)(44832011)(5660300002)(54906003);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n DBK6HKUkBAK6+x3tvkwQpRx3BNKoh/Mu3txoYiokJ3M6apRDr0Pr5PN4589vSXsQLDY8baX+NBDSS9bmaalD7U52jNRSPJSRq93Qp5fIwp4s1U+fnUvHiOCzlH+tV7zHi0C3z2ddRw/ooxtE7aIdCloCO82P1lp3Ti5xMnIguFznjgJhaPiGYN2Hjam66co/IMtjIfZgPZbhNjtLsFNUh5gHmCa/wNPAmJKcicmVREHmGHSP4J+lnyLNu0QPvIXd0gs0BhpiR2T0SzTU1P3JlWwOOXHsNvOJb4bYRBt80rdD9SaJyal5iZOx2ftqoVFj5nsQzlWDUEBtSkWHQYhvzW16YgjA+cunNrbxq1imwuUDJHoh/flCQzJ4bVndzc8yRHAzz0fLfoUP9aLw2lOUlaLZl1GCgm721wfhzeL0YBJGK83HSKaZShAH4J7wUY1Ps18DInZqwomH7oXDdZ5nk9lUoBU85uX1TU6twClvX7lXkjVw70qVYcDICM26Ic3iO9lRmmEeZVJmwK0q+Anm5NuIus6tvHk1LhFqx+e0BV7BDdeSXM5bjHlh1BOcmbaj6FkzgBixLcY1S8hEUoy6CLEDJ7JXoLF6b7LqQaRgBRtkMDs4XuVVDzqsHzaNBREm0uUO0N1cUr8jzE9TM5+TGXBrgpg8ZS87nDU5yyeyY+D1aXRMh2g3M/dfguRiIW7xf4M61i9vmKnvM7+qLyZODuKqe+OFhZkzAjirboVJKeDu91gXgjhrEUNpbhBOcZlqkVG+AsOK29FKP7swKTaFgPIcZdF7PyFD9GSNCrlL80o/OIGNycAur0CvyrUHJbdII11bHKRO+DONpswemR1WbmFUQ40jld3kgiRziWjbyPJiyOAQuYaMTi2mRSvGBbK/OL1Q8vJAx52K32KL2KYC25sKG+UbyJe4ix+moZ3JubwhQ2VPCZ5FczUOYbj2UJ9ScnbmPVzonGN1D5m/y7y/30oNqWtRfBQ/P053OLrMzkERJd2lHF8RPahpIUwwbxijqT+v8yuxws+3aVzzp+HvJg43LVnEco8xLCK+eJg4cz+wVV0+dKbXsaouaKg/HbcgycTz+Pm6wKxydJW4wc6sZ+BoJZ0/GBEsVVn314jMSnP2Kv2aalTyWPq5+8UOn/u9AV63z9Seif6Zyg552V0Zj+2xPfjerk5HsUxZaLsyBFq5LNZHA7O5xc8qmkeagqs9PpsLSkSeeJXVwEB22DYrQFoOkLmmNJUIpLBcs8RTpgDQOoiHusEvYQeXYlqMWCZu5Bxb8uuL5ZW+A4wawZsx7wlF4oixc9Jcugkib3FCXUKhIpz1w0YXmIRRpxFjn7riavpqZOBZGoryzKHIADwmE2kea5Whrcal68isFVY26UlY0ndRzWieDLzKKotUtBKmMMit21I7G9C/4G9qqD/oHY7kAsiPl63hSRIymEie4Mb2OiAsg9IvEKx5k3RRDY0h4bCWQqAe58A9XH7YlTDrfoNoHPXY/uz48sPdEFLE3NDt/9bmvYzHmmQB+sUuY/dSsrwzli0qV0d72OtTvRCNSourMWtJUIg2LM3jhfiU5aSEie6+4TjF8Va/5S1N+DzoRSHpucok1gomyXDXYJ8QQQ==",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 696327f6-43af-49c3-437b-08dbd698f781",
        "X-MS-Exchange-CrossTenant-AuthSource": "SJ0PR13MB5545.namprd13.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "27 Oct 2023 03:01:08.1734 (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 RQNQNjdqg2D1Ja4G+EBM48nTA7mRNcWxrOZW9+ytgrwAPUah/GHN7gz0SFgGFAT8nE/evyPZ4OD8rvTw38wCUBHyN9ILKyD/YPETuZU4iHI=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "SA0PR13MB4048",
        "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          | 318 +++++++++++++++++++++++++++\n drivers/vdpa/nfp/nfp_vdpa_core.c     |  78 +++++++\n drivers/vdpa/nfp/nfp_vdpa_core.h     |  15 ++\n 4 files changed, 412 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..04dd29092b 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+\tRTE_ATOMIC(uint32_t) started;\n+\tRTE_ATOMIC(uint32_t) dev_attached;\n+\tRTE_ATOMIC(uint32_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,305 @@ 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 ((rte_atomic_load_explicit(&device->running, rte_memory_order_relaxed) == 0) &&\n+\t\t\t(rte_atomic_load_explicit(&device->started,\n+\t\t\t\t\trte_memory_order_relaxed) != 0) &&\n+\t\t\t(rte_atomic_load_explicit(&device->dev_attached,\n+\t\t\t\t\trte_memory_order_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\trte_atomic_store_explicit(&device->running, 1, rte_memory_order_relaxed);\n+\t} else if ((rte_atomic_load_explicit(&device->running, rte_memory_order_relaxed) != 0) &&\n+\t\t\t((rte_atomic_load_explicit(&device->started,\n+\t\t\t\t\trte_memory_order_relaxed) != 0) ||\n+\t\t\t(rte_atomic_load_explicit(&device->dev_attached,\n+\t\t\t\t\trte_memory_order_relaxed) != 0))) {\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\trte_atomic_store_explicit(&device->running, 0, rte_memory_order_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 +467,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+\trte_atomic_store_explicit(&device->started, 1, rte_memory_order_relaxed);\n+\tupdate_datapath(device);\n+\n \treturn 0;\n \n vfio_teardown:\n@@ -185,6 +500,9 @@ nfp_vdpa_pci_remove(struct rte_pci_device *pci_dev)\n \n \tdevice = node->device;\n \n+\trte_atomic_store_explicit(&device->started, 0, rte_memory_order_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": [
        "v4",
        "22/24"
    ]
}