get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 133206,
    "url": "http://patches.dpdk.org/api/patches/133206/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20231024022849.3092506-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": "<20231024022849.3092506-2-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20231024022849.3092506-2-chaoyong.he@corigine.com",
    "date": "2023-10-24T02:28:25",
    "name": "[v2,01/25] drivers: introduce the NFP common library",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "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/20231024022849.3092506-2-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 29961,
            "url": "http://patches.dpdk.org/api/series/29961/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=29961",
            "date": "2023-10-24T02:28:24",
            "name": "add the NFP vDPA PMD",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/29961/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/133206/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/133206/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 AB6A2431EB;\n\tTue, 24 Oct 2023 04:29:46 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id F0A04402E6;\n\tTue, 24 Oct 2023 04:29:43 +0200 (CEST)",
            "from NAM02-DM3-obe.outbound.protection.outlook.com\n (mail-dm3nam02on2093.outbound.protection.outlook.com [40.107.95.93])\n by mails.dpdk.org (Postfix) with ESMTP id E2E39402CE\n for <dev@dpdk.org>; Tue, 24 Oct 2023 04:29:40 +0200 (CEST)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by BLAPR13MB4691.namprd13.prod.outlook.com (2603:10b6:208:306::19)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6907.33; Tue, 24 Oct\n 2023 02:29:39 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::142e:d47c:7320:8a9d]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::142e:d47c:7320:8a9d%4]) with mapi id 15.20.6907.021; Tue, 24 Oct 2023\n 02:29:38 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=BDAdLK6mPGQ0fUmI3aFLjMA/ZPGRcsi+4MoUw3rIiUaYZPvZs8J6QDYDJcNhH9t3OgpkQL9TlR6gdD+0lhkbQZGCvM6fjleCd8vnLaEiajZdc/XQh9eMdZVQAdHV8LMz8fV3a/eTWsWXgWix4xw5lI3zRw+qxb2o3xWWFpzoXOgquecUnfM7RJlQZG1nI2xMzXPf/PxVP84BpK6YQwhOny2U5g9fDl5koVXT06SoV/At5fHSTkfu33llxvmRrlyH9Ma8UKq4yhPB2pCJqqoDx+EubQQM6UWyPjV9YjE0U6cE+cDmE+5pcgvr3/IigXKsu/u7fbnV1BZ2b2/47S+YoA==",
        "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=6yl8b7LkGdNSpGGQjmoO9GuDWZG6lEC364BuMuB5GuE=;\n b=LENDUgEQngbctTKRtEhqy/L5OZEjm7jzjf6i3vRYnJ98US13a3Wmtkd+zzrJ7MLaleC/mzy/THK7xgLNFvnrPMs7HuwKvPj9WA40Uq1oGoGKgznSSl1JDL64bVZ4tIEmONMQbSmLCdKHzl0OE0+3z1x+LjrpDJ80uzRMwkzCRanMfykYZzlxRZ1NdjTshDkZvnA68Xq0XFGI+BvUKZopQgPwZ5DZe3Q/idqE2tNbnciO5u0f4TorYxutVOKc8aL/f00kTEAwEgi27hNArJXIqwS3uxxzw2qjjUWymT5t0kNX/1YJm9Z1cprkj7NumBfgIPe7bbunEAqBCBaP0nxT8w==",
        "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=6yl8b7LkGdNSpGGQjmoO9GuDWZG6lEC364BuMuB5GuE=;\n b=IoLVJBRZ5OADRLn3lvgKqLizHkoj6Xn0MH6E3b3mBQile5HgTHKvhFBrJWpMzQ7ho8mVJxp7YBpFJRf8lQMmUro2WTW2dm272GZLrgXaCXt39zTaptJvGElCyCYPfZrMKjgW5XsO/WhZ4DmtKbZrqUXp5GRI9ZmneOOb0ud8nUo=",
        "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 v2 01/25] drivers: introduce the NFP common library",
        "Date": "Tue, 24 Oct 2023 10:28:25 +0800",
        "Message-Id": "<20231024022849.3092506-2-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>\n <20231024022849.3092506-1-chaoyong.he@corigine.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "BYAPR04CA0015.namprd04.prod.outlook.com\n (2603:10b6:a03:40::28) 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_|BLAPR13MB4691:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "5580c8b5-48db-481b-0c4f-08dbd4391221",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n /rhc5eM4KVVnxmOjeEAOKhrlaIfpF0zRsV9G0CS89UUpeEsURSqFKw17AWK2b6c+0pfoTW1pWkSG+IdRc/CUiErZkkBvf30oprR4Rw69e4KK6uxIPBNsXdBF9Syenrtc7+oMe5goVkvIl5QnRGtr0MZBdGE/cgultY1158PpeHD7kp+mrQE+0h0hASMQBhrBxZepRebxTpqFrcXZMZy/gZQkIPzyUK0UEA4vAh1t5Z7RHbHT/BmH0Vp6dIhIFQ870sALYyaAcW40tiCMJiMv2rYam6IOZQwjn4msiFkhH0rYvAKIIWDUHwy35Ob/PS0G/y1zRC1Jv4HIfjscP9lzH5y5ZvnOGHioE6G4rQFwGyehA6pAWxoQ9RCdKt+PLnEdrANYsLZm/6d8W/6OcTtAtgvjKpO3YngjDZ6SpcOnT2ucWmahWdIQHRbUt7cBCLwAgV7hS7OcxZ7czWgvMQitUSpdCzn0q29WzsBKfmCbYOmzC5/0G2JLApNevmVM3DF6P9m//QqB9fzXk0UNS6yOO2hTE9jYFjnyeQEhKHHsVEY31bwqFG09gNFSIqQ+2cpTCyjeyrLZ/T0Ka2ybdGWp78hL0jaUXZYdKzHEGOTNb2InuR68tc7joVYUjxCRZW1BlD+BeTi8eNUo2fXkqDJyNlcRhUichD5ZGP8h0YhW8PM=",
        "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)(39830400003)(366004)(376002)(346002)(396003)(136003)(230922051799003)(186009)(451199024)(1800799009)(64100799003)(83380400001)(38350700005)(30864003)(2906002)(4326008)(8936002)(36756003)(44832011)(8676002)(26005)(52116002)(107886003)(2616005)(1076003)(38100700002)(6506007)(6666004)(6512007)(316002)(6916009)(478600001)(6486002)(5660300002)(66476007)(86362001)(54906003)(41300700001)(66946007)(66556008);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n xFUr0utE8l/3Zxe1ITrdLpk8DXpCLZYpfVrm6XKH58ysUAT29/qXNDeQsApkM85NP76++pVG84R1uyTBfDvo/tFKZbJfVANvQ1BJW/4rU3eHP3IKQBh6l4yfYqFbodUI0Zf0wsSQ9NmikzRvJ45HoxZlmzBii0FRznP58ehvTP9AKSuu6RzMVr4/zziUzoRZeB2pVinMRl0R+ZFBtrFsZB5pUsuKnGPekwuWmCqUu6RhNbiyZtx3pzHu93DRAt4gdr5a74F/ZN+RjOpjt6PjBIpifR619DTbig0dHESSF7ZxwBknQQak4w/94mHWiEOUBV4BbUVumCg3qRL7WQJMTJl5froin5Ujv9Q6LX/ZSW6QNeSzwZACJInoe05jw1DEXFrAw7B3NzoQXc+jDwWxVFhj4FF1s83uBf0TXGT5vN5je5dRJwH0OaBGlx4hp4yXFUCqNTI9VBM9Np5q8W4F16UNbB9oIqOI8K7lZtYOQGsTbecqyE4bj46ZOEj+cBZU7ZrrlGbVmmGCavMsx+6yOKSi6SQKMlk87gAJxaFWQW8jIMBMbWQdk+5gW2xCe6RnYrx4epx9uROdRV2cOF+sSUaXDdLzQBl41VPoQ9wTukWrgZpXwUX1Krb4VIed81/zrdbSC40EonXvanzbcYqt5UYZ0IJA2n9DvotcsBq0SJEw/of6+ZBad6pPFWw5ACkutUqpqAAwFDcsJqcshBtRT7huK8QL4PtAC1KB9SV2S24cpwIgFXjHhr7pMa8N3xB5bSn4CxvZq6QulPF5fDh82jjXkiAo1oRmiQNNWSiIgS2CCrC06vWfJ22G5f996kUxI3GDujh0kPXyQmwXFZN9vNSgcW8EMAY84ycA07lqPFeeEyCr3L17P72FID8c9nLTy9lg4nc1KUZuZKe+ERUqx4iRqS6v3e61yYri7sPjAZPqGcupEOlCfhJs97g2a20d5s9GoBUsp5LV5ZALpk7cYrRnAkHST53B6OCkGhec/l/2cfRiiKdte9kytPN82LPz01qUuX5DbKS5s6y866W4Q4ZMh/cozTDKGES4ClWiBB/6PdCNiGLP4/V99qU36MRKNjTKf03u/OMRQxwHp4l0fcnuXdJ5Oa2FWs8E8366gbZVwiP8UeaiR+qLg7uvCNbgsqcoqiypn3er7VEcRyqXVS3Qe3JPPeplAGwQ+oVG9AI4+PoJBkvhuQx4Wb55G58ygnKlJS91ERPDrWGZbuD1qZPMocGrj0zdQ2/ybRkV0zy2IIyiZnF6X4Wmo2POC5MVcGYnkzun9wMHc/I86TRRP9b4gTfbBBTG/d3j/TRiVHgaHuh2LTCfoZjtI1rFjx8S4imVKiJ5VL/LW7mtn9aSkOpdJo1A/wcT/0OlFhFIhZcKfiwGxZyZwI7en0vWtDsZWsKrKJsbkNEJqohJuyrR3x7a/eY0ZvCpAIrl8IeLVkt7IeaJfC12t6MW+kG0GZ3R2yWRg+f9+fz8dQSgdTyE9XLbYDNapXg+aPWJmANZv6Amv4ggPQ9zS3KFjkPHnfO46VOXTFZQf3pWkf6O9IA4rdBZR7pHSfqBTRuaE6r3n5NPUhxvJUGn7UoGLvGtnTiGODBwLbXmjGNHGvujA5dZVQ==",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 5580c8b5-48db-481b-0c4f-08dbd4391221",
        "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:29:38.8686 (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 XVJeBlOLy7RDYc4Y/sRIfPUytgGOY2b1YqBZ+GCZGA3eJYSOC8xjYmOu3Dw18FrHPutJBy3pH7bmrKFL99HmBLr/keX0aAF+vzjZNytyqOQ=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "BLAPR13MB4691",
        "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 3f5bab26a8..9d9e015607 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": [
        "v2",
        "01/25"
    ]
}