From nobody Tue Dec 16 19:57:24 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A0453CDB47E for ; Fri, 13 Oct 2023 06:09:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229714AbjJMGJk (ORCPT ); Fri, 13 Oct 2023 02:09:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42196 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229676AbjJMGJf (ORCPT ); Fri, 13 Oct 2023 02:09:35 -0400 Received: from NAM12-MW2-obe.outbound.protection.outlook.com (mail-mw2nam12on2079.outbound.protection.outlook.com [40.107.244.79]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 15129CF for ; Thu, 12 Oct 2023 23:09:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=PQQLR6Ue6w7jBNpFG4s+Od6A45GB/yvQ6Avx8xPVmv11Eb3O4mTu5NtfCY/oxm4lcGHUZ3eWhwKUzUhNC5fBPynVH/leotFoMixB0P70PLKjMoZ6BjSEqYxiDePk/TIAhPsmVMVA12NbQwCWfI97HO4E+EUw1A3g68EWrfA9Tfqawgn0GZEzKdohMQ+dOyfBMShmLprU+KiAloPsf/haEGRg8VPuPm/xTxdmtK5VG49Sybs+k9EhaCSw+sj7w8MHLsXZR43YAIxfmiTDzfrtSHU31ThmuCVIB/WhDIQBUIHMdGTcNjIIWCWLiG2prnZlhTQBOFixVozxhWv0mSOd8g== 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=spbV+7FTpGZ/9IgAK4Axmw2Z9j6wq/fN+HUj5HQLVXE=; b=QyYXmARoUHkRb5c77Rsc1YFVA7unXkp+xbgOwj9f4T1Mrq5M/tOM/dHzn5oEETQEUbiXN2R4Z+ut45VsAxYyx/X7cg31DPnbidsHTY0X6eZ8Qb9eGo2I9JCk5YjYLVPy+qIqMn3vz8jQK8IQfBiqSWvTrid+WWPis8vzbKvf9U4l9GBjvFuiXHCW6uozJX+JU4Yjqc8qIE4cLZ5SHRWZoSaemxDC64AWl5rX9+PCiqTdXUCWJ6oqs6F48lPcI/LWv+FIgDc7mTC3KULvAfl4OEoPNl9riVFCu5+8qKa/z7cLvUpvoBTp3KGbnNVAxnGdfXZBwwb+5079zsNT5q55SA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=linuxfoundation.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=spbV+7FTpGZ/9IgAK4Axmw2Z9j6wq/fN+HUj5HQLVXE=; b=vGt5eTwglEu+JvIkaDrgxFmCscSVknSkxXlS+63nD+/1T4zn2rTK41ofILFW/XweRKjrZ1awPe6koAqp7Umi3oaAxDvVy0/YeJcV/S+UZzZiJ/QrfZTB2IflXlQPXXNjJSfz6i9ApXigz/+TfXEGSpXmCPMRhZDy4TDxEGJeL5Q= Received: from CY8PR02CA0020.namprd02.prod.outlook.com (2603:10b6:930:4d::23) by DS7PR12MB6119.namprd12.prod.outlook.com (2603:10b6:8:99::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.45; Fri, 13 Oct 2023 06:09:28 +0000 Received: from CY4PEPF0000FCBE.namprd03.prod.outlook.com (2603:10b6:930:4d:cafe::e5) by CY8PR02CA0020.outlook.office365.com (2603:10b6:930:4d::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6886.29 via Frontend Transport; Fri, 13 Oct 2023 06:09:28 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by CY4PEPF0000FCBE.mail.protection.outlook.com (10.167.242.100) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.6838.22 via Frontend Transport; Fri, 13 Oct 2023 06:09:28 +0000 Received: from SATLEXMB08.amd.com (10.181.40.132) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Fri, 13 Oct 2023 01:09:23 -0500 Received: from SATLEXMB03.amd.com (10.181.40.144) by SATLEXMB08.amd.com (10.181.40.132) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Thu, 12 Oct 2023 23:09:23 -0700 Received: from xhdipdslab59.xilinx.com (10.180.168.240) by SATLEXMB03.amd.com (10.181.40.144) with Microsoft SMTP Server id 15.1.2507.27 via Frontend Transport; Fri, 13 Oct 2023 01:09:20 -0500 From: Abhijit Gangurde To: , , CC: , , , , , Abhijit Gangurde Subject: [PATCH v6 1/6] cdx: Remove cdx controller list from cdx bus system Date: Fri, 13 Oct 2023 11:38:45 +0530 Message-ID: <20231013060850.424929-2-abhijit.gangurde@amd.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231013060850.424929-1-abhijit.gangurde@amd.com> References: <20231013060850.424929-1-abhijit.gangurde@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CY4PEPF0000FCBE:EE_|DS7PR12MB6119:EE_ X-MS-Office365-Filtering-Correlation-Id: 6308be7b-aa9d-4695-8705-08dbcbb2f56d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: +w//W8J3QOZCeLJ/o5jSv0QyxVn8VUy5mFCx+4h0nWaij7L8gjVGikJk6pcgAratGo7MrbUBgvjnb/lrASjeuqlEQCnj/uOOnRnRTO+S/7I/BxMpn45idPu9vAPDeOAV5xVT7QhxuRBr0BUandIFVjnkzCtMaMqew76zEt/Q93jGt9EPuv0UkflxEesdCDUvbLxaqd2o6aic9aI68xmVviuJcPJCFyBV68AMzxlxpAoH93Ivlzlfc++aKgRoYiQbC1Gn8lK7LqOjJe6K/LhZFQT7JccYnvCSdW/5yIJY0K4+W4Z7cbllPKfJg+keIVqNaO7pLEvj4mDrpxj9UAUQu44QLoryqtQAb1UtE4uih2ytgZcijuA36HXGU/nIoS93wF4Ss1hnxF1PC+4P2Qq53BoU30dUPXJxiR0tFVWuh/N9ZNK91o1WBoaZdPtGKrgPcwCmUXE190CTWxzIcAS3vtW5egAcQJ5aLIBi84Gu5+N4Dea3hWpee4GssvdXwB6rPzqgfbEOfVdH2b5mup0sL0Uq3Os6QZwTMnWQWSecweJ4LRvZTyWg0xHRlE06a/dx/I+iA5JFVz24rE1StjYFWkS2vN18meMJBgpGCE/mlTlBzZrohpGbV5nM8NYEG1/HYaN5BnkwB2344FzJmJSxdG7rPyoelTeG/WzKI5wgnYQwpkzEfbPnLo0/teiOjZ7g/bwOjO2Ze4GLSaXLagwYirA/KVXh5a7O7BjRWoqNLkq9wE3xuceCrEJq00Pvv4oCFSaDv/mVMSg/0FeNVcS/uw== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230031)(4636009)(396003)(346002)(39860400002)(376002)(136003)(230922051799003)(64100799003)(186009)(1800799009)(451199024)(82310400011)(36840700001)(46966006)(40470700004)(26005)(426003)(336012)(82740400003)(44832011)(40480700001)(36756003)(316002)(83380400001)(70206006)(54906003)(70586007)(110136005)(86362001)(81166007)(1076003)(356005)(2616005)(47076005)(36860700001)(40460700003)(478600001)(2906002)(6666004)(5660300002)(8676002)(8936002)(4326008)(41300700001)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Oct 2023 06:09:28.4176 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6308be7b-aa9d-4695-8705-08dbcbb2f56d X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CY4PEPF0000FCBE.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR12MB6119 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Remove xarray list of cdx controller. Instead, use platform bus to locate the cdx controller using compat string used by cdx controller platform driver. Also, use ida to allocate a unique id for the controller. Signed-off-by: Abhijit Gangurde --- Changes in v6: - Added conditional check before scan() Changes in v5: - None Changes in v4: - Make cdx_controller_ida as static Changes in v3: - New patch in the series - Remove xarray list and use platform bus - Use ida to get unique id for controller drivers/cdx/cdx.c | 42 ++++++++++++++++++++++++------------- include/linux/cdx/cdx_bus.h | 2 ++ 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/drivers/cdx/cdx.c b/drivers/cdx/cdx.c index d2cad4c670a0..0252fc92433d 100644 --- a/drivers/cdx/cdx.c +++ b/drivers/cdx/cdx.c @@ -60,7 +60,7 @@ #include #include #include -#include +#include #include #include #include @@ -70,8 +70,10 @@ #define CDX_DEFAULT_DMA_MASK (~0ULL) #define MAX_CDX_CONTROLLERS 16 =20 -/* CDX controllers registered with the CDX bus */ -static DEFINE_XARRAY_ALLOC(cdx_controllers); +/* IDA for CDX controllers registered with the CDX bus */ +static DEFINE_IDA(cdx_controller_ida); + +static char *compat_node_name =3D "xlnx,versal-net-cdx"; =20 /** * cdx_dev_reset - Reset a CDX device @@ -384,7 +386,8 @@ static ssize_t rescan_store(const struct bus_type *bus, const char *buf, size_t count) { struct cdx_controller *cdx; - unsigned long index; + struct platform_device *pd; + struct device_node *np; bool val; =20 if (kstrtobool(buf, &val) < 0) @@ -397,12 +400,19 @@ static ssize_t rescan_store(const struct bus_type *bu= s, cdx_unregister_devices(&cdx_bus_type); =20 /* Rescan all the devices */ - xa_for_each(&cdx_controllers, index, cdx) { - int ret; + for_each_compatible_node(np, NULL, compat_node_name) { + if (!np) + return -EINVAL; =20 - ret =3D cdx->ops->scan(cdx); - if (ret) - dev_err(cdx->dev, "cdx bus scanning failed\n"); + pd =3D of_find_device_by_node(np); + if (!pd) + return -EINVAL; + + cdx =3D platform_get_drvdata(pd); + if (cdx && cdx->controller_registered && cdx->ops->scan) + cdx->ops->scan(cdx); + + put_device(&pd->dev); } =20 return count; @@ -520,17 +530,20 @@ int cdx_register_controller(struct cdx_controller *cd= x) { int ret; =20 - ret =3D xa_alloc(&cdx_controllers, &cdx->id, cdx, - XA_LIMIT(0, MAX_CDX_CONTROLLERS - 1), GFP_KERNEL); - if (ret) { + ret =3D ida_alloc_range(&cdx_controller_ida, 0, MAX_CDX_CONTROLLERS - 1,= GFP_KERNEL); + if (ret < 0) { dev_err(cdx->dev, "No free index available. Maximum controllers already registered\n"); cdx->id =3D (u8)MAX_CDX_CONTROLLERS; return ret; } =20 + cdx->id =3D ret; + /* Scan all the devices */ - cdx->ops->scan(cdx); + if (cdx->ops->scan) + cdx->ops->scan(cdx); + cdx->controller_registered =3D true; =20 return 0; } @@ -541,8 +554,9 @@ void cdx_unregister_controller(struct cdx_controller *c= dx) if (cdx->id >=3D MAX_CDX_CONTROLLERS) return; =20 + cdx->controller_registered =3D false; device_for_each_child(cdx->dev, NULL, cdx_unregister_device); - xa_erase(&cdx_controllers, cdx->id); + ida_free(&cdx_controller_ida, cdx->id); } EXPORT_SYMBOL_GPL(cdx_unregister_controller); =20 diff --git a/include/linux/cdx/cdx_bus.h b/include/linux/cdx/cdx_bus.h index bead71b7bc73..82c27b8c94e1 100644 --- a/include/linux/cdx/cdx_bus.h +++ b/include/linux/cdx/cdx_bus.h @@ -63,12 +63,14 @@ struct cdx_ops { * @dev: Linux device associated with the CDX controller. * @priv: private data * @id: Controller ID + * @controller_registered: controller registered with bus * @ops: CDX controller ops */ struct cdx_controller { struct device *dev; void *priv; u32 id; + bool controller_registered; struct cdx_ops *ops; }; =20 --=20 2.34.1 From nobody Tue Dec 16 19:57:24 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8424BCDB47E for ; Fri, 13 Oct 2023 06:09:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229747AbjJMGJm (ORCPT ); Fri, 13 Oct 2023 02:09:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42198 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229644AbjJMGJf (ORCPT ); Fri, 13 Oct 2023 02:09:35 -0400 Received: from NAM11-CO1-obe.outbound.protection.outlook.com (mail-co1nam11on2067.outbound.protection.outlook.com [40.107.220.67]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4ED56DA for ; Thu, 12 Oct 2023 23:09:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=U0krgeOfJOcGlh5GhsMuQYxIZ2NZrzd3lnLiv9d+BAggogOqGBAVEc7+Y0x4YqkmhChZBdI+s2pYvZHAXUydyrXztgNGVNCIK7zEHKli0BsMUq3L9HbLf5hjT0pLEZXudkmAsYfPEw+1E6jowjQJFOmAyCbH7fc8T5+gWkcUpOw8ewy/+vfmNhQ2VOiZfWe7vgy3YvmDYPdNjG5d3xelVmdBVVeiBBY/RS6adelwdxrPVLFRuBrrG1PUjPUuIWv1TI19fL9s7wWlFBAb3nc/J9FbpcIXTpSQtlGBZzT2qDXFNZCLip0PRqGcgt+O6qX6Lyu6ADfHRHqTQKE3EElnng== 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=ADDGs3ff5jYOy3F5Q0yOMqrSVnqNm8+80u9lqYakXKo=; b=lz8Ps+gAYwFWj3FdfXsvkZT/i8sFuuW3pHZyE2KUNhev9aviN0LEWeldMWFX4Ai+mXLmvr+GKz8IxLcOW/sRxQ+tMxPXn2XRNVq9xUn8FDQ2Y/HTGAawxMWdehmT8FfppXk61ZmeN8oZATR7sen1L2xpjefR7qI0nuf8Lf3MKekuu9MyaP3Pw4x2mzq/r0g46cyyoECndgz/IpivPzjTmUDgXLOUKiyVz8/Muk0bNBqEnJmMSm8VtTL+xhXPl6IoN04h8pfhUk1SAwIeebYq18A/Qeuq0yHb1RACr9P2bvZnGVeRQfLMar3EMK/csS38aaK7oEpkb0N9EAxc7SPr8A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=linuxfoundation.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ADDGs3ff5jYOy3F5Q0yOMqrSVnqNm8+80u9lqYakXKo=; b=X3OEwgw3s8LLGV1knHLbAXWb9fqSOBMBbgreTtDNrCoTKtLmUQBsKaKvP26p4Fi5o2KHi3W8f4vMmOJiCaXOXfoaL9neKbQs6UztPRqbucPcnT+cvLIoYCHOmoZMnqI1Wr79WLCRkQt5iiVSKNvMsY3BYVT9mcE/T2ho1N3YfjI= Received: from BLAPR03CA0116.namprd03.prod.outlook.com (2603:10b6:208:32a::31) by DS7PR12MB6007.namprd12.prod.outlook.com (2603:10b6:8:7e::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.43; Fri, 13 Oct 2023 06:09:30 +0000 Received: from MN1PEPF0000ECDA.namprd02.prod.outlook.com (2603:10b6:208:32a:cafe::a6) by BLAPR03CA0116.outlook.office365.com (2603:10b6:208:32a::31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6886.27 via Frontend Transport; Fri, 13 Oct 2023 06:09:30 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB03.amd.com; pr=C Received: from SATLEXMB03.amd.com (165.204.84.17) by MN1PEPF0000ECDA.mail.protection.outlook.com (10.167.242.134) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.6838.22 via Frontend Transport; Fri, 13 Oct 2023 06:09:30 +0000 Received: from SATLEXMB08.amd.com (10.181.40.132) by SATLEXMB03.amd.com (10.181.40.144) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Fri, 13 Oct 2023 01:09:30 -0500 Received: from SATLEXMB03.amd.com (10.181.40.144) by SATLEXMB08.amd.com (10.181.40.132) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Thu, 12 Oct 2023 23:09:29 -0700 Received: from xhdipdslab59.xilinx.com (10.180.168.240) by SATLEXMB03.amd.com (10.181.40.144) with Microsoft SMTP Server id 15.1.2507.27 via Frontend Transport; Fri, 13 Oct 2023 01:09:27 -0500 From: Abhijit Gangurde To: , , CC: , , , , , Abhijit Gangurde Subject: [PATCH v6 2/6] cdx: Introduce lock to protect controller ops Date: Fri, 13 Oct 2023 11:38:46 +0530 Message-ID: <20231013060850.424929-3-abhijit.gangurde@amd.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231013060850.424929-1-abhijit.gangurde@amd.com> References: <20231013060850.424929-1-abhijit.gangurde@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN1PEPF0000ECDA:EE_|DS7PR12MB6007:EE_ X-MS-Office365-Filtering-Correlation-Id: 240f4e13-18a9-4cb8-2a04-08dbcbb2f694 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 0qH/2csxOGn+vETLMrwzH2EtVur3TI5e9EpBh1G8CpK8gxdVh1g+tmX15KIU18Iq/99rPmR8z56BELBp5Zx3kQNWT8ZmAca9EOQ1LO84+GQqSu+lnhoLu3eaizI77Cm5TwLM0/vNGrr5R4AVo61w9s3k5OSl8S5LNMWRna1ExL2S+npbRSh9NQFcxjLKdJcEZh046sTNxTrBR6j1IUVVaIOpC72H1bvyR8I1LMPktCDhG2RbHUB2Tq5SaMv8+gMTjs3FmLvvq/6LX8s3zEJ/pFzP4IXAyM8nNrHRtlgUF8d2TtaqCkGI+r13AHlEHMeG7jzm2f1xLQIk7CrJKflImltpXZiUUiRcbT7mcKpgD8SD+/O/O/+CmIKCYSKunY+Rroa03lDSyOrfr2IbDV4BMuLKRnjj1/SZiUqYMmoLIBFIAAvGQfyH6LkbI+pGz2ea24xzfUF52StKATG6OXyR4XfftDiXL5zzxWlft6Vk/ko1a1lIhiO/CZrGAQLmpbqgk2c7ez5Z1RdeNPD6ITOXVx3qYDv3RO/xQD/dAG5VtAEHGa06qonOgnzcqw4MK7inPnkcVsL6JmcnUgm/yKjj4UKJdkoUUuvbv4isuQMWXYjkymypOSHm43zr3nZ45BSxee3O4vrZECihvY9fqIMpVRzsPmcS0fnnTTnzScc9OSvuvcGFSWPChxQoLUR8c/b12u3cG5xKYzOYfB6nFRGnAH/NaoTwnxYloKAI1XxtzN3tIGwyt1pB2M9OOGl+LpDN4vqQjmMf5UU25Ni+ETd58g== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB03.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230031)(4636009)(136003)(376002)(396003)(346002)(39860400002)(230922051799003)(1800799009)(186009)(451199024)(64100799003)(82310400011)(46966006)(36840700001)(40470700004)(47076005)(6666004)(26005)(36756003)(36860700001)(1076003)(426003)(316002)(478600001)(336012)(2616005)(83380400001)(110136005)(40480700001)(70586007)(70206006)(54906003)(41300700001)(356005)(81166007)(44832011)(4326008)(8936002)(8676002)(40460700003)(5660300002)(82740400003)(2906002)(86362001)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Oct 2023 06:09:30.4267 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 240f4e13-18a9-4cb8-2a04-08dbcbb2f694 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB03.amd.com] X-MS-Exchange-CrossTenant-AuthSource: MN1PEPF0000ECDA.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR12MB6007 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add a mutex lock to prevent race between controller ops initiated by the bus subsystem and the controller registration/unregistration. Signed-off-by: Abhijit Gangurde --- Changes in v6: - None Changes in v5: - None Changes in v4: - None Changes in v3: - None Changes in v2: - New patch in the series - Introduce new lock drivers/cdx/cdx.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/cdx/cdx.c b/drivers/cdx/cdx.c index 0252fc92433d..75760388f5e7 100644 --- a/drivers/cdx/cdx.c +++ b/drivers/cdx/cdx.c @@ -72,6 +72,8 @@ =20 /* IDA for CDX controllers registered with the CDX bus */ static DEFINE_IDA(cdx_controller_ida); +/* Lock to protect controller ops */ +static DEFINE_MUTEX(cdx_controller_lock); =20 static char *compat_node_name =3D "xlnx,versal-net-cdx"; =20 @@ -396,6 +398,8 @@ static ssize_t rescan_store(const struct bus_type *bus, if (!val) return -EINVAL; =20 + mutex_lock(&cdx_controller_lock); + /* Unregister all the devices on the bus */ cdx_unregister_devices(&cdx_bus_type); =20 @@ -415,6 +419,8 @@ static ssize_t rescan_store(const struct bus_type *bus, put_device(&pd->dev); } =20 + mutex_unlock(&cdx_controller_lock); + return count; } static BUS_ATTR_WO(rescan); @@ -538,12 +544,14 @@ int cdx_register_controller(struct cdx_controller *cd= x) return ret; } =20 + mutex_lock(&cdx_controller_lock); cdx->id =3D ret; =20 /* Scan all the devices */ if (cdx->ops->scan) cdx->ops->scan(cdx); cdx->controller_registered =3D true; + mutex_unlock(&cdx_controller_lock); =20 return 0; } @@ -554,9 +562,13 @@ void cdx_unregister_controller(struct cdx_controller *= cdx) if (cdx->id >=3D MAX_CDX_CONTROLLERS) return; =20 + mutex_lock(&cdx_controller_lock); + cdx->controller_registered =3D false; device_for_each_child(cdx->dev, NULL, cdx_unregister_device); ida_free(&cdx_controller_ida, cdx->id); + + mutex_unlock(&cdx_controller_lock); } EXPORT_SYMBOL_GPL(cdx_unregister_controller); =20 --=20 2.34.1 From nobody Tue Dec 16 19:57:24 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 557F6CDB47E for ; Fri, 13 Oct 2023 06:10:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229742AbjJMGKH (ORCPT ); Fri, 13 Oct 2023 02:10:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34682 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229737AbjJMGKE (ORCPT ); Fri, 13 Oct 2023 02:10:04 -0400 Received: from NAM12-MW2-obe.outbound.protection.outlook.com (mail-mw2nam12on2052.outbound.protection.outlook.com [40.107.244.52]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1AC9FD6 for ; Thu, 12 Oct 2023 23:09:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=T+OQN6AynaVLG9asefdpTCkxyZT8rIjYG8+pAl6lw3wh1/VP9vyI17dkYvbr8RpDfIhgEXVNftXL0sWNGLpkeWJaUw0VGBBHAr09uYCaisRSS0HqOvH995s3fn52PTfe3rftuSISNhPWZcxdbkURs1M9d406TyNE6mVCw5YB4BC4xmwVeXIOAjUoGTrHQXeGDjXwVZyUrEPGRUAtA6nO4iCey00NoF7/NCRijd64YCQ+1H3BmdmBpG9Jt7pSVAptcWz3ikpokhEplnubEgalmedmisjjwdLFzdiE9iFV6zNW1i7JrMW+q5R07+ypp/QPmbtTevl918mgzlV3Ci8MbQ== 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=SAA50OrtvwIvupFMiuUMOYlEa5jURPwM6otSw/trtus=; b=TQadbkvL0OOVMdqTqfnV1mAn43HCQLc5U1Ys6oNhHbFEmO24j7AxkV+gr7GSlo0Ybbiie9530DUqsJXM+ITnK2BHo+bA5xm17AGHOgD0I1LpwQpv94010lM4co5gfJcaL52gGvmyoPVGjCuINFeCAoSYEqju4YVR1YmDi+yvH9XNYLOMFJHlFM1jY0hw5PGVSVDVSPY92UnI72ZLYz2SrvRO+HH2rfvvZKM7FdIMLt3QeQ2tbGYi1R1U2BRO2YVVJdMK/XLgaWLC6PUjCu1SERrfNSmoltiCM/bbe58FbEx1XFNwb5ZaFIaFCaiPz+q18VQHpGJkXrmKuasDVttQ1w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=linuxfoundation.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=SAA50OrtvwIvupFMiuUMOYlEa5jURPwM6otSw/trtus=; b=jYlfM+ZNQXXdRsau0V83+kZbriP4RaZMDzmM9twqcKNfYXonUbdY+1iCfoC/yL/2I+Cyciy44OK8U10Y4JwnKlG/GyBq4z0gQBeqQ0DehSGnSx+o+lGZVOamrR9Mn9wAC5BWOZHrd9wts+tiIQfINF/ii5y2j12Wmg4s8ctB2tU= Received: from CH0PR08CA0028.namprd08.prod.outlook.com (2603:10b6:610:33::33) by SJ0PR12MB5674.namprd12.prod.outlook.com (2603:10b6:a03:42c::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.45; Fri, 13 Oct 2023 06:09:56 +0000 Received: from CY4PEPF0000FCBF.namprd03.prod.outlook.com (2603:10b6:610:33:cafe::16) by CH0PR08CA0028.outlook.office365.com (2603:10b6:610:33::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6886.30 via Frontend Transport; Fri, 13 Oct 2023 06:09:55 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by CY4PEPF0000FCBF.mail.protection.outlook.com (10.167.242.101) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.6838.22 via Frontend Transport; Fri, 13 Oct 2023 06:09:55 +0000 Received: from SATLEXMB03.amd.com (10.181.40.144) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Fri, 13 Oct 2023 01:09:48 -0500 Received: from xhdipdslab59.xilinx.com (10.180.168.240) by SATLEXMB03.amd.com (10.181.40.144) with Microsoft SMTP Server id 15.1.2507.27 via Frontend Transport; Fri, 13 Oct 2023 01:09:34 -0500 From: Abhijit Gangurde To: , , CC: , , , , , Abhijit Gangurde Subject: [PATCH v6 3/6] cdx: Register cdx bus as a device on cdx subsystem Date: Fri, 13 Oct 2023 11:38:47 +0530 Message-ID: <20231013060850.424929-4-abhijit.gangurde@amd.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231013060850.424929-1-abhijit.gangurde@amd.com> References: <20231013060850.424929-1-abhijit.gangurde@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CY4PEPF0000FCBF:EE_|SJ0PR12MB5674:EE_ X-MS-Office365-Filtering-Correlation-Id: 91e22f1c-451b-475f-3081-08dbcbb3056b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 8J0oejRBeRVDi/cfpsVscfH4LNinRwOQkVcY44CDOksITvmzeSPAO8IfdOfzjAbugzFv2/8OFtxZZLn8FFhcW8exfO2Vfun+B4l47fXiDyfsbjateN4x7io9vsV66yGgW0Wr3oBC8tEhkoMva3Y71aThIxAaXryYOJKx1J2Z6iDFPof/tfD2pCxFJ7cSW4outUqZaU4+KEsB+g3T7rPTV3GgooTrnISCGCDI4DQVHwh249W+eY2kw/D0XePTNS/MazwBByxoGNPZFWAbefRZuwg7rvEolx5p/r9KeRdw/D/jZi+K4Rg/jApBQt/wPd3ki8gjAejnkpW4OPIxaZYMIlpOLn/Q4csLdmlTjJrFwSjC/tGxvlfxiHB4bVme2uJAm1NH2YNCt2JPoIi6mvTM0bBUooBZHjYx7GGrmgFCbSpkHwZNEkoyB2T6IRl8eJ2C/y1MMgfzUH4ZkXoiyO6ptTUC2VaY4NaLmWBfjZSolxM11aubN/w4CE/WXxksSXdV+kjpKv6VB0v0AVL0vZJjx3B9Ca0hPSNuRVb4UZPQxDVWYj7ctonhNGlrNLtm0gELwbKp9CMvwqszBI63mGjnm4CCHbeJp2FYWY4zXlcFQTSlmTIkDE0E7matmbzCiS4eHtmIDf2UBao02jls+YJ73cYjvMTE1jY5o924bCJCifCz5DnfriUqGSxj/wPbwSbWR+SEzbYiYVjVf5gBPh7dUPwWUYBpXmSzgfIVZOqsE0qSQRg+8mAaLa1k1i6Va2dgtbfx+HIBxcAp6XlIIa3big== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230031)(4636009)(136003)(376002)(396003)(39860400002)(346002)(230922051799003)(186009)(64100799003)(82310400011)(1800799009)(451199024)(46966006)(40470700004)(36840700001)(36756003)(86362001)(40480700001)(40460700003)(110136005)(54906003)(316002)(70586007)(81166007)(82740400003)(356005)(70206006)(47076005)(83380400001)(36860700001)(426003)(26005)(2616005)(1076003)(41300700001)(6666004)(5660300002)(8676002)(478600001)(8936002)(336012)(2906002)(44832011)(4326008)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Oct 2023 06:09:55.1990 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 91e22f1c-451b-475f-3081-08dbcbb3056b X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CY4PEPF0000FCBF.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR12MB5674 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" While scanning for CDX devices, register newly discovered bus as a cdx device. CDX device attributes are visible based on device type. Signed-off-by: Abhijit Gangurde --- Changes in v6: - New patch in the series - Register cdx bus as a device on cdx subsystem drivers/cdx/cdx.c | 77 +++++++++++++++++++++++-- drivers/cdx/cdx.h | 14 ++++- drivers/cdx/controller/cdx_controller.c | 7 +++ include/linux/cdx/cdx_bus.h | 2 + 4 files changed, 93 insertions(+), 7 deletions(-) diff --git a/drivers/cdx/cdx.c b/drivers/cdx/cdx.c index 75760388f5e7..18da06e0babe 100644 --- a/drivers/cdx/cdx.c +++ b/drivers/cdx/cdx.c @@ -125,8 +125,13 @@ static int cdx_unregister_device(struct device *dev, { struct cdx_device *cdx_dev =3D to_cdx_device(dev); =20 - kfree(cdx_dev->driver_override); - cdx_dev->driver_override =3D NULL; + if (cdx_dev->is_bus) { + device_for_each_child(dev, NULL, cdx_unregister_device); + } else { + kfree(cdx_dev->driver_override); + cdx_dev->driver_override =3D NULL; + } + /* * Do not free cdx_dev here as it would be freed in * cdx_device_release() called from within put_device(). @@ -201,6 +206,9 @@ static int cdx_bus_match(struct device *dev, struct dev= ice_driver *drv) const struct cdx_device_id *found_id =3D NULL; const struct cdx_device_id *ids; =20 + if (cdx_dev->is_bus) + return false; + ids =3D cdx_drv->match_id_table; =20 /* When driver_override is set, only bind to the matching driver */ @@ -265,10 +273,11 @@ static int cdx_dma_configure(struct device *dev) { struct cdx_driver *cdx_drv =3D to_cdx_driver(dev->driver); struct cdx_device *cdx_dev =3D to_cdx_device(dev); + struct cdx_controller *cdx =3D cdx_dev->cdx; u32 input_id =3D cdx_dev->req_id; int ret; =20 - ret =3D of_dma_configure_id(dev, dev->parent->of_node, 0, &input_id); + ret =3D of_dma_configure_id(dev, cdx->dev->of_node, 0, &input_id); if (ret && ret !=3D -EPROBE_DEFER) { dev_err(dev, "of_dma_configure_id() failed\n"); return ret; @@ -374,6 +383,18 @@ static ssize_t driver_override_show(struct device *dev, } static DEVICE_ATTR_RW(driver_override); =20 +static umode_t cdx_dev_attrs_are_visible(struct kobject *kobj, struct attr= ibute *a, int n) +{ + struct device *dev =3D kobj_to_dev(kobj); + struct cdx_device *cdx_dev; + + cdx_dev =3D to_cdx_device(dev); + if (!cdx_dev->is_bus) + return a->mode; + + return 0; +} + static struct attribute *cdx_dev_attrs[] =3D { &dev_attr_remove.attr, &dev_attr_reset.attr, @@ -382,7 +403,16 @@ static struct attribute *cdx_dev_attrs[] =3D { &dev_attr_driver_override.attr, NULL, }; -ATTRIBUTE_GROUPS(cdx_dev); + +static const struct attribute_group cdx_dev_group =3D { + .attrs =3D cdx_dev_attrs, + .is_visible =3D cdx_dev_attrs_are_visible, +}; + +static const struct attribute_group *cdx_dev_groups[] =3D { + &cdx_dev_group, + NULL, +}; =20 static ssize_t rescan_store(const struct bus_type *bus, const char *buf, size_t count) @@ -479,7 +509,6 @@ static void cdx_device_release(struct device *dev) int cdx_device_add(struct cdx_dev_params *dev_params) { struct cdx_controller *cdx =3D dev_params->cdx; - struct device *parent =3D cdx->dev; struct cdx_device *cdx_dev; int ret; =20 @@ -503,7 +532,7 @@ int cdx_device_add(struct cdx_dev_params *dev_params) =20 /* Initialize generic device */ device_initialize(&cdx_dev->dev); - cdx_dev->dev.parent =3D parent; + cdx_dev->dev.parent =3D dev_params->parent; cdx_dev->dev.bus =3D &cdx_bus_type; cdx_dev->dev.dma_mask =3D &cdx_dev->dma_mask; cdx_dev->dev.release =3D cdx_device_release; @@ -532,6 +561,42 @@ int cdx_device_add(struct cdx_dev_params *dev_params) } EXPORT_SYMBOL_GPL(cdx_device_add); =20 +struct device *cdx_bus_add(struct cdx_controller *cdx, u8 bus_num) +{ + struct cdx_device *cdx_dev; + int ret; + + cdx_dev =3D kzalloc(sizeof(*cdx_dev), GFP_KERNEL); + if (!cdx_dev) + return NULL; + + device_initialize(&cdx_dev->dev); + cdx_dev->cdx =3D cdx; + + cdx_dev->dev.parent =3D cdx->dev; + cdx_dev->dev.bus =3D &cdx_bus_type; + cdx_dev->dev.release =3D cdx_device_release; + cdx_dev->is_bus =3D true; + cdx_dev->bus_num =3D bus_num; + + dev_set_name(&cdx_dev->dev, "cdx-%02x", + ((cdx->id << CDX_CONTROLLER_ID_SHIFT) | (bus_num & CDX_BUS_NUM_MASK= ))); + + ret =3D device_add(&cdx_dev->dev); + if (ret) { + dev_err(&cdx_dev->dev, "cdx bus device add failed: %d\n", ret); + goto device_add_fail; + } + + return &cdx_dev->dev; + +device_add_fail: + put_device(&cdx_dev->dev); + + return NULL; +} +EXPORT_SYMBOL_GPL(cdx_bus_add); + int cdx_register_controller(struct cdx_controller *cdx) { int ret; diff --git a/drivers/cdx/cdx.h b/drivers/cdx/cdx.h index c436ac7ac86f..1f593deb4c9e 100644 --- a/drivers/cdx/cdx.h +++ b/drivers/cdx/cdx.h @@ -13,7 +13,7 @@ /** * struct cdx_dev_params - CDX device parameters * @cdx: CDX controller associated with the device - * @parent: Associated CDX controller + * @parent: Associated CDX Bus device * @vendor: Vendor ID for CDX device * @device: Device ID for CDX device * @bus_num: Bus number for this CDX device @@ -24,6 +24,7 @@ */ struct cdx_dev_params { struct cdx_controller *cdx; + struct device *parent; u16 vendor; u16 device; u8 bus_num; @@ -59,4 +60,15 @@ void cdx_unregister_controller(struct cdx_controller *cd= x); */ int cdx_device_add(struct cdx_dev_params *dev_params); =20 +/** + * cdx_bus_add - Add a CDX bus. This function adds a bus on the CDX bus + * subsystem. It creates a CDX device for the corresponding bus and + * also registers an associated Linux generic device. + * @cdx: Associated CDX controller + * @us_num: Bus number + * + * Return: associated Linux generic device pointer on success or NULL on f= ailure. + */ +struct device *cdx_bus_add(struct cdx_controller *cdx, u8 bus_num); + #endif /* _CDX_H_ */ diff --git a/drivers/cdx/controller/cdx_controller.c b/drivers/cdx/controll= er/cdx_controller.c index bb4ae7970e21..d1d4606f6c1a 100644 --- a/drivers/cdx/controller/cdx_controller.c +++ b/drivers/cdx/controller/cdx_controller.c @@ -79,8 +79,14 @@ static int cdx_scan_devices(struct cdx_controller *cdx) num_cdx_bus =3D (u8)ret; =20 for (bus_num =3D 0; bus_num < num_cdx_bus; bus_num++) { + struct device *bus_dev; u8 num_cdx_dev; =20 + /* Add the bus on cdx subsystem */ + bus_dev =3D cdx_bus_add(cdx, bus_num); + if (!bus_dev) + continue; + /* MCDI FW Read: Fetch the number of devices present */ ret =3D cdx_mcdi_get_num_devs(cdx_mcdi, bus_num); if (ret < 0) { @@ -103,6 +109,7 @@ static int cdx_scan_devices(struct cdx_controller *cdx) continue; } dev_params.cdx =3D cdx; + dev_params.parent =3D bus_dev; =20 /* Add the device to the cdx bus */ ret =3D cdx_device_add(&dev_params); diff --git a/include/linux/cdx/cdx_bus.h b/include/linux/cdx/cdx_bus.h index 82c27b8c94e1..b5e4b7e05666 100644 --- a/include/linux/cdx/cdx_bus.h +++ b/include/linux/cdx/cdx_bus.h @@ -88,6 +88,7 @@ struct cdx_controller { * @dma_mask: Default DMA mask * @flags: CDX device flags * @req_id: Requestor ID associated with CDX device + * @is_bus: Is this bus device * @driver_override: driver name to force a match; do not set directly, * because core frees it; use driver_set_override() to * set or clear it. @@ -104,6 +105,7 @@ struct cdx_device { u64 dma_mask; u16 flags; u32 req_id; + bool is_bus; const char *driver_override; }; =20 --=20 2.34.1 From nobody Tue Dec 16 19:57:24 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D0530CDB483 for ; Fri, 13 Oct 2023 06:10:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229778AbjJMGKm (ORCPT ); Fri, 13 Oct 2023 02:10:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54438 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229762AbjJMGKg (ORCPT ); Fri, 13 Oct 2023 02:10:36 -0400 Received: from NAM10-BN7-obe.outbound.protection.outlook.com (mail-bn7nam10on2051.outbound.protection.outlook.com [40.107.92.51]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E1D20F7 for ; Thu, 12 Oct 2023 23:10:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=O/94HXS1jJDs8HMyoUNP8gMc4mN3bwyZvBDvjJMobFqwfSnMtk0d/3FcGexQ/TEsufFnQRsCmpDZtJJaVuP5/ZpfPbqPFscVK7FoFa9DWlTRE47FOTAm8P8NZ81Em43DhnarKTykZbnPTzjAD4ZMK5PUYxbVOb3JP45U+EgMRKl4hjxCek33/Ng2GC/4FzeqJc5dRjpZEHe2g+C8u0flhosXQjHzrj8MK4RduVEfRXJkQqG3tyEVqVcjqe3zVX+CUVsAXxIopi/rn0G23fBTraOVhe0PCUaMJ7n8CT7h1H/9mvl2ffkYyGcpDfC9ro6qz1BoFEeP3lqZ8r5lMBFNmA== 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=OyfNZUnc/ArPxaff9x/aiveev08idKZ/LBl1Y4YLvsU=; b=EEGsGTna9r24PbjJ6bOHCKD0ErUkN5ARBynWK9bsrJEQ08lrl/tr40R6GRIZ2SV87TAY9kNlSAfJfRZ9MY+x//SG4d4mj7rHtrbkTy9+fPNqX5hqar/W2Ko9DVtJ2A4Ju1OfGws3ygDjrAit1KR2UJxW2tzX15O6648C087EvWO3PkiHe5jDMLpoxHy7m1rQWF3/eeAiD35/w5Z+IGJWxnxPF8n8fKFrtxBXJ1lLFAqUjOfrfRuhfsShawIRN74f8IjabglJ+z/VqzLYBkOIYoPlf9h4CMu9P7GFtR1VkoEUI9OdH5lkq52fJyqDyP/av7LgB9p9PdB0Cw29kDC8iw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=linuxfoundation.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=OyfNZUnc/ArPxaff9x/aiveev08idKZ/LBl1Y4YLvsU=; b=yDSAMIqqfSQPHmiAiGC/YGSzg+bQHHC6T5GZ2UTR4/XRRDQIZyrvdMAtuYw8EaLGnZLYiN1316q5uMczOwELQKHhL+tRzcgHYNtD8Gv3GTPzclW7iF80ydcaH4W5bCmYjvEIHRQf10lK8T3bRAn7RpQiQr2O5OjPb925/qKcJdg= Received: from CY5PR22CA0040.namprd22.prod.outlook.com (2603:10b6:930:1d::16) by PH0PR12MB5450.namprd12.prod.outlook.com (2603:10b6:510:e8::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.37; Fri, 13 Oct 2023 06:10:28 +0000 Received: from CY4PEPF0000FCC1.namprd03.prod.outlook.com (2603:10b6:930:1d:cafe::3c) by CY5PR22CA0040.outlook.office365.com (2603:10b6:930:1d::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6886.31 via Frontend Transport; Fri, 13 Oct 2023 06:10:28 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by CY4PEPF0000FCC1.mail.protection.outlook.com (10.167.242.103) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.6838.22 via Frontend Transport; Fri, 13 Oct 2023 06:10:28 +0000 Received: from SATLEXMB08.amd.com (10.181.40.132) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Fri, 13 Oct 2023 01:10:03 -0500 Received: from SATLEXMB03.amd.com (10.181.40.144) by SATLEXMB08.amd.com (10.181.40.132) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Thu, 12 Oct 2023 23:10:02 -0700 Received: from xhdipdslab59.xilinx.com (10.180.168.240) by SATLEXMB03.amd.com (10.181.40.144) with Microsoft SMTP Server id 15.1.2507.27 via Frontend Transport; Fri, 13 Oct 2023 01:09:55 -0500 From: Abhijit Gangurde To: , , CC: , , , , , Abhijit Gangurde , Nipun Gupta Subject: [PATCH v6 4/6] cdx: add support for bus enable and disable Date: Fri, 13 Oct 2023 11:38:48 +0530 Message-ID: <20231013060850.424929-5-abhijit.gangurde@amd.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231013060850.424929-1-abhijit.gangurde@amd.com> References: <20231013060850.424929-1-abhijit.gangurde@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CY4PEPF0000FCC1:EE_|PH0PR12MB5450:EE_ X-MS-Office365-Filtering-Correlation-Id: 6a23940c-27e6-4c8a-c876-08dbcbb31919 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: IrDzJzo2zBp5gUnvmi1TCHC7Txgf3uzqN9rgBDWwtO5tfA1soGM3Hl4vewYpD90QIcwYGI7dd9ZS6V0wQtPXenS+GnIZELD2eRrm6OIEcDRcgOHLu4xImWq6URh3rHxreB9s/plxWsjh1/qBLqdA+bgpkEzbQ5zKaJVFmTP9BFAa89cRcCinz3mfuxov7tHn+aEtK6j+gtShstq7yPKXAIErVlKvC/mJjdYGO9VWJy9+NF7llRaYr6ZbTZ82sHbIbfQiBCOqSfc3gIn6TmHI42sTHv1JvC1mqiBAVa0OGY+KKSf3ua04XkLCcpKV+3E/RSj1MGwdcTFww8ah1YMjSNjAsxg3a8McyFpy7VCRODkKMD5m/+K9dZNVIdBJTVdKnrLTytiCA4B/GELoXe4jooFjHNhQ1YJ00HwPbfhz40UeG2wD82/kmsnh1xf0ncibJhBoeTbbBCyn8WU8dGwlgOLFLYshDfkv/A8sOBkSXJ4TpvIsmBrIx8RcWbU3r1ghUHfFA+m609p3YBnfeJhTyQ2gJPyZhY0HlIQivzydPL9NvKjouYuqf8KRsVAZSXLmlyq7b+cffEOwtKARj3Ab5hWkI6mocLQuhrpZ0OaaNhxS0IHUMtWH888vn8zqE0Q37yXXAex/LH16YlQKGSbvbFKaBk+yCDB+5jkTNH8ZQuTelqMqxoiMi+D2EvRqFX9mT8klEDoc8HrV1RR4qVt/FcpNZokyA4a8TMqDXZmV15/++bRx5mkt7MVNMISXCyXEWGXp9iOzc/Gr6HQ7brZluw== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230031)(4636009)(376002)(396003)(136003)(346002)(39860400002)(230922051799003)(451199024)(64100799003)(1800799009)(186009)(82310400011)(40470700004)(36840700001)(46966006)(1076003)(2616005)(6666004)(82740400003)(36756003)(81166007)(40480700001)(40460700003)(86362001)(356005)(36860700001)(316002)(2906002)(30864003)(47076005)(336012)(44832011)(41300700001)(478600001)(426003)(4326008)(26005)(83380400001)(8936002)(5660300002)(70586007)(70206006)(8676002)(110136005)(54906003)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Oct 2023 06:10:28.2668 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6a23940c-27e6-4c8a-c876-08dbcbb31919 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CY4PEPF0000FCC1.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB5450 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" CDX bus needs to be disabled before updating/writing devices in the FPGA. Once the devices are written, the bus shall be rescanned. This change provides sysfs entry to enable/disable the CDX bus. Co-developed-by: Nipun Gupta Signed-off-by: Nipun Gupta Signed-off-by: Abhijit Gangurde --- Changes in v6: - Remove bus attributes enable and disable - Add enable attribute for cdx device visible only for bus device. Changes in v5: - Rebased on Linux 6.6 Changes in v4: - Add sparse marking for lock around cdx_find_controller() function Changes in v3: - Use platform bus to locate controller Changes in v2: - Improve documentation - Split sysfs entry enable to enable and disable - sysfs entry enable and disable take bus number as an argument Documentation/ABI/testing/sysfs-bus-cdx | 13 +++++ drivers/cdx/cdx.c | 72 +++++++++++++++++++++++++ drivers/cdx/controller/cdx_controller.c | 12 +++++ drivers/cdx/controller/mc_cdx_pcol.h | 54 +++++++++++++++++++ drivers/cdx/controller/mcdi_functions.c | 24 +++++++++ drivers/cdx/controller/mcdi_functions.h | 18 +++++++ include/linux/cdx/cdx_bus.h | 10 ++++ 7 files changed, 203 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-bus-cdx b/Documentation/ABI/te= sting/sysfs-bus-cdx index 7af477f49998..c12bdaa4152a 100644 --- a/Documentation/ABI/testing/sysfs-bus-cdx +++ b/Documentation/ABI/testing/sysfs-bus-cdx @@ -28,6 +28,19 @@ Description: of a device manufacturer. Combination of Vendor ID and Device ID identifies a device. =20 +What: /sys/bus/cdx/devices/.../enable +Date: October 2023 +Contact: abhijit.gangurde@amd.com +Description: + CDX bus should be disabled before updating the devices in FPGA. + Writing n/0/off will attempt to disable the CDX bus and. + writing y/1/on will attempt to enable the CDX bus. Reading this file + gives the current state of the bus, 1 for enabled and 0 for disabled. + + For example:: + + # echo 1 > /sys/bus/cdx/.../enable + What: /sys/bus/cdx/devices/.../reset Date: March 2023 Contact: nipun.gupta@amd.com diff --git a/drivers/cdx/cdx.c b/drivers/cdx/cdx.c index 18da06e0babe..3d7bdd2647a3 100644 --- a/drivers/cdx/cdx.c +++ b/drivers/cdx/cdx.c @@ -124,9 +124,12 @@ static int cdx_unregister_device(struct device *dev, void *data) { struct cdx_device *cdx_dev =3D to_cdx_device(dev); + struct cdx_controller *cdx =3D cdx_dev->cdx; =20 if (cdx_dev->is_bus) { device_for_each_child(dev, NULL, cdx_unregister_device); + if (cdx_dev->enabled && cdx->ops->bus_disable) + cdx->ops->bus_disable(cdx, cdx_dev->bus_num); } else { kfree(cdx_dev->driver_override); cdx_dev->driver_override =3D NULL; @@ -383,6 +386,41 @@ static ssize_t driver_override_show(struct device *dev, } static DEVICE_ATTR_RW(driver_override); =20 +static ssize_t enable_store(struct device *dev, struct device_attribute *a= ttr, + const char *buf, size_t count) +{ + struct cdx_device *cdx_dev =3D to_cdx_device(dev); + struct cdx_controller *cdx =3D cdx_dev->cdx; + bool enable; + int ret; + + if (kstrtobool(buf, &enable) < 0) + return -EINVAL; + + if (enable =3D=3D cdx_dev->enabled) + return count; + + if (enable && cdx->ops->bus_enable) + ret =3D cdx->ops->bus_enable(cdx, cdx_dev->bus_num); + else if (!enable && cdx->ops->bus_disable) + ret =3D cdx->ops->bus_disable(cdx, cdx_dev->bus_num); + else + ret =3D -EOPNOTSUPP; + + if (!ret) + cdx_dev->enabled =3D enable; + + return ret < 0 ? ret : count; +} + +static ssize_t enable_show(struct device *dev, struct device_attribute *at= tr, char *buf) +{ + struct cdx_device *cdx_dev =3D to_cdx_device(dev); + + return sysfs_emit(buf, "%u\n", cdx_dev->enabled); +} +static DEVICE_ATTR_RW(enable); + static umode_t cdx_dev_attrs_are_visible(struct kobject *kobj, struct attr= ibute *a, int n) { struct device *dev =3D kobj_to_dev(kobj); @@ -395,6 +433,18 @@ static umode_t cdx_dev_attrs_are_visible(struct kobjec= t *kobj, struct attribute return 0; } =20 +static umode_t cdx_bus_attrs_are_visible(struct kobject *kobj, struct attr= ibute *a, int n) +{ + struct device *dev =3D kobj_to_dev(kobj); + struct cdx_device *cdx_dev; + + cdx_dev =3D to_cdx_device(dev); + if (cdx_dev->is_bus) + return a->mode; + + return 0; +} + static struct attribute *cdx_dev_attrs[] =3D { &dev_attr_remove.attr, &dev_attr_reset.attr, @@ -409,8 +459,19 @@ static const struct attribute_group cdx_dev_group =3D { .is_visible =3D cdx_dev_attrs_are_visible, }; =20 +static struct attribute *cdx_bus_dev_attrs[] =3D { + &dev_attr_enable.attr, + NULL, +}; + +static const struct attribute_group cdx_bus_dev_group =3D { + .attrs =3D cdx_bus_dev_attrs, + .is_visible =3D cdx_bus_attrs_are_visible, +}; + static const struct attribute_group *cdx_dev_groups[] =3D { &cdx_dev_group, + &cdx_bus_dev_group, NULL, }; =20 @@ -588,8 +649,19 @@ struct device *cdx_bus_add(struct cdx_controller *cdx,= u8 bus_num) goto device_add_fail; } =20 + if (cdx->ops->bus_enable) { + ret =3D cdx->ops->bus_enable(cdx, bus_num); + if (ret && ret !=3D -EALREADY) { + dev_err(cdx->dev, "cdx bus enable failed: %d\n", ret); + goto bus_enable_fail; + } + } + + cdx_dev->enabled =3D true; return &cdx_dev->dev; =20 +bus_enable_fail: + device_del(&cdx_dev->dev); device_add_fail: put_device(&cdx_dev->dev); =20 diff --git a/drivers/cdx/controller/cdx_controller.c b/drivers/cdx/controll= er/cdx_controller.c index d1d4606f6c1a..b818f9815ea8 100644 --- a/drivers/cdx/controller/cdx_controller.c +++ b/drivers/cdx/controller/cdx_controller.c @@ -33,6 +33,16 @@ static const struct cdx_mcdi_ops mcdi_ops =3D { .mcdi_request =3D cdx_mcdi_request, }; =20 +static int cdx_bus_enable(struct cdx_controller *cdx, u8 bus_num) +{ + return cdx_mcdi_bus_enable(cdx->priv, bus_num); +} + +static int cdx_bus_disable(struct cdx_controller *cdx, u8 bus_num) +{ + return cdx_mcdi_bus_disable(cdx->priv, bus_num); +} + void cdx_rpmsg_post_probe(struct cdx_controller *cdx) { /* Register CDX controller with CDX bus driver */ @@ -128,6 +138,8 @@ static int cdx_scan_devices(struct cdx_controller *cdx) } =20 static struct cdx_ops cdx_ops =3D { + .bus_enable =3D cdx_bus_enable, + .bus_disable =3D cdx_bus_disable, .scan =3D cdx_scan_devices, .dev_configure =3D cdx_configure_device, }; diff --git a/drivers/cdx/controller/mc_cdx_pcol.h b/drivers/cdx/controller/= mc_cdx_pcol.h index 4ccb7b52951b..2de019406b57 100644 --- a/drivers/cdx/controller/mc_cdx_pcol.h +++ b/drivers/cdx/controller/mc_cdx_pcol.h @@ -455,6 +455,60 @@ #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_REQUESTER_ID_OFST 84 #define MC_CMD_CDX_BUS_GET_DEVICE_CONFIG_OUT_REQUESTER_ID_LEN 4 =20 +/***********************************/ +/* + * MC_CMD_CDX_BUS_DOWN + * Asserting reset on the CDX bus causes all devices on the bus to be quie= sced. + * DMA bus mastering is disabled and any pending DMA request are flushed. = Once + * the response is returned, the devices are guaranteed to no longer issue= DMA + * requests or raise MSI interrupts. Further device MMIO accesses may have + * undefined results. While the bus reset is asserted, any of the enumerat= ion + * or device configuration MCDIs will fail with EAGAIN. It is only legal to + * reload the relevant PL region containing CDX devices if the correspondi= ng CDX + * bus is in reset. Depending on the implementation, the firmware may or m= ay + * not enforce this restriction and it is up to the caller to make sure th= is + * requirement is satisfied. + */ +#define MC_CMD_CDX_BUS_DOWN 0x4 +#define MC_CMD_CDX_BUS_DOWN_MSGSET 0x4 + +/* MC_CMD_CDX_BUS_DOWN_IN msgrequest */ +#define MC_CMD_CDX_BUS_DOWN_IN_LEN 4 +/* Bus number to put in reset, in range 0 to BUS_COUNT-1 */ +#define MC_CMD_CDX_BUS_DOWN_IN_BUS_OFST 0 +#define MC_CMD_CDX_BUS_DOWN_IN_BUS_LEN 4 + +/* + * MC_CMD_CDX_BUS_DOWN_OUT msgresponse: The bus is quiesced, no further + * upstream traffic for devices on this bus. + */ +#define MC_CMD_CDX_BUS_DOWN_OUT_LEN 0 + +/***********************************/ +/* + * MC_CMD_CDX_BUS_UP + * After bus reset is de-asserted, devices are in a state which is functio= nally + * equivalent to each device having been reset with MC_CMD_CDX_DEVICE_RESE= T. In + * other words, device logic is reset in a hardware-specific way, MMIO acc= esses + * are forwarded to the device, DMA bus mastering is disabled and needs to= be + * re-enabled with MC_CMD_CDX_DEVICE_DMA_ENABLE once the driver is ready to + * start servicing DMA. If the underlying number of devices or device reso= urces + * changed (e.g. if PL was reloaded) while the bus was in reset, the bus d= river + * is expected to re-enumerate the bus. Returns EALREADY if the bus was al= ready + * up before the call. + */ +#define MC_CMD_CDX_BUS_UP 0x5 +#define MC_CMD_CDX_BUS_UP_MSGSET 0x5 + +/* MC_CMD_CDX_BUS_UP_IN msgrequest */ +#define MC_CMD_CDX_BUS_UP_IN_LEN 4 +/* Bus number to take out of reset, in range 0 to BUS_COUNT-1 */ +#define MC_CMD_CDX_BUS_UP_IN_BUS_OFST 0 +#define MC_CMD_CDX_BUS_UP_IN_BUS_LEN 4 + +/* MC_CMD_CDX_BUS_UP_OUT msgresponse: The bus can now be enumerated. */ +#define MC_CMD_CDX_BUS_UP_OUT_LEN 0 + /***********************************/ /* * MC_CMD_CDX_DEVICE_RESET diff --git a/drivers/cdx/controller/mcdi_functions.c b/drivers/cdx/controll= er/mcdi_functions.c index 0158f26533dd..0e1e35d91242 100644 --- a/drivers/cdx/controller/mcdi_functions.c +++ b/drivers/cdx/controller/mcdi_functions.c @@ -124,6 +124,30 @@ int cdx_mcdi_get_dev_config(struct cdx_mcdi *cdx, return 0; } =20 +int cdx_mcdi_bus_enable(struct cdx_mcdi *cdx, u8 bus_num) +{ + MCDI_DECLARE_BUF(inbuf, MC_CMD_CDX_BUS_UP_IN_LEN); + int ret; + + MCDI_SET_DWORD(inbuf, CDX_BUS_UP_IN_BUS, bus_num); + ret =3D cdx_mcdi_rpc(cdx, MC_CMD_CDX_BUS_UP, inbuf, sizeof(inbuf), + NULL, 0, NULL); + + return ret; +} + +int cdx_mcdi_bus_disable(struct cdx_mcdi *cdx, u8 bus_num) +{ + MCDI_DECLARE_BUF(inbuf, MC_CMD_CDX_BUS_DOWN_IN_LEN); + int ret; + + MCDI_SET_DWORD(inbuf, CDX_BUS_DOWN_IN_BUS, bus_num); + ret =3D cdx_mcdi_rpc(cdx, MC_CMD_CDX_BUS_DOWN, inbuf, sizeof(inbuf), + NULL, 0, NULL); + + return ret; +} + int cdx_mcdi_reset_device(struct cdx_mcdi *cdx, u8 bus_num, u8 dev_num) { MCDI_DECLARE_BUF(inbuf, MC_CMD_CDX_DEVICE_RESET_IN_LEN); diff --git a/drivers/cdx/controller/mcdi_functions.h b/drivers/cdx/controll= er/mcdi_functions.h index 7440ace5539a..28973d5ec3ab 100644 --- a/drivers/cdx/controller/mcdi_functions.h +++ b/drivers/cdx/controller/mcdi_functions.h @@ -47,6 +47,24 @@ int cdx_mcdi_get_dev_config(struct cdx_mcdi *cdx, u8 bus_num, u8 dev_num, struct cdx_dev_params *dev_params); =20 +/** + * cdx_mcdi_bus_enable - Enable CDX bus represented by bus_num + * @cdx: pointer to MCDI interface. + * @bus_num: Bus number. + * + * Return: 0 on success, <0 on failure + */ +int cdx_mcdi_bus_enable(struct cdx_mcdi *cdx, u8 bus_num); + +/** + * cdx_mcdi_bus_disable - Disable CDX bus represented by bus_num + * @cdx: pointer to MCDI interface. + * @bus_num: Bus number. + * + * Return: 0 on success, <0 on failure + */ +int cdx_mcdi_bus_disable(struct cdx_mcdi *cdx, u8 bus_num); + /** * cdx_mcdi_reset_device - Reset cdx device represented by bus_num:dev_num * @cdx: pointer to MCDI interface. diff --git a/include/linux/cdx/cdx_bus.h b/include/linux/cdx/cdx_bus.h index b5e4b7e05666..18e95076d1d5 100644 --- a/include/linux/cdx/cdx_bus.h +++ b/include/linux/cdx/cdx_bus.h @@ -28,6 +28,10 @@ struct cdx_device_config { u8 type; }; =20 +typedef int (*cdx_bus_enable_cb)(struct cdx_controller *cdx, u8 bus_num); + +typedef int (*cdx_bus_disable_cb)(struct cdx_controller *cdx, u8 bus_num); + typedef int (*cdx_scan_cb)(struct cdx_controller *cdx); =20 typedef int (*cdx_dev_configure_cb)(struct cdx_controller *cdx, @@ -49,11 +53,15 @@ typedef int (*cdx_dev_configure_cb)(struct cdx_controll= er *cdx, =20 /** * struct cdx_ops - Callbacks supported by CDX controller. + * @bus_enable: enable bus on the controller + * @bus_disable: disable bus on the controller * @scan: scan the devices on the controller * @dev_configure: configuration like reset, master_enable, * msi_config etc for a CDX device */ struct cdx_ops { + cdx_bus_enable_cb bus_enable; + cdx_bus_disable_cb bus_disable; cdx_scan_cb scan; cdx_dev_configure_cb dev_configure; }; @@ -89,6 +97,7 @@ struct cdx_controller { * @flags: CDX device flags * @req_id: Requestor ID associated with CDX device * @is_bus: Is this bus device + * @enabled: is this bus enabled * @driver_override: driver name to force a match; do not set directly, * because core frees it; use driver_set_override() to * set or clear it. @@ -106,6 +115,7 @@ struct cdx_device { u16 flags; u32 req_id; bool is_bus; + bool enabled; const char *driver_override; }; =20 --=20 2.34.1 From nobody Tue Dec 16 19:57:24 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BC3A5CDB47E for ; Fri, 13 Oct 2023 06:10:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229749AbjJMGKT (ORCPT ); Fri, 13 Oct 2023 02:10:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39016 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229783AbjJMGKQ (ORCPT ); Fri, 13 Oct 2023 02:10:16 -0400 Received: from NAM11-CO1-obe.outbound.protection.outlook.com (mail-co1nam11on2066.outbound.protection.outlook.com [40.107.220.66]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 10311E6 for ; Thu, 12 Oct 2023 23:10:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=n6K+mHTq6vBsqP2o4s9sLuRvUb2scwzZSFMWoObSDmQJJu7yxj4w5HNduwkstO3qyTS8ylPfhb1xiYkVMu8f20F3X2JL9OlXwr/k4eAYT+Tjx5v1zl5Q2AVySHgtY5RVh09VmhrYbK50+aNwt3ieO5o0OJKEwyGXHHlHgyRjWaDVUn1UYWyZf3cXpf7kRTL8V1+/7o/0RIrzcg6rqyFx9jRpz/chmEjY5jIzUKodF+QNNtet3kZ0q+jsIMJigSFas8DXVGjRYmv8Esp6DDq3X5aQyj/g46KJkNsH26zJsC4/7mh6P7QyjC3BYcNj5UWbidC0MnKIA6zzRLIDzeDi2Q== 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=7mvsK5jN3Gcr+swLaFh22G6BimQ2EN2yCUsez4/XpvE=; b=bn0zFpwjdI6vS5C/CurYe9/6SfUN5fSs/G7PkSNTSJqel/lBFSk0GkTDSszUcOo3yXcRYseRz/YCngPHdovwmkoObuT3baJXm4ugDBll1LppWp8DQDXwqPAdkpm48GEFYCNh9VdbmoLK8f4+0tMdAsvAWcAJ7oJ9RrTwrzsJ8DkUqmpcbKGGSY9u345ptu9IihKVreTCihKA58+gMWJsZ3zlTWgTAwthdfFcPapS10YT6gXQBqS8C9Khi10+FP7eZ2nOehfvdlEqXOwsBNnvJBa83bgHZQ20rM/q5PbxX7NMMzKJurm8UYmjFM1lywh4mnQnI/HUjmWmtfa4cycCcw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=linuxfoundation.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=7mvsK5jN3Gcr+swLaFh22G6BimQ2EN2yCUsez4/XpvE=; b=U46EJdNOCLDmTrflIQ27UOBYf02b8WIytfalzlh97eZA9qCfKtglyohIrHTchw1OalyNm6oKSvx7fmQ5CpRtXERIbD3VsHG39YbcINGyf2a9EuuhSA4xoY/P6QVg8VwVWbn0kFLbYQvnH2qkwwpHrNNCAGNWQwcdG4rvTN3vxoU= Received: from BL1PR13CA0199.namprd13.prod.outlook.com (2603:10b6:208:2be::24) by DM6PR12MB4122.namprd12.prod.outlook.com (2603:10b6:5:214::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.37; Fri, 13 Oct 2023 06:10:10 +0000 Received: from MN1PEPF0000ECD6.namprd02.prod.outlook.com (2603:10b6:208:2be:cafe::ad) by BL1PR13CA0199.outlook.office365.com (2603:10b6:208:2be::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6886.27 via Frontend Transport; Fri, 13 Oct 2023 06:10:10 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB03.amd.com; pr=C Received: from SATLEXMB03.amd.com (165.204.84.17) by MN1PEPF0000ECD6.mail.protection.outlook.com (10.167.242.135) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.6838.22 via Frontend Transport; Fri, 13 Oct 2023 06:10:10 +0000 Received: from SATLEXMB03.amd.com (10.181.40.144) by SATLEXMB03.amd.com (10.181.40.144) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Fri, 13 Oct 2023 01:10:09 -0500 Received: from xhdipdslab59.xilinx.com (10.180.168.240) by SATLEXMB03.amd.com (10.181.40.144) with Microsoft SMTP Server id 15.1.2507.27 via Frontend Transport; Fri, 13 Oct 2023 01:10:07 -0500 From: Abhijit Gangurde To: , , CC: , , , , , Abhijit Gangurde Subject: [PATCH v6 5/6] cdx: add sysfs for bus reset Date: Fri, 13 Oct 2023 11:38:49 +0530 Message-ID: <20231013060850.424929-6-abhijit.gangurde@amd.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231013060850.424929-1-abhijit.gangurde@amd.com> References: <20231013060850.424929-1-abhijit.gangurde@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN1PEPF0000ECD6:EE_|DM6PR12MB4122:EE_ X-MS-Office365-Filtering-Correlation-Id: 80b9039c-6831-410f-fb59-08dbcbb30e49 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: a6R8aQIdNHbWKPhDYcY0/hGz432bF9QdyCr9o+VkFSACZ7iBd1mE92JCJKngQN6q2LdIE7r309Zekv2wQGr36PPAf06GXFao2LvApPyq5BBn96Ko/ShsRGRptUxFXgHnSJNEaUn1l/+153RSR/b6HYreqTQF0Hzu2XyPs5pfxD1GHuqXV1rv6A2bsHPRbFoK68gn59Z40GOarT50LwOOcYwcQycASR/nZp2NwmI+OpNfaum5cVc6ObSt/AOUjhBgtTcevxNlXpXn6frNa1EzsVSQRWgUOfajuKNGNqmeUkCTRyDKBkQw2f3t0T8v6qWlLsfyVZOH0hulABm5m1FCBhQHAa944RNDyqwO53BS2jEmXQOR00Uwf5XNDtjZDNNsYdbW+7CO5pFnIZi+ePwEeBTnbTQ2wYU/PbfWJkvit7ycA/KkXLBIKfAe9T2NpjGW3t7JBy/PM1x/tgUa/wm0u1QTKYfPKgQVZRM1X+gLbyt8GCUHFcewh+cvDNGDdx2gfe8XapQWkOzETq39qR+cneA+MBwSsXgDTOjVGV52Xs9IWVkaQl/Hc0wH5Qb4pfwNGq/Ty4gZ2hHC6Qs7wan40JQKMBYO5EB0pX3l91VichcwhidQ8S0unh1dxpeGtwbjKiXT0TA67WjbMuM2y/R798fkocZPllFhxBAo/ogro9CAoiGpMnzIh4T6Ut1piN3/XoqCjiPx/8XaKh7kUcGsZcaxZ7waurtmSjn74VDpjZGYh3ei9uAU1oAyH/n5M3K7TYHEed64FxF4vQY/D3J92g== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB03.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230031)(4636009)(346002)(376002)(396003)(136003)(39860400002)(230922051799003)(1800799009)(64100799003)(82310400011)(186009)(451199024)(40470700004)(46966006)(36840700001)(41300700001)(6666004)(1076003)(2616005)(82740400003)(40480700001)(44832011)(316002)(36756003)(86362001)(478600001)(356005)(36860700001)(81166007)(40460700003)(2906002)(336012)(47076005)(426003)(4326008)(26005)(83380400001)(5660300002)(70586007)(70206006)(8676002)(110136005)(54906003)(8936002)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Oct 2023 06:10:10.1902 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 80b9039c-6831-410f-fb59-08dbcbb30e49 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB03.amd.com] X-MS-Exchange-CrossTenant-AuthSource: MN1PEPF0000ECD6.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB4122 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add sysfs interface reset to reset all the devices on the CDX bus. Signed-off-by: Abhijit Gangurde --- Changes in v6: - Remove bus attributes reset - Use reset attribute of cdx device for bus reset. Changes in v5: - None Changes in v4: - None Changes in v3: - None Changes in v2: - Improve documentation - sysfs entry reset takes bus number as an argument Documentation/ABI/testing/sysfs-bus-cdx | 8 ++++---- drivers/cdx/cdx.c | 26 +++++++++++++++++++++---- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-bus-cdx b/Documentation/ABI/te= sting/sysfs-bus-cdx index c12bdaa4152a..c2c54abffed5 100644 --- a/Documentation/ABI/testing/sysfs-bus-cdx +++ b/Documentation/ABI/testing/sysfs-bus-cdx @@ -45,10 +45,10 @@ What: /sys/bus/cdx/devices/.../reset Date: March 2023 Contact: nipun.gupta@amd.com Description: - Writing y/1/on to this file resets the CDX device. - On resetting the device, the corresponding driver is notified - twice, once before the device is being reset, and again after - the reset has been complete. + Writing y/1/on to this file resets the CDX device or all devices + on the bus. On resetting the device, the corresponding driver is + notified twice, once before the device is being reset, and again + after the reset has been complete. =20 For example:: =20 diff --git a/drivers/cdx/cdx.c b/drivers/cdx/cdx.c index 3d7bdd2647a3..5f713a83effa 100644 --- a/drivers/cdx/cdx.c +++ b/drivers/cdx/cdx.c @@ -110,6 +110,20 @@ int cdx_dev_reset(struct device *dev) } EXPORT_SYMBOL_GPL(cdx_dev_reset); =20 +/** + * reset_cdx_device - Reset a CDX device + * @dev: CDX device + * @data: This is always passed as NULL, and is not used in this API, + * but is required here as the device_for_each_child() API expects + * the passed function to have this as an argument. + * + * Return: -errno on failure, 0 on success. + */ +static int reset_cdx_device(struct device *dev, void *data) +{ + return cdx_dev_reset(dev); +} + /** * cdx_unregister_device - Unregister a CDX device * @dev: CDX device @@ -343,6 +357,7 @@ static DEVICE_ATTR_WO(remove); static ssize_t reset_store(struct device *dev, struct device_attribute *at= tr, const char *buf, size_t count) { + struct cdx_device *cdx_dev =3D to_cdx_device(dev); bool val; int ret; =20 @@ -352,11 +367,13 @@ static ssize_t reset_store(struct device *dev, struct= device_attribute *attr, if (!val) return -EINVAL; =20 - ret =3D cdx_dev_reset(dev); - if (ret) - return ret; + if (cdx_dev->is_bus) + /* Reset all the devices attached to cdx bus */ + ret =3D device_for_each_child(dev, NULL, reset_cdx_device); + else + ret =3D cdx_dev_reset(dev); =20 - return count; + return ret < 0 ? ret : count; } static DEVICE_ATTR_WO(reset); =20 @@ -461,6 +478,7 @@ static const struct attribute_group cdx_dev_group =3D { =20 static struct attribute *cdx_bus_dev_attrs[] =3D { &dev_attr_enable.attr, + &dev_attr_reset.attr, NULL, }; =20 --=20 2.34.1 From nobody Tue Dec 16 19:57:24 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 84E17CDB47E for ; Fri, 13 Oct 2023 06:10:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229732AbjJMGKk (ORCPT ); Fri, 13 Oct 2023 02:10:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54446 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229761AbjJMGKg (ORCPT ); Fri, 13 Oct 2023 02:10:36 -0400 Received: from NAM04-BN8-obe.outbound.protection.outlook.com (mail-bn8nam04on2088.outbound.protection.outlook.com [40.107.100.88]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E15E0F1 for ; Thu, 12 Oct 2023 23:10:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=FLquNI16CBrIgniz259COIcO3Qv1IxNu+dXlIRzTiNPvvgIFphswZC/ekRHNtgi8w472gkwdoxjQgS59qRgZHq3OTAuG2WIP1eGRYNb8PR5Nh5jNxaz+pIWYpXuZeYTxvhgLf4enKGzLFVKJf7HMo96qGxeBA9qYuouLAM0hGJHkh0BlvetvfJd4hDJzJrUPiirenrf1nWL9cIdGZXNiySWKFs6Ea+4OqOuYXdAalag6GPoThOyqsWvCyobmrSWvsNhpC2a4en0+t0DKE8jcoC5uKYO3Bp9ZhSkBqUYRaNcWog1dfkjxQeLf5v3nyE0/kGOWbpuvDn3m8xNxW6CJmQ== 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=QOcZ5fD/R9j9rqJ2fis6kIsIRpujPkeggo0S0QNn9sQ=; b=R11mez7B6AeQsO1aX+tIizsuAOxKgZ3cyY7XLY+rc47Zuc86YLAJ6oV60Krbf1XdWbz6YvQHmsN7nnYwhGu0rgmH71xfSnlhcLQdjEEtgUe8Uki9IkiHkOpR9hFg1vyGJLxPBQKw6WgFeqhqUf1VLLhDR5nlyuTwTQX4/pcuvkktepAqE/YdTaJXMPceKWFJJP4lsXVEdC0JbiC1VCZwRpK3u3QvBo0evncXYTcgUvNF40oUYx65lvWvTMx0lufaOKhEbHZ/h989N4EnuQxReS9LcrD3fzTWLEsTlbAVqc1XoWHVbMcSnSe3rgloOxwxJhC8NwtjEBcxFBkS1r/yvg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=linuxfoundation.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=QOcZ5fD/R9j9rqJ2fis6kIsIRpujPkeggo0S0QNn9sQ=; b=wEzroTUvZ9gLOdrjxNdOHaPgLBu02XzVLM/uXo3YrEXgU7m1+uO1GKJj5JSsv1ddodGyXa/xwUJxAYvO2kF+kU5qmq1bxdPxeuru3gOmzs/yObmgl/98r96LSElsgWxdjYfZ+6n4azoHfoHka21EJ0cKrGv6CA+O4zKdlMOB6Lc= Received: from MN2PR01CA0029.prod.exchangelabs.com (2603:10b6:208:10c::42) by CH3PR12MB8879.namprd12.prod.outlook.com (2603:10b6:610:171::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.37; Fri, 13 Oct 2023 06:10:29 +0000 Received: from MN1PEPF0000ECD8.namprd02.prod.outlook.com (2603:10b6:208:10c:cafe::7e) by MN2PR01CA0029.outlook.office365.com (2603:10b6:208:10c::42) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6886.29 via Frontend Transport; Fri, 13 Oct 2023 06:10:29 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB03.amd.com; pr=C Received: from SATLEXMB03.amd.com (165.204.84.17) by MN1PEPF0000ECD8.mail.protection.outlook.com (10.167.242.137) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.6838.22 via Frontend Transport; Fri, 13 Oct 2023 06:10:28 +0000 Received: from SATLEXMB06.amd.com (10.181.40.147) by SATLEXMB03.amd.com (10.181.40.144) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Fri, 13 Oct 2023 01:10:20 -0500 Received: from SATLEXMB03.amd.com (10.181.40.144) by SATLEXMB06.amd.com (10.181.40.147) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Fri, 13 Oct 2023 01:10:20 -0500 Received: from xhdipdslab59.xilinx.com (10.180.168.240) by SATLEXMB03.amd.com (10.181.40.144) with Microsoft SMTP Server id 15.1.2507.27 via Frontend Transport; Fri, 13 Oct 2023 01:10:12 -0500 From: Abhijit Gangurde To: , , CC: , , , , , Abhijit Gangurde , Nipun Gupta , "Pieter Jansen van Vuuren" Subject: [PATCH v6 6/6] cdx: add sysfs for subsystem, class and revision Date: Fri, 13 Oct 2023 11:38:50 +0530 Message-ID: <20231013060850.424929-7-abhijit.gangurde@amd.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231013060850.424929-1-abhijit.gangurde@amd.com> References: <20231013060850.424929-1-abhijit.gangurde@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN1PEPF0000ECD8:EE_|CH3PR12MB8879:EE_ X-MS-Office365-Filtering-Correlation-Id: 235bee5b-d9dd-484c-4a60-08dbcbb31973 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: peODY21wm3XB1r/cjWRkn9lnMaccwYOB/7A6WbblFp8NMC2Jg6sRYDH6nfBQ5J0dDEUGotVUeJA5jmMs3HSB2LKQ53H8aOTTbMxKojqekGoFlw+9qMnbirdyAvJO1LmHdStQrsRX4/amh/AeuW2gPuGPebB5c1tawllyl5ENshvgywZs/WID+DF050/jZWMzIvwrrWsxxkErUB7fyi8RefZNlBzrvP5w+ZS45tnz6y1VW6/m++fquGqdjKpyKKCq+9hxGIQxhUqRGeGyNmIuW4Dk8zhehXZD2xIkuRShSEd4m/KBhHw24ihCnC4Buu1rZHHSfufw3gr7Dl3+AHXvH1RzhPmGKUE7H1tpp2YYG8Ev8s0Up4k7XzF0rtkFYO/trwYroM35vlqnqDUMA7aPK8hEp1zsvvyGChUaHAhQ9fnYJ0+CRfAjDUB2Xg4ZgfUcZfjBnQ2ApMt/2PbCRR/nLYiH25GE9TcI0w7tfTkbMzF3++QCwt9qRPj1L2issrtXG2FAxTAYY6jAsG1QRUA/NA/lOjRDwkwJRHnN7Ih9gZ9CWOtrvEybd+1ZXsV+HcZl7dsSQiAY1eMtZiR0eaZaQ7HUVhX0DEPWiUrZ4Jt5E43W2BAoxZtjJT1g98WqJuKN/RaBv72gyIiHkC1ttjhyRTgujrMaw2MPkaIuDdSgN9Hl9jJZ8qyu5auoJLXCgzs1vEUUKioLZvrlx+HyMpKWJUGCf/MbHahk2J5EFTVZddip9LfMT16ic2S7As49sHzTyn3POgIqU3GECdcPAPv/vA== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB03.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230031)(4636009)(376002)(396003)(39860400002)(136003)(346002)(230922051799003)(1800799009)(82310400011)(451199024)(64100799003)(186009)(46966006)(36840700001)(40470700004)(26005)(336012)(426003)(1076003)(2616005)(83380400001)(6666004)(47076005)(40480700001)(478600001)(36756003)(8936002)(8676002)(41300700001)(4326008)(5660300002)(44832011)(82740400003)(356005)(30864003)(81166007)(2906002)(36860700001)(86362001)(54906003)(40460700003)(110136005)(70586007)(316002)(70206006)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Oct 2023 06:10:28.9158 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 235bee5b-d9dd-484c-4a60-08dbcbb31973 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB03.amd.com] X-MS-Exchange-CrossTenant-AuthSource: MN1PEPF0000ECD8.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR12MB8879 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" CDX controller provides subsystem vendor, subsystem device, class and revision info of the device along with vendor and device ID in native endian format. CDX Bus system uses this information to bind the cdx device to the cdx device driver. Co-developed-by: Puneet Gupta Signed-off-by: Puneet Gupta Co-developed-by: Nipun Gupta Signed-off-by: Nipun Gupta Signed-off-by: Abhijit Gangurde Reviewed-by: Pieter Jansen van Vuuren Tested-by: Nikhil Agarwal --- Changes in v6: - None Changes in v5: - None Changes in v4: - None Changes in v3: - None Changes in v2: - Improve documentation and commit message Documentation/ABI/testing/sysfs-bus-cdx | 45 +++++++++++++++++++++++++ drivers/cdx/cdx.c | 29 +++++++++++++++- drivers/cdx/cdx.h | 8 +++++ drivers/cdx/controller/mcdi_functions.c | 7 ++++ include/linux/cdx/cdx_bus.h | 27 +++++++++++++-- include/linux/mod_devicetable.h | 10 ++++++ scripts/mod/devicetable-offsets.c | 4 +++ scripts/mod/file2alias.c | 8 +++++ 8 files changed, 135 insertions(+), 3 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-bus-cdx b/Documentation/ABI/te= sting/sysfs-bus-cdx index c2c54abffed5..8c067ff99e54 100644 --- a/Documentation/ABI/testing/sysfs-bus-cdx +++ b/Documentation/ABI/testing/sysfs-bus-cdx @@ -28,6 +28,36 @@ Description: of a device manufacturer. Combination of Vendor ID and Device ID identifies a device. =20 +What: /sys/bus/cdx/devices/.../subsystem_vendor +Date: July 2023 +Contact: puneet.gupta@amd.com +Description: + Subsystem Vendor ID for this CDX device, in hexadecimal. + Subsystem Vendor ID is 16 bit identifier specific to the + card manufacturer. + +What: /sys/bus/cdx/devices/.../subsystem_device +Date: July 2023 +Contact: puneet.gupta@amd.com +Description: + Subsystem Device ID for this CDX device, in hexadecimal + Subsystem Device ID is 16 bit identifier specific to the + card manufacturer. + +What: /sys/bus/cdx/devices/.../class +Date: July 2023 +Contact: puneet.gupta@amd.com +Description: + This file contains the class of the CDX device, in hexadecimal. + Class is 24 bit identifier specifies the functionality of the device. + +What: /sys/bus/cdx/devices/.../revision +Date: July 2023 +Contact: puneet.gupta@amd.com +Description: + This file contains the revision field of the CDX device, in hexadecimal. + Revision is 8 bit revision identifier of the device. + What: /sys/bus/cdx/devices/.../enable Date: October 2023 Contact: abhijit.gangurde@amd.com @@ -67,3 +97,18 @@ Description: For example:: =20 # echo 1 > /sys/bus/cdx/devices/.../remove + +What: /sys/bus/cdx/devices/.../modalias +Date: July 2023 +Contact: nipun.gupta@amd.com +Description: + This attribute indicates the CDX ID of the device. + That is in the format: + cdx:vXXXXdXXXXsvXXXXsdXXXXcXXXXXX, + where: + + - vXXXX contains the vendor ID; + - dXXXX contains the device ID; + - svXXXX contains the subsystem vendor ID; + - sdXXXX contains the subsystem device ID; + - cXXXXXX contains the device class. diff --git a/drivers/cdx/cdx.c b/drivers/cdx/cdx.c index 5f713a83effa..d663f52560e9 100644 --- a/drivers/cdx/cdx.c +++ b/drivers/cdx/cdx.c @@ -179,7 +179,10 @@ cdx_match_one_device(const struct cdx_device_id *id, { /* Use vendor ID and device ID for matching */ if ((id->vendor =3D=3D CDX_ANY_ID || id->vendor =3D=3D dev->vendor) && - (id->device =3D=3D CDX_ANY_ID || id->device =3D=3D dev->device)) + (id->device =3D=3D CDX_ANY_ID || id->device =3D=3D dev->device) && + (id->subvendor =3D=3D CDX_ANY_ID || id->subvendor =3D=3D dev->subsyst= em_vendor) && + (id->subdevice =3D=3D CDX_ANY_ID || id->subdevice =3D=3D dev->subsyst= em_device) && + !((id->class ^ dev->class) & id->class_mask)) return id; return NULL; } @@ -329,6 +332,10 @@ static DEVICE_ATTR_RO(field) =20 cdx_config_attr(vendor, "0x%04x\n"); cdx_config_attr(device, "0x%04x\n"); +cdx_config_attr(subsystem_vendor, "0x%04x\n"); +cdx_config_attr(subsystem_device, "0x%04x\n"); +cdx_config_attr(revision, "0x%02x\n"); +cdx_config_attr(class, "0x%06x\n"); =20 static ssize_t remove_store(struct device *dev, struct device_attribute *attr, @@ -377,6 +384,17 @@ static ssize_t reset_store(struct device *dev, struct = device_attribute *attr, } static DEVICE_ATTR_WO(reset); =20 +static ssize_t modalias_show(struct device *dev, struct device_attribute *= attr, + char *buf) +{ + struct cdx_device *cdx_dev =3D to_cdx_device(dev); + + return sprintf(buf, "cdx:v%04Xd%04Xsv%04Xsd%04Xc%06X\n", cdx_dev->vendor, + cdx_dev->device, cdx_dev->subsystem_vendor, cdx_dev->subsystem_device, + cdx_dev->class); +} +static DEVICE_ATTR_RO(modalias); + static ssize_t driver_override_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) @@ -467,6 +485,11 @@ static struct attribute *cdx_dev_attrs[] =3D { &dev_attr_reset.attr, &dev_attr_vendor.attr, &dev_attr_device.attr, + &dev_attr_subsystem_vendor.attr, + &dev_attr_subsystem_device.attr, + &dev_attr_class.attr, + &dev_attr_revision.attr, + &dev_attr_modalias.attr, &dev_attr_driver_override.attr, NULL, }; @@ -604,6 +627,10 @@ int cdx_device_add(struct cdx_dev_params *dev_params) cdx_dev->req_id =3D dev_params->req_id; cdx_dev->vendor =3D dev_params->vendor; cdx_dev->device =3D dev_params->device; + cdx_dev->subsystem_vendor =3D dev_params->subsys_vendor; + cdx_dev->subsystem_device =3D dev_params->subsys_device; + cdx_dev->class =3D dev_params->class; + cdx_dev->revision =3D dev_params->revision; cdx_dev->bus_num =3D dev_params->bus_num; cdx_dev->dev_num =3D dev_params->dev_num; cdx_dev->cdx =3D dev_params->cdx; diff --git a/drivers/cdx/cdx.h b/drivers/cdx/cdx.h index 1f593deb4c9e..300ad8be7a34 100644 --- a/drivers/cdx/cdx.h +++ b/drivers/cdx/cdx.h @@ -16,22 +16,30 @@ * @parent: Associated CDX Bus device * @vendor: Vendor ID for CDX device * @device: Device ID for CDX device + * @subsys_vendor: Sub vendor ID for CDX device + * @subsys_device: Sub device ID for CDX device * @bus_num: Bus number for this CDX device * @dev_num: Device number for this device * @res: array of MMIO region entries * @res_count: number of valid MMIO regions * @req_id: Requestor ID associated with CDX device + * @class: Class of the CDX Device + * @revision: Revision of the CDX device */ struct cdx_dev_params { struct cdx_controller *cdx; struct device *parent; u16 vendor; u16 device; + u16 subsys_vendor; + u16 subsys_device; u8 bus_num; u8 dev_num; struct resource res[MAX_CDX_DEV_RESOURCES]; u8 res_count; u32 req_id; + u32 class; + u8 revision; }; =20 /** diff --git a/drivers/cdx/controller/mcdi_functions.c b/drivers/cdx/controll= er/mcdi_functions.c index 0e1e35d91242..65dca2aa1d3f 100644 --- a/drivers/cdx/controller/mcdi_functions.c +++ b/drivers/cdx/controller/mcdi_functions.c @@ -120,6 +120,13 @@ int cdx_mcdi_get_dev_config(struct cdx_mcdi *cdx, =20 dev_params->vendor =3D MCDI_WORD(outbuf, CDX_BUS_GET_DEVICE_CONFIG_OUT_VE= NDOR_ID); dev_params->device =3D MCDI_WORD(outbuf, CDX_BUS_GET_DEVICE_CONFIG_OUT_DE= VICE_ID); + dev_params->subsys_vendor =3D MCDI_WORD(outbuf, + CDX_BUS_GET_DEVICE_CONFIG_OUT_SUBSYS_VENDOR_ID); + dev_params->subsys_device =3D MCDI_WORD(outbuf, + CDX_BUS_GET_DEVICE_CONFIG_OUT_SUBSYS_DEVICE_ID); + dev_params->class =3D MCDI_DWORD(outbuf, + CDX_BUS_GET_DEVICE_CONFIG_OUT_DEVICE_CLASS) & 0xFFFFFF; + dev_params->revision =3D MCDI_BYTE(outbuf, CDX_BUS_GET_DEVICE_CONFIG_OUT_= DEVICE_REVISION); =20 return 0; } diff --git a/include/linux/cdx/cdx_bus.h b/include/linux/cdx/cdx_bus.h index 18e95076d1d5..cf9738e3a957 100644 --- a/include/linux/cdx/cdx_bus.h +++ b/include/linux/cdx/cdx_bus.h @@ -38,6 +38,19 @@ typedef int (*cdx_dev_configure_cb)(struct cdx_controlle= r *cdx, u8 bus_num, u8 dev_num, struct cdx_device_config *dev_config); =20 +/** + * CDX_DEVICE - macro used to describe a specific CDX device + * @vend: the 16 bit CDX Vendor ID + * @dev: the 16 bit CDX Device ID + * + * This macro is used to create a struct cdx_device_id that matches a + * specific device. The subvendor and subdevice fields will be set to + * CDX_ANY_ID. + */ +#define CDX_DEVICE(vend, dev) \ + .vendor =3D (vend), .device =3D (dev), \ + .subvendor =3D CDX_ANY_ID, .subdevice =3D CDX_ANY_ID + /** * CDX_DEVICE_DRIVER_OVERRIDE - macro used to describe a CDX device with * override_only flags. @@ -46,10 +59,12 @@ typedef int (*cdx_dev_configure_cb)(struct cdx_controll= er *cdx, * @driver_override: the 32 bit CDX Device override_only * * This macro is used to create a struct cdx_device_id that matches only a - * driver_override device. + * driver_override device. The subvendor and subdevice fields will be set = to + * CDX_ANY_ID. */ #define CDX_DEVICE_DRIVER_OVERRIDE(vend, dev, driver_override) \ - .vendor =3D (vend), .device =3D (dev), .override_only =3D (driver_overrid= e) + .vendor =3D (vend), .device =3D (dev), .subvendor =3D CDX_ANY_ID,\ + .subdevice =3D CDX_ANY_ID, .override_only =3D (driver_override) =20 /** * struct cdx_ops - Callbacks supported by CDX controller. @@ -88,6 +103,10 @@ struct cdx_controller { * @cdx: CDX controller associated with the device * @vendor: Vendor ID for CDX device * @device: Device ID for CDX device + * @subsystem_vendor: Subsystem Vendor ID for CDX device + * @subsystem_device: Subsystem Device ID for CDX device + * @class: Class for the CDX device + * @revision: Revision of the CDX device * @bus_num: Bus number for this CDX device * @dev_num: Device number for this device * @res: array of MMIO region entries @@ -107,6 +126,10 @@ struct cdx_device { struct cdx_controller *cdx; u16 vendor; u16 device; + u16 subsystem_vendor; + u16 subsystem_device; + u32 class; + u8 revision; u8 bus_num; u8 dev_num; struct resource res[MAX_CDX_DEV_RESOURCES]; diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetabl= e.h index b0678b093cb2..aa3c28781248 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h @@ -935,6 +935,12 @@ enum { * struct cdx_device_id - CDX device identifier * @vendor: Vendor ID * @device: Device ID + * @subvendor: Subsystem vendor ID (or CDX_ANY_ID) + * @subdevice: Subsystem device ID (or CDX_ANY_ID) + * @class: Device class + * Most drivers do not need to specify class/class_mask + * as vendor/device is normally sufficient. + * @class_mask: Limit which sub-fields of the class field are compared. * @override_only: Match only when dev->driver_override is this driver. * * Type of entries in the "device Id" table for CDX devices supported by @@ -943,6 +949,10 @@ enum { struct cdx_device_id { __u16 vendor; __u16 device; + __u16 subvendor; + __u16 subdevice; + __u32 class; + __u32 class_mask; __u32 override_only; }; =20 diff --git a/scripts/mod/devicetable-offsets.c b/scripts/mod/devicetable-of= fsets.c index abe65f8968dd..7a659aa3114a 100644 --- a/scripts/mod/devicetable-offsets.c +++ b/scripts/mod/devicetable-offsets.c @@ -265,6 +265,10 @@ int main(void) DEVID(cdx_device_id); DEVID_FIELD(cdx_device_id, vendor); DEVID_FIELD(cdx_device_id, device); + DEVID_FIELD(cdx_device_id, subvendor); + DEVID_FIELD(cdx_device_id, subdevice); + DEVID_FIELD(cdx_device_id, class); + DEVID_FIELD(cdx_device_id, class_mask); DEVID_FIELD(cdx_device_id, override_only); =20 return 0; diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index 7056751c29b1..2b28faca9585 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c @@ -1458,6 +1458,10 @@ static int do_cdx_entry(const char *filename, void *= symval, { DEF_FIELD(symval, cdx_device_id, vendor); DEF_FIELD(symval, cdx_device_id, device); + DEF_FIELD(symval, cdx_device_id, subvendor); + DEF_FIELD(symval, cdx_device_id, subdevice); + DEF_FIELD(symval, cdx_device_id, class); + DEF_FIELD(symval, cdx_device_id, class_mask); DEF_FIELD(symval, cdx_device_id, override_only); =20 switch (override_only) { @@ -1475,6 +1479,10 @@ static int do_cdx_entry(const char *filename, void *= symval, =20 ADD(alias, "v", vendor !=3D CDX_ANY_ID, vendor); ADD(alias, "d", device !=3D CDX_ANY_ID, device); + ADD(alias, "sv", subvendor !=3D CDX_ANY_ID, subvendor); + ADD(alias, "sd", subdevice !=3D CDX_ANY_ID, subdevice); + ADD(alias, "c", class_mask =3D=3D 0xFFFFFF, class); + return 1; } =20 --=20 2.34.1