From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 2D19E431EB; Tue, 24 Oct 2023 04:32:49 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E174E40EF0; Tue, 24 Oct 2023 04:30:25 +0200 (CEST) Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2103.outbound.protection.outlook.com [40.107.223.103]) by mails.dpdk.org (Postfix) with ESMTP id C4D1442DB2 for ; Tue, 24 Oct 2023 04:30:20 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ks1LDSGNlwe3ITUH4Dlnhh7tdBGdLa/lxm0Vfx/4y/2/ljTsRIp/D1w1YivqnRkQ0EjgFpa/qBOU2QzzxhqBnFiasmFv2R5q4Aj3nlANKE4VYBS2sri2QPEulBbqiF+U64wEwzdgNeWO0sZ9LxiiAqTvptC+ceiwkA2mrcLfEa68N7SIjmu2pbJH9p4LPT6GgwavogochOIyNtwdC41o9PRpspt2Cm4hCjTb2PKYu9fjiOiSVmQEJx6B7HzRutoRAwwfns2nryxPUW3nCPjF2gxclg+AjBxIwr/DxuaWGvHtLH03ywtykcvy7wFMBa2ngJv1pxivVJZEkmPAKYUo5w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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; bh=CRjIkFOAgtqQO6MucvhuRNntT4IojwKrYXbnkxEmJj4=; b=fhDvhT2alOB6ZS/vZ7Pktjz1xeO1WjdFqfeDElu597t525kRqXzg8ZsYm86cZat2hNjZIWLWnD38er87r/9NQno4geOcyhzTEqLUjV62ZHJh6j8qhwpFAkM2k9IE+tsbu1ZbAAT7ydunME4oBndHgyBHE8fGJ8Jy1J8/A1KthSeGpaTtSje8F6Grsyn1BaCVN1NtA9Z2higsk9e/gX9BO5KdLPlIlRIqoqGa4a3yT1Bf8RqPXuz5OKJILOo70/jnPyKx+Rds0sDEza1OAlm7r5uePXr7UUTaXtFxywbPBvsiN+zJKGhHRoE8thc9zr1o3t3gxih0uykSGohtw1NBdw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com; dkim=pass header.d=corigine.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=CRjIkFOAgtqQO6MucvhuRNntT4IojwKrYXbnkxEmJj4=; b=CZKRn8PmV0ParYR7m6myYyBjgSDvnhlaHbloYlMYIeoYcmy0Vy4h4WAwn7WkZa54DT3s4fZZJk3f5+WUYv4+/5M+RntPgrHZwGMFxD1urveRwpm+jZJK4LROWX2eNUWVA5pu6M9Ft9JHEYu35AGEsFIe2W5tx/Aoz8KR0lbZjV8= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=corigine.com; Received: from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) by PH8PR13MB6182.namprd13.prod.outlook.com (2603:10b6:510:259::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6907.21; Tue, 24 Oct 2023 02:30:19 +0000 Received: from SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::142e:d47c:7320:8a9d]) by SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::142e:d47c:7320:8a9d%4]) with mapi id 15.20.6907.021; Tue, 24 Oct 2023 02:30:19 +0000 From: Chaoyong He To: dev@dpdk.org Cc: oss-drivers@corigine.com, Chaoyong He , Shujing Dong , Long Wu , Peng Zhang Subject: [PATCH v2 22/25] drivers: add the datapath update logic Date: Tue, 24 Oct 2023 10:28:46 +0800 Message-Id: <20231024022849.3092506-23-chaoyong.he@corigine.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20231024022849.3092506-1-chaoyong.he@corigine.com> References: <20231017054545.1692509-1-chaoyong.he@corigine.com> <20231024022849.3092506-1-chaoyong.he@corigine.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: BYAPR04CA0015.namprd04.prod.outlook.com (2603:10b6:a03:40::28) To SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ0PR13MB5545:EE_|PH8PR13MB6182:EE_ X-MS-Office365-Filtering-Correlation-Id: cf58f77a-7520-48c1-e2d2-08dbd4392a25 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: na4yq5+ypUYqDgeHhsme76Tbowb6zraM/AM0NOPjS3gIc2dqG7q41sOTpM7BoaqoQYO3OtQ6jQp3k2lYnp/amySc+jqRhim9ot3uxYyrpMTsDHAGFfKj/vzwg1hm5flS1lXTyEVwsLhtwjx4lOnekd69ReX71xVzjw2AOGHwFpsZswvnTZK5w6/Z7b52XM9P5ItGc/6fC2UU9FUc6J6B6W6yh1gWKSwWcidmBn6/Hd0aN+RvhKtp+4ttbSlFc/VQsx9KrEOeaCkLPB2L/Zxg+J6RL0IBAW//y7jvdZK/tNBxTl6cdntmp1OUAakenqOGwAk/LEDxr7/PMZ1ByrCJ0sFI6jvT1q4X79OJs1ce3owbefft6nL3urgSeeMN5QHirIySrRvWYoS7r8y1hZyPrgfcAsSlQ5qMsvHFMyL1Q3jOd5QDyhW8+cpZREFBQjwpSo14F771DdVVVCqg1bj4PGzgHRxI51esPAu2cP4UIQg5bulLxGGAfStj0szQrHcJBMGeGYs7YWkN3cLsftsdUNBoMRT3EK71YIRiL6G0+4AeK3QGisBRsGWSp8hhDNRtGGtJ8xDPYa2ArL0gWiH8aj+DNbfDYGkSEL1zOoT3hBuHpFJLBJkDqCQoQwXpTynKcJaTJ63CNsr6KOFqPo1kHHnx2IDlGoGYgy5ruPt8zv4= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230031)(366004)(396003)(376002)(39830400003)(346002)(136003)(230922051799003)(1800799009)(64100799003)(186009)(451199024)(86362001)(30864003)(66946007)(316002)(2906002)(54906003)(66476007)(6916009)(66556008)(5660300002)(8936002)(44832011)(8676002)(4326008)(36756003)(15650500001)(41300700001)(2616005)(38100700002)(478600001)(1076003)(52116002)(6506007)(107886003)(6666004)(38350700005)(6512007)(26005)(83380400001)(6486002); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?J8feOjlhcxArZTgsE178B6BcQATIbHij3oOuACImgFBJ9n3cYPHGqV/dtlyW?= =?us-ascii?Q?PMr6QGCbYuRuV0WhEEp2Hvoshfm+J+xsyFdeVmQOW7MpCFLgcf+/r2im2IER?= =?us-ascii?Q?1UUtWx9zHrYjLTO+aFkFpBZX9wfogIJqYRZyu6PaxkonSulLDn/+HXr2LAJL?= =?us-ascii?Q?V0PAyu8IDM2uIcKOX1VGY/W0IaLIPQ+hwjXA3eDRAC2i/X4xiEbLY1mj/bpI?= =?us-ascii?Q?ini+eSDya0WdAbhNv3QwJtTh7AcvmvVEuSCYklUSxXKIQWcUZ+jy9HaWaW0V?= =?us-ascii?Q?wdkm5DC/mzDyTkMOxGQkA296qWkVsRQuG9ljCyVVL8mqvUWNwd0DV/sL8tXr?= =?us-ascii?Q?XuwCidExG+koch65kG1mMy0uCC3wMRGqBkoL5BwqLShIcaRzMGP7P72TQQN9?= =?us-ascii?Q?pftKMdZQkUvRDVUbUOJS7dA/QSgxyR8igs0ZcPRy/NjAO58zs/RzqxTHeAXt?= =?us-ascii?Q?agTwFpBczqlMzED2iHe3phyweWLXzVOD2WO8u1J96vzO6vPSSX7NkzvzyYrx?= =?us-ascii?Q?47BsFZVYASMaFt8R4JWP29JIZhanNMfyFeBM9nGm2lGAYDPgxK38p62CJ9TU?= =?us-ascii?Q?3SluUqsoFV6PDPupsbWX7KGXY8MsY3S2os72HFpT4YZM85gYhwnvYLMGzI9I?= =?us-ascii?Q?HtpR2ZQNCG1EEvtSeO/Tpymyx+nNdjHzL2OP3cJ6BSSTm1g9OQKopX36mNBd?= =?us-ascii?Q?C7h0TwC6FAV2y+/5ST3R/EAvP9XGXRQY+YJBdyoaMhmgFpFlA+kg3p+Jxez9?= =?us-ascii?Q?wJnOLebtkZjtCuUXqaFzBRWPI1kIs7rYk4FutYypKhgGh2cO7oauO8Sr1FlN?= =?us-ascii?Q?WKMSfKL7NhSwmK4txAzXK1KBsQKP24f2iUVXlAI27Le4L+egCjd66sKkGppc?= =?us-ascii?Q?f4BuRe4VnxEMOaQTtAXTvX2C6IM6cVE+D7quu/DH+rEOATl09brYtrbaw7RA?= =?us-ascii?Q?FG58ScceJ/Czs58erPHE2NP/JYaR8+ObB1gHTky2oPC6ABSVQCpH2wFcs9Ds?= =?us-ascii?Q?0WrCSj4V//JwFmS6+PXQsGIO0moWDptrEcRm0ksR7QlGKQ8+xfVaZMw7tSGi?= =?us-ascii?Q?louf2nJCK9mI1k+rnSv9Jxk1ET5quQ56wCHAfh/beRKIem69blXOfkgBnquE?= =?us-ascii?Q?yMfFcLNpLWUTo9h0pf/Sw2SImiNwfuTT1NbvBuFZeKENk4QABGcmuyjqiOyB?= =?us-ascii?Q?+Mtgn9e+qSanmaoObWocZdulbwS2pi74ROPHZT1z9PU1O7pZxfEfxstnHb4q?= =?us-ascii?Q?uvvGHFlsmgLFquewcgEK7YckdSsrmQUwJq+/OH/u78NXOiugHLr0/PCE4ni/?= =?us-ascii?Q?ED9Ilb++mJRpuU/Zq4xdKB32ofnwTEnJg/Kj6aNK7VlaLy1Aok0AyKyvpOGY?= =?us-ascii?Q?NNk/3jwuy/84iPQH+tHCmSOhpdvp1ZyyszCucbfus8GsmwNRj32Me3zY/HMT?= =?us-ascii?Q?Hs9/IzBlqLGk2MfygS5YxKntP7Ksv+GklvpN4Y8h6BcNd7kA01P6eQf0edl5?= =?us-ascii?Q?nf++9PDGOqMWRYZLg4ykC8rSgjmi93DGpZM9ofp87qO3smupYkr2jKA0r15q?= =?us-ascii?Q?c1aJPjPXQHbBedVYRfqzXcobyJnOAib+YO2jZugHMVbdI0rwaBQz+w88xp9r?= =?us-ascii?Q?oQ=3D=3D?= X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: cf58f77a-7520-48c1-e2d2-08dbd4392a25 X-MS-Exchange-CrossTenant-AuthSource: SJ0PR13MB5545.namprd13.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Oct 2023 02:30:19.1116 (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: d1kivj6TVSI1IjPccR3HGoqu0CPNajqhdPUqSslvX2vfKGJazHkVM8IW9TPO6GJwoE0q/DIw0iyJL85Attz+27mH0QAB5RRBBhdHSXrJ9Pc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH8PR13MB6182 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Add the vDPA datapath update logic. Signed-off-by: Chaoyong He Signed-off-by: Shujing Dong Reviewed-by: Long Wu Reviewed-by: Peng Zhang --- drivers/common/nfp/nfp_common_ctrl.h | 1 + drivers/vdpa/nfp/nfp_vdpa.c | 315 +++++++++++++++++++++++++++ drivers/vdpa/nfp/nfp_vdpa_core.c | 78 +++++++ drivers/vdpa/nfp/nfp_vdpa_core.h | 15 ++ 4 files changed, 409 insertions(+) diff --git a/drivers/common/nfp/nfp_common_ctrl.h b/drivers/common/nfp/nfp_common_ctrl.h index 3c8cd916cf..f92ce50fc0 100644 --- a/drivers/common/nfp/nfp_common_ctrl.h +++ b/drivers/common/nfp/nfp_common_ctrl.h @@ -238,6 +238,7 @@ struct nfp_net_fw_ver { #define NFP_NET_CFG_CTRL_IPSEC (0x1 << 1) /**< IPsec offload */ #define NFP_NET_CFG_CTRL_IPSEC_SM_LOOKUP (0x1 << 3) /**< SA short match lookup */ #define NFP_NET_CFG_CTRL_IPSEC_LM_LOOKUP (0x1 << 4) /**< SA long match lookup */ +#define NFP_NET_CFG_CTRL_IN_ORDER (0x1 << 11) /**< Virtio in-order flag */ #define NFP_NET_CFG_CAP_WORD1 0x00a4 diff --git a/drivers/vdpa/nfp/nfp_vdpa.c b/drivers/vdpa/nfp/nfp_vdpa.c index 00d8f7e007..465ee4841d 100644 --- a/drivers/vdpa/nfp/nfp_vdpa.c +++ b/drivers/vdpa/nfp/nfp_vdpa.c @@ -4,6 +4,7 @@ */ #include +#include #include #include @@ -15,6 +16,9 @@ #define NFP_VDPA_DRIVER_NAME nfp_vdpa +#define MSIX_IRQ_SET_BUF_LEN (sizeof(struct vfio_irq_set) + \ + sizeof(int) * (NFP_VDPA_MAX_QUEUES * 2 + 1)) + struct nfp_vdpa_dev { struct rte_pci_device *pci_dev; struct rte_vdpa_device *vdev; @@ -25,7 +29,15 @@ struct nfp_vdpa_dev { int vfio_dev_fd; int iommu_group; + int vid; uint16_t max_queues; + uint32_t started; + uint32_t dev_attached; + uint32_t running; + rte_spinlock_t lock; + + /** Eventfd for used ring interrupt */ + int intr_fd[NFP_VDPA_MAX_QUEUES * 2]; }; struct nfp_vdpa_dev_node { @@ -112,6 +124,302 @@ nfp_vdpa_vfio_teardown(struct nfp_vdpa_dev *device) rte_vfio_container_destroy(device->vfio_container_fd); } +static int +nfp_vdpa_dma_do_unmap(struct rte_vhost_memory *mem, + uint32_t times, + int vfio_container_fd) +{ + uint32_t i; + int ret = 0; + struct rte_vhost_mem_region *region; + + for (i = 0; i < times; i++) { + region = &mem->regions[i]; + + ret = rte_vfio_container_dma_unmap(vfio_container_fd, + region->host_user_addr, region->guest_phys_addr, + region->size); + if (ret < 0) { + /* Here should not return, even error happened. */ + DRV_VDPA_LOG(ERR, "DMA unmap failed. Times: %u", i); + } + } + + return ret; +} + +static int +nfp_vdpa_dma_do_map(struct rte_vhost_memory *mem, + uint32_t times, + int vfio_container_fd) +{ + int ret; + uint32_t i; + struct rte_vhost_mem_region *region; + + for (i = 0; i < times; i++) { + region = &mem->regions[i]; + + ret = rte_vfio_container_dma_map(vfio_container_fd, + region->host_user_addr, region->guest_phys_addr, + region->size); + if (ret < 0) { + DRV_VDPA_LOG(ERR, "DMA map failed."); + nfp_vdpa_dma_do_unmap(mem, i, vfio_container_fd); + return ret; + } + } + + return 0; +} + +static int +nfp_vdpa_dma_map(struct nfp_vdpa_dev *device, + bool do_map) +{ + int ret; + int vfio_container_fd; + struct rte_vhost_memory *mem = NULL; + + ret = rte_vhost_get_mem_table(device->vid, &mem); + if (ret < 0) { + DRV_VDPA_LOG(ERR, "Failed to get memory layout."); + return ret; + } + + vfio_container_fd = device->vfio_container_fd; + DRV_VDPA_LOG(DEBUG, "vfio_container_fd %d", vfio_container_fd); + + if (do_map) + ret = nfp_vdpa_dma_do_map(mem, mem->nregions, vfio_container_fd); + else + ret = nfp_vdpa_dma_do_unmap(mem, mem->nregions, vfio_container_fd); + + free(mem); + + return ret; +} + +static uint64_t +nfp_vdpa_qva_to_gpa(int vid, + uint64_t qva) +{ + int ret; + uint32_t i; + uint64_t gpa = 0; + struct rte_vhost_memory *mem = NULL; + struct rte_vhost_mem_region *region; + + ret = rte_vhost_get_mem_table(vid, &mem); + if (ret < 0) { + DRV_VDPA_LOG(ERR, "Failed to get memory layout."); + return gpa; + } + + for (i = 0; i < mem->nregions; i++) { + region = &mem->regions[i]; + + if (qva >= region->host_user_addr && + qva < region->host_user_addr + region->size) { + gpa = qva - region->host_user_addr + region->guest_phys_addr; + break; + } + } + + free(mem); + + return gpa; +} + +static int +nfp_vdpa_start(struct nfp_vdpa_dev *device) +{ + int ret; + int vid; + uint16_t i; + uint64_t gpa; + struct rte_vhost_vring vring; + struct nfp_vdpa_hw *vdpa_hw = &device->hw; + + vid = device->vid; + vdpa_hw->nr_vring = rte_vhost_get_vring_num(vid); + + ret = rte_vhost_get_negotiated_features(vid, &vdpa_hw->req_features); + if (ret != 0) + return ret; + + for (i = 0; i < vdpa_hw->nr_vring; i++) { + ret = rte_vhost_get_vhost_vring(vid, i, &vring); + if (ret != 0) + return ret; + + gpa = nfp_vdpa_qva_to_gpa(vid, (uint64_t)(uintptr_t)vring.desc); + if (gpa == 0) { + DRV_VDPA_LOG(ERR, "Fail to get GPA for descriptor ring."); + return -1; + } + + vdpa_hw->vring[i].desc = gpa; + + gpa = nfp_vdpa_qva_to_gpa(vid, (uint64_t)(uintptr_t)vring.avail); + if (gpa == 0) { + DRV_VDPA_LOG(ERR, "Fail to get GPA for available ring."); + return -1; + } + + vdpa_hw->vring[i].avail = gpa; + + gpa = nfp_vdpa_qva_to_gpa(vid, (uint64_t)(uintptr_t)vring.used); + if (gpa == 0) { + DRV_VDPA_LOG(ERR, "Fail to get GPA for used ring."); + return -1; + } + + vdpa_hw->vring[i].used = gpa; + + vdpa_hw->vring[i].size = vring.size; + + ret = rte_vhost_get_vring_base(vid, i, + &vdpa_hw->vring[i].last_avail_idx, + &vdpa_hw->vring[i].last_used_idx); + if (ret != 0) + return ret; + } + + return nfp_vdpa_hw_start(&device->hw, vid); +} + +static void +nfp_vdpa_stop(struct nfp_vdpa_dev *device) +{ + int vid; + uint32_t i; + struct nfp_vdpa_hw *vdpa_hw = &device->hw; + + nfp_vdpa_hw_stop(vdpa_hw); + + vid = device->vid; + for (i = 0; i < vdpa_hw->nr_vring; i++) + rte_vhost_set_vring_base(vid, i, + vdpa_hw->vring[i].last_avail_idx, + vdpa_hw->vring[i].last_used_idx); +} + +static int +nfp_vdpa_enable_vfio_intr(struct nfp_vdpa_dev *device) +{ + int ret; + uint16_t i; + int *fd_ptr; + uint16_t nr_vring; + struct vfio_irq_set *irq_set; + struct rte_vhost_vring vring; + char irq_set_buf[MSIX_IRQ_SET_BUF_LEN]; + + nr_vring = rte_vhost_get_vring_num(device->vid); + + irq_set = (struct vfio_irq_set *)irq_set_buf; + irq_set->argsz = sizeof(irq_set_buf); + irq_set->count = nr_vring + 1; + irq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER; + irq_set->index = VFIO_PCI_MSIX_IRQ_INDEX; + irq_set->start = 0; + + fd_ptr = (int *)&irq_set->data; + fd_ptr[RTE_INTR_VEC_ZERO_OFFSET] = rte_intr_fd_get(device->pci_dev->intr_handle); + + for (i = 0; i < nr_vring; i++) + device->intr_fd[i] = -1; + + for (i = 0; i < nr_vring; i++) { + rte_vhost_get_vhost_vring(device->vid, i, &vring); + fd_ptr[RTE_INTR_VEC_RXTX_OFFSET + i] = vring.callfd; + } + + ret = ioctl(device->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set); + if (ret != 0) { + DRV_VDPA_LOG(ERR, "Error enabling MSI-X interrupts."); + return -EIO; + } + + return 0; +} + +static int +nfp_vdpa_disable_vfio_intr(struct nfp_vdpa_dev *device) +{ + int ret; + struct vfio_irq_set *irq_set; + char irq_set_buf[MSIX_IRQ_SET_BUF_LEN]; + + irq_set = (struct vfio_irq_set *)irq_set_buf; + irq_set->argsz = sizeof(irq_set_buf); + irq_set->count = 0; + irq_set->flags = VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_ACTION_TRIGGER; + irq_set->index = VFIO_PCI_MSIX_IRQ_INDEX; + irq_set->start = 0; + + ret = ioctl(device->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set); + if (ret != 0) { + DRV_VDPA_LOG(ERR, "Error disabling MSI-X interrupts."); + return -EIO; + } + + return 0; +} + +static int +update_datapath(struct nfp_vdpa_dev *device) +{ + int ret; + + rte_spinlock_lock(&device->lock); + + if ((__atomic_load_n(&device->running, __ATOMIC_RELAXED) == 0) && + (__atomic_load_n(&device->started, __ATOMIC_RELAXED) != 0) && + (__atomic_load_n(&device->dev_attached, __ATOMIC_RELAXED) != 0)) { + ret = nfp_vdpa_dma_map(device, true); + if (ret != 0) + goto unlock_exit; + + ret = nfp_vdpa_enable_vfio_intr(device); + if (ret != 0) + goto dma_map_rollback; + + ret = nfp_vdpa_start(device); + if (ret != 0) + goto disable_vfio_intr; + + __atomic_store_n(&device->running, 1, __ATOMIC_RELAXED); + } else if ((__atomic_load_n(&device->running, __ATOMIC_RELAXED) != 0) && + ((__atomic_load_n(&device->started, __ATOMIC_RELAXED) != 0) || + (__atomic_load_n(&device->dev_attached, __ATOMIC_RELAXED) != 0))) { + + nfp_vdpa_stop(device); + + ret = nfp_vdpa_disable_vfio_intr(device); + if (ret != 0) + goto unlock_exit; + + ret = nfp_vdpa_dma_map(device, false); + if (ret != 0) + goto unlock_exit; + + __atomic_store_n(&device->running, 0, __ATOMIC_RELAXED); + } + + rte_spinlock_unlock(&device->lock); + return 0; + +disable_vfio_intr: + nfp_vdpa_disable_vfio_intr(device); +dma_map_rollback: + nfp_vdpa_dma_map(device, false); +unlock_exit: + rte_spinlock_unlock(&device->lock); + return ret; +} + struct rte_vdpa_dev_ops nfp_vdpa_ops = { }; @@ -156,6 +464,10 @@ nfp_vdpa_pci_probe(struct rte_pci_device *pci_dev) TAILQ_INSERT_TAIL(&vdpa_dev_list, node, next); pthread_mutex_unlock(&vdpa_list_lock); + rte_spinlock_init(&device->lock); + __atomic_store_n(&device->started, 1, __ATOMIC_RELAXED); + update_datapath(device); + return 0; vfio_teardown: @@ -185,6 +497,9 @@ nfp_vdpa_pci_remove(struct rte_pci_device *pci_dev) device = node->device; + __atomic_store_n(&device->started, 0, __ATOMIC_RELAXED); + update_datapath(device); + pthread_mutex_lock(&vdpa_list_lock); TAILQ_REMOVE(&vdpa_dev_list, node, next); pthread_mutex_unlock(&vdpa_list_lock); diff --git a/drivers/vdpa/nfp/nfp_vdpa_core.c b/drivers/vdpa/nfp/nfp_vdpa_core.c index a7e15fa88a..db9b8462b4 100644 --- a/drivers/vdpa/nfp/nfp_vdpa_core.c +++ b/drivers/vdpa/nfp/nfp_vdpa_core.c @@ -5,6 +5,7 @@ #include "nfp_vdpa_core.h" +#include #include #include "nfp_vdpa_log.h" @@ -52,3 +53,80 @@ nfp_vdpa_hw_init(struct nfp_vdpa_hw *vdpa_hw, return 0; } + +static uint32_t +nfp_vdpa_check_offloads(void) +{ + return NFP_NET_CFG_CTRL_SCATTER | + NFP_NET_CFG_CTRL_IN_ORDER; +} + +int +nfp_vdpa_hw_start(struct nfp_vdpa_hw *vdpa_hw, + int vid) +{ + int ret; + uint32_t update; + uint32_t new_ctrl; + struct timespec wait_tst; + struct nfp_hw *hw = &vdpa_hw->super; + uint8_t mac_addr[RTE_ETHER_ADDR_LEN]; + + nn_cfg_writeq(hw, NFP_NET_CFG_TXR_ADDR(0), vdpa_hw->vring[1].desc); + nn_cfg_writeb(hw, NFP_NET_CFG_TXR_SZ(0), rte_log2_u32(vdpa_hw->vring[1].size)); + nn_cfg_writeq(hw, NFP_NET_CFG_TXR_ADDR(1), vdpa_hw->vring[1].avail); + nn_cfg_writeq(hw, NFP_NET_CFG_TXR_ADDR(2), vdpa_hw->vring[1].used); + + nn_cfg_writeq(hw, NFP_NET_CFG_RXR_ADDR(0), vdpa_hw->vring[0].desc); + nn_cfg_writeb(hw, NFP_NET_CFG_RXR_SZ(0), rte_log2_u32(vdpa_hw->vring[0].size)); + nn_cfg_writeq(hw, NFP_NET_CFG_RXR_ADDR(1), vdpa_hw->vring[0].avail); + nn_cfg_writeq(hw, NFP_NET_CFG_RXR_ADDR(2), vdpa_hw->vring[0].used); + + rte_wmb(); + + nfp_disable_queues(hw); + nfp_enable_queues(hw, NFP_VDPA_MAX_QUEUES, NFP_VDPA_MAX_QUEUES); + + new_ctrl = nfp_vdpa_check_offloads(); + + nn_cfg_writel(hw, NFP_NET_CFG_MTU, 9216); + nn_cfg_writel(hw, NFP_NET_CFG_FLBUFSZ, 10240); + + /* TODO: Temporary set MAC to fixed value fe:1b:ac:05:a5:22 */ + mac_addr[0] = 0xfe; + mac_addr[1] = 0x1b; + mac_addr[2] = 0xac; + mac_addr[3] = 0x05; + mac_addr[4] = 0xa5; + mac_addr[5] = (0x22 + vid); + + /* Writing new MAC to the specific port BAR address */ + nfp_write_mac(hw, (uint8_t *)mac_addr); + + /* Enable device */ + new_ctrl |= NFP_NET_CFG_CTRL_ENABLE; + + /* Signal the NIC about the change */ + update = NFP_NET_CFG_UPDATE_MACADDR | + NFP_NET_CFG_UPDATE_GEN | + NFP_NET_CFG_UPDATE_RING; + + ret = nfp_reconfig(hw, new_ctrl, update); + if (ret < 0) + return -EIO; + + hw->ctrl = new_ctrl; + + DRV_CORE_LOG(DEBUG, "Enabling the device, sleep 1 seconds..."); + wait_tst.tv_sec = 1; + wait_tst.tv_nsec = 0; + nanosleep(&wait_tst, 0); + + return 0; +} + +void +nfp_vdpa_hw_stop(struct nfp_vdpa_hw *vdpa_hw) +{ + nfp_disable_queues(&vdpa_hw->super); +} diff --git a/drivers/vdpa/nfp/nfp_vdpa_core.h b/drivers/vdpa/nfp/nfp_vdpa_core.h index c9403e0ea4..a88de768dd 100644 --- a/drivers/vdpa/nfp/nfp_vdpa_core.h +++ b/drivers/vdpa/nfp/nfp_vdpa_core.h @@ -15,6 +15,15 @@ #define NFP_VDPA_NOTIFY_ADDR_BASE 0x4000 #define NFP_VDPA_NOTIFY_ADDR_INTERVAL 0x1000 +struct nfp_vdpa_vring { + uint64_t desc; + uint64_t avail; + uint64_t used; + uint16_t size; + uint16_t last_avail_idx; + uint16_t last_used_idx; +}; + struct nfp_vdpa_hw { struct nfp_hw super; @@ -22,11 +31,17 @@ struct nfp_vdpa_hw { uint64_t req_features; uint8_t *notify_addr[NFP_VDPA_MAX_QUEUES * 2]; + struct nfp_vdpa_vring vring[NFP_VDPA_MAX_QUEUES * 2]; uint8_t mac_addr[RTE_ETHER_ADDR_LEN]; uint8_t notify_region; + uint8_t nr_vring; }; int nfp_vdpa_hw_init(struct nfp_vdpa_hw *vdpa_hw, struct rte_pci_device *dev); +int nfp_vdpa_hw_start(struct nfp_vdpa_hw *vdpa_hw, int vid); + +void nfp_vdpa_hw_stop(struct nfp_vdpa_hw *vdpa_hw); + #endif /* __NFP_VDPA_CORE_H__ */ -- 2.39.1