From nobody Tue Jul 7 05:55:17 2026 Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11013035.outbound.protection.outlook.com [40.107.201.35]) (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 0B8E62D73BD; Tue, 30 Jun 2026 21:08:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.201.35 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782853687; cv=fail; b=FVKAEbKBIi1zfe3srSkLECSBeLVXMtm00ZIBKSF7S5AS11oZQl6PkWenuxM9gVlyct032purmFE0/0IR1TaYSgFHr2t/RqvxnPuFTZ2LgBwPI+HRIpXKCJ1IzDHIOfOr9EkSPghs3B+7RtiigeO/i2LYpAMmnnazTNvkyY34JuU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782853687; c=relaxed/simple; bh=EEfNekimH24UUkhnuBuANGZgj17idHjI5D0nfA8wwwU=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=tdEGOG5zG+tGrNqX6JPH9Zrf9WVTaMadsRABTI5FVNTs1GRwC2CQnnR8trhJqzLVIsYsCMC/lPmnNc8AKP2oJVEJZ+g5kwv9t8KNZ7FIe8Bv12jdb2X75SXcNG/kRlodffHjeZpg4nfrdh6oTcd0T9M+heCzzoxNfcBrHlYHlB4= 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=ENDYDjcp; arc=fail smtp.client-ip=40.107.201.35 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="ENDYDjcp" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=NkAGvqjJO2d2mF/Td4UTPrdMaJ41cNmjKeJm876SEfx9u6QrFiiiY1NdgWkWtJgoJaC1nqt1NSKjBqocx5SCZKV0qlZwTB8m//7jMtKe1M6wk8705sgP/jby4BhbrKouQiZ9KK7grTfb31EyDlocJRkjviHx3LESMTdCbBPhdBrdPZBUMR+4j26VQ7J2Ll2ATHukAJ4LqKBDQlMfOHkDgUrLTJI5v/5kN8TtLuoISJw6m8VFnU73NNPsvpBGvF8ynbDDAXLnDDGMVqEjHlGUro2XHuI5XBvGbWmLW770qsZI8eyHVs4B2VmUaZOMr/jv6DBx8pdp3a5MgBRuTZdnAg== 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=0S7OabnBGBOSl7skcJO/JIRdgGqmLNDujfHcqpB58gA=; b=qG3C9H7CAh4Zi4o+FgUL8SC5k5YPwDv8ecLtDABFctRxOGob0BCy9tGHM6BjK1BRCDHk45cAJcLiG2sJBSYIfz5d+3DFox5VicXpzi8weqBF112X5KxBOQu/e3QiF5C6L/yX51VWCl29pCj1wIAjF1tMteEAmpd4qYzkz6VSMGBuRJCILs4TCp7pNRh3rI29OKHgJEAmVJB14i7MDcRJ1eTi05dehH8eOcnlJyUaOL7Bu0MeqotHEqqH7M9ZpfNZFIYdsmEnbMieR+dnacegyR0RXhFaDsiTlicUeK6kLGUYN+41TM3YYaeWsgHeTZOebfhSsxx7J+zDno4Zd2e3mA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=alien8.de 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=0S7OabnBGBOSl7skcJO/JIRdgGqmLNDujfHcqpB58gA=; b=ENDYDjcpuxMwgNOUlFCjML7hl1viWGozSxsHf1/xiyaV/74uWLDxGcsieXcpjwY1XT59KpQiyT4XgmqDaN8Gaa16nTjEl7Wz6OBnTVz6eY7wwEzS4Y8IFJcCxuDL/pKyCOyB//nD2aX5Kyl8NI4WaEhI5pA4AikMpd2pcQ+2xJ0= Received: from BN9P220CA0003.NAMP220.PROD.OUTLOOK.COM (2603:10b6:408:13e::8) by PH7PR12MB7332.namprd12.prod.outlook.com (2603:10b6:510:20f::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.159.19; Tue, 30 Jun 2026 21:07:58 +0000 Received: from BN2PEPF0000449F.namprd02.prod.outlook.com (2603:10b6:408:13e:cafe::47) by BN9P220CA0003.outlook.office365.com (2603:10b6:408:13e::8) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.159.19 via Frontend Transport; Tue, 30 Jun 2026 21:07:58 +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=satlexmb08.amd.com; pr=C Received: from satlexmb08.amd.com (165.204.84.17) by BN2PEPF0000449F.mail.protection.outlook.com (10.167.243.150) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.6 via Frontend Transport; Tue, 30 Jun 2026 21:07:57 +0000 Received: from Satlexmb09.amd.com (10.181.42.218) by satlexmb08.amd.com (10.181.42.217) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Tue, 30 Jun 2026 16:07:03 -0500 Received: from yaz-khff4.amd.com (10.180.168.240) by satlexmb09.amd.com (10.181.42.218) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Tue, 30 Jun 2026 14:06:54 -0700 From: Yazen Ghannam To: , CC: , Avadhut Naik , "Yazen Ghannam" Subject: [PATCH v7 1/3] RAS/AMD/ATL: Directly export address translation helper Date: Tue, 30 Jun 2026 17:06:38 -0400 Message-ID: <20260630210640.680758-2-yazen.ghannam@amd.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260630210640.680758-1-yazen.ghannam@amd.com> References: <20260630210640.680758-1-yazen.ghannam@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 satlexmb09.amd.com (10.181.42.218) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN2PEPF0000449F:EE_|PH7PR12MB7332:EE_ X-MS-Office365-Filtering-Correlation-Id: 42a9d6cc-6eac-41c8-7b0f-08ded6eba94d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|1800799024|23010399003|82310400026|376014|18002099003|6133799003|11063799006|56012099006|3023799007|22082099003; X-Microsoft-Antispam-Message-Info: 1QhklPOfiszdXmERC4Kw+E700lRHvh71nzV8nnNsMkCqyJcf9nOMyYvX3cQVMopN+C7ew4chillVEzItneP+HjUIzSdZCeZGhsGQZLZwUM+TZLE2e6FM2GKigS8tR8xbI/BHU8v1Sy0ECWW2Gf39+blcOqKkM0Tt8WI0aVyWz9yi/WD2GAwLubMoAgOG4b23vtMcvM7nmbWrApDNeGhAfVkkyR77PLGDfl7fySbrSsAyTnbyZvAPaR1KP2aGQtpDedFqgWcXsLKYqfxjIphntos06RUuJmsfByBh+rlgm/PBQ6WcSKEax1yt5MQoUTHaX1wNW6TzSddnQRS1G5XB6Adr2OgCYiyXVCRktKUHRzyGyEV4F+RAzVXu/J2ufu4i4IJsgYsw8nDGw21mhNQ1zvy4Npa9IRd7c9qs2PIVWzLps1wUX4STuMW4562AjwU/2rTu4sy2jyNSCpi0YQyk2GNBt/ORFn7wXra/lauPl3DJCHk0F9SN6NBRGcZ8Q0LhMwBbBfs7/d7db2kbRu4RAwJnNSJe2dngHAoJ2sjbdv57c7RuzBreRzmTv5sTJpUgumMhDe/ND9uXRtvadQWpt7xz3XsAxqHe3xoFYuVg2vFBeYwLQnoFGLLnmcfO8qk9dNEkP/GYyfgf2udoOfdSfQQPes1dlY0swOPSXHrUElhhjMP8EB0CBDiYZHa0sF3sGfzAqKIC+wT0pEyGWgRazg== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb08.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700016)(1800799024)(23010399003)(82310400026)(376014)(18002099003)(6133799003)(11063799006)(56012099006)(3023799007)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Gd7ljv9MllxCYUp2uOUFq5B0ZOeQwd4WVEw7d+46YMCWMeM6HWcI1Fq4loLa/EuwB96VVq80mup6m//vo5gMcCcsc3qX6jsMABuMEmkpzr5hqIBoVbIVeRcfIUi0VCNiXATjzWeKNR4w1uRs5UnvbSlFf0UoPTt/cAWg2skpBL4IDdGkxzQwQlY0BJ8VppAcaLrUm8M6l/b3VS2T+FylYIW98/bCNyfsj52pqSu9znVFiXJmYuBGTsNGS60kWcIOOi18N/LaH01VBNlzimckEpAHMyEi9lMUoC+7qdber1626CMpwmJWcaympifWVbX8DrWzcCMfqv87oQ59fO6oX5zqIh5YX5jQEQKBL6rXlq3BEX1cL3XCgATRLi3VpEaaM7308C/Buc9RVd8JUyFllJkAOFIiXAWSaK6KNLIY0D8oq7vnKsY85mS/4Qcdbvm7 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jun 2026 21:07:57.8892 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 42a9d6cc-6eac-41c8-7b0f-08ded6eba94d 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=[satlexmb08.amd.com] X-MS-Exchange-CrossTenant-AuthSource: BN2PEPF0000449F.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB7332 Content-Type: text/plain; charset="utf-8" Currently, the address translation function is accessed indirectly through a function pointer set at module init. This is useful to allow the translation library to be built as an optional module independent of its consumers. However, it becomes cumbersome to add new functions in this way. Remove the indirection and export the current helper function. This introduces a linker issue when AMD_ATL=3Dm and a consumer module is built-in. Address this issue by using the IS_REACHABLE() config guard. Also, shorten the helper function name a bit. Assisted-by: Claude:claude-opus-4-8 Originally-by: Borislav Petkov Signed-off-by: Yazen Ghannam --- drivers/edac/amd64_edac.c | 2 +- drivers/ras/amd/atl/core.c | 17 ++++++----------- drivers/ras/amd/atl/umc.c | 2 +- drivers/ras/amd/fmpm.c | 2 +- drivers/ras/ras.c | 31 ------------------------------- include/linux/ras.h | 8 +++----- 6 files changed, 12 insertions(+), 50 deletions(-) diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index c6aa69dbd9fb..880036599456 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c @@ -2847,7 +2847,7 @@ static void decode_umc_error(int node_id, struct mce = *m) a_err.ipid =3D m->ipid; a_err.cpu =3D m->extcpu; =20 - sys_addr =3D amd_convert_umc_mca_addr_to_sys_addr(&a_err); + sys_addr =3D amd_convert_umc_addr_to_sys_addr(&a_err); if (IS_ERR_VALUE(sys_addr)) { err.err_code =3D ERR_NORM_ADDR; goto log_error; diff --git a/drivers/ras/amd/atl/core.c b/drivers/ras/amd/atl/core.c index 0f7cd6dab0b0..49695313f850 100644 --- a/drivers/ras/amd/atl/core.c +++ b/drivers/ras/amd/atl/core.c @@ -192,6 +192,12 @@ static const struct x86_cpu_id amd_atl_cpuids[] =3D { }; MODULE_DEVICE_TABLE(x86cpu, amd_atl_cpuids); =20 +unsigned long amd_convert_umc_addr_to_sys_addr(struct atl_err *err) +{ + return convert_umc_mca_addr_to_sys_addr(err); +} +EXPORT_SYMBOL_GPL(amd_convert_umc_addr_to_sys_addr); + static int __init amd_atl_init(void) { int ret; @@ -210,23 +216,12 @@ 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); =20 pr_info("AMD Address Translation Library initialized\n"); return 0; } =20 -/* - * Exit function is only needed for testing and debug. Module unload must = be - * forced to override refcount check. - */ -static void __exit amd_atl_exit(void) -{ - amd_atl_unregister_decoder(); -} - module_init(amd_atl_init); -module_exit(amd_atl_exit); =20 MODULE_DESCRIPTION("AMD Address Translation Library"); MODULE_LICENSE("GPL"); diff --git a/drivers/ras/amd/atl/umc.c b/drivers/ras/amd/atl/umc.c index befc616d5e8a..b59556ded2c8 100644 --- a/drivers/ras/amd/atl/umc.c +++ b/drivers/ras/amd/atl/umc.c @@ -318,7 +318,7 @@ static void _retire_row_mi300(struct atl_err *a_err) a_err->addr &=3D ~MI300_UMC_MCA_COL; a_err->addr |=3D FIELD_PREP(MI300_UMC_MCA_COL, col); =20 - addr =3D amd_convert_umc_mca_addr_to_sys_addr(a_err); + addr =3D amd_convert_umc_addr_to_sys_addr(a_err); if (IS_ERR_VALUE(addr)) continue; =20 diff --git a/drivers/ras/amd/fmpm.c b/drivers/ras/amd/fmpm.c index 4ccaaf7b70bf..48ca7f598387 100644 --- a/drivers/ras/amd/fmpm.c +++ b/drivers/ras/amd/fmpm.c @@ -334,7 +334,7 @@ static void save_spa(struct fru_rec *rec, unsigned int = entry, a_err.ipid =3D id; a_err.cpu =3D cpu; =20 - spa =3D amd_convert_umc_mca_addr_to_sys_addr(&a_err); + spa =3D amd_convert_umc_addr_to_sys_addr(&a_err); if (IS_ERR_VALUE(spa)) { pr_debug("Failed to get system address\n"); return; diff --git a/drivers/ras/ras.c b/drivers/ras/ras.c index 03df3db62334..011de2c257b1 100644 --- a/drivers/ras/ras.c +++ b/drivers/ras/ras.c @@ -10,37 +10,6 @@ #include #include =20 -#if IS_ENABLED(CONFIG_AMD_ATL) -/* - * Once set, this function pointer should never be unset. - * - * The library module will set this pointer if it successfully loads. The = module - * should not be unloaded except for testing and debug purposes. - */ -static unsigned long (*amd_atl_umc_na_to_spa)(struct atl_err *err); - -void amd_atl_register_decoder(unsigned long (*f)(struct atl_err *)) -{ - amd_atl_umc_na_to_spa =3D f; -} -EXPORT_SYMBOL_GPL(amd_atl_register_decoder); - -void amd_atl_unregister_decoder(void) -{ - amd_atl_umc_na_to_spa =3D NULL; -} -EXPORT_SYMBOL_GPL(amd_atl_unregister_decoder); - -unsigned long amd_convert_umc_mca_addr_to_sys_addr(struct atl_err *err) -{ - if (!amd_atl_umc_na_to_spa) - return -EINVAL; - - return amd_atl_umc_na_to_spa(err); -} -EXPORT_SYMBOL_GPL(amd_convert_umc_mca_addr_to_sys_addr); -#endif /* CONFIG_AMD_ATL */ - #define CREATE_TRACE_POINTS #define TRACE_INCLUDE_PATH ../../include/ras #include diff --git a/include/linux/ras.h b/include/linux/ras.h index 468941bfe855..4b095ddb9071 100644 --- a/include/linux/ras.h +++ b/include/linux/ras.h @@ -41,15 +41,13 @@ struct atl_err { u32 cpu; }; =20 -#if IS_ENABLED(CONFIG_AMD_ATL) -void amd_atl_register_decoder(unsigned long (*f)(struct atl_err *)); -void amd_atl_unregister_decoder(void); +#if IS_REACHABLE(CONFIG_AMD_ATL) void amd_retire_dram_row(struct atl_err *err); -unsigned long amd_convert_umc_mca_addr_to_sys_addr(struct atl_err *err); +unsigned long amd_convert_umc_addr_to_sys_addr(struct atl_err *err); #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= ; } +amd_convert_umc_addr_to_sys_addr(struct atl_err *err) { return -EINVAL; } #endif /* CONFIG_AMD_ATL */ =20 #if defined(CONFIG_ARM) || defined(CONFIG_ARM64) --=20 2.53.0 From nobody Tue Jul 7 05:55:17 2026 Received: from SJ2PR03CU001.outbound.protection.outlook.com (mail-westusazon11012016.outbound.protection.outlook.com [52.101.43.16]) (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 8EC6C2F8EB8; Tue, 30 Jun 2026 21:08:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.43.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782853697; cv=fail; b=FQkHQM/1X/OL3RTTcIzKIApJESRS4tcyrMN3IrS8MN91PC/V3EJskOk1uoJMw5cqZK3uTHaEK0uelU0Uv/L+zq0/vAvzoIWGxmUGEY95XhGlKHkIi8g8aK9A3ougUk1dSmtNiP+p4ItBTeYzfEvT0IrnHTvs7eAiB4R/plwQoHg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782853697; c=relaxed/simple; bh=fXUaknt7G//yXDpB8HKJ0hS/lytTFTCQVkskyG4vti8=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=LVAcJLCfAwq2EkXBvIGHpj7Kt8kjTKuJ/WqBYDxsHLCUD9B4S0t6eHlMe6h9Bm+9td1sda8d/+vdjDo7ACXAE2sW6OsyO7fvHRCgFGVNXNimdvPIEMrNJ8aqDXM3M0C9lQ3qqeUBM/p7hhHreQXFMIezdWruk3ZPh3kw4f3KApg= 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=s668Vn7m; arc=fail smtp.client-ip=52.101.43.16 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="s668Vn7m" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=A1ul+fpPd0exUf88uN5O0dg8zXKvWxMM5qAep+YNHg/O3uK9CdvzoJlmCMM5zMm5IHbOnLNPqG5JNkrOG9/d6CSeiAOQ/VR+O9PpPgrdiNF9CDQdynHj85O9WSxEv/oxMlmuQuJpFY/9fLCmltEBymmiSsfpWBPxUFz4rLy7sTyuvLoG1bK8eSzKMf2MI121USbrRf2Wt7Mxkt9pV3VRmULEvnR87lTNP5KTKFsbFlXp07Ilb5bxOZCpqE3whE2qioYSQelMGjz3SZGoqZWWeCCQhajgfoFWRAtGkpoLTaLQ/FnK4ZBGQYGCvW/UHbqTao6j2LM7LOFjPQ1yx42ykg== 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=t9sMn9v8R//N3g7/pCu0AF7DEwN6FYlMuLsEtas9Ybc=; b=vjMqGVOte8YwNBE2vAss+wL1WrcKkznB4nyfoYADcZpXryiKpGjQIDXCPjfdNHZW5RKmBlxrRIjmZ9fPZ5S+7xR16P7G1ieSjznc4bruG/bjk+x6Z31F1wYCnY2wtNmE5xlFLYvB8xqFfHMWwECnh6lCUPWJ8hhBHCB7hrf1rTBPatpgf672RuIqPH3Dbp2Tf/t/hzhOARI2lVUGxU0JJzfwIX/8S1DC+SXu6FoLboOkDUeNWWkhVNDft2ELJc33O17C8klsiJ4UFbiC6VOcflrN8Jh0sjZU3uGDmArcBviYSgMfWwUlrdmcJX0ZhfuAYyZ406Lj5IylxOjhBTPmVw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=alien8.de 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=t9sMn9v8R//N3g7/pCu0AF7DEwN6FYlMuLsEtas9Ybc=; b=s668Vn7mwsdhk20DEA9VAYMUQEmiTubmVZvkPzj02eo+ci/3IVsyi4fPMBpCC3if3MwfI0/Tmul2qtcX1l9GZnzB55q7c5/SBr9djlJvvoDtSvKCnWPmgJ58gMX825B+vDbg2zkfY+YNxodM3MVf3qb9lWGxLsSulPTELKwdC4w= Received: from MW4PR04CA0180.namprd04.prod.outlook.com (2603:10b6:303:85::35) by MN0PR12MB6032.namprd12.prod.outlook.com (2603:10b6:208:3cc::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.159.19; Tue, 30 Jun 2026 21:08:08 +0000 Received: from SJ1PEPF0000231B.namprd03.prod.outlook.com (2603:10b6:303:85:cafe::57) by MW4PR04CA0180.outlook.office365.com (2603:10b6:303:85::35) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.181.8 via Frontend Transport; Tue, 30 Jun 2026 21:08:07 +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 SJ1PEPF0000231B.mail.protection.outlook.com (10.167.242.232) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.6 via Frontend Transport; Tue, 30 Jun 2026 21:08:06 +0000 Received: from Satlexmb09.amd.com (10.181.42.218) 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.41; Tue, 30 Jun 2026 16:07:08 -0500 Received: from yaz-khff4.amd.com (10.180.168.240) by satlexmb09.amd.com (10.181.42.218) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Tue, 30 Jun 2026 14:06:55 -0700 From: Yazen Ghannam To: , CC: , Avadhut Naik , "Yazen Ghannam" Subject: [PATCH v7 2/3] RAS/AMD/ATL: Translate UMC normalized address to DRAM address using PRM Date: Tue, 30 Jun 2026 17:06:39 -0400 Message-ID: <20260630210640.680758-3-yazen.ghannam@amd.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260630210640.680758-1-yazen.ghannam@amd.com> References: <20260630210640.680758-1-yazen.ghannam@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 satlexmb09.amd.com (10.181.42.218) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF0000231B:EE_|MN0PR12MB6032:EE_ X-MS-Office365-Filtering-Correlation-Id: 766e71d0-e002-4c54-7368-08ded6ebae85 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|36860700016|376014|82310400026|1800799024|13003099007|18002099003|22082099003|11063799006|5023799004|56012099006|6133799003; X-Microsoft-Antispam-Message-Info: ZIzsxuU0wXc5T0s75i98j6+NmkWqAzGxCplIIVBFxea0pV0zXLYPg2LYbG6h+0RE4MSbFDzSssM7LH1XCPvJ1Vss1r0cVuxl9sBXSxSHvwaDL82/fGX0/X4vRN5Ix+1Ea4dZDXRuoG27kqeeAKJwZIbRzqQYyh61aVHy7HwQkLblpRxNcvIXWWgTGBpKCEKk2iuGOAP87RTKEziDZPj9RPrrT0r7+J3JrjASKTdl2lETFK/CnLhg9Nf/3ln9uiCin4X2eRsGR9nmRHs2aHZYO2QALd5skr7rp1mOzrCrFwTzJ5AcdKBL7cIOTDoJQV6gQP9GsNv0cvas9TuZJL3fgzpEddO8LmEeCqILQ9Zk65eLTI9se8sAI9oXKsKFj8n1+REuSUHcvz3RYSPNC0VeS418NrpwLCpX+/JMaWCSHm89SyBoWFzbPob9FvZk0wk7rnac/SHdHriGxIWisBmRFjAQNd9jYu1u2IXJBrETGnE4OtnfAWyrHhW5+WUJjKgg7Hb/zb4b1dNWtBBHvQnkBoIMjxmvmOcp7OhaeLiLeRYHQVYH4jn+b4+kB49W67M6GPSQSfVyoFUVmq5FpQHzdQsFxZla6MUUTiw5lcOtX5GPCFQkMCdHRXTbBqjqSTSwU3pPBdjLefMEdltegUTXGjhYbxuvMPH9gghJmVcs7+UrvIIJ1gRX4Ur7Tqv5qju14Xky9LCjiWumtj2oVEkTSQ== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(23010399003)(36860700016)(376014)(82310400026)(1800799024)(13003099007)(18002099003)(22082099003)(11063799006)(5023799004)(56012099006)(6133799003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: bUrVSFXCqVPEdtPHQQBlxZzwyMc7JR3nn+MgWWrYBAX1iJcF/31hJx14bFoxTrvV8rLpJxVcq3k8TZpPOMhqFajK5MWKzOS2mW9W9NYa7o6ekvqeVs7Z8Hy93dpSe4WWadp9JVpG65rMM0C2HkwTMkeUXaJURC60KQX9GgbItJ+sypq5nJ6aHz7tzteigp7018yLxS6TXC7Lb5AeeUq//Mv9H6tdz2Gku9Jlfif0TTUBoO2vh4P72izrX7XPeer+zc7WzoxGIxZ6mh71njvgQkfefa6UQ/qiU72rYwPfe4DCyiHzwdsul31jon84AgMSCMeBsz3zGlt9HVdzS+3/2dO0u1StVOKdOEBvDE6pSIcpylykaoRfXqlWyjYEqkEtVGTvUcTOR1zF3JTM0YmVaTV/HtLv6eylpJb6YCQB18vWwTtNof4Wmzdcqtm5l9bx X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jun 2026 21:08:06.5818 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 766e71d0-e002-4c54-7368-08ded6ebae85 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: SJ1PEPF0000231B.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN0PR12MB6032 Content-Type: text/plain; charset="utf-8" From: Avadhut Naik 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, export 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 [Yazen: Remove 'handler available' check] Signed-off-by: Avadhut Naik Signed-off-by: Yazen Ghannam --- drivers/ras/amd/atl/core.c | 6 ++++++ drivers/ras/amd/atl/internal.h | 11 ++++++++++- drivers/ras/amd/atl/prm.c | 32 ++++++++++++++++++++++++++++---- drivers/ras/amd/atl/system.c | 3 +++ drivers/ras/amd/atl/umc.c | 9 +++++++++ include/linux/ras.h | 14 ++++++++++++++ 6 files changed, 70 insertions(+), 5 deletions(-) diff --git a/drivers/ras/amd/atl/core.c b/drivers/ras/amd/atl/core.c index 49695313f850..52d4d973f4ad 100644 --- a/drivers/ras/amd/atl/core.c +++ b/drivers/ras/amd/atl/core.c @@ -198,6 +198,12 @@ unsigned long amd_convert_umc_addr_to_sys_addr(struct = atl_err *err) } EXPORT_SYMBOL_GPL(amd_convert_umc_addr_to_sys_addr); =20 +int amd_convert_umc_addr_to_dram_addr(struct atl_err *err, struct atl_dram= _addr *dram_addr) +{ + return convert_umc_mca_addr_to_dram_addr(err, dram_addr); +} +EXPORT_SYMBOL_GPL(amd_convert_umc_addr_to_dram_addr); + static int __init amd_atl_init(void) { int ret; diff --git a/drivers/ras/amd/atl/internal.h b/drivers/ras/amd/atl/internal.h index 82a56d9c2be1..b6ca5fef6ec7 100644 --- a/drivers/ras/amd/atl/internal.h +++ b/drivers/ras/amd/atl/internal.h @@ -280,23 +280,32 @@ 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 /* GUIDs for PRM handlers */ extern const guid_t norm_to_sys_guid; +extern const guid_t norm_to_dram_guid; =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; } -#endif =20 +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 /* * Make a gap in @data that is @num_bits long starting at @bit_num. * e.g. data =3D 11111111'b diff --git a/drivers/ras/amd/atl/prm.c b/drivers/ras/amd/atl/prm.c index 0f9bfa96e16a..c69158f66639 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; @@ -31,7 +32,7 @@ struct norm_to_sys_param_buf { =20 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 @@ -51,3 +52,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/system.c b/drivers/ras/amd/atl/system.c index 812a30e21d3a..33a04f3e7da8 100644 --- a/drivers/ras/amd/atl/system.c +++ b/drivers/ras/amd/atl/system.c @@ -17,6 +17,9 @@ const guid_t norm_to_sys_guid =3D GUID_INIT(0xE7180659, 0xA65D, 0x451D, 0x92, 0xCD, 0x2B, 0x56, 0xF1, 0x2B, 0xEB, 0xA6); +const guid_t norm_to_dram_guid =3D GUID_INIT(0x7626C6AE, 0xF973, 0x429C, + 0xA9, 0x1C, 0x10, 0x7D, 0x7B, + 0xE2, 0x98, 0xB0); =20 int determine_node_id(struct addr_ctx *ctx, u8 socket_id, u8 die_id) { diff --git a/drivers/ras/amd/atl/umc.c b/drivers/ras/amd/atl/umc.c index b59556ded2c8..f8470d74a9b0 100644 --- a/drivers/ras/amd/atl/umc.c +++ b/drivers/ras/amd/atl/umc.c @@ -416,3 +416,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/include/linux/ras.h b/include/linux/ras.h index 4b095ddb9071..205ceb447e23 100644 --- a/include/linux/ras.h +++ b/include/linux/ras.h @@ -41,13 +41,27 @@ 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_REACHABLE(CONFIG_AMD_ATL) void amd_retire_dram_row(struct atl_err *err); unsigned long amd_convert_umc_addr_to_sys_addr(struct atl_err *err); +int amd_convert_umc_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_addr_to_sys_addr(struct atl_err *err) { return -EINVAL; } +static inline int +amd_convert_umc_addr_to_dram_addr(struct atl_err *err, + struct atl_dram_addr *dram_addr) { return -EINVAL; } #endif /* CONFIG_AMD_ATL */ =20 #if defined(CONFIG_ARM) || defined(CONFIG_ARM64) --=20 2.53.0 From nobody Tue Jul 7 05:55:17 2026 Received: from CY7PR03CU001.outbound.protection.outlook.com (mail-westcentralusazon11010030.outbound.protection.outlook.com [40.93.198.30]) (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 1B08A2FE057; Tue, 30 Jun 2026 21:08:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.198.30 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782853688; cv=fail; b=Mjw2wBj89VCDTiB1qDIdkt4iPzdGAYWMwHtkB4x0Y9MGo0li9qxSfirvHZVJSdyNSMWhode4NeZYfk8RAoX+P8lBMgmki6oN6hziKkyfiB3ZTH4hr0utFBXdMs5AQqvwy++Jgn3P387rIe3FQRKdScOIHuye2TO9rDVWgPrlAtY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782853688; c=relaxed/simple; bh=i0Qjo2LP3n5dQDp4GIoWKoBTuMluV3umoNYcPWNavhU=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=rCU6faCfUEsPP4wCcNV6pbzsOAG8PNdG6u2qwjtZa1gaKLFXtYweHPt7cxX0ORy6IlvE43LZiHaiSMN0qp+ZS63UWqsdJXG8kglUO0jb95R6nCXCoW3xamTtizQu0te5inINXfP/eArLueb69OlKro93Rfpq+7aWn2C4EvJ19s0= 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=YPTRTGgZ; arc=fail smtp.client-ip=40.93.198.30 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="YPTRTGgZ" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=s5ZQ5MoIhme7bkOXB3Sg2Ywm5lE3g/EIIingW6orefD7BbEYuHUoeezWrSNSL7EMBi+YWXV7ndPm+HVGhS0i7xA5n42oVsoEUXuqmsY26nF4Vn3oZzQOZhQj5w//NH3vaXvNlbbOsf7E8L9wy/XLMPn5KLVUuyiY/nt511RbHI/vYMLJhlA+QMcw1p6epWoSsxE68jeH9HJXFHp2QT6BY5uvlO4VGqS/bNLJ3jBSOg+Adiu/LFhRRH07Ct0jizpCnqvTijzcE3BEkuiMULz7yE4aQ48Mafb8UCrAk++bLyLHZRH/kC5qJd8APYrn3EYIWAoJQDHshlafWhwmiOTxiQ== 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=wTONkEm+1hg2ERdHIT+9PUDRIwRFKHX0M1c5NcEX1hY=; b=rzXpY45uFgqhOdyklnULd5H7rJ86VB7xt83m/h+GA2ikZ5bMTPKjimJLGQOVBpVbPUFsy76/IZvKUwG+JCny1yEozOXjfIr4R29pZrJ8+yTAPWAuDA41X/KJdwW/PLgEgoNr+jC8yN2IWgiFw/DapINrCOps4KNqpq74dzaFG5xnkn4F/KwvK8Z8h93crLjEBHF+vKXQXFFONS5mxlWq11LqWhVVcL4NmcCyjnFZZ8yIeAe189X7xCMtFmLq3KZ6zLo6exejkmgOJ7O8vzCg5dbyvy9znfvU1H3cLqHikFSXAcA+g6RNDkp+G0eZrc9Xg6i3N1IN0GSQxoPlZiepKA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=alien8.de 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=wTONkEm+1hg2ERdHIT+9PUDRIwRFKHX0M1c5NcEX1hY=; b=YPTRTGgZW1S+QjwUyCelNNno9p16D06BF5ord6JejRZV7dOnXG3v29grdcoqr+DnKz0VCLbO3Ft81jMF85W2g4vpwPU3EHfb+IOSnCxXOwFhBB8oQUnOt2XoSbfF7vNXbJiDy1UuRF7vfJZWlwS9K8/GX7iqCAQFtjdNi9zpoy8= Received: from BN9P220CA0011.NAMP220.PROD.OUTLOOK.COM (2603:10b6:408:13e::16) by CY8PR12MB8068.namprd12.prod.outlook.com (2603:10b6:930:75::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.8; Tue, 30 Jun 2026 21:08:00 +0000 Received: from BN2PEPF0000449F.namprd02.prod.outlook.com (2603:10b6:408:13e:cafe::6c) by BN9P220CA0011.outlook.office365.com (2603:10b6:408:13e::16) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.159.19 via Frontend Transport; Tue, 30 Jun 2026 21:07:58 +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=satlexmb08.amd.com; pr=C Received: from satlexmb08.amd.com (165.204.84.17) by BN2PEPF0000449F.mail.protection.outlook.com (10.167.243.150) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.6 via Frontend Transport; Tue, 30 Jun 2026 21:07:58 +0000 Received: from Satlexmb09.amd.com (10.181.42.218) by satlexmb08.amd.com (10.181.42.217) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Tue, 30 Jun 2026 16:07:33 -0500 Received: from yaz-khff4.amd.com (10.180.168.240) by satlexmb09.amd.com (10.181.42.218) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.41; Tue, 30 Jun 2026 14:06:56 -0700 From: Yazen Ghannam To: , CC: , Avadhut Naik , "Yazen Ghannam" Subject: [PATCH v7 3/3] EDAC/amd64: Include DRAM address in output Date: Tue, 30 Jun 2026 17:06:40 -0400 Message-ID: <20260630210640.680758-4-yazen.ghannam@amd.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260630210640.680758-1-yazen.ghannam@amd.com> References: <20260630210640.680758-1-yazen.ghannam@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 satlexmb09.amd.com (10.181.42.218) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN2PEPF0000449F:EE_|CY8PR12MB8068:EE_ X-MS-Office365-Filtering-Correlation-Id: 2fe5c200-6717-4cb9-58d8-08ded6eba9cd X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|30052699003|23010399003|1800799024|376014|82310400026|36860700016|18002099003|22082099003|3023799007|11063799006|56012099006; X-Microsoft-Antispam-Message-Info: Cefxqt4iqoZwIvkI6r+fH49TiMIiMKqr/s1ZM6fRilNakTG1np29py3E/8ApaxrtvF0yUHPgoFVknJBahQgsCs9Vmjvba4PaIPelharnNmubHLmJXGM2oCmlrRM7YFUH6SupgCLlNBs7OnhyEukUOdu8JAUhz9zvSws3DtcMt+gGd/N3wBsueZNa8fBCGYUZQgZ6irYcXJqAH+Oa3XgaZzGbHpeHVEa8fLblOu1FPYdN/Avzx53+Kz/BebrHN2/0Fq4N6CKeLLcOaxhCikx1H09KyqjAbqKVMCesba/6Rzn7UjHOkdM+kaJzW/YiVUiI0NzYEOgSSYI2U6RO14h+bDmcIAu8TGuBZ43bp8RRCWupToEBilePItNwycfxl6uQ+WV64KXZi3tSVArt+9zHNOekVSEarvbL5gB1kksJeV9eAE82z4iqsvu7wUhmjBNihTDQqOYL8s6uaDXoPD27DOL5BZQHxBSS9LuILBgbl1x8/7KoWMhieXGiH0BBPl3MC8JWDxQEzBEbnL1QDFHPEIWx/Xt5P4AW5e3qiv3wsqpjsDqFoKOTXitke13OGQkRWXNvpdkdEZa/w4RNNj3Jo+Ptqkwe58xVQJI4XlvIrUIEl9jk7hkmQmORs3J2OQ/eZz+XCKvhlwxfEjpdDGl04Xz71yavMjWiWAL/SPNKj9eVWz+hhmcbdWaMcrNvhNuTVx1qcPeESjZIPbBIiyhxYw== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb08.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(30052699003)(23010399003)(1800799024)(376014)(82310400026)(36860700016)(18002099003)(22082099003)(3023799007)(11063799006)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 9me4WI0bgYYSedT5gerKI2RkV4ghWrligs9RhGS/nj1ZGya9F+YwF8sqOJGjNCj2ZjHzPeidZgYEkmOOibyJzRulRMxLNjLhMjayY7IfUctGvDcnAFD0gWJ3ENkLosNnfd97XCZGsNq7Jm5ab4YgTpEfkasxyGClEnL/OIy2Mszhk/l/LCpWFX64CERooLcpAEB7BEeraAHxIy9TFRgMy8srGe8o3/xIk8h2eEB3K93tdLcgYN27Ze7awjBdKx/Zonb6Yep8c8szVFb3uu8Vzk++GJL20QoAoBE5Kh1q6SOZujB6nALOm3DbLL4BCk4vN64L6lwliIXQ/YiMh0d1ByoO+FyvhBBzvmo4WmFBDVKcbYKlQ61yxz6XpOhfZdKFabEOZq3vAVhaZplWCZhgQ44E/fiylRcwPL84JCfhZixkRozTiHx1eOF9erflXpp/ X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jun 2026 21:07:58.7263 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2fe5c200-6717-4cb9-58d8-08ded6eba9cd 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=[satlexmb08.amd.com] X-MS-Exchange-CrossTenant-AuthSource: BN2PEPF0000449F.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR12MB8068 Content-Type: text/plain; charset="utf-8" From: Avadhut Naik The DRAM address of an error is used by tooling to find failure patterns. This information can be used for general analysis off system. And it can be used on system to take action like offline a page affected by a bad row. Other EDAC modules (GHES and SKX) provide this information in their output. The AMD64 EDAC module was not able to provide this information, because system-specific translation is needed. Recent AMD systems provide a PRM handler for DRAM address translation. Use this PRM handler to get the DRAM address of an error. Include this in the EDAC "other_detail" field. Also include the Socket and IPID in the EDAC "other_detail" field. These are needed by tooling to translate a DRAM address to a System Physical Address. [Yazen: Reformat other_detail string] Signed-off-by: Avadhut Naik Co-developed-by: Yazen Ghannam Signed-off-by: Yazen Ghannam --- drivers/edac/amd64_edac.c | 32 +++++++++++++++++++++++++++++++- drivers/edac/amd64_edac.h | 3 +++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index 880036599456..477c8bf620fc 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c @@ -2704,11 +2704,16 @@ static int get_channel_from_ecc_syndrome(struct mem= _ctl_info *mci, u16 syndrome) return map_err_sym_to_channel(err_sym, pvt->ecc_sym_sz); } =20 +#define MSG_SIZE 512 + static void __log_ecc_error(struct mem_ctl_info *mci, struct err_info *err, u8 ecc_type) { enum hw_event_mc_err_type err_type; const char *string; + char s[MSG_SIZE]; + + memset(s, 0, sizeof(s)); =20 if (ecc_type =3D=3D 2) err_type =3D HW_EVENT_ERR_CORRECTED; @@ -2721,6 +2726,23 @@ static void __log_ecc_error(struct mem_ctl_info *mci= , struct err_info *err, return; } =20 + if (err->dram_addr) { + struct atl_dram_addr *da =3D err->dram_addr; + char *p =3D s, *end =3D p + sizeof(s); + + /* Include a version prefix in case the format needs to change later. */ + p +=3D scnprintf(p, end - p, " [AMDv1]"); + p +=3D scnprintf(p, end - p, " %s:0x%x", "SocketId", err->socketid); + p +=3D scnprintf(p, end - p, " %s:0x%llx", "IPID", err->ipid); + p +=3D scnprintf(p, end - p, " %s:0x%x", "ChipSelect", da->chip_select); + p +=3D scnprintf(p, end - p, " %s:0x%x", "Row", da->row_addr); + p +=3D scnprintf(p, end - p, " %s:0x%x", "Column", da->col_addr); + p +=3D scnprintf(p, end - p, " %s:0x%x", "Bank", da->bank_addr); + p +=3D scnprintf(p, end - p, " %s:0x%x", "BankGroup", da->bank_group); + p +=3D scnprintf(p, end - p, " %s:0x%x", "RankMul", da->rank_mul); + p +=3D scnprintf(p, end - p, " %s:0x%x", "SubChannel", da->sub_ch); + } + switch (err->err_code) { case DECODE_OK: string =3D ""; @@ -2748,7 +2770,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,6 +2830,7 @@ static void umc_get_err_info(struct mce *m, struct er= r_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; @@ -2822,8 +2845,12 @@ 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 + err.socketid =3D m->socketid; + err.ipid =3D m->ipid; + if (m->status & MCI_STATUS_DEFERRED) ecc_type =3D 3; =20 @@ -2853,6 +2880,9 @@ static void decode_umc_error(int node_id, struct mce = *m) goto log_error; } =20 + if (!amd_convert_umc_addr_to_dram_addr(&a_err, &dram_addr)) + 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 1757c1b99fc8..39c1b6471909 100644 --- a/drivers/edac/amd64_edac.h +++ b/drivers/edac/amd64_edac.h @@ -400,6 +400,9 @@ struct err_info { u16 syndrome; u32 page; u32 offset; + struct atl_dram_addr *dram_addr; + u32 socketid; + u64 ipid; }; =20 static inline u32 get_umc_base(u8 channel) --=20 2.53.0