From patchwork Tue Oct 17 05:45:21 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chaoyong He X-Patchwork-Id: 132691 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: 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]) by inbox.dpdk.org (Postfix) with ESMTP id 5599443186; Tue, 17 Oct 2023 07:46:15 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5C47840689; Tue, 17 Oct 2023 07:46:10 +0200 (CEST) Received: from NAM10-MW2-obe.outbound.protection.outlook.com (mail-mw2nam10on2109.outbound.protection.outlook.com [40.107.94.109]) by mails.dpdk.org (Postfix) with ESMTP id A8867402EB for ; Tue, 17 Oct 2023 07:46:08 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=X8dp9FDAVVnKeany7LLMlUVgIuGjH3vD5OxkUjJGU3T92fRvW6gUIZV+N6ZU7R4R0ZPh2Y5FWPMaaImvEsPvwd1uKago4pKgYpO3RqOMncfoUi9zVoAmTQmh50jEqjz6kx5QK9jeO2huRit7uxybqX10PShCMA62ux7glCKsO64JXRDZKxRzjOYSuTM04Vs4IRbWyXBVEYiIATiwPFkL6Vqoqd6yqsb0e/LhSvoERZJ40z6JtUlzkiz1wslYkOGsxLbFzFNfvGM+nzRV3Au/hlxXLkWEjEj7XrGB1tFuAvKPJWou6TL35slxSVMKG6/6pLDOlv+CgIlZjvPNGRm6dg== 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=E2ocXth2s6uK0EpcpnmZro/S9Gk7vc97jtsCGP+EeSk=; b=Vq1mIjRpGOg2nluf4vczyorKf+VetzrTdRLCfHLHS/n3J+FoCanvaqrnFAI9JzoNBLadxYpV6QyfIz6uahh8QOQ2toFa3Dqio7FL8GOW2SHoLbiaoPP9E4RKy4oeQF3TTs+2uiUh+/pEIvIm7Qc32m5lXudS4Ak4lRpMdMLRE4yQf8OVaBGgYWc8pc5oETSdVTNlaErAnBTp2FZPIuzaqRKYVgQ5UpsMmB7iaTqW6wFVHaA3MCu1ZHv4k0GfDxWAx0uo4IyA5NJHvEN39Pv+F1TyFd/00QbTk7Tp8dui+VowPlfVlnRhtOszJGaE4n1m2yknMcCe1iOveFMHpo7yZQ== 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=E2ocXth2s6uK0EpcpnmZro/S9Gk7vc97jtsCGP+EeSk=; b=dY3KrrlbKwwohVyjnytyfDVarLOfnyEd/WTYBlaI9kD88ZsAuUwrtoDCSyorDGn722Mr9h2RbJQ/Haj1gMBH/2YIkJWD3tOagN3p+Dzm8P1rmBbeW179WXOhI39dBhb1QsZzUyS6xa4JyUTbMMvv3M1p5uPU+9qwRucLnaiTht4= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=corigine.com; Received: from PH0PR13MB5568.namprd13.prod.outlook.com (2603:10b6:510:12b::16) by SJ0PR13MB5272.namprd13.prod.outlook.com (2603:10b6:a03:3e3::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.46; Tue, 17 Oct 2023 05:46:06 +0000 Received: from PH0PR13MB5568.namprd13.prod.outlook.com ([fe80::b070:92e1:931e:fee7]) by PH0PR13MB5568.namprd13.prod.outlook.com ([fe80::b070:92e1:931e:fee7%4]) with mapi id 15.20.6863.047; Tue, 17 Oct 2023 05:46:06 +0000 From: Chaoyong He To: dev@dpdk.org Cc: oss-drivers@corigine.com, Chaoyong He , Shujing Dong , Long Wu , Peng Zhang 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> X-ClientProxiedBy: PH7PR17CA0069.namprd17.prod.outlook.com (2603:10b6:510:325::29) To PH0PR13MB5568.namprd13.prod.outlook.com (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: 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:; IPV:NLI; SFV:NSPM; H:PH0PR13MB5568.namprd13.prod.outlook.com; PTR:; CAT:NONE; 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); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 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: 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: 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 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 f015c89db0..3040a26609 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