From nobody Thu Oct 2 14:26:15 2025 Received: from BL2PR02CU003.outbound.protection.outlook.com (mail-eastusazon11011010.outbound.protection.outlook.com [52.101.52.10]) (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 BE6CE2C08AA; Mon, 15 Sep 2025 21:23:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.52.10 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757971395; cv=fail; b=c622B4u1T4exOw/JKZ4P/4gdS5kha+txhoOW5s7VSPJxRL1tNT+i+5fyop+jvgAEiIMIyejO3IHaxiuZ/8NHtnX5BVVSpEzcGL1v7uVcNkTkvo+OlKoOvYlDVb/5jVWK6obRRTu+PqKUsiiJgJ64/o3t5b8AwqNs39rO8Kddgas= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757971395; c=relaxed/simple; bh=3RHd+406tCEbzR2PXVs3D2fJ8HRkldskQizzoDUr46Q=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=CfpKXrhCeMh30F6relZWq6ef4/j5N3jhgRW+EPLmDR136Gsi51io1olMQvrrdkk93G5ewN7KF0VdxE6ibpFw81Y58CAq52fIheMTuk/W/sDFZjTieif6iAeFdWETxPHJYP8GWkFWkYDwneMtTgQWHFTWQyBAWRrrXrJQLI4Itf4= 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=QZruqhFN; arc=fail smtp.client-ip=52.101.52.10 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="QZruqhFN" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=RfaohdBiQU6kTwvA0Upi0LhcViLAoi0hQAkcKJuy+WMQzE2bmW1qwpWHKDm1xrjjc9ixLzdTQBqWlkolvKb/SlofWaiMWpCQGWY3RAy517I6egiYads+6RqkP1GwAXWvRARySuD6qEPf251HJFvhF+d/8kqPdflkLdc4qCG+6GwRAM8e3KT+d+ryQwE73nTxfHGzlb9cRXUfSeBA0prsYURuUHW+tQk0b1vEynIg1XHcOAXpq7uJm1hBWJO1uK3saXIXk2B4NB28GBSTeeHzKlq2yjnp1MC8AJYYUt0kvmLbd15ala5XVm9Fmypexa/UeQVy+rJsk9G0/oNvrQNLeQ== 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=bp2zhCwXExKslqdY2c4A1OSrAObQsn81dZbthX2MteE=; b=E07LBaHinJdmrs5xICTdCRSfstZYhE10pE84F7Yui25nkUWbZvbL+huLYc2/beSD1Sak44aKUAM545zt5aBWfmeSga5aw4uNBys/s35RmRRABMaqwhW+YV0MlVmbg2ePSYcDH5bUxVTo/45Vwt1QlH98wJArBChs85D7voAHi4Xtvi1av/QS7QUOyqjslYEBdWI/iVeMxFKjzITlWxLyRhex1BaqXQubNGttLAdZWG0kWc2TzdGS/qo46h7FrmW1hos4LLA3CH7ILd0bh3Ua+9jb0jJoqiOr5Vjy5qtx5jlXepsoMWtVMGB8i7EOrBheVNLpmWOBBXh6t3TYNYv5lw== 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=bp2zhCwXExKslqdY2c4A1OSrAObQsn81dZbthX2MteE=; b=QZruqhFNRyXpi28tCtCkxEs+L4Vh7UuvH7buXCdsT1CkG5mmDgANWbeuZgF9Et+pd9VSkUYF/4I4d9M694z6EV2Gk3AS9xtgTaaZjSp/8Sya7Vr03ehzpzANpvr30EIuSkuAsCCHVxpONbpQMGNh1HwCZWmnxo/KYzzu4Wte3zY= Received: from BN9PR03CA0657.namprd03.prod.outlook.com (2603:10b6:408:13b::32) by CY8PR12MB7516.namprd12.prod.outlook.com (2603:10b6:930:94::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9115.21; Mon, 15 Sep 2025 21:23:03 +0000 Received: from BL6PEPF0002256F.namprd02.prod.outlook.com (2603:10b6:408:13b:cafe::63) by BN9PR03CA0657.outlook.office365.com (2603:10b6:408:13b::32) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9115.21 via Frontend Transport; Mon, 15 Sep 2025 21:23:02 +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 BL6PEPF0002256F.mail.protection.outlook.com (10.167.249.37) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9137.12 via Frontend Transport; Mon, 15 Sep 2025 21:23:02 +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; Mon, 15 Sep 2025 14:23:01 -0700 From: Avadhut Naik To: CC: , , , , Subject: [PATCH v2 1/2] RAS/AMD/ATL: Translate UMC normalized address to DRAM address using PRM Date: Mon, 15 Sep 2025 21:20:22 +0000 Message-ID: <20250915212244.886668-2-avadhut.naik@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250915212244.886668-1-avadhut.naik@amd.com> References: <20250915212244.886668-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: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL6PEPF0002256F:EE_|CY8PR12MB7516:EE_ X-MS-Office365-Filtering-Correlation-Id: ca4be648-1c0f-4102-ff2b-08ddf49e0da2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|82310400026|36860700013|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?UJhbp99ACJrYNXHjK88EMM5uVRzEJqlKrnu7oYGRlSOiRoB8HL+7xyn0PL/l?= =?us-ascii?Q?HpmrNdOPhnN+vtKf+VKbjQxuYCbNNcc+8eOAdnma1kXRGuFtpxuLoSLMtkWu?= =?us-ascii?Q?VIIXrVsQKr99jGCmbjjNIU/swmMptVu/wXqeRyyqkh06ox7+1r65icjNvU7a?= =?us-ascii?Q?Oo+e3Dv5qcjGPhDmKuJUCBp9nSbDDxufwBhpZviz9oKfGoC1jW2BQk4N0LWM?= =?us-ascii?Q?L5Y9YcIXp5Is6Bn4XWE7I0kqfxKQRhhlfFS3IB6zdkrfsO6YcTKvBaFPf3E0?= =?us-ascii?Q?mXHoCtuuERfikL4wvO7SKrzIl7w+cIa7QMkNbfHsN/89xpti27wBgEDP14Vi?= =?us-ascii?Q?rMtZHn8pa+NiswKsyNFPVQ+8AiwFuBmqtH+cBW9L+Z2anX3Z1VX8csHdoWn2?= =?us-ascii?Q?OtVmA4EBGPOanQGBQGoEQj1LnhARLy2NQDSgEWtYSWN4J8ZMcDr8P/3C3zmW?= =?us-ascii?Q?2X1v3e9OChG0KNly6jECaiViiEy+oVFlUZ11NqpqIUEDGnERzOmL2SAUeXXV?= =?us-ascii?Q?OixXEnZ7d+5haMBkqMsgY4GWeBopdhqjoJs0UHOxPxzoSHGq0E/wpsU8yOzv?= =?us-ascii?Q?A0PMU56m3dJ/2P3pdW5BgvH1peWe/1xbm/aaaiDCZ9ZYjOV7baLpVi046OCH?= =?us-ascii?Q?QZp9Aq0I3ExDRaFrnY9pQmo8yz0ACSjzLO1MKm6c9Fu++GAl4WSJ9ozasXjc?= =?us-ascii?Q?IRXMrvo72zKouTsOvAtmiiaziSAYztHZSOkWIBRTcC8bA+madCWYb0uTxMEj?= =?us-ascii?Q?1lgg+LuIBzC/f8TRR9IBImudYSgYWxGg4wjRpeOkLv/lhx7UgXkqLFJlaSAm?= =?us-ascii?Q?/Om8mrnGv4JxM8NlJwpYZjbSKZfMFPNDfHsp4G6eC0Wl3Monizhjupf8FV6x?= =?us-ascii?Q?b09b+eOAd7T88vsKe5nDxZOyHdRGTLpxOLIxx3uOwK4p4VDgPTaPesYISwP/?= =?us-ascii?Q?Inby6d0r6K20LzscgXpvxSE3lqF6nhC1DmL2O3NATp/74aU7Guv7+mQXown1?= =?us-ascii?Q?pTgHTxktXcD+mZypt2qXt7lj8kmB/c9n2O5rh7vIj+e8Ui7MvUU+0S2F9ChB?= =?us-ascii?Q?pA22e5twhXELTfemjWcNLCoYo1gCD/ZjpdrcDM5PNcwHZDem4QcYQkAon+NJ?= =?us-ascii?Q?jgsfoTCmnnJV02ffvhZXOXb7r18lAotZ05HiPThfQfqb1ZoYsu6rwmOv6JyU?= =?us-ascii?Q?hSJQ4Oe1qYfgsY8vLe9CFQfHuhrolyOAL5IFkxIjAzze6wxSCeyBKZCDlOoC?= =?us-ascii?Q?BhZQtv+16Q+oSH/wA/BVhsVQ9lrHCqKxhh5CjMp8JPQSME7XQe5t45b9jEwq?= =?us-ascii?Q?WYy+ENmMcOM3pi5kyvRGtL/AW7pv8fV0/HR4ieG1y+wKdn9myYGYIKLRiDPr?= =?us-ascii?Q?dsRDNP4CnHCphvw7ewqAiIIjZIDrtmAWJISfGXbJHYPuLnhJGYmC5+kxNfx6?= =?us-ascii?Q?Lr9Ie+2l9yrWhHPaROyRf9I9dJWqkc0XwM1exEp7grtmDBwj6wRzAg=3D=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)(1800799024)(82310400026)(36860700013)(376014);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Sep 2025 21:23:02.6851 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: ca4be648-1c0f-4102-ff2b-08ddf49e0da2 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: BL6PEPF0002256F.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR12MB7516 Content-Type: text/plain; charset="utf-8" Modern AMD SOCs provide UEFI PRM module that implements various address translation PRM handlers.[1] These handlers can be invoked by the OS or hypervisor at runtime to perform address translations. On AMD's Zen-based SOCs, Unified Memory Controller (UMC) relative "normalized" address is reported through MCA_ADDR of UMC SMCA bank type on occurrence of a DRAM ECC error. This address must be converted into system physical address and DRAM address to export additional information about the error. Add support to convert normalized address into DRAM address through the appropriate PRM handler. Instead of logging the translated DRAM address locally, register the translating function when the Address Translation library is initialized. Modules like amd64_edac can then invoke the PRM handler to add the DRAM address to their error records. Additionally, it can also be exported through the RAS tracepont. [1] https://bugzilla.kernel.org/show_bug.cgi?id=3D220577 Signed-off-by: Avadhut Naik --- Changes in v2: 1. Modified the commit message and linked kernel bugzilla as reference. 2. Removed unnecessary variables. 3. Renamed struct dram_addr to atl_dram_addr. --- drivers/ras/amd/atl/core.c | 3 ++- drivers/ras/amd/atl/internal.h | 9 +++++++++ drivers/ras/amd/atl/prm.c | 36 ++++++++++++++++++++++++++++++---- drivers/ras/amd/atl/umc.c | 9 +++++++++ drivers/ras/ras.c | 18 +++++++++++++++-- include/linux/ras.h | 19 +++++++++++++++++- 6 files changed, 86 insertions(+), 8 deletions(-) diff --git a/drivers/ras/amd/atl/core.c b/drivers/ras/amd/atl/core.c index 4197e10993ac..ca1646d030ca 100644 --- a/drivers/ras/amd/atl/core.c +++ b/drivers/ras/amd/atl/core.c @@ -207,7 +207,8 @@ static int __init amd_atl_init(void) =20 /* Increment this module's recount so that it can't be easily unloaded. */ __module_get(THIS_MODULE); - amd_atl_register_decoder(convert_umc_mca_addr_to_sys_addr); + amd_atl_register_decoder(convert_umc_mca_addr_to_sys_addr, + convert_umc_mca_addr_to_dram_addr); =20 pr_info("AMD Address Translation Library initialized\n"); return 0; diff --git a/drivers/ras/amd/atl/internal.h b/drivers/ras/amd/atl/internal.h index 2b6279d32774..3dad1a5860d6 100644 --- a/drivers/ras/amd/atl/internal.h +++ b/drivers/ras/amd/atl/internal.h @@ -279,18 +279,27 @@ int dehash_address(struct addr_ctx *ctx); =20 unsigned long norm_to_sys_addr(u8 socket_id, u8 die_id, u8 coh_st_inst_id,= unsigned long addr); unsigned long convert_umc_mca_addr_to_sys_addr(struct atl_err *err); +int convert_umc_mca_addr_to_dram_addr(struct atl_err *err, struct atl_dram= _addr *dram_addr); =20 u64 add_base_and_hole(struct addr_ctx *ctx, u64 addr); u64 remove_base_and_hole(struct addr_ctx *ctx, u64 addr); =20 #ifdef CONFIG_AMD_ATL_PRM unsigned long prm_umc_norm_to_sys_addr(u8 socket_id, u64 umc_bank_inst_id,= unsigned long addr); +int prm_umc_norm_to_dram_addr(u8 socket_id, u64 bank_id, + unsigned long addr, struct atl_dram_addr *dram_addr); #else static inline unsigned long prm_umc_norm_to_sys_addr(u8 socket_id, u64 umc= _bank_inst_id, unsigned long addr) { return -ENODEV; } + +static inline int prm_umc_norm_to_dram_addr(u8 socket_id, u64 bank_id, + unsigned long addr, struct atl_dram_addr *dram_addr) +{ + return -ENODEV; +} #endif =20 /* diff --git a/drivers/ras/amd/atl/prm.c b/drivers/ras/amd/atl/prm.c index 0931a20d213b..02c47c27690b 100644 --- a/drivers/ras/amd/atl/prm.c +++ b/drivers/ras/amd/atl/prm.c @@ -19,10 +19,11 @@ #include =20 /* - * PRM parameter buffer - normalized to system physical address, as descri= bed - * in the "PRM Parameter Buffer" section of the AMD ACPI Porting Guide. + * PRM parameter buffer - normalized to system physical address and normal= ized + * to DRAM address, as described in the "PRM Parameter Buffer" section of = the + * AMD ACPI Porting Guide. */ -struct norm_to_sys_param_buf { +struct prm_parameter_buffer { u64 norm_addr; u8 socket; u64 bank_id; @@ -33,9 +34,13 @@ static const guid_t norm_to_sys_guid =3D GUID_INIT(0xE71= 80659, 0xA65D, 0x451D, 0x92, 0xCD, 0x2B, 0x56, 0xF1, 0x2B, 0xEB, 0xA6); =20 +static const guid_t norm_to_dram_guid =3D GUID_INIT(0x7626C6AE, 0xF973, 0x= 429C, + 0xA9, 0x1C, 0x10, 0x7D, 0x7B, + 0xE2, 0x98, 0xB0); + unsigned long prm_umc_norm_to_sys_addr(u8 socket_id, u64 bank_id, unsigned= long addr) { - struct norm_to_sys_param_buf p_buf; + struct prm_parameter_buffer p_buf; unsigned long ret_addr; int ret; =20 @@ -55,3 +60,26 @@ unsigned long prm_umc_norm_to_sys_addr(u8 socket_id, u64= bank_id, unsigned long =20 return ret; } + +int prm_umc_norm_to_dram_addr(u8 socket_id, u64 bank_id, + unsigned long addr, struct atl_dram_addr *dram_addr) +{ + struct prm_parameter_buffer p_buf; + int ret; + + p_buf.norm_addr =3D addr; + p_buf.socket =3D socket_id; + p_buf.bank_id =3D bank_id; + p_buf.out_buf =3D dram_addr; + + ret =3D acpi_call_prm_handler(norm_to_dram_guid, &p_buf); + if (!ret) + return ret; + + if (ret =3D=3D -ENODEV) + pr_debug("PRM module/handler not available.\n"); + else + pr_notice_once("PRM DRAM Address Translation failed.\n"); + + return ret; +} diff --git a/drivers/ras/amd/atl/umc.c b/drivers/ras/amd/atl/umc.c index 6e072b7667e9..3f53f90dadc0 100644 --- a/drivers/ras/amd/atl/umc.c +++ b/drivers/ras/amd/atl/umc.c @@ -427,3 +427,12 @@ unsigned long convert_umc_mca_addr_to_sys_addr(struct = atl_err *err) =20 return norm_to_sys_addr(socket_id, die_id, coh_st_inst_id, addr); } + +int convert_umc_mca_addr_to_dram_addr(struct atl_err *err, struct atl_dram= _addr *dram_addr) +{ + u8 socket_id =3D topology_physical_package_id(err->cpu); + unsigned long addr =3D get_addr(err->addr); + u64 bank_id =3D err->ipid; + + return prm_umc_norm_to_dram_addr(socket_id, bank_id, addr, dram_addr); +} diff --git a/drivers/ras/ras.c b/drivers/ras/ras.c index a6e4792a1b2e..829ca8ccf1e1 100644 --- a/drivers/ras/ras.c +++ b/drivers/ras/ras.c @@ -19,15 +19,20 @@ */ static unsigned long (*amd_atl_umc_na_to_spa)(struct atl_err *err); =20 -void amd_atl_register_decoder(unsigned long (*f)(struct atl_err *)) +static int (*amd_atl_umc_na_to_dram_addr)(struct atl_err *err, struct atl_= dram_addr *dram_addr); + +void amd_atl_register_decoder(unsigned long (*f1)(struct atl_err *), + int (*f2)(struct atl_err *, struct atl_dram_addr *)) { - amd_atl_umc_na_to_spa =3D f; + amd_atl_umc_na_to_spa =3D f1; + amd_atl_umc_na_to_dram_addr =3D f2; } EXPORT_SYMBOL_GPL(amd_atl_register_decoder); =20 void amd_atl_unregister_decoder(void) { amd_atl_umc_na_to_spa =3D NULL; + amd_atl_umc_na_to_dram_addr =3D NULL; } EXPORT_SYMBOL_GPL(amd_atl_unregister_decoder); =20 @@ -39,6 +44,15 @@ unsigned long amd_convert_umc_mca_addr_to_sys_addr(struc= t atl_err *err) return amd_atl_umc_na_to_spa(err); } EXPORT_SYMBOL_GPL(amd_convert_umc_mca_addr_to_sys_addr); + +int amd_convert_umc_mca_addr_to_dram_addr(struct atl_err *err, struct atl_= dram_addr *dram_addr) +{ + if (!amd_atl_umc_na_to_dram_addr) + return -EINVAL; + + return amd_atl_umc_na_to_dram_addr(err, dram_addr); +} +EXPORT_SYMBOL_GPL(amd_convert_umc_mca_addr_to_dram_addr); #endif /* CONFIG_AMD_ATL */ =20 #define CREATE_TRACE_POINTS diff --git a/include/linux/ras.h b/include/linux/ras.h index a64182bc72ad..f489da8b4722 100644 --- a/include/linux/ras.h +++ b/include/linux/ras.h @@ -42,15 +42,32 @@ struct atl_err { u32 cpu; }; =20 +struct atl_dram_addr { + u8 chip_select; + u8 bank_group; + u8 bank_addr; + u32 row_addr; + u16 col_addr; + u8 rank_mul; + u8 sub_ch; +} __packed; + #if IS_ENABLED(CONFIG_AMD_ATL) -void amd_atl_register_decoder(unsigned long (*f)(struct atl_err *)); +void amd_atl_register_decoder(unsigned long (*f1)(struct atl_err *), + int (*f2)(struct atl_err *, struct atl_dram_addr *)); void amd_atl_unregister_decoder(void); void amd_retire_dram_row(struct atl_err *err); unsigned long amd_convert_umc_mca_addr_to_sys_addr(struct atl_err *err); +int amd_convert_umc_mca_addr_to_dram_addr(struct atl_err *err, struct atl_= dram_addr *dram_addr); #else static inline void amd_retire_dram_row(struct atl_err *err) { } static inline unsigned long amd_convert_umc_mca_addr_to_sys_addr(struct atl_err *err) { return -EINVAL= ; } +static inline int amd_convert_umc_mca_addr_to_dram_addr(struct atl_err *er= r, + struct atl_dram_addr *dram_addr) +{ + return -EINVAL; +} #endif /* CONFIG_AMD_ATL */ =20 #endif /* __RAS_H__ */ --=20 2.43.0 From nobody Thu Oct 2 14:26:15 2025 Received: from CY7PR03CU001.outbound.protection.outlook.com (mail-westcentralusazon11010020.outbound.protection.outlook.com [40.93.198.20]) (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 291BC2C0F79; Mon, 15 Sep 2025 21:23:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.198.20 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757971398; cv=fail; b=DWdI4N0YkUzlPHDTErGtrk4XOAvT8El80evZplUQtUGJnBwJqpX93FbZEtThlIu7jo8CwBbScnl1jG+V+la3n9DjQNizRe2/KB6WHRZ9BI8Zu5gLPmYJuh+7Jp+ptkTDYq3OESZu231QnkivFGX48zLHqHLiuMzrXBIJrgcVDnE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757971398; c=relaxed/simple; bh=zfpueJRaT7jCiTCdqIznwDHfX2Vn3Nz2BZMTriKz1/o=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=jRjuOg8LqwwZtmG+h/Uldt3/flXzNLKlt/szJhwUrfeouIW5QyN1x1EAsGstgO3064JjzZ2M1ydr4OAVCV58z8rgfbatp2Bg5nOFh+RFrTaDCWnADDZKObhSB5Xck95lVDH63P+SRokbDx2TJ90diZKisXRdIzKnfThyIUjeDTw= 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=dr9EMyj3; arc=fail smtp.client-ip=40.93.198.20 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="dr9EMyj3" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ZUlsKvOeVNsSY44W+2QJtaXW5zbV6ffKr2VcdnVVUWXY41FPTpRtqg1c0W1l5giJaDsGliQ6nQoUwOiT//PAkSZd6vLMEkkQZdQ06V9m0PesXKBlI+8x5TBQMwt4u/QMvV6klNn6JWZsdnXizk0G0r3Y05NfbK+TW9E2u433PwLVq15n18Id58wc8cerKOI58HO9y6ODjITCfOle1qoewmOKO+sj5VgVJoPQVQ9czXQQfF5N+HRH7bFR8SOSlKzN74D2Hmm7N+t2ZqKv7temz5VqCLFi1cp79XUfAc9GpQxrTo/0l/6F1Xh9NFoGyr6cmnkhBKcdyz8+rLt8090iXg== 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=pRwAHgDVZA6toPneKjpwjN1NcfzinG+28H11Wj1WhKc=; b=ur1ac2JDVSS2ThZF0gJNIMK7Bjk0rTfuBKp92MWN9l80OFoTw+mNXRkvTbY318c70Fe3kQt6toTIYI+edf6ZxmO4PDgbyrH81WwemIrEgI5SXFEqHHiTxhlOyMAkYfIMM+2UAbCM9NAW8EX95u3QZGSAoLrAo+sgzIoeHUZ/F0I0YIzTwiWOJsGBZbjjdv4zQjAynMNICOvn1gTlVL98DFaDR0XHExTrClSpgoQYObJt2LX7sFt0aV6dZAHseKgdMmtVRZp+2knKvIiHn2OAcwUGvdlMAN2mOrXOVL5b4B2guz1aA2aXZ/RqTSJX1AONTKCgq+ImFL6KUr+/6p7EDw== 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=pRwAHgDVZA6toPneKjpwjN1NcfzinG+28H11Wj1WhKc=; b=dr9EMyj3qiCeS4xwcSMHJKkP5VaHifGTZE7NpaYvcByZ61+nEqtyfk8xSy/H8f9bSoYtaB6anbcqxn+/sI7rZ7FSIfxvTdj4GJjZ7JOJArRsZ68OC7YlZ8DCaZZItAqbp9fV5egwcUCLssPLyED41T2ubltQKuwvBWg+BioQ21s= Received: from BN9P222CA0027.NAMP222.PROD.OUTLOOK.COM (2603:10b6:408:10c::32) by SN7PR12MB7105.namprd12.prod.outlook.com (2603:10b6:806:2a0::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9115.19; Mon, 15 Sep 2025 21:23:13 +0000 Received: from BL6PEPF0002256E.namprd02.prod.outlook.com (2603:10b6:408:10c:cafe::72) by BN9P222CA0027.outlook.office365.com (2603:10b6:408:10c::32) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9115.20 via Frontend Transport; Mon, 15 Sep 2025 21:23: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=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by BL6PEPF0002256E.mail.protection.outlook.com (10.167.249.36) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9137.12 via Frontend Transport; Mon, 15 Sep 2025 21:23:13 +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; Mon, 15 Sep 2025 14:23:12 -0700 From: Avadhut Naik To: CC: , , , , Subject: [PATCH v2 2/2] EDAC/amd64: Incorporate DRAM Address in EDAC message Date: Mon, 15 Sep 2025 21:20:23 +0000 Message-ID: <20250915212244.886668-3-avadhut.naik@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250915212244.886668-1-avadhut.naik@amd.com> References: <20250915212244.886668-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: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL6PEPF0002256E:EE_|SN7PR12MB7105:EE_ X-MS-Office365-Filtering-Correlation-Id: bc4b01db-9f97-4759-fe4e-08ddf49e1421 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|376014|36860700013|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?wFKtWpyYs2xIGkSyrsbyZtDOAbeHQiJ5Nw89cYlBQWkokIVWsVWGTZGIQNSw?= =?us-ascii?Q?5qf+AkuH0GSpcjXBaSUptIpa4VM6IqzEYjy/OsAvuGK85jXS7ckENAtf3ttk?= =?us-ascii?Q?baYhC4spS4JhdfcgptO/LOydQW4SlsRmP9j+t8BOcAwbFZ/+KqWrGSJH/j51?= =?us-ascii?Q?GzGWaggmJnvbTWWaqaKc0gk1lD0EI3Nd5PMR7mOfmj90pFDy8rTpKcKr5Oqd?= =?us-ascii?Q?Hm9Uk7uQr86FucU5KegTM98RWOEuClRJl6KQ8t79xQyuXwP1OoggrPt99la1?= =?us-ascii?Q?YxIYKiUHzN9U3kQXhrktEGueoLnvX7CjM5qp8GBOuntLv4vlfyKJtRbIO5vF?= =?us-ascii?Q?oJlOpZ08TgzIeLPPYRgtg3OuxbpTfni6acj9SPcPZDLgwXuEGioe8kCJO2mK?= =?us-ascii?Q?xASFB9BSjov+PRJq0EOTHPt7bZILzsBzdDPFe3lbFAIo3+BfnJiN4Tc23YUS?= =?us-ascii?Q?laaG5LR9qoMuwah5Lf6oJCWz4QHnhYKHJG1jh1O+toAw+zOmVDxjE4AcRM6h?= =?us-ascii?Q?4B+wpS/izCPt6c3NZWOO3esWkjUmVy1MsVZAJzeExaNcQwTzZToFtOtSv3Uz?= =?us-ascii?Q?6ELOBVQtl0IV/7ToXyoGiGFXsqMWNP2R3E/virj74lZvxi4h9IiYdayBm7+a?= =?us-ascii?Q?lmZpzYJt4bbMpD4zNWQbE12R3X+awD4lH9ThfjJNxgKmCIkLMXBUttdU6ojR?= =?us-ascii?Q?YlG6cWTsdXhm3/AqpbJO/4x1wDHaoJiDzkNH+zT1WnfojuLX0fp+FA5V6vPL?= =?us-ascii?Q?ZjUIi1NmSOn0+F++XwefGcHT6+r1m3gbm+MdfzzGBfxGdaAR0fSFWtuRozjL?= =?us-ascii?Q?fVvlWx26re2dX3ryhY5TEwZdkr5fUFjHXoZ008CM7VdQJjhkA7cnHMh3UeLU?= =?us-ascii?Q?DulhfF/tGpmqzy8kgn5Is6YNVGkKQs0e5jD6j1U7lh0oTMgptthNlbP18UVc?= =?us-ascii?Q?aHZ+1cUO7sKe0yHodBpuDZfr0krMYcGF1dv4g06TwS1WWFHxQJqhyjoWngCe?= =?us-ascii?Q?r+X55FPVcYe94RuX2QCXZtr7Y1TVsyveA/gTpJeU4ZzEIdEEngmhrYY4evAv?= =?us-ascii?Q?9X5WydU9JIMN5qQRx9Gi3njwhj3C155ZCm/xDREp4d8vNB80w+XlOOIiQ8pQ?= =?us-ascii?Q?sV44SMoexZznd3rZqz/Sh828wyzOW7Mn5wbMx8ce50y0xywcot8UabcBvcXc?= =?us-ascii?Q?nqyueJfn96OemQaxzm6nrlCuuwJsKJi8ed0ZfJkFmwqU1ePE1UMnlPb/0qCb?= =?us-ascii?Q?2499TLKTlwK8/Z+AWOweTijPbVdlVYEQA9xj7K/TeRZCWe4R7PV5AxuhgIgE?= =?us-ascii?Q?VK/lV7PU2aCO/rlJXsGGRK/Uy6LkjU26NLNY4OWH3cZ7PrkcJirNxPaBhu3f?= =?us-ascii?Q?4qXFuxLDYip3LyzmojTx1jdeaNpwtT3poZenM/rfkjoQoKTAqc7KjGtcsvzJ?= =?us-ascii?Q?Xwpsp2xeg4CWiiMU2cXOxPL9lqBop0AHiON+Ol883MSj9O6tqR2thkJLV3Dh?= =?us-ascii?Q?4Bb9pY+UTdg7w3Dqp+AUtMEfDdVeCEVQuqBq?= 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)(82310400026)(376014)(36860700013)(1800799024);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Sep 2025 21:23:13.5825 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: bc4b01db-9f97-4759-fe4e-08ddf49e1421 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: BL6PEPF0002256E.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR12MB7105 Content-Type: text/plain; charset="utf-8" Currently, the amd64_edac module provides decoded error data to the EDAC interface. This data involves the system physical address (PFN + offset). Furthermore, the UMC normalized address, gathered from MCA error decoding, is also provided. The DRAM Address on which the error has occurred, however, is not provided. Use the new PRM call in the AMD Address Translation Library to gather the DRAM address of an error. Include this data in the EDAC 'string' so it is available in the kernel messages and the RAS tracepoint. Signed-off-by: Avadhut Naik --- Changes in v2: 1. Modify commit message per feedback received. 2. Pass the DRAM Address to edac_mc_handle_error() through "other_detail" parameter instead of "msg". 3. Replace sprintf call with scnprintf in __log_ecc_error(). --- drivers/edac/amd64_edac.c | 23 ++++++++++++++++++++++- drivers/edac/amd64_edac.h | 1 + 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index 07f1e9dc1ca7..a10a6134eb04 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c @@ -2709,6 +2709,9 @@ static void __log_ecc_error(struct mem_ctl_info *mci,= struct err_info *err, { enum hw_event_mc_err_type err_type; const char *string; + char s[100]; + + memset(s, 0, sizeof(s)); =20 if (ecc_type =3D=3D 2) err_type =3D HW_EVENT_ERR_CORRECTED; @@ -2724,6 +2727,17 @@ static void __log_ecc_error(struct mem_ctl_info *mci= , struct err_info *err, switch (err->err_code) { case DECODE_OK: string =3D ""; + + if (err->dram_addr) { + scnprintf(s, sizeof(s), "Cs: 0x%x Bank Grp: 0x%x Bank Addr: 0x%x Row: 0= x%x Column: 0x%x RankMul: 0x%x SubChannel: 0x%x", + err->dram_addr->chip_select, + err->dram_addr->bank_group, + err->dram_addr->bank_addr, + err->dram_addr->row_addr, + err->dram_addr->col_addr, + err->dram_addr->rank_mul, + err->dram_addr->sub_ch); + } break; case ERR_NODE: string =3D "Failed to map error addr to a node"; @@ -2748,7 +2762,7 @@ static void __log_ecc_error(struct mem_ctl_info *mci,= struct err_info *err, edac_mc_handle_error(err_type, mci, 1, err->page, err->offset, err->syndrome, err->csrow, err->channel, -1, - string, ""); + string, s); } =20 static inline void decode_bus_error(int node_id, struct mce *m) @@ -2808,11 +2822,13 @@ static void umc_get_err_info(struct mce *m, struct = err_info *err) static void decode_umc_error(int node_id, struct mce *m) { u8 ecc_type =3D (m->status >> 45) & 0x3; + struct atl_dram_addr dram_addr; struct mem_ctl_info *mci; unsigned long sys_addr; struct amd64_pvt *pvt; struct atl_err a_err; struct err_info err; + int ret; =20 node_id =3D fixup_node_id(node_id, m); =20 @@ -2822,6 +2838,7 @@ static void decode_umc_error(int node_id, struct mce = *m) =20 pvt =3D mci->pvt_info; =20 + memset(&dram_addr, 0, sizeof(dram_addr)); memset(&err, 0, sizeof(err)); =20 if (m->status & MCI_STATUS_DEFERRED) @@ -2853,6 +2870,10 @@ static void decode_umc_error(int node_id, struct mce= *m) goto log_error; } =20 + ret =3D amd_convert_umc_mca_addr_to_dram_addr(&a_err, &dram_addr); + if (!ret) + err.dram_addr =3D &dram_addr; + error_address_to_page_and_offset(sys_addr, &err); =20 log_error: diff --git a/drivers/edac/amd64_edac.h b/drivers/edac/amd64_edac.h index 17228d07de4c..56de2857369a 100644 --- a/drivers/edac/amd64_edac.h +++ b/drivers/edac/amd64_edac.h @@ -399,6 +399,7 @@ struct err_info { u16 syndrome; u32 page; u32 offset; + struct atl_dram_addr *dram_addr; }; =20 static inline u32 get_umc_base(u8 channel) --=20 2.43.0