From nobody Fri Dec 19 14:37:04 2025 Received: from CO1PR03CU002.outbound.protection.outlook.com (mail-westus2azon11010051.outbound.protection.outlook.com [52.101.46.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3DD2324503C; Thu, 6 Nov 2025 01:57:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.46.51 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762394276; cv=fail; b=SBk/Fcplsk5SDMj88DO0Yvr3PmDkAykma5k2+a4RuguU8PXJMFRKSa4FxGzLfHJechNKSzoFWn71oB+IRhV7RvyoiythYUh09+itUQLdBFU/gQZ0th3hZ4ERzSgztSO1oM7ZduHlmojVHYitxud6ZP6BBH3+EMAE+CxsHhCwnBg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762394276; c=relaxed/simple; bh=P/qmrtkXwYcFXV4HeeL1Y9Yrkt5V8oeK/Kp1L4VIY/Y=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Ab3XFXe/nncoT4IFSbc4o5JO52zROa8EtE+lhcyi4LxdgXIs8j8YneyU4sP+SDL9X8RJz4aMikeI6dZ6J5hVJ4odtHzG9MiYPXXhRsM3221UW6keCbpNusd/RWiuF8Oc5Sd2a9eehdr+FOxHFP9AVOph2N+K2yxLE2ehjmRB4gQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=r8XBpVM8; arc=fail smtp.client-ip=52.101.46.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="r8XBpVM8" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=OthZ0zyExA8iiISXP4U3huYOiYlHiITIQy0v0dDuMqZW5HSLOb984WEP0z5mZXtLAyCxLPDovp/eMrlgaJYP4QObOg96xt/rt1XVqNoWZGBSTcvYUa1L6MWRQ2bWot7VgOydXnNNTjXQltshQ1GeW6s88f52rV0Pcd8z+AwVjEsx8cfvSmHfmZe1V2FPtkayrNw/LqoUOkruvIabUUvmFmiv4mT7SnIEtAtqwIe5WCVCGQT9YrxfAj2UYGtrb06Tf41YguOreEghdyaQ9difb3fLC0snsb6eQWgQvDLyuO0PxqQepDhdSrZfr+WAWQl59c5NAczKrjTtGjRRPynfYA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=dcZx7XHjCpYDE8lzT0ZJmmyK37yShmPxFxPV2ZONuYI=; b=OZun/5X48FCvIAtcfkxxp4IfEaTQZY6TqgrhcgjzMD40oE+fu0ctUe5MtcvArYl9jPRK1cdN9GYbMed20ckStb/EJ6ItxOy6PXYQ9E1c1rgFNfIzdKHBnkzJV/CuBEwpMCA/guYHSotWiiDXXrQmbrpaWs4Bp0vqABtBstDV4m/8dbofwP/U4EPVkTnNjpZgrLdu2rXrF1cOVFe5L8ZESHFWx4N4chir8mXtk2+6NbN2tNSaU0f7KiFW547Gf4H8WLu3me89nmnpp9CpDkmXPRefqZnYYYQ36LXK0QEOmcOj3RHWIg4yn47rvVQSXUqEZ4DUZWM3iOYD5j5flq3tsA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.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 (0) 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=dcZx7XHjCpYDE8lzT0ZJmmyK37yShmPxFxPV2ZONuYI=; b=r8XBpVM8OHBwyHuMVx/Oj2vfFyM57kpYdYWf6Xp+RmT1JFTqBA34WrUlcmgfeuXG0vMqMSIw3j+5aQvrNKfjDFDTTsOUiRgzKZzXfDRA1woNUBJroO2WUFOQoepEz+5EHLQar2VpHipFdOaGkddZJOS8cCNeI67weJl/tDMXQPM= Received: from SJ0PR05CA0027.namprd05.prod.outlook.com (2603:10b6:a03:33b::32) by DS4PR12MB9612.namprd12.prod.outlook.com (2603:10b6:8:278::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9298.12; Thu, 6 Nov 2025 01:57:51 +0000 Received: from SJ5PEPF0000020A.namprd05.prod.outlook.com (2603:10b6:a03:33b:cafe::13) by SJ0PR05CA0027.outlook.office365.com (2603:10b6:a03:33b::32) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9298.7 via Frontend Transport; Thu, 6 Nov 2025 01:57:50 +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=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ5PEPF0000020A.mail.protection.outlook.com (10.167.244.43) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9298.6 via Frontend Transport; Thu, 6 Nov 2025 01:57:50 +0000 Received: from titanite-d354host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Wed, 5 Nov 2025 17:57:48 -0800 From: Avadhut Naik To: , CC: , , , , , , , Subject: [PATCH v2 1/3] EDAC/amd64: Generate ctl_name string at runtime Date: Thu, 6 Nov 2025 01:54:44 +0000 Message-ID: <20251106015727.1987246-2-avadhut.naik@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251106015727.1987246-1-avadhut.naik@amd.com> References: <20251106015727.1987246-1-avadhut.naik@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ5PEPF0000020A:EE_|DS4PR12MB9612:EE_ X-MS-Office365-Filtering-Correlation-Id: 9b5f9a6d-f357-49db-b96d-08de1cd7e465 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|82310400026|376014|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?lk6hc2pwlugGEGwbTHGx+oP1EnrfLSkFEXdvLsCg5qnKVyuo7kDj6ALAsMlJ?= =?us-ascii?Q?emvyMCvTkkgi7DELjrsFHw2lnoW7OTZQC3Zllc75N5bbWqi0nl0qMIeIvYgT?= =?us-ascii?Q?tjKIFPZKRMAq3SuHjFzuCQ3hJtbTQ2dpznO31VDf4vFs8jMT9sWL3KHw+qWQ?= =?us-ascii?Q?d8bq5IkiUa0AwbQKANw1NYAEU20dCKCkNiPn3LlyVnUsNu+WukWfkZWqXFVc?= =?us-ascii?Q?4SsmBSm4CyzUCSrMLm6PuzgZRk7fz1Lu1dIWitFPdW4yZu76TuheluYRcRvw?= =?us-ascii?Q?caYkNNAbGTOW5/48EdVD5w+nE+/povMP4QxTw2yHM/7PEDjyr0CKbDNctZHJ?= =?us-ascii?Q?5A1BzXCfOdYnX+CFHFp/xeA32NK4Un07ywmLp532JTYVZ+BLbn5E4N8gmZWS?= =?us-ascii?Q?e9dgtL265fPCC1/nHyDxxGZyZ/25CCjJqo2uqto9j4KFQ9AYUvjS+/xe3mDE?= =?us-ascii?Q?eSrjIx9abI6SMZ104cuLwDlOABBeeVbqD0gm/ina9lg5uiFgsPtxhi/eYkXL?= =?us-ascii?Q?dLeEjjS4Vw/hspRsfVR+7qlp1gFFEmp5EpvduP3jSM3mNRwAmIB0llFTLNjZ?= =?us-ascii?Q?lX8vqBu1TrCn/hbvVyvtPaqgZPIIWKVUELJLqDgwylaqMYBA6L3/gaSQ+MPd?= =?us-ascii?Q?LG4pRv6pzQVYLcCRbxq88aAr93FzPCOH3e3ihAf41A08NwH4GES9h+l57X45?= =?us-ascii?Q?zxp0+o6JwTMfk1h0TnS8id4OXMc8J1odpBI7yqK2SLttokOniKvOSqRjoJbp?= =?us-ascii?Q?Nax1zJ74mHVaECtA9MTHvZDB+p/Bmz3NPm1Xgyfg13eCKYRr+QN9aF1DxJ7O?= =?us-ascii?Q?nkZdzFebH1CcaywMzcy0YiIMGaD60THOSbdfXIPaow/YDG3OqPT/6IvMJIsg?= =?us-ascii?Q?W0oyyIi5lsIUZWLOHyuuFkhkhza0IxhnyFux+gyeoDV39Bz25DpaB+wH9B9x?= =?us-ascii?Q?+TK9dyPuEkHIV23Mvu9YG6cpYitHpxiqgOwIjfrUflvM6K26G/tcSRhBXoJH?= =?us-ascii?Q?eSTmNaeu6JYB6xpvI3zSL6ELFRz3ZXQDFjPWoycsQ+0oOiMd/R5cwWTH0xH2?= =?us-ascii?Q?TuU8Gd7U7UQjLDIeNjjtt9aqYmp0Og+mtQmq+MbWeXXFH/Nlp1KQlae8pZ5d?= =?us-ascii?Q?9fWegu+K/fVRYcsgxPT30ij0/OM2UcL+oj3ocN3ZVbN8nkGH2y90xS60I1JZ?= =?us-ascii?Q?C8l3KLhlCH4lhgX8M6F+HRcbrErUe/JrmMa705jcxMqBfep3Fw7qObOiVq6k?= =?us-ascii?Q?5oGxnK970OiWB6TEWN6XeREUiHvhr5tMevN4KbN9YlSYWSHble6yqXAxK+51?= =?us-ascii?Q?uBBmA0Cg4CZ3zS/gxIdaaXdt2CoJKCrCmnWT5MZTWb6KZezNdhxvInHRY//j?= =?us-ascii?Q?h8Iiyk/i+kNLwVH6poBTUBbys3uJTdy2DOnMAE68OR8XkdVe2UHKQkxltFci?= =?us-ascii?Q?Ow3jnU2Eua3W//rJ+J4tiYoxS9cLtYRMlLJ+96QEtUy8zz55utRelqhRW+u1?= =?us-ascii?Q?t3bgCEnM2hib+mBNf4nFFAi9UDda5E87KwINgeimqLFAACeCSyxyPu0My5X8?= =?us-ascii?Q?n7KshcWixztA/AWL2ww=3D?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700013)(82310400026)(376014)(1800799024);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Nov 2025 01:57:50.7266 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 9b5f9a6d-f357-49db-b96d-08de1cd7e465 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=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ5PEPF0000020A.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS4PR12MB9612 Content-Type: text/plain; charset="utf-8" Currently, the ctl_name string is statically assigned based on the family and model of the SOC when the amd64_edac module is loaded. The same, however, is not exactly needed as the string can be generated and assigned at runtime through scnprintf(). Remove all static assignments and generate the string at runtime. Also, cleanup the switch cases which became defunct and consolidate identical cases. Signed-off-by: Avadhut Naik --- drivers/edac/amd64_edac.c | 56 +++++++-------------------------------- drivers/edac/amd64_edac.h | 4 ++- 2 files changed, 13 insertions(+), 47 deletions(-) diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index 2f6ab783bf20..886ad075d222 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c @@ -3766,6 +3766,7 @@ static int per_family_init(struct amd64_pvt *pvt) pvt->stepping =3D boot_cpu_data.x86_stepping; pvt->model =3D boot_cpu_data.x86_model; pvt->fam =3D boot_cpu_data.x86; + char *tmp_name =3D NULL; pvt->max_mcs =3D 2; =20 /* @@ -3779,7 +3780,7 @@ static int per_family_init(struct amd64_pvt *pvt) =20 switch (pvt->fam) { case 0xf: - pvt->ctl_name =3D (pvt->ext_model >=3D K8_REV_F) ? + tmp_name =3D (pvt->ext_model >=3D K8_REV_F) ? "K8 revF or later" : "K8 revE or earlier"; pvt->f1_id =3D PCI_DEVICE_ID_AMD_K8_NB_ADDRMAP; pvt->f2_id =3D PCI_DEVICE_ID_AMD_K8_NB_MEMCTL; @@ -3788,7 +3789,6 @@ static int per_family_init(struct amd64_pvt *pvt) break; =20 case 0x10: - pvt->ctl_name =3D "F10h"; pvt->f1_id =3D PCI_DEVICE_ID_AMD_10H_NB_MAP; pvt->f2_id =3D PCI_DEVICE_ID_AMD_10H_NB_DRAM; pvt->ops->dbam_to_cs =3D f10_dbam_to_chip_select; @@ -3797,12 +3797,10 @@ static int per_family_init(struct amd64_pvt *pvt) case 0x15: switch (pvt->model) { case 0x30: - pvt->ctl_name =3D "F15h_M30h"; pvt->f1_id =3D PCI_DEVICE_ID_AMD_15H_M30H_NB_F1; pvt->f2_id =3D PCI_DEVICE_ID_AMD_15H_M30H_NB_F2; break; case 0x60: - pvt->ctl_name =3D "F15h_M60h"; pvt->f1_id =3D PCI_DEVICE_ID_AMD_15H_M60H_NB_F1; pvt->f2_id =3D PCI_DEVICE_ID_AMD_15H_M60H_NB_F2; pvt->ops->dbam_to_cs =3D f15_m60h_dbam_to_chip_select; @@ -3811,7 +3809,6 @@ static int per_family_init(struct amd64_pvt *pvt) /* Richland is only client */ return -ENODEV; default: - pvt->ctl_name =3D "F15h"; pvt->f1_id =3D PCI_DEVICE_ID_AMD_15H_NB_F1; pvt->f2_id =3D PCI_DEVICE_ID_AMD_15H_NB_F2; pvt->ops->dbam_to_cs =3D f15_dbam_to_chip_select; @@ -3822,12 +3819,10 @@ static int per_family_init(struct amd64_pvt *pvt) case 0x16: switch (pvt->model) { case 0x30: - pvt->ctl_name =3D "F16h_M30h"; pvt->f1_id =3D PCI_DEVICE_ID_AMD_16H_M30H_NB_F1; pvt->f2_id =3D PCI_DEVICE_ID_AMD_16H_M30H_NB_F2; break; default: - pvt->ctl_name =3D "F16h"; pvt->f1_id =3D PCI_DEVICE_ID_AMD_16H_NB_F1; pvt->f2_id =3D PCI_DEVICE_ID_AMD_16H_NB_F2; break; @@ -3836,76 +3831,51 @@ static int per_family_init(struct amd64_pvt *pvt) =20 case 0x17: switch (pvt->model) { - case 0x10 ... 0x2f: - pvt->ctl_name =3D "F17h_M10h"; - break; case 0x30 ... 0x3f: - pvt->ctl_name =3D "F17h_M30h"; pvt->max_mcs =3D 8; break; - case 0x60 ... 0x6f: - pvt->ctl_name =3D "F17h_M60h"; - break; - case 0x70 ... 0x7f: - pvt->ctl_name =3D "F17h_M70h"; - break; default: - pvt->ctl_name =3D "F17h"; break; } break; =20 case 0x18: - pvt->ctl_name =3D "F18h"; break; =20 case 0x19: switch (pvt->model) { case 0x00 ... 0x0f: - pvt->ctl_name =3D "F19h"; pvt->max_mcs =3D 8; break; case 0x10 ... 0x1f: - pvt->ctl_name =3D "F19h_M10h"; pvt->max_mcs =3D 12; pvt->flags.zn_regs_v2 =3D 1; break; - case 0x20 ... 0x2f: - pvt->ctl_name =3D "F19h_M20h"; - break; case 0x30 ... 0x3f: if (pvt->F3->device =3D=3D PCI_DEVICE_ID_AMD_MI200_DF_F3) { - pvt->ctl_name =3D "MI200"; + tmp_name =3D "MI200"; pvt->max_mcs =3D 4; pvt->dram_type =3D MEM_HBM2; pvt->gpu_umc_base =3D 0x50000; pvt->ops =3D &gpu_ops; } else { - pvt->ctl_name =3D "F19h_M30h"; pvt->max_mcs =3D 8; } break; - case 0x50 ... 0x5f: - pvt->ctl_name =3D "F19h_M50h"; - break; case 0x60 ... 0x6f: - pvt->ctl_name =3D "F19h_M60h"; pvt->flags.zn_regs_v2 =3D 1; break; case 0x70 ... 0x7f: - pvt->ctl_name =3D "F19h_M70h"; pvt->max_mcs =3D 4; pvt->flags.zn_regs_v2 =3D 1; break; case 0x90 ... 0x9f: - pvt->ctl_name =3D "F19h_M90h"; pvt->max_mcs =3D 4; pvt->dram_type =3D MEM_HBM3; pvt->gpu_umc_base =3D 0x90000; pvt->ops =3D &gpu_ops; break; case 0xa0 ... 0xaf: - pvt->ctl_name =3D "F19h_MA0h"; pvt->max_mcs =3D 12; pvt->flags.zn_regs_v2 =3D 1; break; @@ -3915,34 +3885,22 @@ static int per_family_init(struct amd64_pvt *pvt) case 0x1A: switch (pvt->model) { case 0x00 ... 0x1f: - pvt->ctl_name =3D "F1Ah"; pvt->max_mcs =3D 12; pvt->flags.zn_regs_v2 =3D 1; break; case 0x40 ... 0x4f: - pvt->ctl_name =3D "F1Ah_M40h"; pvt->flags.zn_regs_v2 =3D 1; break; case 0x50 ... 0x57: - pvt->ctl_name =3D "F1Ah_M50h"; + case 0xc0 ... 0xc7: pvt->max_mcs =3D 16; pvt->flags.zn_regs_v2 =3D 1; break; case 0x90 ... 0x9f: - pvt->ctl_name =3D "F1Ah_M90h"; - pvt->max_mcs =3D 8; - pvt->flags.zn_regs_v2 =3D 1; - break; case 0xa0 ... 0xaf: - pvt->ctl_name =3D "F1Ah_MA0h"; pvt->max_mcs =3D 8; pvt->flags.zn_regs_v2 =3D 1; break; - case 0xc0 ... 0xc7: - pvt->ctl_name =3D "F1Ah_MC0h"; - pvt->max_mcs =3D 16; - pvt->flags.zn_regs_v2 =3D 1; - break; } break; =20 @@ -3951,6 +3909,12 @@ static int per_family_init(struct amd64_pvt *pvt) return -ENODEV; } =20 + if (tmp_name) + scnprintf(pvt->ctl_name, sizeof(pvt->ctl_name), tmp_name); + else + scnprintf(pvt->ctl_name, sizeof(pvt->ctl_name), "F%02Xh_M%02Xh", + pvt->fam, pvt->model); + return 0; } =20 diff --git a/drivers/edac/amd64_edac.h b/drivers/edac/amd64_edac.h index d70b8a8d0b09..4ec6133d5179 100644 --- a/drivers/edac/amd64_edac.h +++ b/drivers/edac/amd64_edac.h @@ -101,6 +101,8 @@ #define ON true #define OFF false =20 +#define MAX_CTL_NAMELEN 19 + /* * PCI-defined configuration space registers */ @@ -362,7 +364,7 @@ struct amd64_pvt { /* x4, x8, or x16 syndromes in use */ u8 ecc_sym_sz; =20 - const char *ctl_name; + char ctl_name[MAX_CTL_NAMELEN]; u16 f1_id, f2_id; /* Maximum number of memory controllers per die/node. */ u8 max_mcs; --=20 2.43.0 From nobody Fri Dec 19 14:37:04 2025 Received: from PH0PR06CU001.outbound.protection.outlook.com (mail-westus3azon11011017.outbound.protection.outlook.com [40.107.208.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 692A2223DE7; Thu, 6 Nov 2025 01:58:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.208.17 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762394293; cv=fail; b=lOUIO4PouUFgLraBv4Je7XpP2xkoP7vzWcUdFIDq98wdetUdZw5f0GSiVRY6bAFN8t2ocE++1Fhd+D53hS0HLA22QPv1gntjgTnorBcbwJfaPDHvMniKl+o6fnP4BQYCQkd11zhQXN5oV2bzySRm+UG0XO/yYp8kfk/pFWhMyWw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762394293; c=relaxed/simple; bh=ukcBiMPnSSNdpv8r09MLpqlK7gApSWRur6F7hrnlUGM=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=h6xgojhrQkGvjj+jn4xIIWtxLr7L/m8cldXEEmeMa8A07Mgwuvzi6qISfodFXe9+9oT60Ul9l6LX2JEuTzxayXob1MjA7sbiLgFz/UF/I/6mvD8W9+OP0CUrfaRFHog3qJ1L6rmpFZZX8BSA6Ws4zcYAfoSbEkRMkE6KOM2shcY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=vCcuyRZ+; arc=fail smtp.client-ip=40.107.208.17 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="vCcuyRZ+" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=U4uFv4jkMKj6KnrxKIzb7zuVEal40juYJ4zpyfyQA6iAUChCkSPT56JGetDgkCGMxIstuYfO3wi5Xyc0SQET0u+RAmrnBwH1sAKlFC/J+3PB2tB6vdL5mejDzkQJj78uPZL+3yJSiA/czusp41A1FGWq+r3393vYhfnIbBfV6Uip04rBQjavBlMJt8vdWjGg8h+mhLtC0yV9F1EdV1Z5VUC8ERD+cMC0yX/Rwi6SrIl6vbWzHNIdXVr+ILA/EIfYKm9e0UMDyzgC5woeH+6GeZokia6Eu9qaP2BVrInnln55b7zwqYXu3jOnO8NGLJvQU6bjCAw/aFELs0zLoeCD2Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=yQixXkCQ3sE2uZG9qdOUmFOpIl8zK/eUoHx2xVxh+ak=; b=dSdBnxFhqWK5E4zD/TKg6YPGtwHG5jYO/METPJcfxN4VNv3526hrZq8l4YwatD8x4ldN8bc0UIVwEoDGi9afNEDqJix7o1Zwr+AfQlg9VD9CPUzxPpT8l/feYCyygyxhk5o0vCGg7uDAnsARM8mi3CUUh/b86MrJVl11HgjPBBV6p/uS3ceMf6lVICfZw93IX7sAZ74SYzpAcX3m2RJFpPbadRfRadJvMpqbL6NZVJ0b0mYlf86lXp2XSVA7owHw3tKzTeGjduG3A5QUNGJYRSb6GbTqIzdsuYtkSa5AmOAKzFKHF6FMDHHUBq/WHMlxc2vD8e/jL81HGi4g5AG1aw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.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 (0) 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=yQixXkCQ3sE2uZG9qdOUmFOpIl8zK/eUoHx2xVxh+ak=; b=vCcuyRZ+7qHPZnS+0g+U1Dn5wTDQx+VaqDKPZphICT45mKoj5Ym2Mwf0RSfh2ZKoeAPps+gV/CLO/mTyN3AmrmbDeL6ADyxKQeMuz7/OQN+JJH6m4bGmtHB1M3Huj4KiRUCYDy575VsRVamKrN5+CRsNrWe369YNPs73u0zhlb8= Received: from BY5PR04CA0022.namprd04.prod.outlook.com (2603:10b6:a03:1d0::32) by SN7PR12MB6741.namprd12.prod.outlook.com (2603:10b6:806:26f::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9275.16; Thu, 6 Nov 2025 01:58:06 +0000 Received: from SJ5PEPF00000209.namprd05.prod.outlook.com (2603:10b6:a03:1d0:cafe::e) by BY5PR04CA0022.outlook.office365.com (2603:10b6:a03:1d0::32) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9298.7 via Frontend Transport; Thu, 6 Nov 2025 01:58:00 +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=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ5PEPF00000209.mail.protection.outlook.com (10.167.244.42) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9298.6 via Frontend Transport; Thu, 6 Nov 2025 01:58:05 +0000 Received: from titanite-d354host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Wed, 5 Nov 2025 17:58:00 -0800 From: Avadhut Naik To: , CC: , , , , , , , Subject: [PATCH v2 2/3] EDAC/amd64: Remove NUM_CONTROLLERS macro Date: Thu, 6 Nov 2025 01:54:45 +0000 Message-ID: <20251106015727.1987246-3-avadhut.naik@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251106015727.1987246-1-avadhut.naik@amd.com> References: <20251106015727.1987246-1-avadhut.naik@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ5PEPF00000209:EE_|SN7PR12MB6741:EE_ X-MS-Office365-Filtering-Correlation-Id: 277d7889-e52c-44fc-3d50-08de1cd7ed4f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|36860700013|1800799024|82310400026; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?YryYJQMFzW3B1XVQb88pegdajAF8k2E5JbHpTMMxKqnfpEdb4RRjul7c8pBT?= =?us-ascii?Q?h/HusqF26QTprHRyghjSL05K14Jhd8IEQs5UhfC+mBuidTyeF+aE1Z2ZEuQZ?= =?us-ascii?Q?oS17w69QRsxtikjieY909jOO0J0nZlLbByXIg30YVVuaCEewQ+9dI5HOy2w5?= =?us-ascii?Q?Hj3UNBRCLPHpaGgaCn64GpnA031r8nwyBddKT1spqm4Q6Uy8LSfovtW8mi36?= =?us-ascii?Q?tHOFtrUSjTzOf9RjE1m62YDqY6iYGH/ZjmtHxa0qKDSNRzvBi1opaN/zNPBi?= =?us-ascii?Q?wmi4ruoNfSwChNYA0REeJtib6fdKj4LvI4xhJw0ws1lTvO8/keQg5SIr/MRt?= =?us-ascii?Q?qLY+ziTGttGHf6UBJPbLNpYRpeLuJ3pTyQWslQVPU6Ilp7G70UmMpTl+t8uS?= =?us-ascii?Q?RpKCmVqIpVYpQWEa9KkT63oa31T4TSSWEeQrP/wmNZuVVgwx6dnzb2dbjsL+?= =?us-ascii?Q?ko/cvHyGDeChCfEOXYzpVqWrE+XXC/WD4hZBzlVWe8+q/PKlKWsfb2yWVbDG?= =?us-ascii?Q?pmacZL+N4MFQFw6FPoRuEr9bCXMZMYb23HAg2cVh0OlMkLuqmaj68Qj86TEX?= =?us-ascii?Q?xGl33nEYGC3hIIKuvJBbM4pn5+0sW1LY22aMeSKOA9YAp5FDOVkArKOk4JGq?= =?us-ascii?Q?m9eqBL+y6ClZ3X/iKEoIukTyHl84VaxcOg61OdwmSKMOCPGIjGOUJjAV3iuo?= =?us-ascii?Q?mmpd1jpDXI3nwCTPhH7lj160/ULGItKejd1HxCKKoIm+vIZhsmWavNj5BJnB?= =?us-ascii?Q?XRTicoTkQebXF+XThAl7JGI2ea9oStQ7xuCAwPF5RmoCpQQxSmRsAvpQluU4?= =?us-ascii?Q?Tx+lc3SZfGHV0ruipBz3auZGv+xBNOKwj/2pgDvLE/vQ57hGqTjkyY6NhNId?= =?us-ascii?Q?26EC9L+QX5i059yJ34Oz26UMpbNLwCFVL1SKU6ysH6HhqkwyTveDKoesMxIH?= =?us-ascii?Q?jpLDtyQ06h+wR4pLxPI/XEkGEf9H+kOhCqH+/9lgqli+0rYwnjE/FrM30kLp?= =?us-ascii?Q?rHGWJVOLzDXwGk2Yc1JXAWC9LQv9BQr2dOf5sR/70H/iunHOKy1Yeqq51Gih?= =?us-ascii?Q?7+1CGC+e20aSM1E2DtZkJUgYDKpJ7yq4aPWbJHLmK74WdNA/hraU3QH0Xi5q?= =?us-ascii?Q?U1q/7tvaPhoisdJNvNv0oi87asDhbg4wNM21CRtx4j/zyh9Ra0KW66fQEc3u?= =?us-ascii?Q?eIaUt0Ye8Ip90ofOVPejH1I86XjYHiXRTlMXotJH0IDx9/iGI2YI/3Ffuda2?= =?us-ascii?Q?PmDvDTnYdi+jox8weBelAzHtJU77+6a8lyeltTDXu87cnlUWGPniiJyhlFsC?= =?us-ascii?Q?yUyUE1dDhZcnJIbC4fCk1/3D7yML8KR7x24Xpv3bTDEcniA/ib/oYHy6hzMJ?= =?us-ascii?Q?lJHKfwIRq4tLI6ADZuqsgQJZ+5bFB+DrbsF447bxxlOkaAzmEl07rrS00xV2?= =?us-ascii?Q?MCWYs+gx8l4URtmvMZUZ2WYbcKh4/0pVx7fEn00WvFNCCyOe5OfqcTazVKSn?= =?us-ascii?Q?eMaE92VJWv5oRT/hcTB5qUyovfI9Rfo0J/ftxs4FOWSh81pNH0c+TAK9U022?= =?us-ascii?Q?7dXrsm31/oMeMJI/qK4=3D?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(376014)(36860700013)(1800799024)(82310400026);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Nov 2025 01:58:05.6795 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 277d7889-e52c-44fc-3d50-08de1cd7ed4f 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=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ5PEPF00000209.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR12MB6741 Content-Type: text/plain; charset="utf-8" Currently, the NUM_CONTROLLERS macro is used to limit the amount of memory controllers (UMCs) available per node. The number of UMCs available per node, however, is already cached by the max_mcs variable of struct amd64_pvt. Allocate the relevant data structures dynamically using the variable instead of static allocation through the macro. The max_mcs variable is used for legacy systems too. These systems have a max of 2 controllers. Since the default value of max_mcs, set in per_family_init(), is 2, these legacy systems are also covered by this change. Signed-off-by: Avadhut Naik --- drivers/edac/amd64_edac.c | 5 +++++ drivers/edac/amd64_edac.h | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index 886ad075d222..2391f3469961 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c @@ -3732,6 +3732,7 @@ static void hw_info_put(struct amd64_pvt *pvt) pci_dev_put(pvt->F1); pci_dev_put(pvt->F2); kfree(pvt->umc); + kfree(pvt->csels); } =20 static struct low_ops umc_ops =3D { @@ -3915,6 +3916,10 @@ static int per_family_init(struct amd64_pvt *pvt) scnprintf(pvt->ctl_name, sizeof(pvt->ctl_name), "F%02Xh_M%02Xh", pvt->fam, pvt->model); =20 + pvt->csels =3D kcalloc(pvt->max_mcs, sizeof(*pvt->csels), GFP_KERNEL); + if (!pvt->csels) + return -ENOMEM; + return 0; } =20 diff --git a/drivers/edac/amd64_edac.h b/drivers/edac/amd64_edac.h index 4ec6133d5179..1757c1b99fc8 100644 --- a/drivers/edac/amd64_edac.h +++ b/drivers/edac/amd64_edac.h @@ -96,7 +96,6 @@ /* Hardware limit on ChipSelect rows per MC and processors per system */ #define NUM_CHIPSELECTS 8 #define DRAM_RANGES 8 -#define NUM_CONTROLLERS 16 =20 #define ON true #define OFF false @@ -348,7 +347,7 @@ struct amd64_pvt { u32 dbam1; /* DRAM Base Address Mapping reg for DCT1 */ =20 /* one for each DCT/UMC */ - struct chip_select csels[NUM_CONTROLLERS]; + struct chip_select *csels; =20 /* DRAM base and limit pairs F1x[78,70,68,60,58,50,48,40] */ struct dram_range ranges[DRAM_RANGES]; --=20 2.43.0 From nobody Fri Dec 19 14:37:04 2025 Received: from DM5PR21CU001.outbound.protection.outlook.com (mail-centralusazon11011019.outbound.protection.outlook.com [52.101.62.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DF701225A3B; Thu, 6 Nov 2025 01:58:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.62.19 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762394314; cv=fail; b=RAMtNzkZXae7E/L4M1AjKB1WGtRn5d3gQtGTWavoh2nxH7ZiCiqzwshSSUXfSQPnq3DTORblEuhF58/nAQz5YbKd5THLloNN2eIadlyFCXYaN9XLXY2v2wjEjTID8CPszRohva84OslQeQ2/6hTtBE2roxx5TzYuS6bX5TGb+Fo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762394314; c=relaxed/simple; bh=NfhaJG9ii6Uaft/bLorOB+BxKSIQaMoOVknenMkHorI=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=B1JqrlyhQYedgraqq47vjBP43wOKv14yhPgVf3VJgM+ckrUKTha54fJ/haNsV4ZeCp1LAOapfVSBS5jgtZRzg/HrJTp6eLPAkQh5D3p7kNkSGgVD+Cj2BaKXoRP3Dl60hqsB39hcJbDkMtGZNxpdrbs5m0+bOXY9rBBVs/QETe8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=mbIGtQ4e; arc=fail smtp.client-ip=52.101.62.19 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="mbIGtQ4e" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=r1hagYw0XOnxXGKAAshYxg587WWzCtgs8K/5BEEAXe/wSSFpHNLgwQwOKRiHkv1Hl9xv4XQAc7ZJCfyyudnocpRyCyT7Dl5j3wQavM3607lMoDK+C1yrceuIMWCeANwUhOsahkzPoJt1I3mlESuxGlXn/nbEv/HDl7PWBypwVZ7XVvaWBmI4tWyG2xeT659TqHWpe/i0oQtBdcmW5DGR4/DVDf6vrWAaltm1+y1vygV7NldtLaW07OJPCNpYTGWV6YibhQLy9gwW4kxITWpvN6Y7KHPUfwahaYCW1v95dH3ZljtVE3q1jHjVhVIB2labqqG8pMyGw/m5dI7xgWM0/w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=IKYQMoic+eCO+qq/0uxqKeDYa9UKDe5NjU1JQoV+15A=; b=S9Q3wXq9yH66wdm6TRzOoBbp4XK+TPB7JXVL/dl93E1+eyPjv6VZtTVqnwiXo+7NJgIya5nJWsrjZ9dOVDaVNvChjWmyRFG8ZUPQXjhKqBenoeO4/uEftqj4bGinNsampbrpSCnx+8iDfbXEi5LHZqMnvolTFV4JWIt/nhyi1t9y6gZrUqJii0IH8uD2FegUHOU7x5xXo2/lai06HRp30lI7pRgN7eAeq8W4TE6eH3XHQi3vOH8ZFYrEw56yKOglqvkrMt9ae2Nj1jG0pIWBpugdvlmkv9D3T0NUPH51hloL0wV8Ks/D+8uq1Ee6rqAsxjx5qhf1wPuGpEqTgmFwNA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.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 (0) 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=IKYQMoic+eCO+qq/0uxqKeDYa9UKDe5NjU1JQoV+15A=; b=mbIGtQ4e/5/0r1X/iWphcjit0vkfr7MMksBNJsewspfQCQzAp0llwkcUO3MXcHnrzROf7cVn6NAXZoVjhDldC5wFg4vlEW4aRhTaRWUwzJ0QV1kNeKcoM3/pnBEqNSrrf8IhHzWan1gcbbhS1+dRYD36c97/yacpEe6/4kRs9HU= Received: from BY5PR04CA0007.namprd04.prod.outlook.com (2603:10b6:a03:1d0::17) by LV8PR12MB9083.namprd12.prod.outlook.com (2603:10b6:408:18c::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9298.9; Thu, 6 Nov 2025 01:58:23 +0000 Received: from SJ5PEPF00000209.namprd05.prod.outlook.com (2603:10b6:a03:1d0:cafe::cc) by BY5PR04CA0007.outlook.office365.com (2603:10b6:a03:1d0::17) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9298.7 via Frontend Transport; Thu, 6 Nov 2025 01:58:20 +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=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ5PEPF00000209.mail.protection.outlook.com (10.167.244.42) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9298.6 via Frontend Transport; Thu, 6 Nov 2025 01:58:23 +0000 Received: from titanite-d354host.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Wed, 5 Nov 2025 17:58:11 -0800 From: Avadhut Naik To: , CC: , , , , , , , Subject: [PATCH v2 3/3] edac: Remove the legacy EDAC sysfs interface Date: Thu, 6 Nov 2025 01:54:46 +0000 Message-ID: <20251106015727.1987246-4-avadhut.naik@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251106015727.1987246-1-avadhut.naik@amd.com> References: <20251106015727.1987246-1-avadhut.naik@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ5PEPF00000209:EE_|LV8PR12MB9083:EE_ X-MS-Office365-Filtering-Correlation-Id: de9c5318-eaf2-4e6b-071b-08de1cd7f7c0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|82310400026|30052699003|376014|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?WWT7tyiPC/bNPAnvi1NTTuEhuMbHVZkMFhc7daM98QmWSbYz9Lob6dparD5I?= =?us-ascii?Q?6JOlzvRkzYT1tByUUqhlyfgKux/HwQhrajsVcSsWlMzaLHi/zWrUaFmzGPH+?= =?us-ascii?Q?RuUPgRPuylMVDqjdhxaLZK6XJmgMTZdynwwPiGltCUKjWYKFm4w/S2FQCoKo?= =?us-ascii?Q?yTzV5zMxuMMucmfpZbhRmutNPs13a+kBK0zHV+VAzgi276TRuYGQm5iohig5?= =?us-ascii?Q?s5zmdFFRLtYIeUS/1vo9TwYUgsxeCGpulZBb7Y3ZJX5hw8+H5p0nuig2VeOM?= =?us-ascii?Q?RLOb//mDNP14NvVs0ye+PCwcnsnLBeRrLHTwMcbE2Xd7KSWz/EpAxatwG3Eh?= =?us-ascii?Q?DBxVm+PSIlCR0meSpQcKacVaVEjkrb4whvbp5HF2cyqDYSDYlc6zhA2QNiew?= =?us-ascii?Q?p9vBgJS2atqzMOXoyigFNg/oChs7l9hstFDwcLtF/0z9eXr1h5gvyCsDKPlG?= =?us-ascii?Q?1TpA4+2qp9UQt0EP1F+TKrtjlKw06HfuxMOTWIfWybHYDLVU8mFqyho6M4BD?= =?us-ascii?Q?9P47UqH25nQAkGZjYuRrw6h92Jm5K4EdKNx7r3NGOVNdNILJqn7W5wVXGbpI?= =?us-ascii?Q?yU99PZirvzu74u0BABFjMBJ5eRX9i4XBOo2BU0KEjSu2XsCUT3FPipwZw6Tj?= =?us-ascii?Q?/KH2zIbzxXbUzuHV7XeoRfwBWcuLWJPOkHAuBmBIvyQpc0skdrqkUgevIJ77?= =?us-ascii?Q?0YXfMwlyY4YbQPU9L0abfO7PSNNOQommS31dOkacPugQOa0ufYsLq/oxUHdp?= =?us-ascii?Q?9pCuAOj/We79yPXw5onX9ZURQpGHBcwvFn6vvbGaUjJShF5XZqV2hm9A639I?= =?us-ascii?Q?SvPQop+5vV4IaYc2AyNtCNiKNvHWRM9yZ0RkjBXMDn/jkJF/8EpiHr6BnNtB?= =?us-ascii?Q?BBhVxIUEg+w96M4w0V6jcyEQULrzglZAc+TrA1h99a1/U5LGnYQj1rBHUAF8?= =?us-ascii?Q?0GixfnJT613T/8X9Qrp8P2M0AyQx+jnOzdkrt4YDxi+ko2ypn2737vY8qhh+?= =?us-ascii?Q?Iunad1/9/Iu/ZSo6VLtYvkjTkZfs8GUu2u7rljFmQ8vWfR1nus4yaMbqzn76?= =?us-ascii?Q?Y8+ADpnkqYQTaqZ6LtEVUB9uh4tAiLCUSfnHcdz/mkMC3/WTxEoSCJg4+WBT?= =?us-ascii?Q?PXeXCYv7aFRrLXW06YjkZ9gHB3DVyi4jON6WUhglvN+fC7O/sjn2802BtkcU?= =?us-ascii?Q?wlIzGoCMPSvriEL8qve1LTECHiNTUiSkQy6JURrUQJH3XSRTJ4TQeg8iLNI6?= =?us-ascii?Q?nn2D7g0M6YimJeB7GHvGbDJ7NtuFPOV0rFUKgU6XXOm6LVp54J5v6eOiEbvU?= =?us-ascii?Q?7n5jf6v8a8FoLEI2MQ+wLMna4xobzlf4ZVG6chNrDHqWR5nEWKY6+GlS76vP?= =?us-ascii?Q?dMYRGp0uks6o+XHSElOqa02HquflTuP4PA4N0TkmZwHWnjLGWtgbN43DlotY?= =?us-ascii?Q?4sdC3zi2hq1YUpBvne2+1mDR4TV/IZfH+mA6zI/3ma6ZLTKO64UyFiuYRFab?= =?us-ascii?Q?0ZfKHJruO/3i7K/FzTSm6viwLKiqPox5EuNjahqy/3nkxDiHQlsbbWjj+kFA?= =?us-ascii?Q?mmUpJAsidg4AcWgM6WE=3D?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700013)(82310400026)(30052699003)(376014)(1800799024);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Nov 2025 01:58:23.1951 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: de9c5318-eaf2-4e6b-071b-08de1cd7f7c0 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=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ5PEPF00000209.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV8PR12MB9083 Content-Type: text/plain; charset="utf-8" Commit 199747106934 ("edac: add a new per-dimm API and make the old per-virtual-rank API obsolete") introduced a new per-dimm sysfs interface for EDAC making the old per-virtual-rank sysfs interface obsolete. Since this new sysfs interface was introduced more than a decade ago, remove the obsolete legacy interface. Signed-off-by: Avadhut Naik --- Documentation/admin-guide/RAS/main.rst | 142 +------- arch/loongarch/configs/loongson3_defconfig | 1 - drivers/edac/Kconfig | 8 - drivers/edac/edac_mc_sysfs.c | 404 --------------------- 4 files changed, 3 insertions(+), 552 deletions(-) diff --git a/Documentation/admin-guide/RAS/main.rst b/Documentation/admin-g= uide/RAS/main.rst index 447bfde509fb..5a45db32c49b 100644 --- a/Documentation/admin-guide/RAS/main.rst +++ b/Documentation/admin-guide/RAS/main.rst @@ -406,24 +406,8 @@ index of the MC:: |->mc2 .... =20 -Under each ``mcX`` directory each ``csrowX`` is again represented by a -``csrowX``, where ``X`` is the csrow index:: - - .../mc/mc0/ - | - |->csrow0 - |->csrow2 - |->csrow3 - .... - -Notice that there is no csrow1, which indicates that csrow0 is composed -of a single ranked DIMMs. This should also apply in both Channels, in -order to have dual-channel mode be operational. Since both csrow2 and -csrow3 are populated, this indicates a dual ranked set of DIMMs for -channels 0 and 1. - -Within each of the ``mcX`` and ``csrowX`` directories are several EDAC -control and attribute files. +Within each of the ``mcX`` directory are several EDAC control and +attribute files. =20 ``mcX`` directories ------------------- @@ -569,7 +553,7 @@ this ``X`` memory module: - Unbuffered-DDR =20 .. [#f5] On some systems, the memory controller doesn't have any logic - to identify the memory module. On such systems, the directory is called = ``rankX`` and works on a similar way as the ``csrowX`` directories. + to identify the memory module. On such systems, the directory is called = ``rankX``. On modern Intel memory controllers, the memory controller identifies the memory modules directly. On such systems, the directory is called ``dimm= X``. =20 @@ -577,126 +561,6 @@ this ``X`` memory module: symlinks inside the sysfs mapping that are automatically created by the sysfs subsystem. Currently, they serve no purpose. =20 -``csrowX`` directories ----------------------- - -When CONFIG_EDAC_LEGACY_SYSFS is enabled, sysfs will contain the ``csrowX`` -directories. As this API doesn't work properly for Rambus, FB-DIMMs and -modern Intel Memory Controllers, this is being deprecated in favor of -``dimmX`` directories. - -In the ``csrowX`` directories are EDAC control and attribute files for -this ``X`` instance of csrow: - - -- ``ue_count`` - Total Uncorrectable Errors count attribute file - - This attribute file displays the total count of uncorrectable - errors that have occurred on this csrow. If panic_on_ue is set - this counter will not have a chance to increment, since EDAC - will panic the system. - - -- ``ce_count`` - Total Correctable Errors count attribute file - - This attribute file displays the total count of correctable - errors that have occurred on this csrow. This count is very - important to examine. CEs provide early indications that a - DIMM is beginning to fail. This count field should be - monitored for non-zero values and report such information - to the system administrator. - - -- ``size_mb`` - Total memory managed by this csrow attribute file - - This attribute file displays, in count of megabytes, the memory - that this csrow contains. - - -- ``mem_type`` - Memory Type attribute file - - This attribute file will display what type of memory is currently - on this csrow. Normally, either buffered or unbuffered memory. - Examples: - - - Registered-DDR - - Unbuffered-DDR - - -- ``edac_mode`` - EDAC Mode of operation attribute file - - This attribute file will display what type of Error detection - and correction is being utilized. - - -- ``dev_type`` - Device type attribute file - - This attribute file will display what type of DRAM device is - being utilized on this DIMM. - Examples: - - - x1 - - x2 - - x4 - - x8 - - -- ``ch0_ce_count`` - Channel 0 CE Count attribute file - - This attribute file will display the count of CEs on this - DIMM located in channel 0. - - -- ``ch0_ue_count`` - Channel 0 UE Count attribute file - - This attribute file will display the count of UEs on this - DIMM located in channel 0. - - -- ``ch0_dimm_label`` - Channel 0 DIMM Label control file - - - This control file allows this DIMM to have a label assigned - to it. With this label in the module, when errors occur - the output can provide the DIMM label in the system log. - This becomes vital for panic events to isolate the - cause of the UE event. - - DIMM Labels must be assigned after booting, with information - that correctly identifies the physical slot with its - silk screen label. This information is currently very - motherboard specific and determination of this information - must occur in userland at this time. - - -- ``ch1_ce_count`` - Channel 1 CE Count attribute file - - - This attribute file will display the count of CEs on this - DIMM located in channel 1. - - -- ``ch1_ue_count`` - Channel 1 UE Count attribute file - - - This attribute file will display the count of UEs on this - DIMM located in channel 0. - - -- ``ch1_dimm_label`` - Channel 1 DIMM Label control file - - This control file allows this DIMM to have a label assigned - to it. With this label in the module, when errors occur - the output can provide the DIMM label in the system log. - This becomes vital for panic events to isolate the - cause of the UE event. - - DIMM Labels must be assigned after booting, with information - that correctly identifies the physical slot with its - silk screen label. This information is currently very - motherboard specific and determination of this information - must occur in userland at this time. - =20 System Logging -------------- diff --git a/arch/loongarch/configs/loongson3_defconfig b/arch/loongarch/co= nfigs/loongson3_defconfig index 3e838c229cd5..50e1304e7a6f 100644 --- a/arch/loongarch/configs/loongson3_defconfig +++ b/arch/loongarch/configs/loongson3_defconfig @@ -917,7 +917,6 @@ CONFIG_MMC=3Dy CONFIG_MMC_LOONGSON2=3Dm CONFIG_INFINIBAND=3Dm CONFIG_EDAC=3Dy -# CONFIG_EDAC_LEGACY_SYSFS is not set CONFIG_EDAC_LOONGSON=3Dy CONFIG_RTC_CLASS=3Dy CONFIG_RTC_DRV_EFI=3Dy diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig index 39352b9b7a7e..9a7ff42064e9 100644 --- a/drivers/edac/Kconfig +++ b/drivers/edac/Kconfig @@ -23,14 +23,6 @@ menuconfig EDAC =20 if EDAC =20 -config EDAC_LEGACY_SYSFS - bool "EDAC legacy sysfs" - default y - help - Enable the compatibility sysfs nodes. - Use 'Y' if your edac utilities aren't ported to work with the newer - structures. - config EDAC_DEBUG bool "Debugging" select DEBUG_FS diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c index 8689631f1905..091cc6aae8a9 100644 --- a/drivers/edac/edac_mc_sysfs.c +++ b/drivers/edac/edac_mc_sysfs.c @@ -115,401 +115,6 @@ static const char * const edac_caps[] =3D { [EDAC_S16ECD16ED] =3D "S16ECD16ED" }; =20 -#ifdef CONFIG_EDAC_LEGACY_SYSFS -/* - * EDAC sysfs CSROW data structures and methods - */ - -#define to_csrow(k) container_of(k, struct csrow_info, dev) - -/* - * We need it to avoid namespace conflicts between the legacy API - * and the per-dimm/per-rank one - */ -#define DEVICE_ATTR_LEGACY(_name, _mode, _show, _store) \ - static struct device_attribute dev_attr_legacy_##_name =3D __ATTR(_name, = _mode, _show, _store) - -struct dev_ch_attribute { - struct device_attribute attr; - unsigned int channel; -}; - -#define DEVICE_CHANNEL(_name, _mode, _show, _store, _var) \ - static struct dev_ch_attribute dev_attr_legacy_##_name =3D \ - { __ATTR(_name, _mode, _show, _store), (_var) } - -#define to_channel(k) (container_of(k, struct dev_ch_attribute, attr)->cha= nnel) - -/* Set of more default csrow attribute show/store functions */ -static ssize_t csrow_ue_count_show(struct device *dev, - struct device_attribute *mattr, char *data) -{ - struct csrow_info *csrow =3D to_csrow(dev); - - return sysfs_emit(data, "%u\n", csrow->ue_count); -} - -static ssize_t csrow_ce_count_show(struct device *dev, - struct device_attribute *mattr, char *data) -{ - struct csrow_info *csrow =3D to_csrow(dev); - - return sysfs_emit(data, "%u\n", csrow->ce_count); -} - -static ssize_t csrow_size_show(struct device *dev, - struct device_attribute *mattr, char *data) -{ - struct csrow_info *csrow =3D to_csrow(dev); - int i; - u32 nr_pages =3D 0; - - for (i =3D 0; i < csrow->nr_channels; i++) - nr_pages +=3D csrow->channels[i]->dimm->nr_pages; - return sysfs_emit(data, "%u\n", PAGES_TO_MiB(nr_pages)); -} - -static ssize_t csrow_mem_type_show(struct device *dev, - struct device_attribute *mattr, char *data) -{ - struct csrow_info *csrow =3D to_csrow(dev); - - return sysfs_emit(data, "%s\n", edac_mem_types[csrow->channels[0]->dimm->= mtype]); -} - -static ssize_t csrow_dev_type_show(struct device *dev, - struct device_attribute *mattr, char *data) -{ - struct csrow_info *csrow =3D to_csrow(dev); - - return sysfs_emit(data, "%s\n", dev_types[csrow->channels[0]->dimm->dtype= ]); -} - -static ssize_t csrow_edac_mode_show(struct device *dev, - struct device_attribute *mattr, - char *data) -{ - struct csrow_info *csrow =3D to_csrow(dev); - - return sysfs_emit(data, "%s\n", edac_caps[csrow->channels[0]->dimm->edac_= mode]); -} - -/* show/store functions for DIMM Label attributes */ -static ssize_t channel_dimm_label_show(struct device *dev, - struct device_attribute *mattr, - char *data) -{ - struct csrow_info *csrow =3D to_csrow(dev); - unsigned int chan =3D to_channel(mattr); - struct rank_info *rank =3D csrow->channels[chan]; - - /* if field has not been initialized, there is nothing to send */ - if (!rank->dimm->label[0]) - return 0; - - return sysfs_emit(data, "%s\n", rank->dimm->label); -} - -static ssize_t channel_dimm_label_store(struct device *dev, - struct device_attribute *mattr, - const char *data, size_t count) -{ - struct csrow_info *csrow =3D to_csrow(dev); - unsigned int chan =3D to_channel(mattr); - struct rank_info *rank =3D csrow->channels[chan]; - size_t copy_count =3D count; - - if (count =3D=3D 0) - return -EINVAL; - - if (data[count - 1] =3D=3D '\0' || data[count - 1] =3D=3D '\n') - copy_count -=3D 1; - - if (copy_count =3D=3D 0 || copy_count >=3D sizeof(rank->dimm->label)) - return -EINVAL; - - memcpy(rank->dimm->label, data, copy_count); - rank->dimm->label[copy_count] =3D '\0'; - - return count; -} - -/* show function for dynamic chX_ce_count attribute */ -static ssize_t channel_ce_count_show(struct device *dev, - struct device_attribute *mattr, char *data) -{ - struct csrow_info *csrow =3D to_csrow(dev); - unsigned int chan =3D to_channel(mattr); - struct rank_info *rank =3D csrow->channels[chan]; - - return sysfs_emit(data, "%u\n", rank->ce_count); -} - -/* cwrow/attribute files */ -DEVICE_ATTR_LEGACY(size_mb, S_IRUGO, csrow_size_show, NULL); -DEVICE_ATTR_LEGACY(dev_type, S_IRUGO, csrow_dev_type_show, NULL); -DEVICE_ATTR_LEGACY(mem_type, S_IRUGO, csrow_mem_type_show, NULL); -DEVICE_ATTR_LEGACY(edac_mode, S_IRUGO, csrow_edac_mode_show, NULL); -DEVICE_ATTR_LEGACY(ue_count, S_IRUGO, csrow_ue_count_show, NULL); -DEVICE_ATTR_LEGACY(ce_count, S_IRUGO, csrow_ce_count_show, NULL); - -/* default attributes of the CSROW object */ -static struct attribute *csrow_attrs[] =3D { - &dev_attr_legacy_dev_type.attr, - &dev_attr_legacy_mem_type.attr, - &dev_attr_legacy_edac_mode.attr, - &dev_attr_legacy_size_mb.attr, - &dev_attr_legacy_ue_count.attr, - &dev_attr_legacy_ce_count.attr, - NULL, -}; - -static const struct attribute_group csrow_attr_grp =3D { - .attrs =3D csrow_attrs, -}; - -static const struct attribute_group *csrow_attr_groups[] =3D { - &csrow_attr_grp, - NULL -}; - -static const struct device_type csrow_attr_type =3D { - .groups =3D csrow_attr_groups, -}; - -/* - * possible dynamic channel DIMM Label attribute files - * - */ -DEVICE_CHANNEL(ch0_dimm_label, S_IRUGO | S_IWUSR, - channel_dimm_label_show, channel_dimm_label_store, 0); -DEVICE_CHANNEL(ch1_dimm_label, S_IRUGO | S_IWUSR, - channel_dimm_label_show, channel_dimm_label_store, 1); -DEVICE_CHANNEL(ch2_dimm_label, S_IRUGO | S_IWUSR, - channel_dimm_label_show, channel_dimm_label_store, 2); -DEVICE_CHANNEL(ch3_dimm_label, S_IRUGO | S_IWUSR, - channel_dimm_label_show, channel_dimm_label_store, 3); -DEVICE_CHANNEL(ch4_dimm_label, S_IRUGO | S_IWUSR, - channel_dimm_label_show, channel_dimm_label_store, 4); -DEVICE_CHANNEL(ch5_dimm_label, S_IRUGO | S_IWUSR, - channel_dimm_label_show, channel_dimm_label_store, 5); -DEVICE_CHANNEL(ch6_dimm_label, S_IRUGO | S_IWUSR, - channel_dimm_label_show, channel_dimm_label_store, 6); -DEVICE_CHANNEL(ch7_dimm_label, S_IRUGO | S_IWUSR, - channel_dimm_label_show, channel_dimm_label_store, 7); -DEVICE_CHANNEL(ch8_dimm_label, S_IRUGO | S_IWUSR, - channel_dimm_label_show, channel_dimm_label_store, 8); -DEVICE_CHANNEL(ch9_dimm_label, S_IRUGO | S_IWUSR, - channel_dimm_label_show, channel_dimm_label_store, 9); -DEVICE_CHANNEL(ch10_dimm_label, S_IRUGO | S_IWUSR, - channel_dimm_label_show, channel_dimm_label_store, 10); -DEVICE_CHANNEL(ch11_dimm_label, S_IRUGO | S_IWUSR, - channel_dimm_label_show, channel_dimm_label_store, 11); -DEVICE_CHANNEL(ch12_dimm_label, S_IRUGO | S_IWUSR, - channel_dimm_label_show, channel_dimm_label_store, 12); -DEVICE_CHANNEL(ch13_dimm_label, S_IRUGO | S_IWUSR, - channel_dimm_label_show, channel_dimm_label_store, 13); -DEVICE_CHANNEL(ch14_dimm_label, S_IRUGO | S_IWUSR, - channel_dimm_label_show, channel_dimm_label_store, 14); -DEVICE_CHANNEL(ch15_dimm_label, S_IRUGO | S_IWUSR, - channel_dimm_label_show, channel_dimm_label_store, 15); - -/* Total possible dynamic DIMM Label attribute file table */ -static struct attribute *dynamic_csrow_dimm_attr[] =3D { - &dev_attr_legacy_ch0_dimm_label.attr.attr, - &dev_attr_legacy_ch1_dimm_label.attr.attr, - &dev_attr_legacy_ch2_dimm_label.attr.attr, - &dev_attr_legacy_ch3_dimm_label.attr.attr, - &dev_attr_legacy_ch4_dimm_label.attr.attr, - &dev_attr_legacy_ch5_dimm_label.attr.attr, - &dev_attr_legacy_ch6_dimm_label.attr.attr, - &dev_attr_legacy_ch7_dimm_label.attr.attr, - &dev_attr_legacy_ch8_dimm_label.attr.attr, - &dev_attr_legacy_ch9_dimm_label.attr.attr, - &dev_attr_legacy_ch10_dimm_label.attr.attr, - &dev_attr_legacy_ch11_dimm_label.attr.attr, - &dev_attr_legacy_ch12_dimm_label.attr.attr, - &dev_attr_legacy_ch13_dimm_label.attr.attr, - &dev_attr_legacy_ch14_dimm_label.attr.attr, - &dev_attr_legacy_ch15_dimm_label.attr.attr, - NULL -}; - -/* possible dynamic channel ce_count attribute files */ -DEVICE_CHANNEL(ch0_ce_count, S_IRUGO, - channel_ce_count_show, NULL, 0); -DEVICE_CHANNEL(ch1_ce_count, S_IRUGO, - channel_ce_count_show, NULL, 1); -DEVICE_CHANNEL(ch2_ce_count, S_IRUGO, - channel_ce_count_show, NULL, 2); -DEVICE_CHANNEL(ch3_ce_count, S_IRUGO, - channel_ce_count_show, NULL, 3); -DEVICE_CHANNEL(ch4_ce_count, S_IRUGO, - channel_ce_count_show, NULL, 4); -DEVICE_CHANNEL(ch5_ce_count, S_IRUGO, - channel_ce_count_show, NULL, 5); -DEVICE_CHANNEL(ch6_ce_count, S_IRUGO, - channel_ce_count_show, NULL, 6); -DEVICE_CHANNEL(ch7_ce_count, S_IRUGO, - channel_ce_count_show, NULL, 7); -DEVICE_CHANNEL(ch8_ce_count, S_IRUGO, - channel_ce_count_show, NULL, 8); -DEVICE_CHANNEL(ch9_ce_count, S_IRUGO, - channel_ce_count_show, NULL, 9); -DEVICE_CHANNEL(ch10_ce_count, S_IRUGO, - channel_ce_count_show, NULL, 10); -DEVICE_CHANNEL(ch11_ce_count, S_IRUGO, - channel_ce_count_show, NULL, 11); -DEVICE_CHANNEL(ch12_ce_count, S_IRUGO, - channel_ce_count_show, NULL, 12); -DEVICE_CHANNEL(ch13_ce_count, S_IRUGO, - channel_ce_count_show, NULL, 13); -DEVICE_CHANNEL(ch14_ce_count, S_IRUGO, - channel_ce_count_show, NULL, 14); -DEVICE_CHANNEL(ch15_ce_count, S_IRUGO, - channel_ce_count_show, NULL, 15); - -/* Total possible dynamic ce_count attribute file table */ -static struct attribute *dynamic_csrow_ce_count_attr[] =3D { - &dev_attr_legacy_ch0_ce_count.attr.attr, - &dev_attr_legacy_ch1_ce_count.attr.attr, - &dev_attr_legacy_ch2_ce_count.attr.attr, - &dev_attr_legacy_ch3_ce_count.attr.attr, - &dev_attr_legacy_ch4_ce_count.attr.attr, - &dev_attr_legacy_ch5_ce_count.attr.attr, - &dev_attr_legacy_ch6_ce_count.attr.attr, - &dev_attr_legacy_ch7_ce_count.attr.attr, - &dev_attr_legacy_ch8_ce_count.attr.attr, - &dev_attr_legacy_ch9_ce_count.attr.attr, - &dev_attr_legacy_ch10_ce_count.attr.attr, - &dev_attr_legacy_ch11_ce_count.attr.attr, - &dev_attr_legacy_ch12_ce_count.attr.attr, - &dev_attr_legacy_ch13_ce_count.attr.attr, - &dev_attr_legacy_ch14_ce_count.attr.attr, - &dev_attr_legacy_ch15_ce_count.attr.attr, - NULL -}; - -static umode_t csrow_dev_is_visible(struct kobject *kobj, - struct attribute *attr, int idx) -{ - struct device *dev =3D kobj_to_dev(kobj); - struct csrow_info *csrow =3D container_of(dev, struct csrow_info, dev); - - if (idx >=3D csrow->nr_channels) - return 0; - - if (idx >=3D ARRAY_SIZE(dynamic_csrow_ce_count_attr) - 1) { - WARN_ONCE(1, "idx: %d\n", idx); - return 0; - } - - /* Only expose populated DIMMs */ - if (!csrow->channels[idx]->dimm->nr_pages) - return 0; - - return attr->mode; -} - - -static const struct attribute_group csrow_dev_dimm_group =3D { - .attrs =3D dynamic_csrow_dimm_attr, - .is_visible =3D csrow_dev_is_visible, -}; - -static const struct attribute_group csrow_dev_ce_count_group =3D { - .attrs =3D dynamic_csrow_ce_count_attr, - .is_visible =3D csrow_dev_is_visible, -}; - -static const struct attribute_group *csrow_dev_groups[] =3D { - &csrow_dev_dimm_group, - &csrow_dev_ce_count_group, - NULL -}; - -static void csrow_release(struct device *dev) -{ - /* - * Nothing to do, just unregister sysfs here. The mci - * device owns the data and will also release it. - */ -} - -static inline int nr_pages_per_csrow(struct csrow_info *csrow) -{ - int chan, nr_pages =3D 0; - - for (chan =3D 0; chan < csrow->nr_channels; chan++) - nr_pages +=3D csrow->channels[chan]->dimm->nr_pages; - - return nr_pages; -} - -/* Create a CSROW object under specified edac_mc_device */ -static int edac_create_csrow_object(struct mem_ctl_info *mci, - struct csrow_info *csrow, int index) -{ - int err; - - csrow->dev.type =3D &csrow_attr_type; - csrow->dev.groups =3D csrow_dev_groups; - csrow->dev.release =3D csrow_release; - device_initialize(&csrow->dev); - csrow->dev.parent =3D &mci->dev; - csrow->mci =3D mci; - dev_set_name(&csrow->dev, "csrow%d", index); - dev_set_drvdata(&csrow->dev, csrow); - - err =3D device_add(&csrow->dev); - if (err) { - edac_dbg(1, "failure: create device %s\n", dev_name(&csrow->dev)); - put_device(&csrow->dev); - return err; - } - - edac_dbg(0, "device %s created\n", dev_name(&csrow->dev)); - - return 0; -} - -/* Create a CSROW object under specified edac_mc_device */ -static int edac_create_csrow_objects(struct mem_ctl_info *mci) -{ - int err, i; - struct csrow_info *csrow; - - for (i =3D 0; i < mci->nr_csrows; i++) { - csrow =3D mci->csrows[i]; - if (!nr_pages_per_csrow(csrow)) - continue; - err =3D edac_create_csrow_object(mci, mci->csrows[i], i); - if (err < 0) - goto error; - } - return 0; - -error: - for (--i; i >=3D 0; i--) { - if (device_is_registered(&mci->csrows[i]->dev)) - device_unregister(&mci->csrows[i]->dev); - } - - return err; -} - -static void edac_delete_csrow_objects(struct mem_ctl_info *mci) -{ - int i; - - for (i =3D 0; i < mci->nr_csrows; i++) { - if (device_is_registered(&mci->csrows[i]->dev)) - device_unregister(&mci->csrows[i]->dev); - } -} - -#endif - /* * Per-dimm (or per-rank) devices */ @@ -989,12 +594,6 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *= mci, goto fail; } =20 -#ifdef CONFIG_EDAC_LEGACY_SYSFS - err =3D edac_create_csrow_objects(mci); - if (err < 0) - goto fail; -#endif - edac_create_debugfs_nodes(mci); return 0; =20 @@ -1019,9 +618,6 @@ void edac_remove_sysfs_mci_device(struct mem_ctl_info = *mci) #ifdef CONFIG_EDAC_DEBUG edac_debugfs_remove_recursive(mci->debugfs); #endif -#ifdef CONFIG_EDAC_LEGACY_SYSFS - edac_delete_csrow_objects(mci); -#endif =20 mci_for_each_dimm(mci, dimm) { if (!device_is_registered(&dimm->dev)) --=20 2.43.0