From patchwork Thu Oct 26 06:43:00 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chaoyong He X-Patchwork-Id: 133341 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 B06CA43204; Thu, 26 Oct 2023 08:43:54 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 46C61402CD; Thu, 26 Oct 2023 08:43:49 +0200 (CEST) Received: from NAM12-MW2-obe.outbound.protection.outlook.com (mail-mw2nam12on2124.outbound.protection.outlook.com [40.107.244.124]) by mails.dpdk.org (Postfix) with ESMTP id 5267B4029A for ; Thu, 26 Oct 2023 08:43:47 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=A8DZJCh49F2ttsKRegFAtgJeukfQu9CDkGZdjn+fwD1LgBKATr/UD5SESU5nGXEliC7/VOmb5MA3lwjDU8TWOf3COFxAqCpxOiw6iP6nC6KaqioftO9kCOGkl4VH6ylY3lZmQpoNwgSgukYEm/e8UwaKSm2Zdytwps7HJlHth/UQ3/opfkgEWYhm6ky+crXMjcbXcoAsyzEZqtxtmZY4fpSYQtGAhp8aT3MqMY7VrvfTIH/wKstczMlEibhccUJP2LcH7u41o6EAxMWyGwQ8v2VYf98uI8SFtePsZkBFSffpvgADvxw8RsFc8fNKSpQXu4h/GBpgC0G51qyIkVihIg== 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=4Q9QnKwYORzPcV269h57iRczxLtSD5GDi7BNAf/pqww=; b=A24fYPRL3nkEQ3vmYnnnjbwZApEbKrHNqvpeDZPVczz8GI3+k8laYTfsc6pB61WbN1r5U+16EnISlzbEm9S1y7moBdRf3K91Cd12n8CLnvnwdzh8DnMsGL14Phph0juAg7andxuYNvx5Pp2WzKBSmlySq4x8VTGZQwQCcevL14iSsKoiqnY8b62B0PUgtuC65+6GypGCEoBdbk2srTODv6mWZuzoU1E3zudZhHigjizTh3kKqKYmj7qxeFGnF8Y+djAbr8aKtnx5vBGC9hhaXfZtKzJWzvWvLC3Y49tig9xpUsPgQ+WiJFuSy0eJqR4HpKeffVQJddcetsNA+0G9/w== 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=4Q9QnKwYORzPcV269h57iRczxLtSD5GDi7BNAf/pqww=; b=RxY9DWn3nU45iJ5CGoczXz/u1muwAhFVcWTDVG+5+93wmYUgG9V1BG/C3jOv9JcGGC4VIsxM0U6l67O1hEQzhlPyfGKIQT8wdwUOUKHbPbXkgu+Vc+EP2S5sI/WLLS0ITvVczuDwztr5vI4wPiB0JSOfJ6YWmt8dDnitEmorqV4= 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 SJ0PR13MB5965.namprd13.prod.outlook.com (2603:10b6:a03:43d::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6907.33; Thu, 26 Oct 2023 06:43:45 +0000 Received: from SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::45b3:d83c:cff2:4a1b]) by SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::45b3:d83c:cff2:4a1b%6]) with mapi id 15.20.6933.022; Thu, 26 Oct 2023 06:43:45 +0000 From: Chaoyong He To: dev@dpdk.org Cc: oss-drivers@corigine.com, Chaoyong He , Shujing Dong , Long Wu , Peng Zhang Subject: [PATCH v3 01/25] drivers: introduce the NFP common library Date: Thu, 26 Oct 2023 14:43:00 +0800 Message-Id: <20231026064324.177531-2-chaoyong.he@corigine.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20231026064324.177531-1-chaoyong.he@corigine.com> References: <20231024022849.3092506-1-chaoyong.he@corigine.com> <20231026064324.177531-1-chaoyong.he@corigine.com> X-ClientProxiedBy: BYAPR07CA0034.namprd07.prod.outlook.com (2603:10b6:a02:bc::47) To SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ0PR13MB5545:EE_|SJ0PR13MB5965:EE_ X-MS-Office365-Filtering-Correlation-Id: eae54730-021a-48cd-1a84-08dbd5eee6a4 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: awlIfyiWoPg/CEPeiK7tERrrF0UMMYwVPKPwPh0GIvaFpB26ZXOz9JSBHfvrY5JGSTkHony1R7cnDykbmAYL6WPij1RcDZq2DFyZDHc8UjlFHVjlzMREkHOu/3RUlFDMw1Omj5h4/g0zmK6ooYI2ztvLrdOOrzl8suy3/ZOWAJh8uArzLlH8FqjDC3dLKnho9fmxv6KLH1zWV3SZ+Khy3F7EVsjidZuKRFQWsbwrVnfATm/3d3STpKwd1I1YsAn+KiwLWTSJCAEFnBxzOrioPFtWUlz+T+WWOnquDIbX0haSqHngKEJOKxZnaYiWIHYxrpj3cOhlTfbabKVUk7HTqFkkehIuCLhYLvJ9oMPZ4KbWOY/LbBKNwIBYBBAHOrCA1g/GdSmgGY39YvWqgqKH+3NGEs9kruwrgJLkDmXsZGsECdJK/7B7G8C7QYLtds5BM7sh3fQlSVUyp8pSYHMB41jlDHLpLQNP15F79hpp2/mrArSDrEums1i7lwRFCWYpRXnN6lmtwgedLp1Lx99TfqW6cvkCMsf7XLlMCNim8kQYnkjtDGHJo6UZsTQYIFzbxtA3RMp2lAPtPyvZ88ZHszjFX5iiH4W9W8oLlyxobZ1Z3NJIpR7APUKJKSo5ZtrCyCA8AQnqo+FN/48zWuVCzqKFaLrMJb5MPusWavzVOFM= 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)(346002)(39830400003)(136003)(366004)(376002)(396003)(230922051799003)(64100799003)(186009)(1800799009)(451199024)(6512007)(478600001)(6506007)(52116002)(2616005)(8676002)(83380400001)(107886003)(30864003)(41300700001)(26005)(1076003)(6486002)(5660300002)(6666004)(44832011)(6916009)(316002)(66556008)(54906003)(66476007)(66946007)(2906002)(4326008)(8936002)(38350700005)(38100700002)(86362001)(36756003); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: m+3BaDYsZ8erXOvNAkY8Z3p8gaLO/n7cXF97eKtOPpMrxcHO5hFk4qraF/Jg/TVgjXyymqOh4bjScl/3NWLywgZG6CW8UXVJQQAGgTEMrh4LDoKe61ktAs15XM8gqTmmffzQiM3BAKVvA8RxdJnmkGbPLTPVPdO0+rkeo6yDQem9+5etvA6/xbwBeA02lyuKn8gU1ayew4iUBmk4rkKqFb2oFSKyroN+yBNoF1RujTXMEZ66i17IvJ0Dk9BiTGbBbq3HovY/pcnRQxtW/Xna1qEh+EM2gKMvARGUre7mu/tr0kJJKzJgFLqmJazXntBqiaXPB/p6Wcvg7eJ4RRMkmHnH6H+wde2D4lW/nEJH4hhiPi0FrtVv8L2yeNZ2Fh046+MdVvlkg8wCcGW9JuPcWVjU6H5ivDbs1qRlqSdd62UjSyppdHGqHnKLgdseOD7CuXn5ZQa0Omta+MDQar8I+ItDSQ4JDEUjbIckDXwcVyXW14LAE5eCCLzdUm7Huygq7IfQHdkGLs5VoNPrcDN5aqNHZYHZSkp2j87trm1eB2qeo9NIv0qY3azxxuWtO/EINT+jwcR3+n0B7LTcPruTHeoid7oQcHDgsWk/Q/52HvJXblQ+b633tDNs7XkdElt3izAaL5Db3ASO5lTjZ/9nlcKKQ030OPtz/4HSjHAidRJ8RzXisSSOw0vXIJTTBQx07rq/vjNClAX1ZIs4CPNcpRLYHDxo4datXoXx8di/KHLceuLrnX5ndtqXoToWux1FceWWg7xfaMqkxSVcKb9r4oBkAgoZgLXDlQtqGj4dw6oiKjLiCdbhsAC1V65vjVsQ5m0ZVkFI5hVVCTQdYayZn+DWbaKNR8tKcX5PZhtYkAano1jL2zwvaLOQKpsD0PAMxBZazUTSwgdd32IERLf3dXFN4wjkzKzyU/YUdpN6nVpipZqVAV8TlakWGOrjC0gtocwKO4nUskYLlDWzBRPa3uie5Za9RRrsERkXGl3y12XcIxaRX5UZluZ0MdiO+AMfzRb3KpsFYYF683MZWxjfLbH3Kk8gMgQTfeKrgDjCVxzsfYPn5Fp4p1vSafzGJTPgyPSRMTbDcFjdLclJVTxrbG2fIXTMQkJ/EMIoMBW3vOKNkm5rr6eac29vHnTVx/7Hs4QN62z93nkdqjcKVJS5K1MUBe0gaSAoRYuNUZDUyHm2KNQ9xiZi9dlPQOn3zTSiB6cmyWHvOVuL5I7bEPOIMzspLIaxHZmc3mT88nrpxoePuJiPdu8ZfL7X/NIbYmUFeS7U9oyfBqtt9id6+M3UfQhTbp5gpn/yU19yLsZKAtgFadt3Y3gqbfkuEepeHzCixWRatnUd0Wji7D1LtUvx79AridFqsd7WcJgV5qa/dqluU3h3rH0xbt81YWz3PZJ/crOu93m/RxZ3NeVqbc7EeQjQ5y7XtlpPfmOyRdbTPgp6XWf0uhhhjRQcDH0x/kgb/9BVScwbpKqOTEvzv0cI3ZRgC+1eRiGRkLy2KVlmpxyouevYg/SXzMPBMoZRoCie5IYz+TmqAJ1bqeaAhx9Wgqn+5/Zh5fW6P9g/EutA8zXxjk1GiSS+mPaRME3sasWORq7KaV+oZB98coGP9VJe4A== X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: eae54730-021a-48cd-1a84-08dbd5eee6a4 X-MS-Exchange-CrossTenant-AuthSource: SJ0PR13MB5545.namprd13.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Oct 2023 06:43:45.4503 (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: 9Awuoinqp4mqjIREFR0aKL4XmCgkoLTw+s7Go965pMFUxiqi0T5xhzEvtNIKI/6r+EPPDlG1hadkygNQohKJ8nuOZFHHBe14Hr9QQ9wRXOE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR13MB5965 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 + MAINTAINERS | 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 + 9 files changed, 366 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/MAINTAINERS b/MAINTAINERS index 4083658697..5273ab9812 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -900,6 +900,7 @@ F: doc/guides/nics/features/nfb.ini Netronome nfp M: Chaoyong He +F: drivers/common/nfp/ F: drivers/net/nfp/ F: doc/guides/nics/nfp.rst F: doc/guides/nics/features/nfp*.ini diff --git a/drivers/common/nfp/meson.build b/drivers/common/nfp/meson.build new file mode 100644 index 0000000000..cda5a930c7 --- /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 + +sources = files( + 'nfp_common_log.c', + 'nfp_common_pci.c', +) + +deps += ['bus_pci'] 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..65f189b05e --- /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) + 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