From patchwork Sun Jun 13 12:58:45 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xueming(Steven) Li" X-Patchwork-Id: 94162 X-Patchwork-Delegate: thomas@monjalon.net 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 82D32A0A0C; Sun, 13 Jun 2021 14:59:12 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 061104003F; Sun, 13 Jun 2021 14:59:12 +0200 (CEST) Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2067.outbound.protection.outlook.com [40.107.236.67]) by mails.dpdk.org (Postfix) with ESMTP id 2DAF64003E for ; Sun, 13 Jun 2021 14:59:11 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=iG5exGq8zzUK6MRFJiL3b8tlAe1AmMEoWeJyMNmXxow3F8wlgccfTF9+tqs3yUxFO/mho3of4ey/UuNrSmDSmcJKvq59LCFCjJ7KryUeJ8NAafMv3wJl/IplTu9ve9OpbRJzrxpLLlLcZzKD9ZkjM9R48mPQT6U/mkZv7QH9Ti30Epvw2/OUbndKYBpAr6nzt159WDXboZgcH6l3wzchUsa1dsUqYEl3ryL921pPKCc5hv8bN+VT22F7ViijjV4yx2xspMulz6EDabh11jEDRpPL62a2m1y9PvwTYXaOhJ4OZ2/OSImctzqz500TVPTjW/ijcFACfyCsernxcH2O1g== 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-SenderADCheck; bh=jtFP9RMhQWd3l7CzHicmxPKjcdWbLCRRTkiNU0Knkhc=; b=GUjDcMG8OcRqK0V/OkeLEBNo8/hIlfRJxMMoBQ548n1w2bOcQjzNd8m/h0VlG8IIT1mBOh7d77YcS2HPaQ4zX7RDjlIMBjN7I2vW1lJ1L57vVwPHbX8/woGJTpL3bUUG9Uw++2/oXgSGWw5UdhCUXeI0MYwAcG6RtRKd9xowuAAWPgQRox0ZMZvkjuLawGUf/fQROBhL0b7Qu3BkjDx41i7Ar8xraAA2jcY+OrfFlhPq/uqEVng9+1hVXHSR2tndv6CUThLwHM+SSriumthAfYSzxPERHpMxu6IomLSr5LXBOZigAw2xYLNlxJVYTMq29qPnBJCwqFPmEI38aYu9lw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.112.34) smtp.rcpttodomain=huawei.com smtp.mailfrom=nvidia.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=jtFP9RMhQWd3l7CzHicmxPKjcdWbLCRRTkiNU0Knkhc=; b=GrMkOs+/SD2vXXrzSPSzs1kH8neInY1r5b5VRXHNjXD4DhYbdVLimp9KsjKeKVordx3/GouFSQUuKuSzR2GOOeW/bTuGT4hoXGIHY6E3xK2Z8p0vhCtlJDM5Bsy8HprgSAO4IxDtbvvJdkwz0NhMiFR9Z9BjQDmulZ+GytxT007oiks4tAnLIhctCXixlOncbfmNWMbpDUdf7Xs5OHvrRuSRrJ2Oy/jUaoBluvDasnML3Nqcetz5pnEM3Qgneo5ZdOnD/peKNVns/v427TbpqDmd9ZchhGvckuUUahRPhWLfrJUt9eDkSmDKtJ1aWm4Lwc0Rd+D/Ff+w+B3NV9kHYw== Received: from MWHPR10CA0059.namprd10.prod.outlook.com (2603:10b6:300:2c::21) by BN6PR12MB1937.namprd12.prod.outlook.com (2603:10b6:404:108::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4219.24; Sun, 13 Jun 2021 12:59:09 +0000 Received: from CO1NAM11FT046.eop-nam11.prod.protection.outlook.com (2603:10b6:300:2c:cafe::6b) by MWHPR10CA0059.outlook.office365.com (2603:10b6:300:2c::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4219.21 via Frontend Transport; Sun, 13 Jun 2021 12:59:09 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.112.34) smtp.mailfrom=nvidia.com; huawei.com; dkim=none (message not signed) header.d=none;huawei.com; dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.112.34 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.112.34; helo=mail.nvidia.com; Received: from mail.nvidia.com (216.228.112.34) by CO1NAM11FT046.mail.protection.outlook.com (10.13.174.203) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.4219.21 via Frontend Transport; Sun, 13 Jun 2021 12:59:08 +0000 Received: from nvidia.com (172.20.187.6) by HQMAIL107.nvidia.com (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 13 Jun 2021 12:59:05 +0000 From: Xueming Li To: CC: , , Matan Azrad , Shahaf Shuler , Viacheslav Ovsiienko , Andrew Rybchenko , Chas Williams , "Min Hu (Connor)" , "Beilei Xing" , Jingjing Wu Date: Sun, 13 Jun 2021 20:58:45 +0800 Message-ID: <20210613125846.19852-1-xuemingl@nvidia.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210510134732.2174-1-xuemingl@nvidia.com> References: <20210510134732.2174-1-xuemingl@nvidia.com> MIME-Version: 1.0 X-Originating-IP: [172.20.187.6] X-ClientProxiedBy: HQMAIL105.nvidia.com (172.20.187.12) To HQMAIL107.nvidia.com (172.20.187.13) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 635d7506-9054-472b-1019-08d92e6b086f X-MS-TrafficTypeDiagnostic: BN6PR12MB1937: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:49; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: inO1EJ3BtK8A/pWhngdePHCynDGSv7wZa540RKuqRtf6XpS54FCSe2ZpYdRlaj+NCFoMHJhcjOVmr1S90+e1uNARhCkMR5hyiR13tJHzrrWmOsGrv1e8oSDWTjSdZW+s01iImOgKdwNlQb3xkHdbbNFtxi/IJnCrbMyoFpAZ/8ql85w2hUF6gatOtxNoASNyfvS7odBtKm307Om0nmbKhuFFFcpl45T0LziPZJMW//j7fRomvzSGUpEpeUtZlCuNG4nRtUex6ENBO0k7fAcTilqs/kPUb/cqOqYo5IMAJpPRBYj/1wE8WPtVNthGSLxNRKuqL8Q6+zW8yaVOCG1cmp7vnsTnw1TE3YOy/GnIvTKzD+UuUwgjLQfzsIrLNlq8b/IKUziXYvfioteafZXX6GyyS3wtcWtfHzikZs9Q0S1PXII/6TqRacGnXrPlDnN00n7rkHzpctcZn3/0XwaUmPYYJ6H78++jGwlMtsem1+S/nQxN2HI8y2rsAYC6mlX6+2G2+kGUccy5UXcCqJKmWPArvsiV33d/7lZ+yNW5Y7ISa7UybUoBRysiJwNf3v3cHVXURmTNeDII4GB3TFcDSA3p6MJ53/1wI1R92XbWb/QUi8qvk8N9DY8aszWkGjAFIxlpKQM4JS1Q7CudnzBT7EWJLsqyMiuU3ZaC5MzIgHY= X-Forefront-Antispam-Report: CIP:216.228.112.34; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:schybrid03.nvidia.com; CAT:NONE; SFS:(4636009)(376002)(39860400002)(396003)(136003)(346002)(36840700001)(46966006)(36860700001)(47076005)(1076003)(26005)(6286002)(8676002)(5660300002)(16526019)(186003)(478600001)(6666004)(109986005)(7696005)(55016002)(54906003)(82740400003)(36906005)(426003)(70206006)(82310400003)(316002)(86362001)(336012)(356005)(2616005)(2906002)(7636003)(4326008)(36756003)(83380400001)(70586007)(8936002)(266003); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Jun 2021 12:59:08.6501 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 635d7506-9054-472b-1019-08d92e6b086f X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.112.34]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CO1NAM11FT046.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR12MB1937 Subject: [dpdk-dev] [PATCH v4 1/2] devargs: add common key definition 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 Sender: "dev" Adds common devargs key definition for "bus", "class" and "driver". Signed-off-by: Xueming Li --- drivers/common/mlx5/mlx5_common.h | 2 -- drivers/common/mlx5/mlx5_common_pci.c | 2 +- drivers/common/sfc_efx/sfc_efx.c | 7 +++---- drivers/common/sfc_efx/sfc_efx.h | 2 -- drivers/net/bonding/rte_eth_bond_args.c | 2 +- drivers/net/i40e/i40e_ethdev_vf.c | 5 ++--- drivers/net/iavf/iavf_ethdev.c | 5 ++--- drivers/net/mlx5/mlx5.c | 4 ++-- drivers/net/sfc/sfc_kvargs.c | 2 +- drivers/vdpa/mlx5/mlx5_vdpa.c | 2 +- lib/eal/common/eal_common_devargs.c | 12 ++++++------ lib/eal/include/rte_devargs.h | 4 ++++ 12 files changed, 23 insertions(+), 26 deletions(-) diff --git a/drivers/common/mlx5/mlx5_common.h b/drivers/common/mlx5/mlx5_common.h index 1fbefe0fa6..306f2f1ab7 100644 --- a/drivers/common/mlx5/mlx5_common.h +++ b/drivers/common/mlx5/mlx5_common.h @@ -208,8 +208,6 @@ __rte_internal int mlx5_get_ifname_sysfs(const char *ibdev_path, char *ifname); -#define MLX5_CLASS_ARG_NAME "class" - enum mlx5_class { MLX5_CLASS_INVALID, MLX5_CLASS_NET = RTE_BIT64(0), diff --git a/drivers/common/mlx5/mlx5_common_pci.c b/drivers/common/mlx5/mlx5_common_pci.c index 3f16cd21cf..34747c4e07 100644 --- a/drivers/common/mlx5/mlx5_common_pci.c +++ b/drivers/common/mlx5/mlx5_common_pci.c @@ -118,7 +118,7 @@ bus_cmdline_options_handler(__rte_unused const char *key, static int parse_class_options(const struct rte_devargs *devargs) { - const char *key = MLX5_CLASS_ARG_NAME; + const char *key = RTE_DEVARGS_KEY_CLASS; struct rte_kvargs *kvlist; int ret = 0; diff --git a/drivers/common/sfc_efx/sfc_efx.c b/drivers/common/sfc_efx/sfc_efx.c index 0b78933d9f..2dc5545760 100644 --- a/drivers/common/sfc_efx/sfc_efx.c +++ b/drivers/common/sfc_efx/sfc_efx.c @@ -42,7 +42,6 @@ enum sfc_efx_dev_class sfc_efx_dev_class_get(struct rte_devargs *devargs) { struct rte_kvargs *kvargs; - const char *key = SFC_EFX_KVARG_DEV_CLASS; enum sfc_efx_dev_class dev_class = SFC_EFX_DEV_CLASS_NET; if (devargs == NULL) @@ -52,9 +51,9 @@ sfc_efx_dev_class_get(struct rte_devargs *devargs) if (kvargs == NULL) return dev_class; - if (rte_kvargs_count(kvargs, key) != 0) { - rte_kvargs_process(kvargs, key, sfc_efx_kvarg_dev_class_handler, - &dev_class); + if (rte_kvargs_count(kvargs, RTE_DEVARGS_KEY_CLASS) != 0) { + rte_kvargs_process(kvargs, RTE_DEVARGS_KEY_CLASS, + sfc_efx_kvarg_dev_class_handler, &dev_class); } rte_kvargs_free(kvargs); diff --git a/drivers/common/sfc_efx/sfc_efx.h b/drivers/common/sfc_efx/sfc_efx.h index 6b6164cb1f..c16eca60f3 100644 --- a/drivers/common/sfc_efx/sfc_efx.h +++ b/drivers/common/sfc_efx/sfc_efx.h @@ -19,8 +19,6 @@ extern "C" { #endif -#define SFC_EFX_KVARG_DEV_CLASS "class" - enum sfc_efx_dev_class { SFC_EFX_DEV_CLASS_INVALID = 0, SFC_EFX_DEV_CLASS_NET, diff --git a/drivers/net/bonding/rte_eth_bond_args.c b/drivers/net/bonding/rte_eth_bond_args.c index 764b1b8c8e..5406e1c934 100644 --- a/drivers/net/bonding/rte_eth_bond_args.c +++ b/drivers/net/bonding/rte_eth_bond_args.c @@ -18,7 +18,7 @@ const char *pmd_bond_init_valid_arguments[] = { PMD_BOND_SOCKET_ID_KVARG, PMD_BOND_MAC_ADDR_KVARG, PMD_BOND_AGG_MODE_KVARG, - "driver", + RTE_DEVARGS_KEY_DRIVER, NULL }; diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c index cb898bdb68..1d8ca42a0f 100644 --- a/drivers/net/i40e/i40e_ethdev_vf.c +++ b/drivers/net/i40e/i40e_ethdev_vf.c @@ -1660,7 +1660,6 @@ static int i40evf_driver_selected(struct rte_devargs *devargs) { struct rte_kvargs *kvlist; - const char *key = "driver"; int ret = 0; if (devargs == NULL) @@ -1670,13 +1669,13 @@ i40evf_driver_selected(struct rte_devargs *devargs) if (kvlist == NULL) return 0; - if (!rte_kvargs_count(kvlist, key)) + if (!rte_kvargs_count(kvlist, RTE_DEVARGS_KEY_DRIVER)) goto exit; /* i40evf driver selected when there's a key-value pair: * driver=i40evf */ - if (rte_kvargs_process(kvlist, key, + if (rte_kvargs_process(kvlist, RTE_DEVARGS_KEY_DRIVER, i40evf_check_driver_handler, NULL) < 0) goto exit; diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c index d688c31cfb..4e79319017 100644 --- a/drivers/net/iavf/iavf_ethdev.c +++ b/drivers/net/iavf/iavf_ethdev.c @@ -2440,7 +2440,6 @@ static int iavf_drv_i40evf_selected(struct rte_devargs *devargs, uint16_t device_id) { struct rte_kvargs *kvlist; - const char *key = "driver"; int ret = 0; if (device_id != IAVF_DEV_ID_VF && @@ -2456,13 +2455,13 @@ iavf_drv_i40evf_selected(struct rte_devargs *devargs, uint16_t device_id) if (kvlist == NULL) return 0; - if (!rte_kvargs_count(kvlist, key)) + if (!rte_kvargs_count(kvlist, RTE_DEVARGS_KEY_DRIVER)) goto exit; /* i40evf driver selected when there's a key-value pair: * driver=i40evf */ - if (rte_kvargs_process(kvlist, key, + if (rte_kvargs_process(kvlist, RTE_DEVARGS_KEY_DRIVER, iavf_drv_i40evf_check_handler, NULL) < 0) goto exit; diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index cf1815cb74..d0faa45944 100644 --- a/drivers/net/mlx5/mlx5.c +++ b/drivers/net/mlx5/mlx5.c @@ -1931,7 +1931,7 @@ mlx5_args_check(const char *key, const char *val, void *opaque) config->max_dump_files_num = tmp; } else if (strcmp(MLX5_LRO_TIMEOUT_USEC, key) == 0) { config->lro.timeout = tmp; - } else if (strcmp(MLX5_CLASS_ARG_NAME, key) == 0) { + } else if (strcmp(RTE_DEVARGS_KEY_CLASS, key) == 0) { DRV_LOG(DEBUG, "class argument is %s.", val); } else if (strcmp(MLX5_HP_BUF_SIZE, key) == 0) { config->log_hp_size = tmp; @@ -2002,7 +2002,7 @@ mlx5_args(struct mlx5_dev_config *config, struct rte_devargs *devargs) MLX5_REPRESENTOR, MLX5_MAX_DUMP_FILES_NUM, MLX5_LRO_TIMEOUT_USEC, - MLX5_CLASS_ARG_NAME, + RTE_DEVARGS_KEY_CLASS, MLX5_HP_BUF_SIZE, MLX5_RECLAIM_MEM, MLX5_SYS_MEM_EN, diff --git a/drivers/net/sfc/sfc_kvargs.c b/drivers/net/sfc/sfc_kvargs.c index 0efa92ed28..974c05e68e 100644 --- a/drivers/net/sfc/sfc_kvargs.c +++ b/drivers/net/sfc/sfc_kvargs.c @@ -28,7 +28,7 @@ sfc_kvargs_parse(struct sfc_adapter *sa) SFC_KVARG_TX_DATAPATH, SFC_KVARG_FW_VARIANT, SFC_KVARG_RXD_WAIT_TIMEOUT_NS, - SFC_EFX_KVARG_DEV_CLASS, + RTE_DEVARGS_KEY_CLASS, NULL, }; diff --git a/drivers/vdpa/mlx5/mlx5_vdpa.c b/drivers/vdpa/mlx5/mlx5_vdpa.c index e5e03e6582..8b5bfd8c3d 100644 --- a/drivers/vdpa/mlx5/mlx5_vdpa.c +++ b/drivers/vdpa/mlx5/mlx5_vdpa.c @@ -588,7 +588,7 @@ mlx5_vdpa_args_check_handler(const char *key, const char *val, void *opaque) unsigned long tmp; int n_cores = sysconf(_SC_NPROCESSORS_ONLN); - if (strcmp(key, "class") == 0) + if (strcmp(key, RTE_DEVARGS_KEY_CLASS) == 0) return 0; errno = 0; tmp = strtoul(val, NULL, 0); diff --git a/lib/eal/common/eal_common_devargs.c b/lib/eal/common/eal_common_devargs.c index b31ac879a9..23aaf8b7e4 100644 --- a/lib/eal/common/eal_common_devargs.c +++ b/lib/eal/common/eal_common_devargs.c @@ -49,9 +49,9 @@ rte_devargs_layers_parse(struct rte_devargs *devargs, const char *str; struct rte_kvargs *kvlist; } layers[] = { - { "bus=", NULL, NULL, }, - { "class=", NULL, NULL, }, - { "driver=", NULL, NULL, }, + { RTE_DEVARGS_KEY_BUS "=", NULL, NULL, }, + { RTE_DEVARGS_KEY_CLASS "=", NULL, NULL, }, + { RTE_DEVARGS_KEY_DRIVER "=", NULL, NULL, }, }; struct rte_kvargs_pair *kv = NULL; struct rte_class *cls = NULL; @@ -118,7 +118,7 @@ rte_devargs_layers_parse(struct rte_devargs *devargs, if (layers[i].kvlist == NULL) continue; kv = &layers[i].kvlist->pairs[0]; - if (strcmp(kv->key, "bus") == 0) { + if (strcmp(kv->key, RTE_DEVARGS_KEY_BUS) == 0) { bus = rte_bus_find_by_name(kv->value); if (bus == NULL) { RTE_LOG(ERR, EAL, "Could not find bus \"%s\"\n", @@ -126,7 +126,7 @@ rte_devargs_layers_parse(struct rte_devargs *devargs, ret = -EFAULT; goto get_out; } - } else if (strcmp(kv->key, "class") == 0) { + } else if (strcmp(kv->key, RTE_DEVARGS_KEY_CLASS) == 0) { cls = rte_class_find_by_name(kv->value); if (cls == NULL) { RTE_LOG(ERR, EAL, "Could not find class \"%s\"\n", @@ -134,7 +134,7 @@ rte_devargs_layers_parse(struct rte_devargs *devargs, ret = -EFAULT; goto get_out; } - } else if (strcmp(kv->key, "driver") == 0) { + } else if (strcmp(kv->key, RTE_DEVARGS_KEY_DRIVER) == 0) { /* Ignore */ continue; } diff --git a/lib/eal/include/rte_devargs.h b/lib/eal/include/rte_devargs.h index 1e595b3c51..14fe7f70b6 100644 --- a/lib/eal/include/rte_devargs.h +++ b/lib/eal/include/rte_devargs.h @@ -25,6 +25,10 @@ extern "C" { #include #include +#define RTE_DEVARGS_KEY_BUS "bus" +#define RTE_DEVARGS_KEY_CLASS "class" +#define RTE_DEVARGS_KEY_DRIVER "driver" + /** * Type of generic device */ From patchwork Wed Jun 23 00:03:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xueming(Steven) Li" X-Patchwork-Id: 94687 X-Patchwork-Delegate: thomas@monjalon.net 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 89618A0548; Wed, 23 Jun 2021 02:05:21 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 734504003F; Wed, 23 Jun 2021 02:05:21 +0200 (CEST) Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2045.outbound.protection.outlook.com [40.107.223.45]) by mails.dpdk.org (Postfix) with ESMTP id C40D84003E for ; Wed, 23 Jun 2021 02:05:19 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Tt4nkWV1AElmVSV5/JdyFhaKMLTMKSpbFt0sjoh+DeDSrbJpYrypqKTYQQz90JixwtNx0CoijDpTYFs2/ox0dNVKhue5s7GBS38leBrQE2XaEO+Q42mqEbyLIgcHPDSBGMz9Nr4AxEvljJMkfLPTU2a8+aYRPY06ZwKjn5FOy5sJEeps39JEBa2xh4khbivfOT45I6uRGgxjaatkvV4M7KEPQiSAne1eEIWj177SWSN4kLvCYRqriUdWYr8FoYhdq0m/0NQDkHATAgnQzelhVxfcJDMccXtPqDzV8vvzKvxYyWtPm8l8GfOo/n/T2m8FPv9OZatve5SWAZ8B/KkVQQ== 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-SenderADCheck; bh=BEhVjin+UgqviaLkufR8baaBbSr5gGrUwSnkMDGULwk=; b=n07uI+pfv9G9dXc4Y/NtX8ycCmSb/FYomSy2KRBALoXuXVKeQRmadzm1e0Ca4ALhx5zbj7y0C23A9twqAczDf4xGfxTxsOC8zpluUNCrNFhxA9cLpDDtdq0Yysp3J3zJ+UiL9+9j4gAa/ScAykpOgvOMREMHfKBBdOoVsiPMmnOK4+71mVfxvTi0JVdj+FY2YkFAEBDv0pViSV038rdUGt68ugzmffHJUjKXbJI8FJFWJ8R9RH5VfqL3/zacsK3J1/cJjvXaAwh3Q11+8mIv5MTRGXmpni2FBHG707CJRUWM/qCbmwlgv0VhIMRz28qe9dYmz6HMD3ANdnnVMm3SuQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.112.34) smtp.rcpttodomain=ashroe.eu smtp.mailfrom=nvidia.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=BEhVjin+UgqviaLkufR8baaBbSr5gGrUwSnkMDGULwk=; b=AbdOd81MyIJ2CFoZHdsgx4CSX62AjVs/1sbtdH0YI5+tGKyT+jBqypX93/bJgIcBIGZEcabm//nOfovCe7z7GgiUeOxaiLr5JXQLWrCglfglABpwicvP4Vqh+rL/Emq0Yt73Tt+us8QSaQ7Hr6il0EizVHn/zqRvjb6fygFNFbtfs0dMPMUYYi6Ti4csrSxOAo9OaXnBaMPDlabwgYwVugMBebfZdJkkgBBPblE/2rl+c+/Aif1nm6Svo5CpIuu3WVWFeBAiHt/yNuefjtq249QrMESuJhvpRLinZX98SRKerUz0N/NFYA4FGexzu/K9d3bYWBfI5+T0oQ+FMSS38A== Received: from MWHPR18CA0046.namprd18.prod.outlook.com (2603:10b6:320:31::32) by BN8PR12MB4769.namprd12.prod.outlook.com (2603:10b6:408:a7::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4242.18; Wed, 23 Jun 2021 00:05:17 +0000 Received: from CO1NAM11FT036.eop-nam11.prod.protection.outlook.com (2603:10b6:320:31:cafe::f6) by MWHPR18CA0046.outlook.office365.com (2603:10b6:320:31::32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4264.18 via Frontend Transport; Wed, 23 Jun 2021 00:05:17 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.112.34) smtp.mailfrom=nvidia.com; ashroe.eu; dkim=none (message not signed) header.d=none;ashroe.eu; dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.112.34 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.112.34; helo=mail.nvidia.com; Received: from mail.nvidia.com (216.228.112.34) by CO1NAM11FT036.mail.protection.outlook.com (10.13.174.124) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.4264.18 via Frontend Transport; Wed, 23 Jun 2021 00:05:16 +0000 Received: from nvidia.com (172.20.187.6) by HQMAIL107.nvidia.com (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 23 Jun 2021 00:05:14 +0000 From: Xueming Li To: CC: , , Wang Haiyue , Thomas Monjalon , Kinsella Ray , Neil Horman Date: Wed, 23 Jun 2021 03:03:49 +0300 Message-ID: <20210623000349.631468-2-xuemingl@nvidia.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210613125846.19852-1-xuemingl@nvidia.com> References: <20210613125846.19852-1-xuemingl@nvidia.com> MIME-Version: 1.0 X-Originating-IP: [172.20.187.6] X-ClientProxiedBy: HQMAIL105.nvidia.com (172.20.187.12) To HQMAIL107.nvidia.com (172.20.187.13) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 3842e6ac-0d4b-495c-aec9-08d935da9508 X-MS-TrafficTypeDiagnostic: BN8PR12MB4769: X-LD-Processed: 43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:5797; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: tbRn/bNpfBmP1HzHuDt+bEzG1A8MR7lCviOhQybmPhA/Ifs40lqJQe2++sL2yaKioM5maOC89FDVqKr8T/x6U6cO6ZhpSMLBKZMUlEXRbHXiAgw3Cl6g4/C4vyYByc7A+Vsg25aZqeL7F9m1K67fpWIXf31zQte1pTrXjrcQ4WmYh05oEBU/Ay59+eEO5AOS65TLEsYB/Jpy0YaaLL1ZoC18cIDAORuHwc4Iq7xncVJ659uIpCD+i6yxarrJpohiUwyUIZH7Ko2x+4UE7XjtXVjifq6guzQDX+a5jjHXv/BH/O3o1rM3rr3xZHrqUt6ilzZZxY26OyQQ55zVYseqLbOK5RX4A2NIkWgiBjyTZ401IQEQ+hf7+8y1pwdQwH35/CF7jpJi95QMdZDY0KIXA9nmI+C2OlIig6YpJqGgyxEkMrfWz5K8msTo6eo5qcKjS6oohfYovYTZgI+X71oxYcA6FUndtRHlzxxpxQ94ZI4Nl6gAnoKfXNnQc0HG0AI/myyxTK3oylKelwNAOL7Q927ENdpExk6jcKxh+f3dElfIagZAUC4MRUZrH3HMXnN1/BoqNfuTWjWWz3KeNCXPpf4JCWodvtJveEC73ksUaToQ57tuXjX2ItIWNTmFjjCwChWQt3RB+e7VK1YAzoQ5bJWFYr9JXJr0SVMO1hMU8t436PyS61SYUuhLD1g4+zrVhcA0pyzYdUqOXp5vJxAxQ1WYSytfSNFvRvbob8NliAxuMwpUt5YTDZnRlgEEGB3iGV0nuqnIXaTemebdVaNHlY/1NU9tXyBWO+r63KZfaHc= X-Forefront-Antispam-Report: CIP:216.228.112.34; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:schybrid03.nvidia.com; CAT:NONE; SFS:(4636009)(136003)(346002)(376002)(396003)(39860400002)(46966006)(36840700001)(7696005)(1076003)(7636003)(70206006)(70586007)(36906005)(478600001)(55016002)(36860700001)(26005)(2906002)(47076005)(356005)(83380400001)(109986005)(8676002)(6286002)(426003)(966005)(82310400003)(36756003)(8936002)(16526019)(186003)(82740400003)(336012)(6666004)(30864003)(2616005)(5660300002)(4326008)(316002)(86362001)(54906003)(266003); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Jun 2021 00:05:16.7983 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 3842e6ac-0d4b-495c-aec9-08d935da9508 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.112.34]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CO1NAM11FT036.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN8PR12MB4769 Subject: [dpdk-dev] [PATCH v5 2/2] bus/auxiliary: introduce auxiliary bus 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 Sender: "dev" Auxiliary bus [1] provides a way to split function into child-devices representing sub-domains of functionality. Each auxiliary device represents a part of its parent functionality. Auxiliary device is identified by unique device name, sysfs path: /sys/bus/auxiliary/devices/ Devargs legacy syntax ofauxiliary device: -a auxiliary:[,args...] Devargs generic syntax of auxiliary device: -a bus=auxiliary,name=,,/class=,,/driver=,, [1] kernel auxiliary bus document: https://www.kernel.org/doc/html/latest/driver-api/auxiliary_bus.html Signed-off-by: Xueming Li Cc: Wang Haiyue Cc: Thomas Monjalon Cc: Kinsella Ray --- MAINTAINERS | 5 + doc/guides/rel_notes/release_21_08.rst | 6 + drivers/bus/auxiliary/auxiliary_common.c | 418 ++++++++++++++++++++++ drivers/bus/auxiliary/auxiliary_params.c | 58 +++ drivers/bus/auxiliary/linux/auxiliary.c | 142 ++++++++ drivers/bus/auxiliary/meson.build | 16 + drivers/bus/auxiliary/private.h | 75 ++++ drivers/bus/auxiliary/rte_bus_auxiliary.h | 199 ++++++++++ drivers/bus/auxiliary/version.map | 3 + drivers/bus/meson.build | 1 + 10 files changed, 923 insertions(+) create mode 100644 drivers/bus/auxiliary/auxiliary_common.c create mode 100644 drivers/bus/auxiliary/auxiliary_params.c create mode 100644 drivers/bus/auxiliary/linux/auxiliary.c create mode 100644 drivers/bus/auxiliary/meson.build create mode 100644 drivers/bus/auxiliary/private.h create mode 100644 drivers/bus/auxiliary/rte_bus_auxiliary.h create mode 100644 drivers/bus/auxiliary/version.map diff --git a/MAINTAINERS b/MAINTAINERS index 5877a16971..eaf691ca6a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -525,6 +525,11 @@ F: doc/guides/mempool/octeontx2.rst Bus Drivers ----------- +Auxiliary bus driver +M: Parav Pandit +M: Xueming Li +F: drivers/bus/auxiliary/ + Intel FPGA bus M: Rosen Xu F: drivers/bus/ifpga/ diff --git a/doc/guides/rel_notes/release_21_08.rst b/doc/guides/rel_notes/release_21_08.rst index a6ecfdf3ce..e7ef4c8a05 100644 --- a/doc/guides/rel_notes/release_21_08.rst +++ b/doc/guides/rel_notes/release_21_08.rst @@ -55,6 +55,12 @@ New Features Also, make sure to start the actual text at the margin. ======================================================= +* **Added auxiliary bus support.** + + Auxiliary bus provides a way to split function into child-devices + representing sub-domains of functionality. Each auxiliary device + represents a part of its parent functionality. + Removed Items ------------- diff --git a/drivers/bus/auxiliary/auxiliary_common.c b/drivers/bus/auxiliary/auxiliary_common.c new file mode 100644 index 0000000000..25d6802f24 --- /dev/null +++ b/drivers/bus/auxiliary/auxiliary_common.c @@ -0,0 +1,418 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2021 NVIDIA Corporation & Affiliates + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "private.h" +#include "rte_bus_auxiliary.h" + +static struct rte_devargs * +auxiliary_devargs_lookup(const char *name) +{ + struct rte_devargs *devargs; + + RTE_EAL_DEVARGS_FOREACH(RTE_BUS_AUXILIARY_NAME, devargs) { + if (strcmp(devargs->name, name) == 0) + return devargs; + } + return NULL; +} + +/* + * Test whether the auxiliary device exist + * + * Stub for OS not supporting auxiliary bus. + */ +__rte_weak bool +auxiliary_dev_exists(const char *name) +{ + RTE_SET_USED(name); + return false; +} + +/* + * Scan the devices in the auxiliary bus. + * + * Stub for OS not supporting auxiliary bus. + */ +__rte_weak int +auxiliary_scan(void) +{ + return 0; +} + +/* + * Update a device's devargs being scanned. + * + * @param aux_dev + * AUXILIARY device. + */ +void +auxiliary_on_scan(struct rte_auxiliary_device *aux_dev) +{ + aux_dev->device.devargs = auxiliary_devargs_lookup(aux_dev->name); +} + +/* + * Match the auxiliary driver and device using driver function. + */ +bool +auxiliary_match(const struct rte_auxiliary_driver *aux_drv, + const struct rte_auxiliary_device *aux_dev) +{ + if (aux_drv->match == NULL) + return false; + return aux_drv->match(aux_dev->name); +} + +/* + * Call the probe() function of the driver. + */ +static int +rte_auxiliary_probe_one_driver(struct rte_auxiliary_driver *drv, + struct rte_auxiliary_device *dev) +{ + enum rte_iova_mode iova_mode; + int ret; + + if ((drv == NULL) || (dev == NULL)) + return -EINVAL; + + /* Check if driver supports it. */ + if (!auxiliary_match(drv, dev)) + /* Match of device and driver failed */ + return 1; + + AUXILIARY_LOG(DEBUG, "Auxiliary device %s on NUMA socket %i", + dev->name, dev->device.numa_node); + + /* No initialization when marked as blocked, return without error. */ + if (dev->device.devargs != NULL && + dev->device.devargs->policy == RTE_DEV_BLOCKED) { + AUXILIARY_LOG(INFO, "Device is blocked, not initializing"); + return -1; + } + + if (dev->device.numa_node < 0) { + AUXILIARY_LOG(INFO, "Device is not NUMA-aware, defaulting socket to 0"); + dev->device.numa_node = 0; + } + + AUXILIARY_LOG(DEBUG, "Probe driver: %s", drv->driver.name); + + iova_mode = rte_eal_iova_mode(); + if ((drv->drv_flags & RTE_AUXILIARY_DRV_NEED_IOVA_AS_VA) > 0 && + iova_mode != RTE_IOVA_VA) { + AUXILIARY_LOG(ERR, "Expecting VA IOVA mode but current mode is PA, not initializing"); + return -EINVAL; + } + + dev->driver = drv; + + AUXILIARY_LOG(INFO, "Probe auxiliary driver: %s device: %s (socket %i)", + drv->driver.name, dev->name, dev->device.numa_node); + ret = drv->probe(drv, dev); + if (ret != 0) + dev->driver = NULL; + else + dev->device.driver = &drv->driver; + + return ret; +} + +/* + * Call the remove() function of the driver. + */ +static int +rte_auxiliary_driver_remove_dev(struct rte_auxiliary_device *dev) +{ + struct rte_auxiliary_driver *drv; + int ret = 0; + + if (dev == NULL) + return -EINVAL; + + drv = dev->driver; + + AUXILIARY_LOG(DEBUG, "Auxiliary device %s on NUMA socket %i", + dev->name, dev->device.numa_node); + + AUXILIARY_LOG(DEBUG, "remove driver: %s %s", + dev->name, drv->driver.name); + + if (drv->remove != NULL) { + ret = drv->remove(dev); + if (ret < 0) + return ret; + } + + /* clear driver structure */ + dev->driver = NULL; + dev->device.driver = NULL; + + return 0; +} + +/* + * Call the probe() function of all registered driver for the given device. + * Return < 0 if initialization failed. + * Return 1 if no driver is found for this device. + */ +static int +auxiliary_probe_all_drivers(struct rte_auxiliary_device *dev) +{ + struct rte_auxiliary_driver *drv; + int rc; + + if (dev == NULL) + return -EINVAL; + + FOREACH_DRIVER_ON_AUXILIARY_BUS(drv) { + if (!drv->match(dev->name)) + continue; + + rc = rte_auxiliary_probe_one_driver(drv, dev); + if (rc < 0) + /* negative value is an error */ + return rc; + if (rc > 0) + /* positive value means driver doesn't support it */ + continue; + return 0; + } + return 1; +} + +/* + * Scan the content of the auxiliary bus, and call the probe function for + * all registered drivers to try to probe discovered devices. + */ +static int +auxiliary_probe(void) +{ + struct rte_auxiliary_device *dev = NULL; + size_t probed = 0, failed = 0; + int ret = 0; + + FOREACH_DEVICE_ON_AUXILIARY_BUS(dev) { + probed++; + + ret = auxiliary_probe_all_drivers(dev); + if (ret < 0) { + if (ret != -EEXIST) { + AUXILIARY_LOG(ERR, "Requested device %s cannot be used", + dev->name); + rte_errno = errno; + failed++; + } + ret = 0; + } + } + + return (probed && probed == failed) ? -1 : 0; +} + +static int +auxiliary_parse(const char *name, void *addr) +{ + struct rte_auxiliary_driver *drv = NULL; + const char **out = addr; + + /* Allow dummy name to prevent bus scan. */ + if (strlen(name) == 0) + return 0; + + FOREACH_DRIVER_ON_AUXILIARY_BUS(drv) { + if (drv->match(name)) + break; + } + if (drv != NULL && addr != NULL) + *out = name; + return drv != NULL ? 0 : -1; +} + +/* Register a driver */ +void +rte_auxiliary_register(struct rte_auxiliary_driver *driver) +{ + TAILQ_INSERT_TAIL(&auxiliary_bus.driver_list, driver, next); + driver->bus = &auxiliary_bus; +} + +/* Unregister a driver */ +void +rte_auxiliary_unregister(struct rte_auxiliary_driver *driver) +{ + TAILQ_REMOVE(&auxiliary_bus.driver_list, driver, next); + driver->bus = NULL; +} + +/* Add a device to auxiliary bus */ +void +auxiliary_add_device(struct rte_auxiliary_device *aux_dev) +{ + TAILQ_INSERT_TAIL(&auxiliary_bus.device_list, aux_dev, next); +} + +/* Insert a device into a predefined position in auxiliary bus */ +void +auxiliary_insert_device(struct rte_auxiliary_device *exist_aux_dev, + struct rte_auxiliary_device *new_aux_dev) +{ + TAILQ_INSERT_BEFORE(exist_aux_dev, new_aux_dev, next); +} + +/* Remove a device from auxiliary bus */ +static void +rte_auxiliary_remove_device(struct rte_auxiliary_device *auxiliary_dev) +{ + TAILQ_REMOVE(&auxiliary_bus.device_list, auxiliary_dev, next); +} + +static struct rte_device * +auxiliary_find_device(const struct rte_device *start, rte_dev_cmp_t cmp, + const void *data) +{ + const struct rte_auxiliary_device *pstart; + struct rte_auxiliary_device *adev; + + if (start != NULL) { + pstart = RTE_DEV_TO_AUXILIARY_CONST(start); + adev = TAILQ_NEXT(pstart, next); + } else { + adev = TAILQ_FIRST(&auxiliary_bus.device_list); + } + while (adev != NULL) { + if (cmp(&adev->device, data) == 0) + return &adev->device; + adev = TAILQ_NEXT(adev, next); + } + return NULL; +} + +static int +auxiliary_plug(struct rte_device *dev) +{ + if (!auxiliary_dev_exists(dev->name)) + return -ENOENT; + return auxiliary_probe_all_drivers(RTE_DEV_TO_AUXILIARY(dev)); +} + +static int +auxiliary_unplug(struct rte_device *dev) +{ + struct rte_auxiliary_device *adev; + int ret; + + adev = RTE_DEV_TO_AUXILIARY(dev); + ret = rte_auxiliary_driver_remove_dev(adev); + if (ret == 0) { + rte_auxiliary_remove_device(adev); + rte_devargs_remove(dev->devargs); + free(adev); + } + return ret; +} + +static int +auxiliary_dma_map(struct rte_device *dev, void *addr, uint64_t iova, size_t len) +{ + struct rte_auxiliary_device *aux_dev = RTE_DEV_TO_AUXILIARY(dev); + + if (dev == NULL || aux_dev->driver == NULL) { + rte_errno = EINVAL; + return -1; + } + if (aux_dev->driver->dma_map == NULL) { + rte_errno = ENOTSUP; + return -1; + } + return aux_dev->driver->dma_map(aux_dev, addr, iova, len); +} + +static int +auxiliary_dma_unmap(struct rte_device *dev, void *addr, uint64_t iova, + size_t len) +{ + struct rte_auxiliary_device *aux_dev = RTE_DEV_TO_AUXILIARY(dev); + + if (dev == NULL || aux_dev->driver == NULL) { + rte_errno = EINVAL; + return -1; + } + if (aux_dev->driver->dma_unmap == NULL) { + rte_errno = ENOTSUP; + return -1; + } + return aux_dev->driver->dma_unmap(aux_dev, addr, iova, len); +} + +bool +auxiliary_ignore_device(const char *name) +{ + struct rte_devargs *devargs = auxiliary_devargs_lookup(name); + + switch (auxiliary_bus.bus.conf.scan_mode) { + case RTE_BUS_SCAN_ALLOWLIST: + if (devargs && devargs->policy == RTE_DEV_ALLOWED) + return false; + break; + case RTE_BUS_SCAN_UNDEFINED: + case RTE_BUS_SCAN_BLOCKLIST: + if (devargs == NULL || devargs->policy != RTE_DEV_BLOCKED) + return false; + break; + } + return true; +} + +static enum rte_iova_mode +auxiliary_get_iommu_class(void) +{ + const struct rte_auxiliary_driver *drv; + + FOREACH_DRIVER_ON_AUXILIARY_BUS(drv) { + if ((drv->drv_flags & RTE_AUXILIARY_DRV_NEED_IOVA_AS_VA) > 0) + return RTE_IOVA_VA; + } + + return RTE_IOVA_DC; +} + +struct rte_auxiliary_bus auxiliary_bus = { + .bus = { + .scan = auxiliary_scan, + .probe = auxiliary_probe, + .find_device = auxiliary_find_device, + .plug = auxiliary_plug, + .unplug = auxiliary_unplug, + .parse = auxiliary_parse, + .dma_map = auxiliary_dma_map, + .dma_unmap = auxiliary_dma_unmap, + .get_iommu_class = auxiliary_get_iommu_class, + .dev_iterate = auxiliary_dev_iterate, + }, + .device_list = TAILQ_HEAD_INITIALIZER(auxiliary_bus.device_list), + .driver_list = TAILQ_HEAD_INITIALIZER(auxiliary_bus.driver_list), +}; + +RTE_REGISTER_BUS(auxiliary, auxiliary_bus.bus); +RTE_LOG_REGISTER_DEFAULT(auxiliary_bus_logtype, NOTICE); diff --git a/drivers/bus/auxiliary/auxiliary_params.c b/drivers/bus/auxiliary/auxiliary_params.c new file mode 100644 index 0000000000..dc63b2e574 --- /dev/null +++ b/drivers/bus/auxiliary/auxiliary_params.c @@ -0,0 +1,58 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2021 NVIDIA Corporation & Affiliates + */ + +#include + +#include +#include +#include +#include + +#include "private.h" +#include "rte_bus_auxiliary.h" + +enum auxiliary_params { + RTE_AUXILIARY_PARAM_NAME, +}; + +static const char * const auxiliary_params_keys[] = { + [RTE_AUXILIARY_PARAM_NAME] = "name", +}; + +static int +auxiliary_dev_match(const struct rte_device *dev, + const void *_kvlist) +{ + const struct rte_kvargs *kvlist = _kvlist; + int ret; + + ret = rte_kvargs_process(kvlist, + auxiliary_params_keys[RTE_AUXILIARY_PARAM_NAME], + rte_kvargs_strcmp, (void *)(uintptr_t)dev->name); + + return ret != 0 ? -1 : 0; +} + +void * +auxiliary_dev_iterate(const void *start, + const char *str, + const struct rte_dev_iterator *it __rte_unused) +{ + rte_bus_find_device_t find_device; + struct rte_kvargs *kvargs = NULL; + struct rte_device *dev; + + if (str != NULL) { + kvargs = rte_kvargs_parse(str, auxiliary_params_keys); + if (kvargs == NULL) { + RTE_LOG(ERR, EAL, "cannot parse argument list\n"); + rte_errno = EINVAL; + return NULL; + } + } + find_device = auxiliary_bus.bus.find_device; + dev = find_device(start, auxiliary_dev_match, kvargs); + rte_kvargs_free(kvargs); + return dev; +} diff --git a/drivers/bus/auxiliary/linux/auxiliary.c b/drivers/bus/auxiliary/linux/auxiliary.c new file mode 100644 index 0000000000..1cc075cd13 --- /dev/null +++ b/drivers/bus/auxiliary/linux/auxiliary.c @@ -0,0 +1,142 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2021 NVIDIA Corporation & Affiliates + */ + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "../rte_bus_auxiliary.h" +#include "../private.h" + +#define AUXILIARY_SYSFS_PATH "/sys/bus/auxiliary/devices" + +/* Scan one auxiliary sysfs entry, and fill the devices list from it. */ +static int +auxiliary_scan_one(const char *dirname, const char *name) +{ + struct rte_auxiliary_device *dev; + struct rte_auxiliary_device *dev2; + char filename[PATH_MAX]; + unsigned long tmp; + int ret; + + dev = malloc(sizeof(*dev)); + if (dev == NULL) + return -1; + + memset(dev, 0, sizeof(*dev)); + if (rte_strscpy(dev->name, name, sizeof(dev->name)) < 0) { + free(dev); + return -1; + } + dev->device.name = dev->name; + dev->device.bus = &auxiliary_bus.bus; + + /* Get numa node, default to 0 if not present */ + snprintf(filename, sizeof(filename), "%s/%s/numa_node", + dirname, name); + if (access(filename, F_OK) != -1) { + if (eal_parse_sysfs_value(filename, &tmp) == 0) + dev->device.numa_node = tmp; + else + dev->device.numa_node = -1; + } else { + dev->device.numa_node = 0; + } + + auxiliary_on_scan(dev); + + /* Device is valid, add in list (sorted) */ + TAILQ_FOREACH(dev2, &auxiliary_bus.device_list, next) { + ret = strcmp(dev->name, dev2->name); + if (ret > 0) + continue; + if (ret < 0) { + auxiliary_insert_device(dev2, dev); + } else { /* already registered */ + if (rte_dev_is_probed(&dev2->device) && + dev2->device.devargs != dev->device.devargs) { + /* To probe device with new devargs. */ + rte_devargs_remove(dev2->device.devargs); + auxiliary_on_scan(dev2); + } + free(dev); + } + return 0; + } + auxiliary_add_device(dev); + return 0; +} + +/* + * Test whether the auxiliary device exist + */ +bool +auxiliary_dev_exists(const char *name) +{ + DIR *dir; + char dirname[PATH_MAX]; + + snprintf(dirname, sizeof(dirname), "%s/%s", + AUXILIARY_SYSFS_PATH, name); + dir = opendir(dirname); + if (dir == NULL) + return false; + closedir(dir); + return true; +} + +/* + * Scan the content of the auxiliary bus, and the devices in the devices + * list + */ +int +auxiliary_scan(void) +{ + struct dirent *e; + DIR *dir; + char dirname[PATH_MAX]; + struct rte_auxiliary_driver *drv; + + dir = opendir(AUXILIARY_SYSFS_PATH); + if (dir == NULL) { + AUXILIARY_LOG(INFO, "%s not found, is auxiliary module loaded?", + AUXILIARY_SYSFS_PATH); + return 0; + } + + while ((e = readdir(dir)) != NULL) { + if (e->d_name[0] == '.') + continue; + + if (auxiliary_ignore_device(e->d_name)) + continue; + + snprintf(dirname, sizeof(dirname), "%s/%s", + AUXILIARY_SYSFS_PATH, e->d_name); + + /* Ignore if no driver can handle. */ + FOREACH_DRIVER_ON_AUXILIARY_BUS(drv) { + if (drv->match(e->d_name)) + break; + } + if (drv == NULL) + continue; + + if (auxiliary_scan_one(dirname, e->d_name) < 0) + goto error; + } + closedir(dir); + return 0; + +error: + closedir(dir); + return -1; +} diff --git a/drivers/bus/auxiliary/meson.build b/drivers/bus/auxiliary/meson.build new file mode 100644 index 0000000000..357550eff7 --- /dev/null +++ b/drivers/bus/auxiliary/meson.build @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2021 NVIDIA Corporation & Affiliates + +headers = files( + 'rte_bus_auxiliary.h', +) +sources = files( + 'auxiliary_common.c', + 'auxiliary_params.c', +) +if is_linux + sources += files( + 'linux/auxiliary.c', + ) +endif +deps += ['kvargs'] diff --git a/drivers/bus/auxiliary/private.h b/drivers/bus/auxiliary/private.h new file mode 100644 index 0000000000..36a66dcf1b --- /dev/null +++ b/drivers/bus/auxiliary/private.h @@ -0,0 +1,75 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2021 NVIDIA Corporation & Affiliates + */ + +#ifndef _AUXILIARY_PRIVATE_H_ +#define _AUXILIARY_PRIVATE_H_ + +#include +#include + +#include "rte_bus_auxiliary.h" + +extern struct rte_auxiliary_bus auxiliary_bus; +extern int auxiliary_bus_logtype; + +#define AUXILIARY_LOG(level, ...) \ + rte_log(RTE_LOG_ ## level, auxiliary_bus_logtype, \ + RTE_FMT("auxiliary bus: " RTE_FMT_HEAD(__VA_ARGS__,) "\n", \ + RTE_FMT_TAIL(__VA_ARGS__,))) + +/* Auxiliary bus iterators */ +#define FOREACH_DEVICE_ON_AUXILIARY_BUS(p) \ + TAILQ_FOREACH(p, &(auxiliary_bus.device_list), next) + +#define FOREACH_DRIVER_ON_AUXILIARY_BUS(p) \ + TAILQ_FOREACH(p, &(auxiliary_bus.driver_list), next) + +bool auxiliary_dev_exists(const char *name); + +/* + * Scan the content of the auxiliary bus, and the devices in the devices + * list. + */ +int auxiliary_scan(void); + +/* + * Update a device being scanned. + */ +void auxiliary_on_scan(struct rte_auxiliary_device *aux_dev); + +/* + * Validate whether a device with given auxiliary device should be ignored + * or not. + */ +bool auxiliary_ignore_device(const char *name); + +/* + * Add an auxiliary device to the auxiliary bus (append to auxiliary Device + * list). This function also updates the bus references of the auxiliary + * Device (and the generic device object embedded within. + */ +void auxiliary_add_device(struct rte_auxiliary_device *aux_dev); + +/* + * Insert an auxiliary device in the auxiliary bus at a particular location + * in the device list. It also updates the auxiliary bus reference of the + * new devices to be inserted. + */ +void auxiliary_insert_device(struct rte_auxiliary_device *exist_aux_dev, + struct rte_auxiliary_device *new_aux_dev); + +/* + * Match the auxiliary Driver and Device by driver function + */ +bool auxiliary_match(const struct rte_auxiliary_driver *aux_drv, + const struct rte_auxiliary_device *aux_dev); + +/* + * Iterate over internal devices, matching any device against the provided + * string. + */ +void *auxiliary_dev_iterate(const void *start, const char *str, + const struct rte_dev_iterator *it); + +#endif /* _AUXILIARY_PRIVATE_H_ */ diff --git a/drivers/bus/auxiliary/rte_bus_auxiliary.h b/drivers/bus/auxiliary/rte_bus_auxiliary.h new file mode 100644 index 0000000000..046350bb52 --- /dev/null +++ b/drivers/bus/auxiliary/rte_bus_auxiliary.h @@ -0,0 +1,199 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2021 NVIDIA Corporation & Affiliates + */ + +#ifndef RTE_BUS_AUXILIARY_H +#define RTE_BUS_AUXILIARY_H + +/** + * @file + * + * Auxiliary Bus Interface. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define RTE_BUS_AUXILIARY_NAME "auxiliary" + +/* Forward declarations */ +struct rte_auxiliary_driver; +struct rte_auxiliary_bus; +struct rte_auxiliary_device; + +/** + * Match function for the driver to decide if device can be handled. + * + * @param name + * Pointer to the auxiliary device name. + * @return + * Whether the driver can handle the auxiliary device. + */ +typedef bool(rte_auxiliary_match_t)(const char *name); + +/** + * Initialization function for the driver called during auxiliary probing. + * + * @param drv + * Pointer to the auxiliary driver. + * @param dev + * Pointer to the auxiliary device. + * @return + * - 0 On success. + * - Negative value and rte_errno is set otherwise. + */ +typedef int(rte_auxiliary_probe_t)(struct rte_auxiliary_driver *drv, + struct rte_auxiliary_device *dev); + +/** + * Uninitialization function for the driver called during hotplugging. + * + * @param dev + * Pointer to the auxiliary device. + * @return + * - 0 On success. + * - Negative value and rte_errno is set otherwise. + */ +typedef int (rte_auxiliary_remove_t)(struct rte_auxiliary_device *dev); + +/** + * Driver-specific DMA mapping. After a successful call the device + * will be able to read/write from/to this segment. + * + * @param dev + * Pointer to the auxiliary device. + * @param addr + * Starting virtual address of memory to be mapped. + * @param iova + * Starting IOVA address of memory to be mapped. + * @param len + * Length of memory segment being mapped. + * @return + * - 0 On success. + * - Negative value and rte_errno is set otherwise. + */ +typedef int (rte_auxiliary_dma_map_t)(struct rte_auxiliary_device *dev, + void *addr, uint64_t iova, size_t len); + +/** + * Driver-specific DMA un-mapping. After a successful call the device + * will not be able to read/write from/to this segment. + * + * @param dev + * Pointer to the auxiliary device. + * @param addr + * Starting virtual address of memory to be unmapped. + * @param iova + * Starting IOVA address of memory to be unmapped. + * @param len + * Length of memory segment being unmapped. + * @return + * - 0 On success. + * - Negative value and rte_errno is set otherwise. + */ +typedef int (rte_auxiliary_dma_unmap_t)(struct rte_auxiliary_device *dev, + void *addr, uint64_t iova, size_t len); + +/** + * A structure describing an auxiliary device. + */ +struct rte_auxiliary_device { + TAILQ_ENTRY(rte_auxiliary_device) next; /**< Next probed device. */ + struct rte_device device; /**< Inherit core device */ + char name[RTE_DEV_NAME_MAX_LEN + 1]; /**< ASCII device name */ + struct rte_intr_handle intr_handle; /**< Interrupt handle */ + struct rte_auxiliary_driver *driver; /**< Last device driver */ +}; + +/** List of auxiliary devices */ +TAILQ_HEAD(rte_auxiliary_device_list, rte_auxiliary_device); +/** List of auxiliary drivers */ +TAILQ_HEAD(rte_auxiliary_driver_list, rte_auxiliary_driver); + +/** + * Structure describing the auxiliary bus + */ +struct rte_auxiliary_bus { + struct rte_bus bus; /**< Inherit the generic class */ + struct rte_auxiliary_device_list device_list; /**< List of devices */ + struct rte_auxiliary_driver_list driver_list; /**< List of drivers */ +}; + +/** + * A structure describing an auxiliary driver. + */ +struct rte_auxiliary_driver { + TAILQ_ENTRY(rte_auxiliary_driver) next; /**< Next in list. */ + struct rte_driver driver; /**< Inherit core driver. */ + struct rte_auxiliary_bus *bus; /**< Auxiliary bus reference. */ + rte_auxiliary_match_t *match; /**< Device match function. */ + rte_auxiliary_probe_t *probe; /**< Device Probe function. */ + rte_auxiliary_remove_t *remove; /**< Device Remove function. */ + rte_auxiliary_dma_map_t *dma_map; /**< Device dma map function. */ + rte_auxiliary_dma_unmap_t *dma_unmap; /**< Device dma unmap function. */ + uint32_t drv_flags; /**< Flags RTE_AUXILIARY_DRV_*. */ +}; + +/** + * @internal + * Helper macro for drivers that need to convert to struct rte_auxiliary_device. + */ +#define RTE_DEV_TO_AUXILIARY(ptr) \ + container_of(ptr, struct rte_auxiliary_device, device) + +#define RTE_DEV_TO_AUXILIARY_CONST(ptr) \ + container_of(ptr, const struct rte_auxiliary_device, device) + +#define RTE_ETH_DEV_TO_AUXILIARY(eth_dev) \ + RTE_DEV_TO_AUXILIARY((eth_dev)->device) + +/** Device driver needs IOVA as VA and cannot work with IOVA as PA */ +#define RTE_AUXILIARY_DRV_NEED_IOVA_AS_VA 0x002 + +/** + * Register an auxiliary driver. + * + * @param driver + * A pointer to a rte_auxiliary_driver structure describing the driver + * to be registered. + */ +void rte_auxiliary_register(struct rte_auxiliary_driver *driver); + +/** Helper for auxiliary device registration from driver instance */ +#define RTE_PMD_REGISTER_AUXILIARY(nm, auxiliary_drv) \ + RTE_INIT(auxiliaryinitfn_ ##nm) \ + { \ + (auxiliary_drv).driver.name = RTE_STR(nm); \ + rte_auxiliary_register(&(auxiliary_drv)); \ + } \ + RTE_PMD_EXPORT_NAME(nm, __COUNTER__) + +/** + * Unregister an auxiliary driver. + * + * @param driver + * A pointer to a rte_auxiliary_driver structure describing the driver + * to be unregistered. + */ +void rte_auxiliary_unregister(struct rte_auxiliary_driver *driver); + +#ifdef __cplusplus +} +#endif + +#endif /* RTE_BUS_AUXILIARY_H */ diff --git a/drivers/bus/auxiliary/version.map b/drivers/bus/auxiliary/version.map new file mode 100644 index 0000000000..3081f19626 --- /dev/null +++ b/drivers/bus/auxiliary/version.map @@ -0,0 +1,3 @@ +EXPERIMENTAL { + # added in 21.08 +}; diff --git a/drivers/bus/meson.build b/drivers/bus/meson.build index 410058de3a..45eab5233d 100644 --- a/drivers/bus/meson.build +++ b/drivers/bus/meson.build @@ -2,6 +2,7 @@ # Copyright(c) 2017 Intel Corporation drivers = [ + 'auxiliary', 'dpaa', 'fslmc', 'ifpga',