get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 132691,
    "url": "http://patches.dpdk.org/api/patches/132691/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20231017054545.1692509-2-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": "<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://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/20231017054545.1692509-2-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 29865,
            "url": "http://patches.dpdk.org/api/series/29865/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=29865",
            "date": "2023-10-17T05:45:20",
            "name": "add the NFP vDPA PMD",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/29865/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/132691/comments/",
    "check": "warning",
    "checks": "http://patches.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"
    ]
}