Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/132691/?format=api
http://patchwork.dpdk.org/api/patches/132691/?format=api", "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20231017054545.1692509-2-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-2-chaoyong.he@corigine.com>", "list_archive_url": "https://inbox.dpdk.org/dev/20231017054545.1692509-2-chaoyong.he@corigine.com", "date": "2023-10-17T05:45:21", "name": "[01/25] drivers: introduce the NFP common library", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": true, "hash": "d6261fada67a92b4df734c624420eb1b9f771156", "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-2-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/132691/comments/", "check": "warning", "checks": "http://patchwork.dpdk.org/api/patches/132691/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 5599443186;\n\tTue, 17 Oct 2023 07:46:15 +0200 (CEST)", "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 5C47840689;\n\tTue, 17 Oct 2023 07:46:10 +0200 (CEST)", "from NAM10-MW2-obe.outbound.protection.outlook.com\n (mail-mw2nam10on2109.outbound.protection.outlook.com [40.107.94.109])\n by mails.dpdk.org (Postfix) with ESMTP id A8867402EB\n for <dev@dpdk.org>; Tue, 17 Oct 2023 07:46:08 +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:46:06 +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:46:06 +0000" ], "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=X8dp9FDAVVnKeany7LLMlUVgIuGjH3vD5OxkUjJGU3T92fRvW6gUIZV+N6ZU7R4R0ZPh2Y5FWPMaaImvEsPvwd1uKago4pKgYpO3RqOMncfoUi9zVoAmTQmh50jEqjz6kx5QK9jeO2huRit7uxybqX10PShCMA62ux7glCKsO64JXRDZKxRzjOYSuTM04Vs4IRbWyXBVEYiIATiwPFkL6Vqoqd6yqsb0e/LhSvoERZJ40z6JtUlzkiz1wslYkOGsxLbFzFNfvGM+nzRV3Au/hlxXLkWEjEj7XrGB1tFuAvKPJWou6TL35slxSVMKG6/6pLDOlv+CgIlZjvPNGRm6dg==", "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=E2ocXth2s6uK0EpcpnmZro/S9Gk7vc97jtsCGP+EeSk=;\n b=Vq1mIjRpGOg2nluf4vczyorKf+VetzrTdRLCfHLHS/n3J+FoCanvaqrnFAI9JzoNBLadxYpV6QyfIz6uahh8QOQ2toFa3Dqio7FL8GOW2SHoLbiaoPP9E4RKy4oeQF3TTs+2uiUh+/pEIvIm7Qc32m5lXudS4Ak4lRpMdMLRE4yQf8OVaBGgYWc8pc5oETSdVTNlaErAnBTp2FZPIuzaqRKYVgQ5UpsMmB7iaTqW6wFVHaA3MCu1ZHv4k0GfDxWAx0uo4IyA5NJHvEN39Pv+F1TyFd/00QbTk7Tp8dui+VowPlfVlnRhtOszJGaE4n1m2yknMcCe1iOveFMHpo7yZQ==", "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=E2ocXth2s6uK0EpcpnmZro/S9Gk7vc97jtsCGP+EeSk=;\n b=dY3KrrlbKwwohVyjnytyfDVarLOfnyEd/WTYBlaI9kD88ZsAuUwrtoDCSyorDGn722Mr9h2RbJQ/Haj1gMBH/2YIkJWD3tOagN3p+Dzm8P1rmBbeW179WXOhI39dBhb1QsZzUyS6xa4JyUTbMMvv3M1p5uPU+9qwRucLnaiTht4=", "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 01/25] drivers: introduce the NFP common library", "Date": "Tue, 17 Oct 2023 13:45:21 +0800", "Message-Id": "<20231017054545.1692509-2-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": "aa4c78f0-96b5-455e-5d5e-08dbced45b29", "X-MS-Exchange-SenderADCheck": "1", "X-MS-Exchange-AntiSpam-Relay": "0", "X-Microsoft-Antispam": "BCL:0;", "X-Microsoft-Antispam-Message-Info": "\n g9N59VtaP3l+CkmDi46p3Xdww9T5WIC/0QEyp7jlYMipu5zhIQpPvBDAbqzmLrbfC2MtnnG5LMv0aFvMWvNIrXdr1PrULU1yvxfLPMOjklsKeAa4gEdilF/0U9kipQs2HDJYinXbzHrhWMyQFTsvgSlGsc7GY1/rFZzcIAA/FB0u+IgRuyHaACXQi37gsQ/kokmSvZnDzZPzLFb62MC4lmtIiaN3fUXTRDq5aTCnbm05nKT3nOjR82Trk3am7Z1FnoQHHcpkfZ2prPrJVZi6ulOcbRqC1Um/laTIqy7HQo4SI1U4Oh8OMkZ0Jsvp0A9lf1vHqNKxT0KI2sAH8pb2mkeXbJpmQ7SGJ5oZk4DQfvIlHXf9D6ilPDqBIbs9fhrRu4vZpKQCSpJIvLjzamxxfIk6x81XtjwuC1c6Phvj2fq1Z0OUgh26fztBgOyrB0piyAEdOj6ZfNdjhs6KO53BPOVI+CBV+DrXlT9yYxFvC5pNmsfKM56fPQgSOgOME/emlNTwj3X+UP9TV5y/t0m/4RR7mqEywJkW2stB6WuBV9oIBHRljNcGGg25TlUTv5I0iqWKEmKKEr7SuzE7UjV4xoNqNQ/5o0qBe/jXptq8msTqyPje5ZyqXfELzVhbus81SPl8AtEKRvcjFTUwGTZ/DWjMtIJY6EYupk/Ezwu0sHY=", "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)(8676002)(36756003)(44832011)(41300700001)(8936002);\n DIR:OUT; SFP:1102;", "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1", "X-MS-Exchange-AntiSpam-MessageData-0": "\n Dvge/92TphdIZMXcknAz1InyXpOqIx8cTe6bUG8CoYIzi30soHc26kdJj5feMTGWY7iVtwatI1j49Kjs70sRxe5rbrmxkLYjca+hf25UBeeUkbKy24TzQq4BcZHxrkGzLlpQA+A8YhlIMRH+poyX8shO6OU+kKkMFlhiAW0SbcnbO1cq1EkvbaJsKqfq85SwkwS4dOEbAq6AAOHLVd/SKRPCytYbsGpdBldQYHYZ49CmvBCOj7aDmaGZF/qYBwhTuz4mn4Je/99MmxO4hIM7nqCSrl9ZgALWgOBod7NZPLUPPxzDYNcMKqQnyv81ClJnc8w1HeXUNOCq4ExJktAKPUpfdRqE7qntFC3rCk5zDwfE2fXJLNb1jmSg7jzSdHf1IMrLL6aZ0oYFYl9acZHYFQv66rZprDU2b/x4+kTT6y5+LaE6mP+dyLZk574DSzMWh4ECFFUHF9jBWdzqg/zzNGJr+Xm+Ti+j6CrNNnPORLjMzF4pk+4IWiqDdKtwfg3m+947uQKE6ligCyu03D3M6rJkTZHlClX46mGNzfVEVZC3qzCALe8RjR40wUxcVbmj4piSyzLD+PdzD4QoVOvizfCdMcqAwdzFvgEPJrOtINVBFtJAjfwGdhho5kGvZtxz9IdxA5Ntbfhwu7GGjW0eKj1K5P0kKOwa+UaE/kI8q2qXSH9qX1iI6hGGrqKkRzUV9PezyQEJUU0Ebw8XShKYqncLsUozqC9EDOZwSaA49FidSVC9Qu+zc9DzBczOax61g11ahNxEX0v4LPNfv0Tk3xpv/HBvx/Z9H7RMPu7giMelab5Vg2i0TQCk4PeXBW2PsREnlJTczIp01xWfyEFoGpfjFtHOvNbxDCWcb+RW+d5g1p06OMcqXih3Q/Qzm6KOGYZgK5g2g96nSfgOe9fDaAgBtXOamQa+j+YK88b9PDuflJHDvbB0lw+f3KX4qC7MRW3DDspD/rN9WRbrYMDMXCTjjY0wPAzFvdCXgqOyhmy+UiI9YFXzzdQaY+uAlOpZydiETkBkU5FwpoLfI5HNcxDzjoYqemMLFwsvThZXKbgtWXQ9YQQKs1/zaXTOaHjCWlp2+OxTfp0EWSBFMwyzpszp/VHfpHEEwL8RwgRlNw9La63LzZxccN/DYV1zfxClQhVX4t6J8R5EWiVNerBmgdclg1FoFzqGG0PxMmAJgA+yh8L+rGgw8KADAiWPrOWqj4oFCnu7zomRxEeK5RRAnNYHFdERMk7P8PUe2RvN1+2th8n9utar4T5NIqiVEtQRnZIf1VxM/mL2KcytFcBxYXZwkV1bnpOQ85ysRrYNKVcG+JstYmqS0wZmbKVZB0QGIgczOSjT+W3mm/75TxnHbnaF1VT2xQo5XdqdyoKeVF56xEqJkzP6AvHUGmH+yosF7rhu+R5jKH5GyTrDmwHflFo0w9kEGm6hJazv3/V8pIGzBvqZjjuxskAdcMVt1K1OIW9MS62qujIswTRHKk4sPb9ScGyi3ie47UkyL5d4uvpZHEozlnxPFIdoyfncHa7SrD6arjKjFbS5SlLSp0VzWhKg4XtT63/EWf5JRPiXVoy6a4tcXylNxOeEaSvRbfFupw7JKnkdTpf6f4TrYrWGzQ==", "X-OriginatorOrg": "corigine.com", "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n aa4c78f0-96b5-455e-5d5e-08dbced45b29", "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:46:06.5942 (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 D2LJsmVgregod2exzqBZku1Lf5TGN6qMHGb46+PpLfV7V+gOpQmm+DDIhhnFxxFoV2DEYf1nQvsRPEz6fUDKwDH4e9/twjoaHkRcHAN3gQU=", "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": "A new NFP vdpa PMD will be added to support vdpa operations by NFP\nadapters.\n\nThis vdpa PMD share some logic with the net/nfp PMD. So create a new\ncommon library in drivers/common for NFP PMDs.\n\nWe import a 'nfp_class_driver' layer and which can support various\ndevice type in addition to the ethernet device.\n\nThe shared logic will move into this common library in the following\ncommits.\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 .mailmap | 1 +\n drivers/common/nfp/meson.build | 14 ++\n drivers/common/nfp/nfp_common_log.c | 8 +\n drivers/common/nfp/nfp_common_log.h | 16 ++\n drivers/common/nfp/nfp_common_pci.c | 274 ++++++++++++++++++++++++++++\n drivers/common/nfp/nfp_common_pci.h | 44 +++++\n drivers/common/nfp/version.map | 7 +\n drivers/meson.build | 1 +\n 8 files changed, 365 insertions(+)\n create mode 100644 drivers/common/nfp/meson.build\n create mode 100644 drivers/common/nfp/nfp_common_log.c\n create mode 100644 drivers/common/nfp/nfp_common_log.h\n create mode 100644 drivers/common/nfp/nfp_common_pci.c\n create mode 100644 drivers/common/nfp/nfp_common_pci.h\n create mode 100644 drivers/common/nfp/version.map", "diff": "diff --git a/.mailmap b/.mailmap\nindex f015c89db0..3040a26609 100644\n--- a/.mailmap\n+++ b/.mailmap\n@@ -1299,6 +1299,7 @@ Shuanglin Wang <shuanglin.wang@broadcom.com>\n Shuki Katzenelson <shuki@lightbitslabs.com>\n Shun Hao <shunh@nvidia.com>\n Shu Shen <shu.shen@radisys.com>\n+Shujing Dong <shujing.dong@corigine.com>\n Shweta Choudaha <shweta.choudaha@att.com>\n Shyam Kumar Shrivastav <shrivastav.shyam@gmail.com>\n Shy Shyman <shys@nvidia.com> <shys@mellanox.com>\ndiff --git a/drivers/common/nfp/meson.build b/drivers/common/nfp/meson.build\nnew file mode 100644\nindex 0000000000..45871dfe35\n--- /dev/null\n+++ b/drivers/common/nfp/meson.build\n@@ -0,0 +1,14 @@\n+# SPDX-License-Identifier: BSD-3-Clause\n+# Copyright (c) 2023 Corigine, Inc.\n+\n+if not is_linux or not dpdk_conf.get('RTE_ARCH_64')\n+ build = false\n+ reason = 'only supported on 64-bit Linux'\n+endif\n+\n+deps += ['bus_pci']\n+\n+sources = files(\n+ 'nfp_common_log.c',\n+ 'nfp_common_pci.c',\n+)\ndiff --git a/drivers/common/nfp/nfp_common_log.c b/drivers/common/nfp/nfp_common_log.c\nnew file mode 100644\nindex 0000000000..e69e608eb9\n--- /dev/null\n+++ b/drivers/common/nfp/nfp_common_log.c\n@@ -0,0 +1,8 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2023 Corigine, Inc.\n+ * All rights reserved.\n+ */\n+\n+#include \"nfp_common_log.h\"\n+\n+RTE_LOG_REGISTER_SUFFIX(nfp_logtype_common, common, NOTICE);\ndiff --git a/drivers/common/nfp/nfp_common_log.h b/drivers/common/nfp/nfp_common_log.h\nnew file mode 100644\nindex 0000000000..066e38e688\n--- /dev/null\n+++ b/drivers/common/nfp/nfp_common_log.h\n@@ -0,0 +1,16 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2023 Corigine, Inc.\n+ * All rights reserved.\n+ */\n+\n+#ifndef __NFP_COMMON_LOG_H__\n+#define __NFP_COMMON_LOG_H__\n+\n+#include <rte_log.h>\n+\n+extern int nfp_logtype_common;\n+#define PMD_DRV_LOG(level, fmt, args...) \\\n+\trte_log(RTE_LOG_ ## level, nfp_logtype_common, \\\n+\t\t\t\"%s(): \" fmt \"\\n\", __func__, ## args)\n+\n+#endif/* __NFP_COMMON_LOG_H__ */\ndiff --git a/drivers/common/nfp/nfp_common_pci.c b/drivers/common/nfp/nfp_common_pci.c\nnew file mode 100644\nindex 0000000000..1aa8dd4bbd\n--- /dev/null\n+++ b/drivers/common/nfp/nfp_common_pci.c\n@@ -0,0 +1,274 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2023 Corigine, Inc.\n+ * All rights reserved.\n+ */\n+\n+#include \"nfp_common_pci.h\"\n+\n+#include <string.h>\n+\n+#include <rte_class.h>\n+#include <rte_devargs.h>\n+#include <rte_kvargs.h>\n+\n+#include \"nfp_common_log.h\"\n+\n+/* Reported driver name. */\n+#define NFP_PCI_DRIVER_NAME \"nfp_common_pci\"\n+\n+static struct rte_pci_driver nfp_common_pci_driver;\n+\n+/* PCI ID table is build dynamically based on registered nfp drivers. */\n+static struct rte_pci_id *nfp_pci_id_table;\n+\n+/* Head of list of drivers. */\n+static TAILQ_HEAD(nfp_drivers, nfp_class_driver) nfp_drivers_list =\n+\t\tTAILQ_HEAD_INITIALIZER(nfp_drivers_list);\n+\n+static bool nfp_common_initialized;\n+\n+static const struct {\n+\tconst char *name;\n+\tenum nfp_class drv_class;\n+} nfp_classes[] = {\n+\t{ .name = \"eth\", .drv_class = NFP_CLASS_ETH },\n+};\n+\n+static enum nfp_class\n+nfp_class_name_to_value(const char *class_name)\n+{\n+\tuint32_t i;\n+\n+\tfor (i = 0; i < RTE_DIM(nfp_classes); i++) {\n+\t\tif (strcmp(class_name, nfp_classes[i].name) == 0)\n+\t\t\treturn nfp_classes[i].drv_class;\n+\t}\n+\n+\treturn NFP_CLASS_INVALID;\n+}\n+\n+static uint32_t\n+nfp_pci_id_table_size_get(const struct rte_pci_id *id_table)\n+{\n+\tuint32_t table_size;\n+\n+\tif (id_table == NULL)\n+\t\treturn 0;\n+\n+\tfor (table_size = 0; id_table->vendor_id != 0; id_table++)\n+\t\ttable_size++;\n+\n+\treturn table_size;\n+}\n+\n+static bool\n+nfp_pci_id_exists(const struct rte_pci_id *id,\n+\t\tconst struct rte_pci_id *table,\n+\t\tuint32_t next_idx)\n+{\n+\tuint32_t i;\n+\n+\tif (next_idx == 0)\n+\t\treturn false;\n+\n+\tfor (i = 0; i < next_idx; i++) {\n+\t\tif (id->device_id == table[i].device_id &&\n+\t\t\t\tid->vendor_id == table[i].vendor_id &&\n+\t\t\t\tid->subsystem_vendor_id == table[i].subsystem_vendor_id &&\n+\t\t\t\tid->subsystem_device_id == table[i].subsystem_device_id)\n+\t\t\treturn true;\n+\t}\n+\n+\treturn false;\n+}\n+\n+static void\n+nfp_pci_id_insert(struct rte_pci_id *new_table,\n+\t\tuint32_t *next_idx,\n+\t\tconst struct rte_pci_id *id_table)\n+{\n+\tif (id_table == NULL)\n+\t\treturn;\n+\n+\t/* Add non duplicate entries to new table. */\n+\tfor (; id_table->vendor_id != 0; id_table++) {\n+\t\tif (!nfp_pci_id_exists(id_table, new_table, *next_idx)) {\n+\t\t\tnew_table[*next_idx] = *id_table;\n+\t\t\t(*next_idx)++;\n+\t\t}\n+\t}\n+}\n+\n+static int\n+nfp_pci_id_table_update(const struct rte_pci_id *driver_id_table)\n+{\n+\tuint32_t i = 0;\n+\tuint32_t num_ids = 0;\n+\tstruct rte_pci_id *old_table;\n+\tconst struct rte_pci_id *id_iter;\n+\tstruct rte_pci_id *updated_table;\n+\n+\told_table = nfp_pci_id_table;\n+\tif (old_table != NULL)\n+\t\tnum_ids = nfp_pci_id_table_size_get(old_table);\n+\tnum_ids += nfp_pci_id_table_size_get(driver_id_table);\n+\n+\t/* Increase size by one for the termination entry of vendor_id = 0. */\n+\tnum_ids += 1;\n+\tupdated_table = calloc(num_ids, sizeof(struct rte_pci_id));\n+\tif (updated_table == NULL)\n+\t\treturn -ENOMEM;\n+\n+\tif (old_table == NULL) {\n+\t\t/* Copy the first driver's ID table. */\n+\t\tfor (id_iter = driver_id_table; id_iter[i].vendor_id != 0; i++)\n+\t\t\tupdated_table[i] = id_iter[i];\n+\t} else {\n+\t\t/* First copy existing table entries. */\n+\t\tfor (id_iter = old_table; id_iter[i].vendor_id != 0; i++)\n+\t\t\tupdated_table[i] = id_iter[i];\n+\t\t/* New id to be added at the end of current ID table. */\n+\t\tnfp_pci_id_insert(updated_table, &i, driver_id_table);\n+\n+\t\tfree(old_table);\n+\t}\n+\n+\t/* Terminate table with empty entry. */\n+\tupdated_table[i].vendor_id = 0;\n+\tnfp_pci_id_table = updated_table;\n+\tnfp_common_pci_driver.id_table = nfp_pci_id_table;\n+\n+\treturn 0;\n+}\n+\n+static int\n+nfp_kvarg_dev_class_handler(__rte_unused const char *key,\n+\t\tconst char *class_str,\n+\t\tvoid *opaque)\n+{\n+\tenum nfp_class *dev_class = opaque;\n+\n+\tif (class_str == NULL)\n+\t\treturn *dev_class;\n+\n+\t*dev_class = nfp_class_name_to_value(class_str);\n+\n+\treturn 0;\n+}\n+\n+static enum nfp_class\n+nfp_parse_class_options(const struct rte_devargs *devargs)\n+{\n+\tstruct rte_kvargs *kvargs;\n+\tenum nfp_class dev_class = NFP_CLASS_ETH;\n+\n+\tif (devargs == NULL)\n+\t\treturn dev_class;\n+\n+\tkvargs = rte_kvargs_parse(devargs->args, NULL);\n+\tif (kvargs == NULL)\n+\t\treturn dev_class;\n+\n+\tif (rte_kvargs_count(kvargs, RTE_DEVARGS_KEY_CLASS) != 0) {\n+\t\trte_kvargs_process(kvargs, RTE_DEVARGS_KEY_CLASS,\n+\t\t\t\tnfp_kvarg_dev_class_handler, &dev_class);\n+\t}\n+\n+\trte_kvargs_free(kvargs);\n+\n+\treturn dev_class;\n+}\n+\n+static int\n+nfp_drivers_probe(struct rte_pci_device *pci_dev,\n+\t\tenum nfp_class class)\n+{\n+\tint32_t ret = 0;\n+\tstruct nfp_class_driver *driver;\n+\n+\tTAILQ_FOREACH(driver, &nfp_drivers_list, next) {\n+\t\tif ((driver->drv_class & class) == 0)\n+\t\t\tcontinue;\n+\n+\t\tret = driver->probe(pci_dev);\n+\t\tif (ret < 0) {\n+\t\t\tPMD_DRV_LOG(ERR, \"Failed to load driver %s\", driver->name);\n+\t\t\treturn ret;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+nfp_common_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,\n+\t\tstruct rte_pci_device *pci_dev)\n+{\n+\tenum nfp_class class;\n+\tstruct rte_device *eal_dev = &pci_dev->device;\n+\n+\tPMD_DRV_LOG(INFO, \"probe device %s.\", eal_dev->name);\n+\n+\tclass = nfp_parse_class_options(eal_dev->devargs);\n+\tif (class == NFP_CLASS_INVALID) {\n+\t\tPMD_DRV_LOG(ERR, \"Unsupported nfp class type: %s\",\n+\t\t\t\teal_dev->devargs->args);\n+\t\treturn -ENOTSUP;\n+\t}\n+\n+\treturn nfp_drivers_probe(pci_dev, class);\n+}\n+\n+static int\n+nfp_common_pci_remove(__rte_unused struct rte_pci_device *pci_dev)\n+{\n+\treturn 0;\n+}\n+\n+static struct rte_pci_driver nfp_common_pci_driver = {\n+\t.driver = {\n+\t\t.name = NFP_PCI_DRIVER_NAME,\n+\t},\n+\t.probe = nfp_common_pci_probe,\n+\t.remove = nfp_common_pci_remove,\n+};\n+\n+static void\n+nfp_common_init(void)\n+{\n+\tconst struct rte_pci_id empty_table[] = {\n+\t\t{\n+\t\t\t.vendor_id = 0\n+\t\t},\n+\t};\n+\n+\tif (nfp_common_initialized)\n+\t\treturn;\n+\n+\t/*\n+\t * All the constructor of NFP PMDs run at same priority. So any of the PMD\n+\t * including this one can register the PCI table first. If any other\n+\t * PMD(s) have registered the PCI ID table, no need to register an empty\n+\t * default one.\n+\t */\n+\tif (nfp_pci_id_table == NULL && nfp_pci_id_table_update(empty_table) != 0)\n+\t\treturn;\n+\n+\trte_pci_register(&nfp_common_pci_driver);\n+\tnfp_common_initialized = true;\n+}\n+\n+void\n+nfp_class_driver_register(struct nfp_class_driver *driver)\n+{\n+\tnfp_common_init();\n+\n+\tif (driver->id_table != NULL) {\n+\t\tif (nfp_pci_id_table_update(driver->id_table) != 0)\n+\t\t\treturn;\n+\t}\n+\n+\tnfp_common_pci_driver.drv_flags |= driver->drv_flags;\n+\n+\tTAILQ_INSERT_TAIL(&nfp_drivers_list, driver, next);\n+}\ndiff --git a/drivers/common/nfp/nfp_common_pci.h b/drivers/common/nfp/nfp_common_pci.h\nnew file mode 100644\nindex 0000000000..21465fca68\n--- /dev/null\n+++ b/drivers/common/nfp/nfp_common_pci.h\n@@ -0,0 +1,44 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2023 Corigine, Inc.\n+ * All rights reserved.\n+ */\n+\n+#ifndef __NFP_COMMON_PCI_H__\n+#define __NFP_COMMON_PCI_H__\n+\n+#include <bus_pci_driver.h>\n+\n+/* Initialization function for the driver called during device probing. */\n+typedef int (nfp_class_driver_probe_t)(struct rte_pci_device *dev);\n+\n+/* Uninitialization function for the driver called during hot-unplugging. */\n+typedef int (nfp_class_driver_remove_t)(struct rte_pci_device *dev);\n+\n+enum nfp_class {\n+\tNFP_CLASS_ETH,\n+\tNFP_CLASS_INVALID,\n+};\n+\n+/* Describing a nfp common class driver. */\n+struct nfp_class_driver {\n+\tTAILQ_ENTRY(nfp_class_driver) next;\n+\tenum nfp_class drv_class; /**< Class of this driver. */\n+\tconst char *name; /**< Driver name. */\n+\tconst struct rte_pci_id *id_table; /**< ID table, NULL terminated. */\n+\tuint32_t drv_flags; /**< Flags RTE_PCI_DRV_*. */\n+\tnfp_class_driver_probe_t *probe; /**< Device probe function. */\n+\tnfp_class_driver_remove_t *remove; /**< Device remove function. */\n+};\n+\n+/**\n+ * Register a nfp device driver.\n+ *\n+ * @param driver\n+ * A pointer to a nfp_driver structure describing the driver\n+ * to be registered.\n+ */\n+__rte_internal\n+void\n+nfp_class_driver_register(struct nfp_class_driver *driver);\n+\n+#endif /* __NFP_COMMON_PCI_H__ */\ndiff --git a/drivers/common/nfp/version.map b/drivers/common/nfp/version.map\nnew file mode 100644\nindex 0000000000..25e48c39d6\n--- /dev/null\n+++ b/drivers/common/nfp/version.map\n@@ -0,0 +1,7 @@\n+INTERNAL {\n+\tglobal:\n+\n+\tnfp_class_driver_register;\n+\n+\tlocal: *;\n+};\ndiff --git a/drivers/meson.build b/drivers/meson.build\nindex 8c775bbe62..af70ed322c 100644\n--- a/drivers/meson.build\n+++ b/drivers/meson.build\n@@ -15,6 +15,7 @@ subdirs = [\n 'common/mlx5', # depends on bus.\n 'common/qat', # depends on bus.\n 'common/sfc_efx', # depends on bus.\n+ 'common/nfp', # depends on bus.\n 'mempool', # depends on common and bus.\n 'dma', # depends on common and bus.\n 'net', # depends on common, bus, mempool\n", "prefixes": [ "01/25" ] }{ "id": 132691, "url": "