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 AB6A2431EB; Tue, 24 Oct 2023 04:29:46 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id F0A04402E6; Tue, 24 Oct 2023 04:29:43 +0200 (CEST) Received: from NAM02-DM3-obe.outbound.protection.outlook.com (mail-dm3nam02on2093.outbound.protection.outlook.com [40.107.95.93]) by mails.dpdk.org (Postfix) with ESMTP id E2E39402CE for ; Tue, 24 Oct 2023 04:29:40 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; 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; 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=6yl8b7LkGdNSpGGQjmoO9GuDWZG6lEC364BuMuB5GuE=; b=LENDUgEQngbctTKRtEhqy/L5OZEjm7jzjf6i3vRYnJ98US13a3Wmtkd+zzrJ7MLaleC/mzy/THK7xgLNFvnrPMs7HuwKvPj9WA40Uq1oGoGKgznSSl1JDL64bVZ4tIEmONMQbSmLCdKHzl0OE0+3z1x+LjrpDJ80uzRMwkzCRanMfykYZzlxRZ1NdjTshDkZvnA68Xq0XFGI+BvUKZopQgPwZ5DZe3Q/idqE2tNbnciO5u0f4TorYxutVOKc8aL/f00kTEAwEgi27hNArJXIqwS3uxxzw2qjjUWymT5t0kNX/1YJm9Z1cprkj7NumBfgIPe7bbunEAqBCBaP0nxT8w== 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=6yl8b7LkGdNSpGGQjmoO9GuDWZG6lEC364BuMuB5GuE=; b=IoLVJBRZ5OADRLn3lvgKqLizHkoj6Xn0MH6E3b3mBQile5HgTHKvhFBrJWpMzQ7ho8mVJxp7YBpFJRf8lQMmUro2WTW2dm272GZLrgXaCXt39zTaptJvGElCyCYPfZrMKjgW5XsO/WhZ4DmtKbZrqUXp5GRI9ZmneOOb0ud8nUo= 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 BLAPR13MB4691.namprd13.prod.outlook.com (2603:10b6:208:306::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6907.33; Tue, 24 Oct 2023 02:29:39 +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:29:38 +0000 From: Chaoyong He To: dev@dpdk.org Cc: oss-drivers@corigine.com, Chaoyong He , Shujing Dong , Long Wu , Peng Zhang 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> <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_|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: /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:; IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE; 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); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?xFUr0utE8l/3Zxe1ITrdLpk8DXpCLZYpfVrm6XKH58ysUAT29/qXNDeQsApk?= =?us-ascii?Q?M85NP76++pVG84R1uyTBfDvo/tFKZbJfVANvQ1BJW/4rU3eHP3IKQBh6l4yf?= =?us-ascii?Q?YqFbodUI0Zf0wsSQ9NmikzRvJ45HoxZlmzBii0FRznP58ehvTP9AKSuu6RzM?= =?us-ascii?Q?Vr4/zziUzoRZeB2pVinMRl0R+ZFBtrFsZB5pUsuKnGPekwuWmCqUu6RhNbiy?= =?us-ascii?Q?Ztx3pzHu93DRAt4gdr5a74F/ZN+RjOpjt6PjBIpifR619DTbig0dHESSF7Zx?= =?us-ascii?Q?wBknQQak4w/94mHWiEOUBV4BbUVumCg3qRL7WQJMTJl5froin5Ujv9Q6LX/Z?= =?us-ascii?Q?SW6QNeSzwZACJInoe05jw1DEXFrAw7B3NzoQXc+jDwWxVFhj4FF1s83uBf0T?= =?us-ascii?Q?XGT5vN5je5dRJwH0OaBGlx4hp4yXFUCqNTI9VBM9Np5q8W4F16UNbB9oIqOI?= =?us-ascii?Q?8K7lZtYOQGsTbecqyE4bj46ZOEj+cBZU7ZrrlGbVmmGCavMsx+6yOKSi6SQK?= =?us-ascii?Q?Mlk87gAJxaFWQW8jIMBMbWQdk+5gW2xCe6RnYrx4epx9uROdRV2cOF+sSUaX?= =?us-ascii?Q?DdLzQBl41VPoQ9wTukWrgZpXwUX1Krb4VIed81/zrdbSC40EonXvanzbcYqt?= =?us-ascii?Q?5UYZ0IJA2n9DvotcsBq0SJEw/of6+ZBad6pPFWw5ACkutUqpqAAwFDcsJqcs?= =?us-ascii?Q?hBtRT7huK8QL4PtAC1KB9SV2S24cpwIgFXjHhr7pMa8N3xB5bSn4CxvZq6Qu?= =?us-ascii?Q?lPF5fDh82jjXkiAo1oRmiQNNWSiIgS2CCrC06vWfJ22G5f996kUxI3GDujh0?= =?us-ascii?Q?kPXyQmwXFZN9vNSgcW8EMAY84ycA07lqPFeeEyCr3L17P72FID8c9nLTy9lg?= =?us-ascii?Q?4nc1KUZuZKe+ERUqx4iRqS6v3e61yYri7sPjAZPqGcupEOlCfhJs97g2a20d?= =?us-ascii?Q?5s9GoBUsp5LV5ZALpk7cYrRnAkHST53B6OCkGhec/l/2cfRiiKdte9kytPN8?= =?us-ascii?Q?2LPz01qUuX5DbKS5s6y866W4Q4ZMh/cozTDKGES4ClWiBB/6PdCNiGLP4/V9?= =?us-ascii?Q?9qU36MRKNjTKf03u/OMRQxwHp4l0fcnuXdJ5Oa2FWs8E8366gbZVwiP8Ueai?= =?us-ascii?Q?R+qLg7uvCNbgsqcoqiypn3er7VEcRyqXVS3Qe3JPPeplAGwQ+oVG9AI4+PoJ?= =?us-ascii?Q?BkvhuQx4Wb55G58ygnKlJS91ERPDrWGZbuD1qZPMocGrj0zdQ2/ybRkV0zy2?= =?us-ascii?Q?IIyiZnF6X4Wmo2POC5MVcGYnkzun9wMHc/I86TRRP9b4gTfbBBTG/d3j/TRi?= =?us-ascii?Q?VHgaHuh2LTCfoZjtI1rFjx8S4imVKiJ5VL/LW7mtn9aSkOpdJo1A/wcT/0Ol?= =?us-ascii?Q?FhFIhZcKfiwGxZyZwI7en0vWtDsZWsKrKJsbkNEJqohJuyrR3x7a/eY0ZvCp?= =?us-ascii?Q?AIrl8IeLVkt7IeaJfC12t6MW+kG0GZ3R2yWRg+f9+fz8dQSgdTyE9XLbYDNa?= =?us-ascii?Q?pXg+aPWJmANZv6Amv4ggPQ9zS3KFjkPHnfO46VOXTFZQf3pWkf6O9IA4rdBZ?= =?us-ascii?Q?R7pHSfqBTRuaE6r3n5NPUhxvJUGn7UoGLvGtnTiGODBwLbXmjGNHGvujA5dZ?= =?us-ascii?Q?VQ=3D=3D?= X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: 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: 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org A new NFP vdpa PMD will be added to support vdpa operations by NFP adapters. This vdpa PMD share some logic with the net/nfp PMD. So create a new common library in drivers/common for NFP PMDs. We import a 'nfp_class_driver' layer and which can support various device type in addition to the ethernet device. The shared logic will move into this common library in the following commits. Signed-off-by: Chaoyong He Signed-off-by: Shujing Dong Reviewed-by: Long Wu Reviewed-by: Peng Zhang --- .mailmap | 1 + drivers/common/nfp/meson.build | 14 ++ drivers/common/nfp/nfp_common_log.c | 8 + drivers/common/nfp/nfp_common_log.h | 16 ++ drivers/common/nfp/nfp_common_pci.c | 274 ++++++++++++++++++++++++++++ drivers/common/nfp/nfp_common_pci.h | 44 +++++ drivers/common/nfp/version.map | 7 + drivers/meson.build | 1 + 8 files changed, 365 insertions(+) create mode 100644 drivers/common/nfp/meson.build create mode 100644 drivers/common/nfp/nfp_common_log.c create mode 100644 drivers/common/nfp/nfp_common_log.h create mode 100644 drivers/common/nfp/nfp_common_pci.c create mode 100644 drivers/common/nfp/nfp_common_pci.h create mode 100644 drivers/common/nfp/version.map diff --git a/.mailmap b/.mailmap index 3f5bab26a8..9d9e015607 100644 --- a/.mailmap +++ b/.mailmap @@ -1299,6 +1299,7 @@ Shuanglin Wang Shuki Katzenelson Shun Hao Shu Shen +Shujing Dong Shweta Choudaha Shyam Kumar Shrivastav Shy Shyman diff --git a/drivers/common/nfp/meson.build b/drivers/common/nfp/meson.build new file mode 100644 index 0000000000..45871dfe35 --- /dev/null +++ b/drivers/common/nfp/meson.build @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2023 Corigine, Inc. + +if not is_linux or not dpdk_conf.get('RTE_ARCH_64') + build = false + reason = 'only supported on 64-bit Linux' +endif + +deps += ['bus_pci'] + +sources = files( + 'nfp_common_log.c', + 'nfp_common_pci.c', +) diff --git a/drivers/common/nfp/nfp_common_log.c b/drivers/common/nfp/nfp_common_log.c new file mode 100644 index 0000000000..e69e608eb9 --- /dev/null +++ b/drivers/common/nfp/nfp_common_log.c @@ -0,0 +1,8 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2023 Corigine, Inc. + * All rights reserved. + */ + +#include "nfp_common_log.h" + +RTE_LOG_REGISTER_SUFFIX(nfp_logtype_common, common, NOTICE); diff --git a/drivers/common/nfp/nfp_common_log.h b/drivers/common/nfp/nfp_common_log.h new file mode 100644 index 0000000000..066e38e688 --- /dev/null +++ b/drivers/common/nfp/nfp_common_log.h @@ -0,0 +1,16 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2023 Corigine, Inc. + * All rights reserved. + */ + +#ifndef __NFP_COMMON_LOG_H__ +#define __NFP_COMMON_LOG_H__ + +#include + +extern int nfp_logtype_common; +#define PMD_DRV_LOG(level, fmt, args...) \ + rte_log(RTE_LOG_ ## level, nfp_logtype_common, \ + "%s(): " fmt "\n", __func__, ## args) + +#endif/* __NFP_COMMON_LOG_H__ */ diff --git a/drivers/common/nfp/nfp_common_pci.c b/drivers/common/nfp/nfp_common_pci.c new file mode 100644 index 0000000000..1aa8dd4bbd --- /dev/null +++ b/drivers/common/nfp/nfp_common_pci.c @@ -0,0 +1,274 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2023 Corigine, Inc. + * All rights reserved. + */ + +#include "nfp_common_pci.h" + +#include + +#include +#include +#include + +#include "nfp_common_log.h" + +/* Reported driver name. */ +#define NFP_PCI_DRIVER_NAME "nfp_common_pci" + +static struct rte_pci_driver nfp_common_pci_driver; + +/* PCI ID table is build dynamically based on registered nfp drivers. */ +static struct rte_pci_id *nfp_pci_id_table; + +/* Head of list of drivers. */ +static TAILQ_HEAD(nfp_drivers, nfp_class_driver) nfp_drivers_list = + TAILQ_HEAD_INITIALIZER(nfp_drivers_list); + +static bool nfp_common_initialized; + +static const struct { + const char *name; + enum nfp_class drv_class; +} nfp_classes[] = { + { .name = "eth", .drv_class = NFP_CLASS_ETH }, +}; + +static enum nfp_class +nfp_class_name_to_value(const char *class_name) +{ + uint32_t i; + + for (i = 0; i < RTE_DIM(nfp_classes); i++) { + if (strcmp(class_name, nfp_classes[i].name) == 0) + return nfp_classes[i].drv_class; + } + + return NFP_CLASS_INVALID; +} + +static uint32_t +nfp_pci_id_table_size_get(const struct rte_pci_id *id_table) +{ + uint32_t table_size; + + if (id_table == NULL) + return 0; + + for (table_size = 0; id_table->vendor_id != 0; id_table++) + table_size++; + + return table_size; +} + +static bool +nfp_pci_id_exists(const struct rte_pci_id *id, + const struct rte_pci_id *table, + uint32_t next_idx) +{ + uint32_t i; + + if (next_idx == 0) + return false; + + for (i = 0; i < next_idx; i++) { + if (id->device_id == table[i].device_id && + id->vendor_id == table[i].vendor_id && + id->subsystem_vendor_id == table[i].subsystem_vendor_id && + id->subsystem_device_id == table[i].subsystem_device_id) + return true; + } + + return false; +} + +static void +nfp_pci_id_insert(struct rte_pci_id *new_table, + uint32_t *next_idx, + const struct rte_pci_id *id_table) +{ + if (id_table == NULL) + return; + + /* Add non duplicate entries to new table. */ + for (; id_table->vendor_id != 0; id_table++) { + if (!nfp_pci_id_exists(id_table, new_table, *next_idx)) { + new_table[*next_idx] = *id_table; + (*next_idx)++; + } + } +} + +static int +nfp_pci_id_table_update(const struct rte_pci_id *driver_id_table) +{ + uint32_t i = 0; + uint32_t num_ids = 0; + struct rte_pci_id *old_table; + const struct rte_pci_id *id_iter; + struct rte_pci_id *updated_table; + + old_table = nfp_pci_id_table; + if (old_table != NULL) + num_ids = nfp_pci_id_table_size_get(old_table); + num_ids += nfp_pci_id_table_size_get(driver_id_table); + + /* Increase size by one for the termination entry of vendor_id = 0. */ + num_ids += 1; + updated_table = calloc(num_ids, sizeof(struct rte_pci_id)); + if (updated_table == NULL) + return -ENOMEM; + + if (old_table == NULL) { + /* Copy the first driver's ID table. */ + for (id_iter = driver_id_table; id_iter[i].vendor_id != 0; i++) + updated_table[i] = id_iter[i]; + } else { + /* First copy existing table entries. */ + for (id_iter = old_table; id_iter[i].vendor_id != 0; i++) + updated_table[i] = id_iter[i]; + /* New id to be added at the end of current ID table. */ + nfp_pci_id_insert(updated_table, &i, driver_id_table); + + free(old_table); + } + + /* Terminate table with empty entry. */ + updated_table[i].vendor_id = 0; + nfp_pci_id_table = updated_table; + nfp_common_pci_driver.id_table = nfp_pci_id_table; + + return 0; +} + +static int +nfp_kvarg_dev_class_handler(__rte_unused const char *key, + const char *class_str, + void *opaque) +{ + enum nfp_class *dev_class = opaque; + + if (class_str == NULL) + return *dev_class; + + *dev_class = nfp_class_name_to_value(class_str); + + return 0; +} + +static enum nfp_class +nfp_parse_class_options(const struct rte_devargs *devargs) +{ + struct rte_kvargs *kvargs; + enum nfp_class dev_class = NFP_CLASS_ETH; + + if (devargs == NULL) + return dev_class; + + kvargs = rte_kvargs_parse(devargs->args, NULL); + if (kvargs == NULL) + return dev_class; + + if (rte_kvargs_count(kvargs, RTE_DEVARGS_KEY_CLASS) != 0) { + rte_kvargs_process(kvargs, RTE_DEVARGS_KEY_CLASS, + nfp_kvarg_dev_class_handler, &dev_class); + } + + rte_kvargs_free(kvargs); + + return dev_class; +} + +static int +nfp_drivers_probe(struct rte_pci_device *pci_dev, + enum nfp_class class) +{ + int32_t ret = 0; + struct nfp_class_driver *driver; + + TAILQ_FOREACH(driver, &nfp_drivers_list, next) { + if ((driver->drv_class & class) == 0) + continue; + + ret = driver->probe(pci_dev); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Failed to load driver %s", driver->name); + return ret; + } + } + + return 0; +} + +static int +nfp_common_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, + struct rte_pci_device *pci_dev) +{ + enum nfp_class class; + struct rte_device *eal_dev = &pci_dev->device; + + PMD_DRV_LOG(INFO, "probe device %s.", eal_dev->name); + + class = nfp_parse_class_options(eal_dev->devargs); + if (class == NFP_CLASS_INVALID) { + PMD_DRV_LOG(ERR, "Unsupported nfp class type: %s", + eal_dev->devargs->args); + return -ENOTSUP; + } + + return nfp_drivers_probe(pci_dev, class); +} + +static int +nfp_common_pci_remove(__rte_unused struct rte_pci_device *pci_dev) +{ + return 0; +} + +static struct rte_pci_driver nfp_common_pci_driver = { + .driver = { + .name = NFP_PCI_DRIVER_NAME, + }, + .probe = nfp_common_pci_probe, + .remove = nfp_common_pci_remove, +}; + +static void +nfp_common_init(void) +{ + const struct rte_pci_id empty_table[] = { + { + .vendor_id = 0 + }, + }; + + if (nfp_common_initialized) + return; + + /* + * All the constructor of NFP PMDs run at same priority. So any of the PMD + * including this one can register the PCI table first. If any other + * PMD(s) have registered the PCI ID table, no need to register an empty + * default one. + */ + if (nfp_pci_id_table == NULL && nfp_pci_id_table_update(empty_table) != 0) + return; + + rte_pci_register(&nfp_common_pci_driver); + nfp_common_initialized = true; +} + +void +nfp_class_driver_register(struct nfp_class_driver *driver) +{ + nfp_common_init(); + + if (driver->id_table != NULL) { + if (nfp_pci_id_table_update(driver->id_table) != 0) + return; + } + + nfp_common_pci_driver.drv_flags |= driver->drv_flags; + + TAILQ_INSERT_TAIL(&nfp_drivers_list, driver, next); +} diff --git a/drivers/common/nfp/nfp_common_pci.h b/drivers/common/nfp/nfp_common_pci.h new file mode 100644 index 0000000000..21465fca68 --- /dev/null +++ b/drivers/common/nfp/nfp_common_pci.h @@ -0,0 +1,44 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2023 Corigine, Inc. + * All rights reserved. + */ + +#ifndef __NFP_COMMON_PCI_H__ +#define __NFP_COMMON_PCI_H__ + +#include + +/* Initialization function for the driver called during device probing. */ +typedef int (nfp_class_driver_probe_t)(struct rte_pci_device *dev); + +/* Uninitialization function for the driver called during hot-unplugging. */ +typedef int (nfp_class_driver_remove_t)(struct rte_pci_device *dev); + +enum nfp_class { + NFP_CLASS_ETH, + NFP_CLASS_INVALID, +}; + +/* Describing a nfp common class driver. */ +struct nfp_class_driver { + TAILQ_ENTRY(nfp_class_driver) next; + enum nfp_class drv_class; /**< Class of this driver. */ + const char *name; /**< Driver name. */ + const struct rte_pci_id *id_table; /**< ID table, NULL terminated. */ + uint32_t drv_flags; /**< Flags RTE_PCI_DRV_*. */ + nfp_class_driver_probe_t *probe; /**< Device probe function. */ + nfp_class_driver_remove_t *remove; /**< Device remove function. */ +}; + +/** + * Register a nfp device driver. + * + * @param driver + * A pointer to a nfp_driver structure describing the driver + * to be registered. + */ +__rte_internal +void +nfp_class_driver_register(struct nfp_class_driver *driver); + +#endif /* __NFP_COMMON_PCI_H__ */ diff --git a/drivers/common/nfp/version.map b/drivers/common/nfp/version.map new file mode 100644 index 0000000000..25e48c39d6 --- /dev/null +++ b/drivers/common/nfp/version.map @@ -0,0 +1,7 @@ +INTERNAL { + global: + + nfp_class_driver_register; + + local: *; +}; diff --git a/drivers/meson.build b/drivers/meson.build index 8c775bbe62..af70ed322c 100644 --- a/drivers/meson.build +++ b/drivers/meson.build @@ -15,6 +15,7 @@ subdirs = [ 'common/mlx5', # depends on bus. 'common/qat', # depends on bus. 'common/sfc_efx', # depends on bus. + 'common/nfp', # depends on bus. 'mempool', # depends on common and bus. 'dma', # depends on common and bus. 'net', # depends on common, bus, mempool -- 2.39.1