get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 133362,
    "url": "http://patchwork.dpdk.org/api/patches/133362/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20231026064324.177531-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": "<20231026064324.177531-23-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20231026064324.177531-23-chaoyong.he@corigine.com",
    "date": "2023-10-26T06:43:21",
    "name": "[v3,22/25] drivers: add the datapath update logic",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "0fadb71c1b16c742aa64c098f82dfb38211f9f59",
    "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/20231026064324.177531-23-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 29991,
            "url": "http://patchwork.dpdk.org/api/series/29991/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=29991",
            "date": "2023-10-26T06:42:59",
            "name": "add the NFP vDPA PMD",
            "version": 3,
            "mbox": "http://patchwork.dpdk.org/series/29991/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/133362/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/133362/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 1E9A643204;\n\tThu, 26 Oct 2023 08:47:43 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 88F7F42E30;\n\tThu, 26 Oct 2023 08:44:38 +0200 (CEST)",
            "from NAM02-SN1-obe.outbound.protection.outlook.com\n (mail-sn1nam02on2116.outbound.protection.outlook.com [40.107.96.116])\n by mails.dpdk.org (Postfix) with ESMTP id 0D05E42E41\n for <dev@dpdk.org>; Thu, 26 Oct 2023 08:44:29 +0200 (CEST)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by DM4PR13MB5908.namprd13.prod.outlook.com (2603:10b6:8:50::21) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6933.19; Thu, 26 Oct\n 2023 06:44:27 +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; Thu, 26 Oct 2023\n 06:44:27 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=QjnxBvmiFajIUu1mrXpbJcAyfEzQXEGb5uyrjsciQg/SdHSt8dpbU5ULA0vneQSB7h0t7vDQPisRDfCsmgEL6DnRVdXOP5sbvzoNM8FFgfwY+g6zcOVhKCsG28eekO8DMCWjnhFCz+4UHlhbTdvPej+jfScgpxwIoM8mbUx3Mm0+nnDN14w9+tKSPXGKN1QIquAbZg6qUpkrHAGK3QuWfD5COHAZy9lxewq2L27kpMJNskq9kTNk62UjFVJ2GxuaBmKziYV7pVJsRgrSLMtU/GRxnQcmoasM+umJ2QTepTZcmtvwGOdPIwwIlj2zhB/ljuWaVFyU/kWzsrx/S3IN4g==",
        "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=RHA2c0lHb7AnijGo5U6VDR7PbFnsFzY914xYKWB4UyA=;\n b=HuyYTXTjgdT5xDLI8eCx35wAIhhCaj/HOHzwZOrGYE4CtX7BDiaa9ApXThONBotj1lQozN6VaZZj6wnHLfCGntvBoD95v+NgFEUpXjQA+evTX1fiWkTdDY26jcP0W1T5ZtlUUiRPQ/Hx/H39jpsi/4+ohlYl24rqSElb2qsYcmvqmiYuAhMf99DrQ5LycpG4oYanC0xado1PMjjHW0k2iJdGwj8fUKcS4Ulbqh2MJTWz7xGWihPzZV3cUFOGcw9XegnJ/8CWrkHjtarE2Yhv1J1AjlNHrsT5G8/mE3uGLu3W20Kk/39KQQnhhNCF78FU+gAKyvtKb9uff7DKvYi3lw==",
        "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=RHA2c0lHb7AnijGo5U6VDR7PbFnsFzY914xYKWB4UyA=;\n b=Bu/qvgceUGK/eTbLedOxXNG1taO2fX+lcw7T0zs+iJRFABi6vSB7oE7oVp9d6ijFUh/oHrfNmCtKXOYnVSFevKWOv3UXBYNMTx06nL69wIwM5jWJ5q58CIzttfp+PbuJGATljVUN1OGfIt3u/+aaBOyPwTPcTqSnQ960sBr6gz4=",
        "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 v3 22/25] drivers: add the datapath update logic",
        "Date": "Thu, 26 Oct 2023 14:43:21 +0800",
        "Message-Id": "<20231026064324.177531-23-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 2.39.1",
        "In-Reply-To": "<20231026064324.177531-1-chaoyong.he@corigine.com>",
        "References": "<20231024022849.3092506-1-chaoyong.he@corigine.com>\n <20231026064324.177531-1-chaoyong.he@corigine.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "BYAPR07CA0034.namprd07.prod.outlook.com\n (2603:10b6:a02:bc::47) 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_|DM4PR13MB5908:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "a623e1b5-2457-400e-77ac-08dbd5eeff6c",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n WovXMNwjfzfnyfxDBri0MtxtWCGcdzgWP+WynEqI/RdSfDlbo8asFK410KvE68c5DTWxvtOk9k/9qb/uTs8vaSOpwqtoFo47KWt0cihFjkCP0o9RCbdyqCXosOs7sHZ0/2aSUr5iAARWduuyYmchBSC1slywAEkD13hKj4EdivNU64TT5WqXRwnbNym++ZaCk+1Gjaf+MlXXCCP4VVMp3vCeNmIcXbRhsIlebSHvZ5d0RUlZx14UMbi348pA4p+MpyKZ83SsauhRKfyz4ge3KN20T6nqAYsNpvT6/qHdNVyDY1kG/w4LnmLza+y3+sc7Umd9wkDTFiK5avBFz/8QytUyLw8Gw6+dFDgwaaf83mhqruyIx51WYpY9GOWtmKqGLwigC4FHOGagYqrkQ9LOXP12PotOdfhn/MF/INoD8+vb6+2IFNLiTVTBP4dpqJq8C1eytMjC46bBHiK2EEPcjZ+h4pwwYgewBnEkrzGCmpN52PCdrdOHb0pP5HTW8ibiSA/fVFeQu8ob7MLR2KpRmmaer0GNN9wrhygLooi+JnfZNRfM+PYqkuWmlDeYuF+PzsgCcDqkgvpc6/aoff7AndfymVkqh9ice8/Jy8BcrnhpErTal8cBdEiPp4gN3TtJ+6Bx3pfVpEeKvQpjTwT38/ysFvFBhN1Fs4EHObej14U=",
        "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)(136003)(376002)(366004)(396003)(346002)(39840400004)(230922051799003)(186009)(1800799009)(451199024)(64100799003)(26005)(478600001)(1076003)(316002)(6666004)(6512007)(86362001)(6506007)(6916009)(66946007)(66556008)(38100700002)(66476007)(54906003)(36756003)(38350700005)(2616005)(6486002)(107886003)(44832011)(30864003)(2906002)(83380400001)(4326008)(8676002)(8936002)(15650500001)(5660300002)(41300700001)(52116002);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n y/xoN9f//LvbouO1dAcCdLg98eeX3IzjlgWL6bwXEHx88dLkiICjhrO/5zF//GC213gALKd36xmENfqE7ZnRyIrmD/37Sn7NAuzcC+PSptvBnZxvvNVcvlZu43j6VnziztVnncPRXZ3PL1J0YP2qvR23Uvw0lRLOTz28XfGcvzALsTrzyEQCu/OWKmK6SRF57Gswt/bVsy707cjor9Ndz2cYW9OD8nhVk/EIESmkNFxYsOywYv+dwXbFmHxJ5jFOIqElB26jJUrq7Pw1ogFKtqlg5W+fbrxVEIthnIGPC7cv2uwG5fFbWDauLxbDpSciH7gnDCCNVmJDbtoZNuTgv/5pWH2QrbDo39o5zs0lsN1/TPqbxXXuZzsZIIjZ6txy9IW8IijmdFhAUlbv+0+96Q07lv/EUJ1J4xlfBLXXfRwJ3DKyuRgEHR7Yfj9BuV9bP/E1eziFUE2v1DzQRpob1DLT3ik1JOVfupsJ7d1rgRsjpXnBqWinaLcVbiDBKi2c55biVEdKsyl9MOIJstKJzdF209b2JdbprE1o7aHjlr0hw12SbRI2utKx6B3yZxSSryt/jlUY7POqI3Ze2hz2WsAe+rsDlx4ORS4RV5yIRULhlqElq0TfgNUoHBd+ZeNIGvgOmHZYZTU6jw8v4TDoM2TB7FSqQuAXy1lCzWa3aMYdOdDT7TMHI/dmy/PqGwH/0QPuQe6OZD5Alv8RBrlnBIo1EWiAz7SvmyRd+iD/4wtMsaxAhoURxWixso+Kx7ZJ923WCG4wIK5EIcNenXEeOoN2/Snp1ZpLxmbw3O6seYIh++9C1AMUtDSHlE/bebPJUDfp/e3pb/7NIEn8xs1Q+/1DUb4hazlEVwGcWfhEtaIxfMgf4HxR5wdQquDe8rFkZ6NED6rGApb99a9crgmD6pToxXiwzGGSUr2tO8IXmLt7Rh4rMG7qleRd3P72mMClS8p78wHGdl+24wH8l6jBucfK/U+B719Azd3V7X3/q5h8bJRIXkxW1TSD9XlxaWobAMy6+G9FNoBHfUhlwosicjr48YXU20Iw6JpXxR8EDWGpYxAXUE1dch6RjGxSdSI4LJiDOCxLS+LECZlF+6550xMna9TlnNYwvGtIj46WawzYaRm2MPRiBsHQ+6H+v7D0A0Xw5u9bLPZyPu7meDym5VamafiRrd3wg7KaPHgTy/Te2QaRjdS2/jjB5Cx9TE4K/xGeUUNyegQSjqlJybzhwL7rpcm7zX+beQxsN1s/SaBLOB3lCcyG4RCn8IsFbRdou9g21HbTjHSSKrLrvbQ+lSZaIaAVDpuQ1mF+/ZYKYMYoJOA5My7rDU+N5/Fj+PHcBHERswgiTzPDJY7XwEEVfXFF7Ytx+kfW81XUD5nSSrX/lQreECTjX7Td6JdheAMCQ5kSo66Hamy1EZQpQDKtBMjbLx8/RxH/VwlZ1c7iZ38HlmhY+wM7cFNGqUXSB2pXgV/ZJ8zgpSlvs3zs7SQPwj6Ijur9SbhaF6p42+5Z1vIOvcYKPUSmK0sBbBmYypMQoywX0YmO+Z+aFSBGFskJEvP21ijUQ2g7L0mKgf6s1aYg34Q5eIVEg7mZjzUMZw6fx/LAZKN9sYUPlZ1TLZzrdQ==",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n a623e1b5-2457-400e-77ac-08dbd5eeff6c",
        "X-MS-Exchange-CrossTenant-AuthSource": "SJ0PR13MB5545.namprd13.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "26 Oct 2023 06:44:27.0026 (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 sN2cH4gGMn83mA8lqBqw4S3QHgrK9hiLqEvlpf7uoM5gsK0604n7ZS9CQbSVGsZve1aJIgJm0XV8ZYx7euKYhxrAoJCJTd2dRtAnNrX4oCo=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "DM4PR13MB5908",
        "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..d0d8050887 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,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": [
        "v3",
        "22/25"
    ]
}