From nobody Sun May 24 21:39:30 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.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 E4D322FD1CA; Thu, 21 May 2026 07:38:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.10 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779349114; cv=none; b=BfEq5g5UMIxEE4AOOqvPjZJnej3qO+5WPgE/52XAUsJc9w3C9WwV3CGEUNect+mkvoqftrozx41d32snHQT0GXVx99hIvInWKJHWtwkQ3pE82nloO1Q+PH4IchiWWcxdARWa3B7yxxaSow9Yo3I23lzlXLvVDZ9Fn2cyY5AnTBE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779349114; c=relaxed/simple; bh=Mbe5hz6Y3uNxsC5wAEABVT3EVK/RvFRtN/WI3+KXuP0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=a1K0yJnAPnGurjhcvsGtRzl0UYNedBSKKhynJbXi5qaEVoWIwvbkdnqVsItU7RF2z9FHVBy5UBClkn6QQPojGN4q83/VDd0wdEIieUy6PzTofHIGrC4yIIdi1nn350+NMNOQ8dC6Hj8e49B9gAcr+1qqIdo8y2NjyDYnFk487kg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=nTj3/LvT; arc=none smtp.client-ip=198.175.65.10 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="nTj3/LvT" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1779349113; x=1810885113; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Mbe5hz6Y3uNxsC5wAEABVT3EVK/RvFRtN/WI3+KXuP0=; b=nTj3/LvT66UYdWFTmXq/hacMb84hCAlaMkZEi9IOIoNMt2k3d427m0Ir SKMqMoCZoHZQao69BHUEBoOchoedpfdLJjQ/FKuxuKRmloUfPACtGVcwW 71E5yv4OoyaRp0hL3BJ57y83LNh6qGQrjBM7QlFNrfyk6pY/fZLG1QMlo eG1rwA8521odrW1uRCTBINO8k8ItOgBgZcBkdcn0p0FIWXTUz9NKi3yhQ 3pWDG6grtz8K5+ESPEyh0gq+Z+3Q5bFFa9E9rB1bD/3OtpgynoUr9l7UX 9D49p2W44iRSwgRjjM2N64lgI8VYjDFOMEmCyR3Jhy4vG5HOa74YT3ZsO g==; X-CSE-ConnectionGUID: eBBor2EcSSOuwx9hRn/6wA== X-CSE-MsgGUID: ppSFFjaBSwOeA8TrY2WKFQ== X-IronPort-AV: E=McAfee;i="6800,10657,11792"; a="97690446" X-IronPort-AV: E=Sophos;i="6.23,245,1770624000"; d="scan'208";a="97690446" Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by orvoesa102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2026 00:38:33 -0700 X-CSE-ConnectionGUID: QfI10y9JS+WYig6E62qjKA== X-CSE-MsgGUID: xuUzYuhuQUe4ntp5GjthWQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,245,1770624000"; d="scan'208";a="263973378" Received: from qiuxu-clx.sh.intel.com ([10.239.53.109]) by fmviesa002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2026 00:38:30 -0700 From: Qiuxu Zhuo To: Tony Luck , Borislav Petkov Cc: Qiuxu Zhuo , Yi Lai , linux-edac@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/8] EDAC/{skx_common,i10nm,imh}: Move MC register access helpers to skx_common Date: Thu, 21 May 2026 15:31:05 +0800 Message-ID: <20260521073112.3881223-2-qiuxu.zhuo@intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260521073112.3881223-1-qiuxu.zhuo@intel.com> References: <20260521073112.3881223-1-qiuxu.zhuo@intel.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 Content-Type: text/plain; charset="utf-8" Both i10nm_basic.c and imh_basic.c use identical helpers for accessing memory controller MMIO-based registers. Move these helpers to skx_common.c to eliminate code duplication. This change also prepares for an upcoming patch that will move RRL(retry_rd_err_log) code from i10nm_basic.c to skx_common.c, which requires these helpers to be available in skx_common.c. Additionally, prefix these function names with 'skx_' to maintain naming consistency within the file. No functional changes intended. Tested-by: Yi Lai Signed-off-by: Qiuxu Zhuo --- drivers/edac/i10nm_base.c | 39 ++++-------------------------- drivers/edac/imh_base.c | 33 ++++---------------------- drivers/edac/skx_common.c | 50 +++++++++++++++++++++++++++++++++++++++ drivers/edac/skx_common.h | 3 +++ 4 files changed, 63 insertions(+), 62 deletions(-) diff --git a/drivers/edac/i10nm_base.c b/drivers/edac/i10nm_base.c index de6c52dbd9d2..0a0236583eb7 100644 --- a/drivers/edac/i10nm_base.c +++ b/drivers/edac/i10nm_base.c @@ -47,12 +47,6 @@ readl((m)->mbase + ((m)->hbm_mc ? 0xef8 : \ (res_cfg->type =3D=3D GNR ? 0xaf8 : 0x20ef8)) + \ (i) * (m)->chan_mmio_sz) -#define I10NM_GET_REG32(m, i, offset) \ - readl((m)->mbase + (i) * (m)->chan_mmio_sz + (offset)) -#define I10NM_GET_REG64(m, i, offset) \ - readq((m)->mbase + (i) * (m)->chan_mmio_sz + (offset)) -#define I10NM_SET_REG32(m, i, offset, v) \ - writel(v, (m)->mbase + (i) * (m)->chan_mmio_sz + (offset)) =20 #define I10NM_GET_SCK_MMIO_BASE(reg) (GET_BITFIELD(reg, 0, 28) << 23) #define I10NM_GET_IMC_MMIO_OFFSET(reg) (GET_BITFIELD(reg, 0, 10) << 12) @@ -189,29 +183,6 @@ static struct reg_rrl gnr_reg_rrl_ddr =3D { .cecnt_widths =3D {4, 4, 4, 4, 4, 4, 4, 4}, }; =20 -static u64 read_imc_reg(struct skx_imc *imc, int chan, u32 offset, u8 widt= h) -{ - switch (width) { - case 4: - return I10NM_GET_REG32(imc, chan, offset); - case 8: - return I10NM_GET_REG64(imc, chan, offset); - default: - i10nm_printk(KERN_ERR, "Invalid read RRL 0x%x width %d\n", offset, width= ); - return 0; - } -} - -static void write_imc_reg(struct skx_imc *imc, int chan, u32 offset, u8 wi= dth, u64 val) -{ - switch (width) { - case 4: - return I10NM_SET_REG32(imc, chan, offset, (u32)val); - default: - i10nm_printk(KERN_ERR, "Invalid write RRL 0x%x width %d\n", offset, widt= h); - } -} - static void enable_rrl(struct skx_imc *imc, int chan, struct reg_rrl *rrl, int rrl_set, bool enable, u32 *rrl_ctl) { @@ -225,7 +196,7 @@ static void enable_rrl(struct skx_imc *imc, int chan, s= truct reg_rrl *rrl, /* Patrol scrub or on-demand read error. */ scrub =3D (mode =3D=3D FRE_SCRUB || mode =3D=3D LRE_SCRUB); =20 - v =3D read_imc_reg(imc, chan, offset, width); + v =3D skx_read_imc_reg(imc, chan, offset, width); =20 if (enable) { /* Save default configurations. */ @@ -268,7 +239,7 @@ static void enable_rrl(struct skx_imc *imc, int chan, s= truct reg_rrl *rrl, v &=3D ~rrl->en_mask; } =20 - write_imc_reg(imc, chan, offset, width, v); + skx_write_imc_reg(imc, chan, offset, width, v); } =20 static void enable_rrls(struct skx_imc *imc, int chan, struct reg_rrl *rrl, @@ -354,7 +325,7 @@ static void show_retry_rd_err_log(struct decoded_addr *= res, char *msg, for (j =3D 0; j < rrl->reg_num && len - n > 0; j++) { offset =3D rrl->offsets[i][j]; width =3D rrl->widths[j]; - log =3D read_imc_reg(imc, ch, offset, width); + log =3D skx_read_imc_reg(imc, ch, offset, width); =20 if (width =3D=3D 4) n +=3D scnprintf(msg + n, len - n, "%.8llx ", log); @@ -363,7 +334,7 @@ static void show_retry_rd_err_log(struct decoded_addr *= res, char *msg, =20 /* Clear RRL status if RRL in Linux control mode. */ if (retry_rd_err_log =3D=3D 2 && !j && (log & status_mask)) - write_imc_reg(imc, ch, offset, width, log & ~status_mask); + skx_write_imc_reg(imc, ch, offset, width, log & ~status_mask); } } =20 @@ -376,7 +347,7 @@ static void show_retry_rd_err_log(struct decoded_addr *= res, char *msg, for (i =3D 0; i < rrl->cecnt_num && len - n > 0; i++) { offset =3D rrl->cecnt_offsets[i]; width =3D rrl->cecnt_widths[i]; - corr =3D read_imc_reg(imc, ch, offset, width); + corr =3D skx_read_imc_reg(imc, ch, offset, width); =20 /* CPUs {ICX,SPR} encode two counters per 4-byte CORRERRCNT register. */ if (res_cfg->type <=3D SPR) { diff --git a/drivers/edac/imh_base.c b/drivers/edac/imh_base.c index 40082ba45e62..dfdcfa127ce7 100644 --- a/drivers/edac/imh_base.c +++ b/drivers/edac/imh_base.c @@ -71,28 +71,11 @@ struct local_reg { .width =3D (cfg)->ip_name##_reg_##reg_name##_width, \ } =20 -static u64 readx(void __iomem *addr, u8 width) -{ - switch (width) { - case 1: - return readb(addr); - case 2: - return readw(addr); - case 4: - return readl(addr); - case 8: - return readq(addr); - default: - imh_printk(KERN_ERR, "Invalid reg 0x%p width %d\n", addr, width); - return 0; - } -} - static void __read_local_reg(void *reg) { struct local_reg *r =3D (struct local_reg *)reg; =20 - r->val =3D readx(r->vbase + r->offset, r->width); + r->val =3D skx_readx(r->vbase + r->offset, r->width); } =20 /* Read a local-view register. */ @@ -378,22 +361,16 @@ static bool imh_2lm_enabled(struct res_config *cfg, s= truct list_head *head) return false; } =20 -/* Helpers to read memory controller registers */ -static u64 read_imc_reg(struct skx_imc *imc, int chan, u32 offset, u8 widt= h) -{ - return readx(imc->mbase + imc->chan_mmio_sz * chan + offset, width); -} - static u32 read_imc_mcmtr(struct res_config *cfg, struct skx_imc *imc, int= chan) { - return (u32)read_imc_reg(imc, chan, cfg->ddr_reg_mcmtr_offset, cfg->ddr_r= eg_mcmtr_width); + return (u32)skx_read_imc_reg(imc, chan, cfg->ddr_reg_mcmtr_offset, cfg->d= dr_reg_mcmtr_width); } =20 static u32 read_imc_dimmmtr(struct res_config *cfg, struct skx_imc *imc, i= nt chan, int dimm) { - return (u32)read_imc_reg(imc, chan, cfg->ddr_reg_dimmmtr_offset + - cfg->ddr_reg_dimmmtr_width * dimm, - cfg->ddr_reg_dimmmtr_width); + return (u32)skx_read_imc_reg(imc, chan, cfg->ddr_reg_dimmmtr_offset + + cfg->ddr_reg_dimmmtr_width * dimm, + cfg->ddr_reg_dimmmtr_width); } =20 static bool ecc_enabled(u32 mcmtr) diff --git a/drivers/edac/skx_common.c b/drivers/edac/skx_common.c index f15de0ea96c8..1c4cc21679bc 100644 --- a/drivers/edac/skx_common.c +++ b/drivers/edac/skx_common.c @@ -52,6 +52,56 @@ static LIST_HEAD(dev_edac_list); static bool skx_mem_cfg_2lm; static struct res_config *skx_res_cfg; =20 +u64 skx_readx(void __iomem *addr, u8 width) +{ + switch (width) { + case 1: + return readb(addr); + case 2: + return readw(addr); + case 4: + return readl(addr); + case 8: + return readq(addr); + default: + skx_printk(KERN_ERR, "Invalid reg 0x%p width %u to read.\n", addr, width= ); + return 0; + } +} +EXPORT_SYMBOL_GPL(skx_readx); + +static void skx_writex(void __iomem *addr, u8 width, u64 val) +{ + switch (width) { + case 1: + writeb((u8)val, addr); + return; + case 2: + writew((u16)val, addr); + return; + case 4: + writel((u32)val, addr); + return; + case 8: + writeq(val, addr); + return; + default: + skx_printk(KERN_ERR, "Invalid reg 0x%p width %u to write 0x%llx.\n", add= r, width, val); + } +} + +u64 skx_read_imc_reg(struct skx_imc *imc, int chan, u32 offset, u8 width) +{ + return skx_readx(imc->mbase + imc->chan_mmio_sz * chan + offset, width); +} +EXPORT_SYMBOL_GPL(skx_read_imc_reg); + +void skx_write_imc_reg(struct skx_imc *imc, int chan, u32 offset, u8 width= , u64 val) +{ + skx_writex(imc->mbase + imc->chan_mmio_sz * chan + offset, width, val); +} +EXPORT_SYMBOL_GPL(skx_write_imc_reg); + int skx_adxl_get(void) { const char * const *names; diff --git a/drivers/edac/skx_common.h b/drivers/edac/skx_common.h index f88038e5b18c..95412459a84f 100644 --- a/drivers/edac/skx_common.h +++ b/drivers/edac/skx_common.h @@ -326,6 +326,9 @@ typedef int (*get_dimm_config_f)(struct mem_ctl_info *m= ci, typedef bool (*skx_decode_f)(struct decoded_addr *res); typedef void (*skx_show_retry_log_f)(struct decoded_addr *res, char *msg, = int len, bool scrub_err); =20 +u64 skx_readx(void __iomem *addr, u8 width); +u64 skx_read_imc_reg(struct skx_imc *imc, int chan, u32 offset, u8 width); +void skx_write_imc_reg(struct skx_imc *imc, int chan, u32 offset, u8 width= , u64 val); int skx_adxl_get(void); void skx_adxl_put(void); void skx_set_decode(skx_decode_f decode, skx_show_retry_log_f show_retry_l= og); --=20 2.43.0 From nobody Sun May 24 21:39:30 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.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 778F62874FF; Thu, 21 May 2026 07:39:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.10 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779349165; cv=none; b=jLceOMHW8qdTRywC98oj0h0/vVDfiPp9ipbsGqSF9vClsDdEY7STxhiWJfVRAzgB1WldnmvBkTQ8xwGoih+BuBozPUeaPBzGzQPfGJtRNv2HgEJvwaNiK8z9fHblsCVjp2ES5eXRJSa9tFMXkGYbr+mdFdkJ1eOuZ9i9sHqhhZk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779349165; c=relaxed/simple; bh=QIOnxwwbOtKXAf+rAxn1RuXBvvn9OJUmlMB4zbF2TXw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VbU6P/Y0XkP/Tm9PEbVmlmo3IDsax60VLmBzkRqT9b4DmoxWFw1cXwkO9b3jo164rKi33dHjdUsr8OHFji7OZGuxhX2hVdKMP1Kvawsy+aIbTLEdAMOFzrip1ue8h6nHeZUlfnS3ADGQSkTcT4qwhquvxs/7HHHrk/HcumW2xoE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=PHU63Uqg; arc=none smtp.client-ip=198.175.65.10 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="PHU63Uqg" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1779349162; x=1810885162; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=QIOnxwwbOtKXAf+rAxn1RuXBvvn9OJUmlMB4zbF2TXw=; b=PHU63UqgLvOQ5f+qIrTxGTouJuKq1kFUCqhBis8250BX+NbvNRDZ129D BDFOQFMEy5lwx1sUTsIYs3PIloU2MgmCiXArDHOr0kmpgqx/iMLySJg+P VsUd2Hnx+QwO5sVtypAjUYs5hckrRAXFQKS+K3gCJNaKnVLzIyqYN3GJB aC84aGqIrrFcXHlE+R9Y9fU6dD/GDMQ4VaPXJC+YARVYknAhCT1hkp88J aLzUPtts+eo3L6Dehcs9vaQj2LNZlOy51o0M1vVIUR8ygMr6e2Pxtb6nY PaeQTBu398QSgR4fwixVx6i/JqbmPAtC7kUNvJWH+1BTL3BfRvr/AJstM w==; X-CSE-ConnectionGUID: cnblmgGhRoOcFaj6CzNlGA== X-CSE-MsgGUID: v+8WPsbTRE64tIuZAWVnEA== X-IronPort-AV: E=McAfee;i="6800,10657,11792"; a="97690549" X-IronPort-AV: E=Sophos;i="6.23,245,1770624000"; d="scan'208";a="97690549" Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by orvoesa102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2026 00:39:19 -0700 X-CSE-ConnectionGUID: tP1QFIkvSlmViTzJXSZdCw== X-CSE-MsgGUID: vuDSmtaeSpGkU4AJP1uLGA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,245,1770624000"; d="scan'208";a="263973603" Received: from qiuxu-clx.sh.intel.com ([10.239.53.109]) by fmviesa002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2026 00:39:17 -0700 From: Qiuxu Zhuo To: Tony Luck , Borislav Petkov Cc: Qiuxu Zhuo , Yi Lai , linux-edac@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/8] EDAC/{skx_common,skx,i10nm}: Split skx_set_decode() Date: Thu, 21 May 2026 15:31:06 +0800 Message-ID: <20260521073112.3881223-3-qiuxu.zhuo@intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260521073112.3881223-1-qiuxu.zhuo@intel.com> References: <20260521073112.3881223-1-qiuxu.zhuo@intel.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 Content-Type: text/plain; charset="utf-8" skx_set_decode() currently handles both address decoding and Retry Read error Log (RRL) reporting, coupling two independent functions in a single API. This complicates setup/teardown and forces callers to update unrelated state. Introduce skx_set_show_rrl() and keep skx_set_decode() focused on decode setup, allowing decode and RRL handling to be managed independently. Also rename the callback type and variable to skx_show_rrl_f and show_rrl for clearer RRL terminology and consistency. No functional changes intended. Tested-by: Yi Lai Signed-off-by: Qiuxu Zhuo --- drivers/edac/i10nm_base.c | 10 ++++++---- drivers/edac/skx_base.c | 6 +++--- drivers/edac/skx_common.c | 15 ++++++++++----- drivers/edac/skx_common.h | 5 +++-- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/drivers/edac/i10nm_base.c b/drivers/edac/i10nm_base.c index 0a0236583eb7..c09790d5b95e 100644 --- a/drivers/edac/i10nm_base.c +++ b/drivers/edac/i10nm_base.c @@ -1208,13 +1208,13 @@ static int __init i10nm_init(void) skx_setup_debug("i10nm_test"); =20 if (retry_rd_err_log && res_cfg->reg_rrl_ddr) { - skx_set_decode(i10nm_mc_decode, show_retry_rd_err_log); + skx_set_show_rrl(show_retry_rd_err_log); if (retry_rd_err_log =3D=3D 2) enable_retry_rd_err_log(true); - } else { - skx_set_decode(i10nm_mc_decode, NULL); } =20 + skx_set_decode(i10nm_mc_decode); + i10nm_printk(KERN_INFO, "%s\n", I10NM_REVISION); =20 return 0; @@ -1227,10 +1227,12 @@ static void __exit i10nm_exit(void) { edac_dbg(2, "\n"); =20 + skx_set_decode(NULL); + if (retry_rd_err_log && res_cfg->reg_rrl_ddr) { - skx_set_decode(NULL, NULL); if (retry_rd_err_log =3D=3D 2) enable_retry_rd_err_log(false); + skx_set_show_rrl(NULL); } =20 skx_teardown_debug(); diff --git a/drivers/edac/skx_base.c b/drivers/edac/skx_base.c index aa6593ccda2d..de749413ff9a 100644 --- a/drivers/edac/skx_base.c +++ b/drivers/edac/skx_base.c @@ -671,14 +671,14 @@ static int __init skx_init(void) } } =20 - skx_set_decode(skx_decode, skx_show_retry_rd_err_log); + skx_set_show_rrl(skx_show_retry_rd_err_log); =20 if (nvdimm_count && skx_adxl_get() !=3D -ENODEV) { - skx_set_decode(NULL, skx_show_retry_rd_err_log); + skx_set_decode(NULL); } else { if (nvdimm_count) skx_printk(KERN_NOTICE, "Only decoding DDR4 address!\n"); - skx_set_decode(skx_decode, skx_show_retry_rd_err_log); + skx_set_decode(skx_decode); } =20 /* Ensure that the OPSTATE is set correctly for POLL or NMI */ diff --git a/drivers/edac/skx_common.c b/drivers/edac/skx_common.c index 1c4cc21679bc..2cdef2e69d71 100644 --- a/drivers/edac/skx_common.c +++ b/drivers/edac/skx_common.c @@ -46,7 +46,7 @@ static unsigned long adxl_nm_bitmap; =20 static char skx_msg[MSG_SIZE]; static skx_decode_f driver_decode; -static skx_show_retry_log_f skx_show_retry_rd_err_log; +static skx_show_rrl_f show_rrl; static u64 skx_tolm, skx_tohm; static LIST_HEAD(dev_edac_list); static bool skx_mem_cfg_2lm; @@ -312,13 +312,18 @@ void skx_set_res_cfg(struct res_config *cfg) } EXPORT_SYMBOL_GPL(skx_set_res_cfg); =20 -void skx_set_decode(skx_decode_f decode, skx_show_retry_log_f show_retry_l= og) +void skx_set_decode(skx_decode_f decode) { driver_decode =3D decode; - skx_show_retry_rd_err_log =3D show_retry_log; } EXPORT_SYMBOL_GPL(skx_set_decode); =20 +void skx_set_show_rrl(skx_show_rrl_f rrl) +{ + show_rrl =3D rrl; +} +EXPORT_SYMBOL_GPL(skx_set_show_rrl); + static int skx_get_pkg_id(struct skx_dev *d, u8 *id) { int node; @@ -767,8 +772,8 @@ static void skx_mce_output_error(struct mem_ctl_info *m= ci, res->row, res->column, res->bank_address, res->bank_group); } =20 - if (skx_show_retry_rd_err_log) - skx_show_retry_rd_err_log(res, skx_msg + len, MSG_SIZE - len, scrub_err); + if (show_rrl) + show_rrl(res, skx_msg + len, MSG_SIZE - len, scrub_err); =20 edac_dbg(0, "%s\n", skx_msg); =20 diff --git a/drivers/edac/skx_common.h b/drivers/edac/skx_common.h index 95412459a84f..5a08f219e46d 100644 --- a/drivers/edac/skx_common.h +++ b/drivers/edac/skx_common.h @@ -324,14 +324,15 @@ struct res_config { typedef int (*get_dimm_config_f)(struct mem_ctl_info *mci, struct res_config *cfg); typedef bool (*skx_decode_f)(struct decoded_addr *res); -typedef void (*skx_show_retry_log_f)(struct decoded_addr *res, char *msg, = int len, bool scrub_err); +typedef void (*skx_show_rrl_f)(struct decoded_addr *res, char *msg, int le= n, bool scrub_err); =20 u64 skx_readx(void __iomem *addr, u8 width); u64 skx_read_imc_reg(struct skx_imc *imc, int chan, u32 offset, u8 width); void skx_write_imc_reg(struct skx_imc *imc, int chan, u32 offset, u8 width= , u64 val); int skx_adxl_get(void); void skx_adxl_put(void); -void skx_set_decode(skx_decode_f decode, skx_show_retry_log_f show_retry_l= og); +void skx_set_decode(skx_decode_f decode); +void skx_set_show_rrl(skx_show_rrl_f rrl); void skx_set_mem_cfg(bool mem_cfg_2lm); void skx_set_res_cfg(struct res_config *cfg); void skx_init_mc_mapping(struct skx_dev *d); --=20 2.43.0 From nobody Sun May 24 21:39:30 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.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 146E1357D1A; Thu, 21 May 2026 07:39:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.10 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779349173; cv=none; b=AL698No8xRU7DmwyqJkrrPb4gawC58giJ3wBZOaPFJtX009DLvOnx4+DiOygR6agVNTyNILb0Wz1dnmgtf7R9sDVed5LtA+Kzpbt6HMT3RNZi/YF4RmOnyyk2CShc9WIydf15/+95Frb+4KQFcHq3xLVGyUOkZ4Jo4fkKae/CH8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779349173; c=relaxed/simple; bh=A9MeywLgKor6uS2NT19b9fpcSpiiD8w+6D5NfY+psmo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=V9tzb6Jm4rK0NvHw8mkg2T1/DshetXPLNfv+MX4br1ORWxUO3vkIiOfC9a31MaSEV+eB+bVtGY2Pw6BWMSU2xD3WiosxELFgm/WaJuxCz4r/XL0unG0QoBmsZLWOfl11p5IrC5o3kkPzI7/Z3NHd+SzyqoNdjBjk6LHjDckPd/8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=g6ZUUokQ; arc=none smtp.client-ip=198.175.65.10 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="g6ZUUokQ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1779349172; x=1810885172; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=A9MeywLgKor6uS2NT19b9fpcSpiiD8w+6D5NfY+psmo=; b=g6ZUUokQkFBMCGFecdx31fP4A6eLlZMMav7zBeChIPobb1KfZdI7XRgl qel+RnArn50a1HF8Vf7QlqjvO5XXkGNAsOY3oB5POXBeUgv5xehTZwxjt lxtOluk5LokAlhoaQumXSbZwNa5hFPSbAMETN8lpyxXTmVPMpmbjPPW20 W1/miS/GZ8UOK0Ih5iOOM/XLjNBH/QtBUPpT2Sw3GpqWL7KmDhfVuWO23 9Bkw50iRbk1QGy5rFXisrtci+PsrQzLKA7Zshz6pyRAsKL/5sGGfnCX1A LG57KxpMT+vWBIGJnmcT4JD45pkHRm7i2NazYGt6bseiwbQGpngB2a8a9 w==; X-CSE-ConnectionGUID: v07G9fnnSNiWyTTV6xygOg== X-CSE-MsgGUID: 5HXngZz5R7SH15BigzPLjQ== X-IronPort-AV: E=McAfee;i="6800,10657,11792"; a="97690572" X-IronPort-AV: E=Sophos;i="6.23,245,1770624000"; d="scan'208";a="97690572" Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by orvoesa102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2026 00:39:32 -0700 X-CSE-ConnectionGUID: 2Z0izTuNQTyTrtAn5vimpA== X-CSE-MsgGUID: WNvk196wTUm9puWvicWrVg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,245,1770624000"; d="scan'208";a="263973687" Received: from qiuxu-clx.sh.intel.com ([10.239.53.109]) by fmviesa002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2026 00:39:30 -0700 From: Qiuxu Zhuo To: Tony Luck , Borislav Petkov Cc: Qiuxu Zhuo , Yi Lai , linux-edac@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/8] EDAC/{skx_common,i10nm}: Rename rrl_mode to rrl_source_type Date: Thu, 21 May 2026 15:31:07 +0800 Message-ID: <20260521073112.3881223-4-qiuxu.zhuo@intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260521073112.3881223-1-qiuxu.zhuo@intel.com> References: <20260521073112.3881223-1-qiuxu.zhuo@intel.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 Content-Type: text/plain; charset="utf-8" The RRL (Retry Read error Log) values describe where an error was logged from (first/last read and scrub/demand), not an operating mode. Rename rrl_mode to rrl_source_type and "modes" to "sources" to better reflect their meaning and improve code readability. No functional changes intended. Tested-by: Yi Lai Signed-off-by: Qiuxu Zhuo --- drivers/edac/i10nm_base.c | 18 +++++++++--------- drivers/edac/skx_common.h | 14 +++++++------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/drivers/edac/i10nm_base.c b/drivers/edac/i10nm_base.c index c09790d5b95e..01cc86f697c8 100644 --- a/drivers/edac/i10nm_base.c +++ b/drivers/edac/i10nm_base.c @@ -78,7 +78,7 @@ static bool no_adxl; static struct reg_rrl icx_reg_rrl_ddr =3D { .set_num =3D 2, .reg_num =3D 6, - .modes =3D {LRE_SCRUB, LRE_DEMAND}, + .sources =3D {RRL_SRC_LRE_SCRUB, RRL_SRC_LRE_DEMAND}, .offsets =3D { {0x22c60, 0x22c54, 0x22c5c, 0x22c58, 0x22c28, 0x20ed8}, {0x22e54, 0x22e60, 0x22e64, 0x22e58, 0x22e5c, 0x20ee0}, @@ -99,7 +99,7 @@ static struct reg_rrl icx_reg_rrl_ddr =3D { static struct reg_rrl spr_reg_rrl_ddr =3D { .set_num =3D 3, .reg_num =3D 6, - .modes =3D {LRE_SCRUB, LRE_DEMAND, FRE_DEMAND}, + .sources =3D {RRL_SRC_LRE_SCRUB, RRL_SRC_LRE_DEMAND, RRL_SRC_FRE_DEMAND}, .offsets =3D { {0x22c60, 0x22c54, 0x22f08, 0x22c58, 0x22c28, 0x20ed8}, {0x22e54, 0x22e60, 0x22f10, 0x22e58, 0x22e5c, 0x20ee0}, @@ -121,7 +121,7 @@ static struct reg_rrl spr_reg_rrl_ddr =3D { static struct reg_rrl spr_reg_rrl_hbm_pch0 =3D { .set_num =3D 2, .reg_num =3D 6, - .modes =3D {LRE_SCRUB, LRE_DEMAND}, + .sources =3D {RRL_SRC_LRE_SCRUB, RRL_SRC_LRE_DEMAND}, .offsets =3D { {0x2860, 0x2854, 0x2b08, 0x2858, 0x2828, 0x0ed8}, {0x2a54, 0x2a60, 0x2b10, 0x2a58, 0x2a5c, 0x0ee0}, @@ -142,7 +142,7 @@ static struct reg_rrl spr_reg_rrl_hbm_pch0 =3D { static struct reg_rrl spr_reg_rrl_hbm_pch1 =3D { .set_num =3D 2, .reg_num =3D 6, - .modes =3D {LRE_SCRUB, LRE_DEMAND}, + .sources =3D {RRL_SRC_LRE_SCRUB, RRL_SRC_LRE_DEMAND}, .offsets =3D { {0x2c60, 0x2c54, 0x2f08, 0x2c58, 0x2c28, 0x0fa8}, {0x2e54, 0x2e60, 0x2f10, 0x2e58, 0x2e5c, 0x0fb0}, @@ -163,7 +163,7 @@ static struct reg_rrl spr_reg_rrl_hbm_pch1 =3D { static struct reg_rrl gnr_reg_rrl_ddr =3D { .set_num =3D 4, .reg_num =3D 6, - .modes =3D {FRE_SCRUB, FRE_DEMAND, LRE_SCRUB, LRE_DEMAND}, + .sources =3D {RRL_SRC_FRE_SCRUB, RRL_SRC_FRE_DEMAND, RRL_SRC_LRE_SCRUB, R= RL_SRC_LRE_DEMAND}, .offsets =3D { {0x2f10, 0x2f20, 0x2f30, 0x2f50, 0x2f60, 0xba0}, {0x2f14, 0x2f24, 0x2f38, 0x2f54, 0x2f64, 0xba8}, @@ -186,15 +186,15 @@ static struct reg_rrl gnr_reg_rrl_ddr =3D { static void enable_rrl(struct skx_imc *imc, int chan, struct reg_rrl *rrl, int rrl_set, bool enable, u32 *rrl_ctl) { - enum rrl_mode mode =3D rrl->modes[rrl_set]; + enum rrl_source_type source =3D rrl->sources[rrl_set]; u32 offset =3D rrl->offsets[rrl_set][0], v; u8 width =3D rrl->widths[0]; bool first, scrub; =20 /* First or last read error. */ - first =3D (mode =3D=3D FRE_SCRUB || mode =3D=3D FRE_DEMAND); + first =3D (source =3D=3D RRL_SRC_FRE_SCRUB || source =3D=3D RRL_SRC_FRE_D= EMAND); /* Patrol scrub or on-demand read error. */ - scrub =3D (mode =3D=3D FRE_SCRUB || mode =3D=3D LRE_SCRUB); + scrub =3D (source =3D=3D RRL_SRC_FRE_SCRUB || source =3D=3D RRL_SRC_LRE_S= CRUB); =20 v =3D skx_read_imc_reg(imc, chan, offset, width); =20 @@ -318,7 +318,7 @@ static void show_retry_rd_err_log(struct decoded_addr *= res, char *msg, =20 n =3D scnprintf(msg, len, " retry_rd_err_log["); for (i =3D 0; i < rrl->set_num; i++) { - scrub =3D (rrl->modes[i] =3D=3D FRE_SCRUB || rrl->modes[i] =3D=3D LRE_SC= RUB); + scrub =3D (rrl->sources[i] =3D=3D RRL_SRC_FRE_SCRUB || rrl->sources[i] = =3D=3D RRL_SRC_LRE_SCRUB); if (scrub_err !=3D scrub) continue; =20 diff --git a/drivers/edac/skx_common.h b/drivers/edac/skx_common.h index 5a08f219e46d..f7f016db122f 100644 --- a/drivers/edac/skx_common.h +++ b/drivers/edac/skx_common.h @@ -81,23 +81,23 @@ /* Max correctable error count registers. */ #define NUM_CECNT_REG 8 =20 -/* Modes of RRL register set. */ -enum rrl_mode { +/* Error source from which the RRL registers log errors. */ +enum rrl_source_type { /* Last read error from patrol scrub. */ - LRE_SCRUB, + RRL_SRC_LRE_SCRUB, /* Last read error from demand. */ - LRE_DEMAND, + RRL_SRC_LRE_DEMAND, /* First read error from patrol scrub. */ - FRE_SCRUB, + RRL_SRC_FRE_SCRUB, /* First read error from demand. */ - FRE_DEMAND, + RRL_SRC_FRE_DEMAND, }; =20 /* RRL registers per {,sub-,pseudo-}channel. */ struct reg_rrl { /* RRL register parts. */ int set_num, reg_num; - enum rrl_mode modes[NUM_RRL_SET]; + enum rrl_source_type sources[NUM_RRL_SET]; u32 offsets[NUM_RRL_SET][NUM_RRL_REG]; /* RRL register widths in byte per set. */ u8 widths[NUM_RRL_REG]; --=20 2.43.0 From nobody Sun May 24 21:39:30 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.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 791D32FD1CA; Thu, 21 May 2026 07:39:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.10 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779349183; cv=none; b=l5PDo+0SjhIzxqXfbE778QdH+gsREIGEA1FarfEHNlasmHrLQDmXOt3QEsuoFFan2hc72/7MTELx3PdO60kGNebK+GBSe2AMjD81yWnn62FOGONSWisL+vos5jVr5vez+TUK8wPaWuVj6p5xLRtNDL803XwbB79ipi2b4oiHJLU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779349183; c=relaxed/simple; bh=37ZYSbhznVu39jS6yV8v/HarMSlLNd6CVDZNkLjlSXE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VF97lz1EOX2pzN6m1IWgVmzD4MtdIzqhv+JDsI8TDKrubcOjwjCpMmXGYEqWAuCf3kM7fc1sWok02MD4RmGskkYm6bHnglY/aY0cRHH5ugmWEie5WC5BjOJHoz2HyJJxs1rre+q9rUD/MIU8pdkiyCb3nHuHmowpHff1q0C+Mjg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=GZRn5t4K; arc=none smtp.client-ip=198.175.65.10 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="GZRn5t4K" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1779349182; x=1810885182; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=37ZYSbhznVu39jS6yV8v/HarMSlLNd6CVDZNkLjlSXE=; b=GZRn5t4KbPwuoWEZGescS8X7o2G/EY18rDNjef0NS1IAsTJmJJNZ7ZtO 1B8JKcDzJz3u81HaEax/6OgctXkl+nFF7kbOPnnpabhE3S7ov4atPi20q GutOPqQTZab4/fb6J6aeDCg/rBlucA8BnAuGNfN/n7ysyU/l0K7fNVsjv 4MqpJpsLslTK9/sncDOGtuW7TZF/AMA3SoLtR1XXFkbYltJ6wM9Qquq7U iJbfhWdSuEt9jlxzxxxkDtk9JBjPuSIzJIqFdk0ytqzxLop19EYAg3zkH Gu074GwRAv+j+8GX/7egUIyAojW/tGbGdJCY0jCTELUn2l6gfYNpGfmfU w==; X-CSE-ConnectionGUID: HmCBCpabQ7WnA7IAYEH1kg== X-CSE-MsgGUID: syNjvsRgSpqTlZMzSk5wng== X-IronPort-AV: E=McAfee;i="6800,10657,11792"; a="97690575" X-IronPort-AV: E=Sophos;i="6.23,245,1770624000"; d="scan'208";a="97690575" Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by orvoesa102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2026 00:39:41 -0700 X-CSE-ConnectionGUID: xBGGfs0eTJeJijwrBM8UPg== X-CSE-MsgGUID: X1tfszGCQmu4w4U2YmlAvw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,245,1770624000"; d="scan'208";a="263973766" Received: from qiuxu-clx.sh.intel.com ([10.239.53.109]) by fmviesa002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2026 00:39:39 -0700 From: Qiuxu Zhuo To: Tony Luck , Borislav Petkov Cc: Qiuxu Zhuo , Yi Lai , linux-edac@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 4/8] EDAC/{skx_common,i10nm}: Introduce rrl_ctrl_mode Date: Thu, 21 May 2026 15:31:08 +0800 Message-ID: <20260521073112.3881223-5-qiuxu.zhuo@intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260521073112.3881223-1-qiuxu.zhuo@intel.com> References: <20260521073112.3881223-1-qiuxu.zhuo@intel.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 Content-Type: text/plain; charset="utf-8" RRL (Retry Read error Log) ownership is currently inferred from retry_rd_err_log magic values, making control semantics implicit and harder to understand. Introduce rrl_ctrl_mode to explicitly describe whether RRL is controlled by none, BIOS, or Linux, and replace direct checks with named control states to improve readability and maintainability. No functional change intended. Tested-by: Yi Lai Signed-off-by: Qiuxu Zhuo --- drivers/edac/i10nm_base.c | 7 ++++--- drivers/edac/skx_common.h | 11 +++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/drivers/edac/i10nm_base.c b/drivers/edac/i10nm_base.c index 01cc86f697c8..fe148f1f2319 100644 --- a/drivers/edac/i10nm_base.c +++ b/drivers/edac/i10nm_base.c @@ -333,7 +333,7 @@ static void show_retry_rd_err_log(struct decoded_addr *= res, char *msg, n +=3D scnprintf(msg + n, len - n, "%.16llx ", log); =20 /* Clear RRL status if RRL in Linux control mode. */ - if (retry_rd_err_log =3D=3D 2 && !j && (log & status_mask)) + if (res_cfg->rrl_ctrl_mode =3D=3D RRL_CTRL_LINUX && !j && (log & status= _mask)) skx_write_imc_reg(imc, ch, offset, width, log & ~status_mask); } } @@ -1207,9 +1207,10 @@ static int __init i10nm_init(void) mce_register_decode_chain(&i10nm_mce_dec); skx_setup_debug("i10nm_test"); =20 + res_cfg->rrl_ctrl_mode =3D retry_rd_err_log; if (retry_rd_err_log && res_cfg->reg_rrl_ddr) { skx_set_show_rrl(show_retry_rd_err_log); - if (retry_rd_err_log =3D=3D 2) + if (retry_rd_err_log =3D=3D RRL_CTRL_LINUX) enable_retry_rd_err_log(true); } =20 @@ -1230,7 +1231,7 @@ static void __exit i10nm_exit(void) skx_set_decode(NULL); =20 if (retry_rd_err_log && res_cfg->reg_rrl_ddr) { - if (retry_rd_err_log =3D=3D 2) + if (retry_rd_err_log =3D=3D RRL_CTRL_LINUX) enable_retry_rd_err_log(false); skx_set_show_rrl(NULL); } diff --git a/drivers/edac/skx_common.h b/drivers/edac/skx_common.h index f7f016db122f..4091431356d6 100644 --- a/drivers/edac/skx_common.h +++ b/drivers/edac/skx_common.h @@ -93,6 +93,15 @@ enum rrl_source_type { RRL_SRC_FRE_DEMAND, }; =20 +enum rrl_ctrl_mode { + /* Linux does not control RRL or reports values. */ + RRL_CTRL_NONE, + /* Firmware retains control. Linux only reports values. */ + RRL_CTRL_BIOS, + /* Linux takes control, resets mode bits, and clears valid/UC bits; repor= ts values. */ + RRL_CTRL_LINUX, +}; + /* RRL registers per {,sub-,pseudo-}channel. */ struct reg_rrl { /* RRL register parts. */ @@ -272,6 +281,8 @@ struct res_config { struct reg_rrl *reg_rrl_ddr; /* RRL register sets per HBM channel */ struct reg_rrl *reg_rrl_hbm[2]; + /* RRL control mode */ + enum rrl_ctrl_mode rrl_ctrl_mode; union { /* {skx,i10nm}_edac */ struct { --=20 2.43.0 From nobody Sun May 24 21:39:30 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.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 D9E0A32AABA; Thu, 21 May 2026 07:39:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.10 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779349196; cv=none; b=Go9hXTN4E5phTAORR1xSrvbXdh8jsxH2sIlQNZFIvEmLkFPqZ9e13KPFwNnPmQXwWaSPKYMDY9DD6MlxzaglL5OrTFg3npdX4C6JDnh7Uvk21C6RgF9fNzHCqxS7pCsl69zyyn6w8IsGGxR8iLpk6L6+r55LKHU7MTqaCGn9/Tw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779349196; c=relaxed/simple; bh=VtCZUf6oMg0H7hNR01fJAQtLx0AL5TMyVAyXRDqnWaI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jbz4v9Pwy+vvDj4gX0OtrW94DNSw7zN9yvJAg9l/zfXPytFURO27Ws7LZE2SkXtg5E8aZUqh1jfIaaS9ewH7B7WzCaL0d/xJK6e6uB50kTnG+2FEQdJxVUgyHjGj1mfdwyl9+yISksdKn+Z94APOSbtGMfon8QNNjWTjbKc80fM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=WEDfdTvI; arc=none smtp.client-ip=198.175.65.10 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="WEDfdTvI" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1779349194; x=1810885194; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=VtCZUf6oMg0H7hNR01fJAQtLx0AL5TMyVAyXRDqnWaI=; b=WEDfdTvIRBQ83Cdr1YYEk403dETcINjUuAxNmI3L6aWFX6Nl4pFOb+XM tYwB+l4zFHV1PE6kU0fHvjZtTiN8wJybKqv6rxTWKLUSPBsDWe2xChH8g mvPMMn88RPTZMAXPf3puntfwNH+d434+RpiWtLVZ576MTOQ4uKUQnmh+H fud4Sh2quNAHIvtFUSoeEyBBcdjZELXoy6hZh/d8yJ6iw0HF3ulJoGjw/ aUzyVSH+qYnwz5vmQv1t8VEWx4T/r2eBvsSGE7z36G6YEa90jz1OfySsJ gt6m1oCcnCBRE/TVd7/9y8Ky3ffLVciUBLzsIAfusiU7YLyjuQrt/UI1S A==; X-CSE-ConnectionGUID: sxUjGohSQRKM/mrBU/n5gw== X-CSE-MsgGUID: jZWDZanbSYWFmIC73hiBZA== X-IronPort-AV: E=McAfee;i="6800,10657,11792"; a="97690582" X-IronPort-AV: E=Sophos;i="6.23,245,1770624000"; d="scan'208";a="97690582" Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by orvoesa102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2026 00:39:49 -0700 X-CSE-ConnectionGUID: r8aH96m/Tq2UYm3TyWmRbg== X-CSE-MsgGUID: 5WnNEN3nSsqjn/OEnUL0qA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,245,1770624000"; d="scan'208";a="263973810" Received: from qiuxu-clx.sh.intel.com ([10.239.53.109]) by fmviesa002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2026 00:39:46 -0700 From: Qiuxu Zhuo To: Tony Luck , Borislav Petkov Cc: Qiuxu Zhuo , Yi Lai , linux-edac@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 5/8] EDAC/{skx_common,i10nm}: Move RRL handling to common code Date: Thu, 21 May 2026 15:31:09 +0800 Message-ID: <20260521073112.3881223-6-qiuxu.zhuo@intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260521073112.3881223-1-qiuxu.zhuo@intel.com> References: <20260521073112.3881223-1-qiuxu.zhuo@intel.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 Content-Type: text/plain; charset="utf-8" Move RRL (Retry Read error Log) handling from i10nm_edac to skx_common so it can be shared across EDAC drivers (e.g. imh_edac). - Move RRL enable/disable and log dumping helpers to skx_common to avoid code duplication and enable reuse by other drivers. - Export skx_enable_rrl() and skx_show_rrl() so common RRL handling can be used by i10nm_edac and imh_edac. No functional change intended. Tested-by: Yi Lai Signed-off-by: Qiuxu Zhuo --- drivers/edac/i10nm_base.c | 191 +------------------------------------- drivers/edac/skx_common.c | 186 +++++++++++++++++++++++++++++++++++++ drivers/edac/skx_common.h | 2 + 3 files changed, 191 insertions(+), 188 deletions(-) diff --git a/drivers/edac/i10nm_base.c b/drivers/edac/i10nm_base.c index fe148f1f2319..2e21eefbb4f5 100644 --- a/drivers/edac/i10nm_base.c +++ b/drivers/edac/i10nm_base.c @@ -183,191 +183,6 @@ static struct reg_rrl gnr_reg_rrl_ddr =3D { .cecnt_widths =3D {4, 4, 4, 4, 4, 4, 4, 4}, }; =20 -static void enable_rrl(struct skx_imc *imc, int chan, struct reg_rrl *rrl, - int rrl_set, bool enable, u32 *rrl_ctl) -{ - enum rrl_source_type source =3D rrl->sources[rrl_set]; - u32 offset =3D rrl->offsets[rrl_set][0], v; - u8 width =3D rrl->widths[0]; - bool first, scrub; - - /* First or last read error. */ - first =3D (source =3D=3D RRL_SRC_FRE_SCRUB || source =3D=3D RRL_SRC_FRE_D= EMAND); - /* Patrol scrub or on-demand read error. */ - scrub =3D (source =3D=3D RRL_SRC_FRE_SCRUB || source =3D=3D RRL_SRC_LRE_S= CRUB); - - v =3D skx_read_imc_reg(imc, chan, offset, width); - - if (enable) { - /* Save default configurations. */ - *rrl_ctl =3D v; - v &=3D ~rrl->uc_mask; - - if (first) - v |=3D rrl->noover_mask; - else - v &=3D ~rrl->noover_mask; - - if (scrub) - v |=3D rrl->en_patspr_mask; - else - v &=3D ~rrl->en_patspr_mask; - - v |=3D rrl->en_mask; - } else { - /* Restore default configurations. */ - if (*rrl_ctl & rrl->uc_mask) - v |=3D rrl->uc_mask; - - if (first) { - if (!(*rrl_ctl & rrl->noover_mask)) - v &=3D ~rrl->noover_mask; - } else { - if (*rrl_ctl & rrl->noover_mask) - v |=3D rrl->noover_mask; - } - - if (scrub) { - if (!(*rrl_ctl & rrl->en_patspr_mask)) - v &=3D ~rrl->en_patspr_mask; - } else { - if (*rrl_ctl & rrl->en_patspr_mask) - v |=3D rrl->en_patspr_mask; - } - - if (!(*rrl_ctl & rrl->en_mask)) - v &=3D ~rrl->en_mask; - } - - skx_write_imc_reg(imc, chan, offset, width, v); -} - -static void enable_rrls(struct skx_imc *imc, int chan, struct reg_rrl *rrl, - bool enable, u32 *rrl_ctl) -{ - for (int i =3D 0; i < rrl->set_num; i++) - enable_rrl(imc, chan, rrl, i, enable, rrl_ctl + i); -} - -static void enable_rrls_ddr(struct skx_imc *imc, bool enable) -{ - struct reg_rrl *rrl_ddr =3D res_cfg->reg_rrl_ddr; - int i, chan_num =3D res_cfg->ddr_chan_num; - struct skx_channel *chan =3D imc->chan; - - if (!imc->mbase) - return; - - for (i =3D 0; i < chan_num; i++) - enable_rrls(imc, i, rrl_ddr, enable, chan[i].rrl_ctl[0]); -} - -static void enable_rrls_hbm(struct skx_imc *imc, bool enable) -{ - struct reg_rrl **rrl_hbm =3D res_cfg->reg_rrl_hbm; - int i, chan_num =3D res_cfg->hbm_chan_num; - struct skx_channel *chan =3D imc->chan; - - if (!imc->mbase || !imc->hbm_mc || !rrl_hbm[0] || !rrl_hbm[1]) - return; - - for (i =3D 0; i < chan_num; i++) { - enable_rrls(imc, i, rrl_hbm[0], enable, chan[i].rrl_ctl[0]); - enable_rrls(imc, i, rrl_hbm[1], enable, chan[i].rrl_ctl[1]); - } -} - -static void enable_retry_rd_err_log(bool enable) -{ - struct skx_dev *d; - int i, imc_num; - - edac_dbg(2, "\n"); - - list_for_each_entry(d, i10nm_edac_list, list) { - imc_num =3D res_cfg->ddr_imc_num; - for (i =3D 0; i < imc_num; i++) - enable_rrls_ddr(&d->imc[i], enable); - - imc_num +=3D res_cfg->hbm_imc_num; - for (; i < imc_num; i++) - enable_rrls_hbm(&d->imc[i], enable); - } -} - -static void show_retry_rd_err_log(struct decoded_addr *res, char *msg, - int len, bool scrub_err) -{ - int i, j, n, ch =3D res->channel, pch =3D res->cs & 1; - struct skx_imc *imc =3D &res->dev->imc[res->imc]; - u64 log, corr, status_mask; - struct reg_rrl *rrl; - bool scrub; - u32 offset; - u8 width; - - if (!imc->mbase) - return; - - rrl =3D imc->hbm_mc ? res_cfg->reg_rrl_hbm[pch] : res_cfg->reg_rrl_ddr; - - if (!rrl) - return; - - status_mask =3D rrl->over_mask | rrl->uc_mask | rrl->v_mask; - - n =3D scnprintf(msg, len, " retry_rd_err_log["); - for (i =3D 0; i < rrl->set_num; i++) { - scrub =3D (rrl->sources[i] =3D=3D RRL_SRC_FRE_SCRUB || rrl->sources[i] = =3D=3D RRL_SRC_LRE_SCRUB); - if (scrub_err !=3D scrub) - continue; - - for (j =3D 0; j < rrl->reg_num && len - n > 0; j++) { - offset =3D rrl->offsets[i][j]; - width =3D rrl->widths[j]; - log =3D skx_read_imc_reg(imc, ch, offset, width); - - if (width =3D=3D 4) - n +=3D scnprintf(msg + n, len - n, "%.8llx ", log); - else - n +=3D scnprintf(msg + n, len - n, "%.16llx ", log); - - /* Clear RRL status if RRL in Linux control mode. */ - if (res_cfg->rrl_ctrl_mode =3D=3D RRL_CTRL_LINUX && !j && (log & status= _mask)) - skx_write_imc_reg(imc, ch, offset, width, log & ~status_mask); - } - } - - /* Move back one space. */ - n--; - n +=3D scnprintf(msg + n, len - n, "]"); - - if (len - n > 0) { - n +=3D scnprintf(msg + n, len - n, " correrrcnt["); - for (i =3D 0; i < rrl->cecnt_num && len - n > 0; i++) { - offset =3D rrl->cecnt_offsets[i]; - width =3D rrl->cecnt_widths[i]; - corr =3D skx_read_imc_reg(imc, ch, offset, width); - - /* CPUs {ICX,SPR} encode two counters per 4-byte CORRERRCNT register. */ - if (res_cfg->type <=3D SPR) { - n +=3D scnprintf(msg + n, len - n, "%.4llx %.4llx ", - corr & 0xffff, corr >> 16); - } else { - /* CPUs {GNR} encode one counter per CORRERRCNT register. */ - if (width =3D=3D 4) - n +=3D scnprintf(msg + n, len - n, "%.8llx ", corr); - else - n +=3D scnprintf(msg + n, len - n, "%.16llx ", corr); - } - } - - /* Move back one space. */ - n--; - n +=3D scnprintf(msg + n, len - n, "]"); - } -} - static struct pci_dev *pci_get_dev_wrapper(int dom, unsigned int bus, unsigned int dev, unsigned int fun) { @@ -1209,9 +1024,9 @@ static int __init i10nm_init(void) =20 res_cfg->rrl_ctrl_mode =3D retry_rd_err_log; if (retry_rd_err_log && res_cfg->reg_rrl_ddr) { - skx_set_show_rrl(show_retry_rd_err_log); + skx_set_show_rrl(skx_show_rrl); if (retry_rd_err_log =3D=3D RRL_CTRL_LINUX) - enable_retry_rd_err_log(true); + skx_enable_rrl(true); } =20 skx_set_decode(i10nm_mc_decode); @@ -1232,7 +1047,7 @@ static void __exit i10nm_exit(void) =20 if (retry_rd_err_log && res_cfg->reg_rrl_ddr) { if (retry_rd_err_log =3D=3D RRL_CTRL_LINUX) - enable_retry_rd_err_log(false); + skx_enable_rrl(false); skx_set_show_rrl(NULL); } =20 diff --git a/drivers/edac/skx_common.c b/drivers/edac/skx_common.c index 2cdef2e69d71..f769a354ea45 100644 --- a/drivers/edac/skx_common.c +++ b/drivers/edac/skx_common.c @@ -102,6 +102,192 @@ void skx_write_imc_reg(struct skx_imc *imc, int chan,= u32 offset, u8 width, u64 } EXPORT_SYMBOL_GPL(skx_write_imc_reg); =20 +static void enable_rrl(struct skx_imc *imc, int chan, struct reg_rrl *rrl, + int rrl_set, bool enable, u32 *rrl_ctl) +{ + enum rrl_source_type source =3D rrl->sources[rrl_set]; + u32 offset =3D rrl->offsets[rrl_set][0], v; + u8 width =3D rrl->widths[0]; + bool first, scrub; + + /* First or last read error. */ + first =3D (source =3D=3D RRL_SRC_FRE_SCRUB || source =3D=3D RRL_SRC_FRE_D= EMAND); + /* Patrol scrub or on-demand read error. */ + scrub =3D (source =3D=3D RRL_SRC_FRE_SCRUB || source =3D=3D RRL_SRC_LRE_S= CRUB); + + v =3D skx_read_imc_reg(imc, chan, offset, width); + + if (enable) { + /* Save default configurations. */ + *rrl_ctl =3D v; + v &=3D ~rrl->uc_mask; + + if (first) + v |=3D rrl->noover_mask; + else + v &=3D ~rrl->noover_mask; + + if (scrub) + v |=3D rrl->en_patspr_mask; + else + v &=3D ~rrl->en_patspr_mask; + + v |=3D rrl->en_mask; + } else { + /* Restore default configurations. */ + if (*rrl_ctl & rrl->uc_mask) + v |=3D rrl->uc_mask; + + if (first) { + if (!(*rrl_ctl & rrl->noover_mask)) + v &=3D ~rrl->noover_mask; + } else { + if (*rrl_ctl & rrl->noover_mask) + v |=3D rrl->noover_mask; + } + + if (scrub) { + if (!(*rrl_ctl & rrl->en_patspr_mask)) + v &=3D ~rrl->en_patspr_mask; + } else { + if (*rrl_ctl & rrl->en_patspr_mask) + v |=3D rrl->en_patspr_mask; + } + + if (!(*rrl_ctl & rrl->en_mask)) + v &=3D ~rrl->en_mask; + } + + skx_write_imc_reg(imc, chan, offset, width, v); +} + +static void enable_rrls(struct skx_imc *imc, int chan, struct reg_rrl *rrl, + bool enable, u32 *rrl_ctl) +{ + for (int i =3D 0; i < rrl->set_num; i++) + enable_rrl(imc, chan, rrl, i, enable, rrl_ctl + i); +} + +static void enable_rrls_ddr(struct skx_imc *imc, bool enable) +{ + struct reg_rrl *rrl_ddr =3D skx_res_cfg->reg_rrl_ddr; + int i, chan_num =3D skx_res_cfg->ddr_chan_num; + struct skx_channel *chan =3D imc->chan; + + if (!imc->mbase) + return; + + for (i =3D 0; i < chan_num; i++) + enable_rrls(imc, i, rrl_ddr, enable, chan[i].rrl_ctl[0]); +} + +static void enable_rrls_hbm(struct skx_imc *imc, bool enable) +{ + struct reg_rrl **rrl_hbm =3D skx_res_cfg->reg_rrl_hbm; + int i, chan_num =3D skx_res_cfg->hbm_chan_num; + struct skx_channel *chan =3D imc->chan; + + if (!imc->mbase || !imc->hbm_mc || !rrl_hbm[0] || !rrl_hbm[1]) + return; + + for (i =3D 0; i < chan_num; i++) { + enable_rrls(imc, i, rrl_hbm[0], enable, chan[i].rrl_ctl[0]); + enable_rrls(imc, i, rrl_hbm[1], enable, chan[i].rrl_ctl[1]); + } +} + +void skx_enable_rrl(bool enable) +{ + struct skx_dev *d; + int i, imc_num; + + edac_dbg(2, "\n"); + + list_for_each_entry(d, &dev_edac_list, list) { + imc_num =3D skx_res_cfg->ddr_imc_num; + for (i =3D 0; i < imc_num; i++) + enable_rrls_ddr(&d->imc[i], enable); + + imc_num +=3D skx_res_cfg->hbm_imc_num; + for (; i < imc_num; i++) + enable_rrls_hbm(&d->imc[i], enable); + } +} +EXPORT_SYMBOL_GPL(skx_enable_rrl); + +void skx_show_rrl(struct decoded_addr *res, char *msg, int len, bool scrub= _err) +{ + int i, j, n, ch =3D res->channel, pch =3D res->cs & 1; + struct skx_imc *imc =3D &res->dev->imc[res->imc]; + u64 log, corr, status_mask; + struct reg_rrl *rrl; + bool scrub; + u32 offset; + u8 width; + + if (!imc->mbase) + return; + + rrl =3D imc->hbm_mc ? skx_res_cfg->reg_rrl_hbm[pch] : skx_res_cfg->reg_rr= l_ddr; + + if (!rrl) + return; + + status_mask =3D rrl->over_mask | rrl->uc_mask | rrl->v_mask; + + n =3D scnprintf(msg, len, " retry_rd_err_log["); + for (i =3D 0; i < rrl->set_num; i++) { + scrub =3D (rrl->sources[i] =3D=3D RRL_SRC_FRE_SCRUB || rrl->sources[i] = =3D=3D RRL_SRC_LRE_SCRUB); + if (scrub_err !=3D scrub) + continue; + + for (j =3D 0; j < rrl->reg_num && len - n > 0; j++) { + offset =3D rrl->offsets[i][j]; + width =3D rrl->widths[j]; + log =3D skx_read_imc_reg(imc, ch, offset, width); + + if (width =3D=3D 4) + n +=3D scnprintf(msg + n, len - n, "%.8llx ", log); + else + n +=3D scnprintf(msg + n, len - n, "%.16llx ", log); + + /* Clear RRL status if RRL in Linux control mode. */ + if (skx_res_cfg->rrl_ctrl_mode =3D=3D RRL_CTRL_LINUX && !j && (log & st= atus_mask)) + skx_write_imc_reg(imc, ch, offset, width, log & ~status_mask); + } + } + + /* Move back one space. */ + n--; + n +=3D scnprintf(msg + n, len - n, "]"); + + if (len - n > 0) { + n +=3D scnprintf(msg + n, len - n, " correrrcnt["); + for (i =3D 0; i < rrl->cecnt_num && len - n > 0; i++) { + offset =3D rrl->cecnt_offsets[i]; + width =3D rrl->cecnt_widths[i]; + corr =3D skx_read_imc_reg(imc, ch, offset, width); + + /* CPUs {ICX,SPR} encode two counters per 4-byte CORRERRCNT register. */ + if (skx_res_cfg->type <=3D SPR) { + n +=3D scnprintf(msg + n, len - n, "%.4llx %.4llx ", + corr & 0xffff, corr >> 16); + } else { + /* CPUs {GNR} encode one counter per CORRERRCNT register. */ + if (width =3D=3D 4) + n +=3D scnprintf(msg + n, len - n, "%.8llx ", corr); + else + n +=3D scnprintf(msg + n, len - n, "%.16llx ", corr); + } + } + + /* Move back one space. */ + n--; + n +=3D scnprintf(msg + n, len - n, "]"); + } +} +EXPORT_SYMBOL_GPL(skx_show_rrl); + int skx_adxl_get(void) { const char * const *names; diff --git a/drivers/edac/skx_common.h b/drivers/edac/skx_common.h index 4091431356d6..eea2d95cc0ac 100644 --- a/drivers/edac/skx_common.h +++ b/drivers/edac/skx_common.h @@ -344,6 +344,8 @@ int skx_adxl_get(void); void skx_adxl_put(void); void skx_set_decode(skx_decode_f decode); void skx_set_show_rrl(skx_show_rrl_f rrl); +void skx_show_rrl(struct decoded_addr *res, char *msg, int len, bool scrub= _err); +void skx_enable_rrl(bool enable); void skx_set_mem_cfg(bool mem_cfg_2lm); void skx_set_res_cfg(struct res_config *cfg); void skx_init_mc_mapping(struct skx_dev *d); --=20 2.43.0 From nobody Sun May 24 21:39:30 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.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 623EB46B5; Thu, 21 May 2026 07:39:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.10 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779349199; cv=none; b=m7gIIfVnmxKi8FZnwR37w7fKJn0h4LsCpCSmD9FW8KX34ocWIlZLRSVNrXfANZS1d+GdZnZmiLeEDlu2pOdpxjlfpw30EjtpDl6TJW+EsU3d0LGJqFsWEMDLBNd4fHo/na1dZM6vM+p7351VZueQ1H72K3xeM6erDr8ek/ikHyI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779349199; c=relaxed/simple; bh=1wAOQAsq4vEcHK8x9vPvNugIwlGTusS7svJZDL3ML68=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CAkgWHpvDqKfOnwOvSh7QuDKiC8CXvdIjOmsSzz7/Vsv6QryLxz1YI55mFjs8R5P9w1MQQ67lBX86ClWtfOVHwzdjCwg1uydJ2r1GBs8HDqElkuDCdzaqQ5qZGiPoh3IV331m/T4ftv9TgnGH6N0l0vKyU6m0p3rsAuWzNBr5Gk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=RWsma5w4; arc=none smtp.client-ip=198.175.65.10 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="RWsma5w4" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1779349198; x=1810885198; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=1wAOQAsq4vEcHK8x9vPvNugIwlGTusS7svJZDL3ML68=; b=RWsma5w4t4Nm8kQ3IbZ+2afsPwJfUf1yOngpvUSUL7gao/xi0dPqVMWp ibUBN3NEJ6CZhoHXDgJOXfT7K62ND4A17iQs+VFn3RE3Hcc6iFve7vrU/ FGB23LS1nvXMlwnm55JWfyvzDBu2Uu1MOFrpMSzzPTu9fKebOZVsyW2kU RD8wzFd1vJLTtIc+S1F2atG8Qb/CyzDC24bckhjP8ei0kZWWtVFPvZe2V hje+QEcFkEWtuf9kGwyaMwlop3VosuDG66L0kor7LBTsJbVSDVoE+Ud/L T/BFhhSkvmmeXoqFklsw9tYKDJa4OJj+lT9xvLv60Rc/6QvCeOCZXTMVe Q==; X-CSE-ConnectionGUID: bev1kY1iQqqzNP+0jGgLvg== X-CSE-MsgGUID: BSyV8fLDQiSS5fGA3oEwyA== X-IronPort-AV: E=McAfee;i="6800,10657,11792"; a="97690587" X-IronPort-AV: E=Sophos;i="6.23,245,1770624000"; d="scan'208";a="97690587" Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by orvoesa102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2026 00:39:57 -0700 X-CSE-ConnectionGUID: NsJ8TZk0TlqRsWJts23s+g== X-CSE-MsgGUID: sj3Z6h2xSm2GwhLtJ5ec2g== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,245,1770624000"; d="scan'208";a="263973839" Received: from qiuxu-clx.sh.intel.com ([10.239.53.109]) by fmviesa002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2026 00:39:53 -0700 From: Qiuxu Zhuo To: Tony Luck , Borislav Petkov Cc: Qiuxu Zhuo , Yi Lai , linux-edac@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 6/8] EDAC/skx_common: Add SubChannel support to ADXL decode Date: Thu, 21 May 2026 15:31:10 +0800 Message-ID: <20260521073112.3881223-7-qiuxu.zhuo@intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260521073112.3881223-1-qiuxu.zhuo@intel.com> References: <20260521073112.3881223-1-qiuxu.zhuo@intel.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 Content-Type: text/plain; charset="utf-8" Diamond Rapids server RRL (Retry Read error Log) operates at sub-channel granularity. Add SubChannel support to ADXL decoding in preparation for enabling this feature. Also introduce adxl_component_required() to validate mandatory ADXL components to improve code readability. Tested-by: Yi Lai Signed-off-by: Qiuxu Zhuo --- drivers/edac/skx_common.c | 20 +++++++++++++++++++- drivers/edac/skx_common.h | 5 +++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/drivers/edac/skx_common.c b/drivers/edac/skx_common.c index f769a354ea45..4d832f02fb59 100644 --- a/drivers/edac/skx_common.c +++ b/drivers/edac/skx_common.c @@ -31,10 +31,12 @@ static const char * const component_names[] =3D { [INDEX_CHANNEL] =3D "ChannelId", [INDEX_DIMM] =3D "DimmSlotId", [INDEX_CS] =3D "ChipSelect", + [INDEX_SUBCH] =3D "SubChId", [INDEX_NM_MEMCTRL] =3D "NmMemoryControllerId", [INDEX_NM_CHANNEL] =3D "NmChannelId", [INDEX_NM_DIMM] =3D "NmDimmSlotId", [INDEX_NM_CS] =3D "NmChipSelect", + [INDEX_NM_SUBCH] =3D "NmSubChId", }; =20 static int component_indices[ARRAY_SIZE(component_names)]; @@ -43,6 +45,7 @@ static const char * const *adxl_component_names; static u64 *adxl_values; static char *adxl_msg; static unsigned long adxl_nm_bitmap; +static unsigned long adxl_bitmap; =20 static char skx_msg[MSG_SIZE]; static skx_decode_f driver_decode; @@ -288,6 +291,15 @@ void skx_show_rrl(struct decoded_addr *res, char *msg,= int len, bool scrub_err) } EXPORT_SYMBOL_GPL(skx_show_rrl); =20 +static bool adxl_component_required(int idx) +{ + return idx =3D=3D INDEX_SOCKET || + idx =3D=3D INDEX_MEMCTRL || + idx =3D=3D INDEX_CHANNEL || + idx =3D=3D INDEX_DIMM || + idx =3D=3D INDEX_CS; +} + int skx_adxl_get(void) { const char * const *names; @@ -306,12 +318,14 @@ int skx_adxl_get(void) =20 if (i >=3D INDEX_NM_FIRST) adxl_nm_bitmap |=3D 1 << i; + else + adxl_bitmap |=3D 1 << i; =20 break; } } =20 - if (!names[j] && i < INDEX_NM_FIRST) + if (!names[j] && adxl_component_required(i)) goto err; } =20 @@ -438,11 +452,15 @@ static bool skx_adxl_decode(struct decoded_addr *res,= enum error_source err_src) (int)adxl_values[component_indices[INDEX_NM_DIMM]] : -1; res->cs =3D (adxl_nm_bitmap & BIT_NM_CS) ? (int)adxl_values[component_indices[INDEX_NM_CS]] : -1; + res->subch =3D (adxl_nm_bitmap & BIT_NM_SUBCH) ? + (int)adxl_values[component_indices[INDEX_NM_SUBCH]] : -1; } else { res->imc =3D (int)adxl_values[component_indices[INDEX_MEMCTRL]]; res->channel =3D (int)adxl_values[component_indices[INDEX_CHANNEL]]; res->dimm =3D (int)adxl_values[component_indices[INDEX_DIMM]]; res->cs =3D (int)adxl_values[component_indices[INDEX_CS]]; + res->subch =3D (adxl_bitmap & BIT_SUBCH) ? + (int)adxl_values[component_indices[INDEX_SUBCH]] : -1; } =20 if (res->imc < 0) { diff --git a/drivers/edac/skx_common.h b/drivers/edac/skx_common.h index eea2d95cc0ac..38d96bf71fd9 100644 --- a/drivers/edac/skx_common.h +++ b/drivers/edac/skx_common.h @@ -210,11 +210,13 @@ enum { INDEX_CHANNEL, INDEX_DIMM, INDEX_CS, + INDEX_SUBCH, INDEX_NM_FIRST, INDEX_NM_MEMCTRL =3D INDEX_NM_FIRST, INDEX_NM_CHANNEL, INDEX_NM_DIMM, INDEX_NM_CS, + INDEX_NM_SUBCH, INDEX_MAX }; =20 @@ -225,10 +227,12 @@ enum error_source { ERR_SRC_NOT_MEMORY, }; =20 +#define BIT_SUBCH BIT_ULL(INDEX_SUBCH) #define BIT_NM_MEMCTRL BIT_ULL(INDEX_NM_MEMCTRL) #define BIT_NM_CHANNEL BIT_ULL(INDEX_NM_CHANNEL) #define BIT_NM_DIMM BIT_ULL(INDEX_NM_DIMM) #define BIT_NM_CS BIT_ULL(INDEX_NM_CS) +#define BIT_NM_SUBCH BIT_ULL(INDEX_NM_SUBCH) =20 struct decoded_addr { struct mce *mce; @@ -242,6 +246,7 @@ struct decoded_addr { int chanways; int dimm; int cs; + int subch; int rank; int channel_rank; u64 rank_address; --=20 2.43.0 From nobody Sun May 24 21:39:30 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.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 E2A5B343898; Thu, 21 May 2026 07:40:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.10 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779349230; cv=none; b=M+9cjpEwgh0Xhh3cMtAht3miUsD8nNZZjsbwFJhnUL+gWFQeWUjPDs6nW+xWMcpc/7oeU+CM/j3vfFyJH8dUwFClZpY6qYtlRdwo804edrkf9XiJNydiR3O9YwlrNAd6uAVkk4KGENr+FpS9UnoNTK0rgHH0hIGknippS4DNRcU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779349230; c=relaxed/simple; bh=ddnsfOZjlx8QKbpjbe/hxa0ckGFh7gWVmj4Q3lEEHAc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WiM9U5MkSeXECg2tsNNs7AqqobnQx3Tg4BP0xSXC7ZcN3pegvXjn2mU48qzxJLNPnbBdOJTkCM8+ucux5sbuU1b3gL8jN0Bg669BIrmHWptui5q1h9hLFvGp651+r9REAegS2YWe6exhHijnhcGe7LZaQ0SbplUk4J7b3rBQ1Z8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=fYU6KgX3; arc=none smtp.client-ip=198.175.65.10 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="fYU6KgX3" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1779349229; x=1810885229; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ddnsfOZjlx8QKbpjbe/hxa0ckGFh7gWVmj4Q3lEEHAc=; b=fYU6KgX3lzCaEFK7OTdCTh+j4OF9dP+n2KvYj1pqqiYRLWUAdI972dbi Ed/h5Jvc4sETp0JwytGsGb9qiDc05VFoJgccdPLv9qhFvZJeRAwdTOreW ACE7UHukOzFUkH4qK9QFYv6h0wlnhKC7qKyqhRICs74lqnbH7NcLWGJ4R IPEhq45RWeKUPurWayc9035FeOSGhMIMaTRWIzUckrIZu6dhh9/j99iYo aNgRFWWOMHSzrRsIbkBtCvluofLX3hkB+UpPAteGRDJa1NGjT6Mc3hKSJ co0Y2LIVvYuDlDRkc4DrqNhAHWxOaAz9zxn687ZTmSeY3bUQXsYOkJsHb A==; X-CSE-ConnectionGUID: Ch7JqlKaSoWSUj7xbZrWXQ== X-CSE-MsgGUID: +6c6tAboTXix4p6vWfrbFg== X-IronPort-AV: E=McAfee;i="6800,10657,11792"; a="97690617" X-IronPort-AV: E=Sophos;i="6.23,245,1770624000"; d="scan'208";a="97690617" Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by orvoesa102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2026 00:40:29 -0700 X-CSE-ConnectionGUID: m+px+oZkTyCfMpjiufsQ2Q== X-CSE-MsgGUID: mZG0LFjrQmyGpgOAiOcKSA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,245,1770624000"; d="scan'208";a="263973968" Received: from qiuxu-clx.sh.intel.com ([10.239.53.109]) by fmviesa002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2026 00:40:26 -0700 From: Qiuxu Zhuo To: Tony Luck , Borislav Petkov Cc: Qiuxu Zhuo , Yi Lai , linux-edac@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 7/8] EDAC/{skx_common,i10nm}: Prepare RRL for sub-channel granularity Date: Thu, 21 May 2026 15:31:11 +0800 Message-ID: <20260521073112.3881223-8-qiuxu.zhuo@intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260521073112.3881223-1-qiuxu.zhuo@intel.com> References: <20260521073112.3881223-1-qiuxu.zhuo@intel.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 Content-Type: text/plain; charset="utf-8" To prepare for enabling Diamond Rapids server RRL (Retry Read error Log), which operates at sub-channel granularity by converting struct res_config::reg_rrl_ddr from a single pointer to an array (reg_rrl_ddr[2]) and updating all users in i10nm_edac and skx_common accordingly. Initialize only reg_rrl_ddr[0] for existing platforms and prepare for supporting two RRL set groups per DDR channel (one per sub-channel) when present. Tested-by: Yi Lai Signed-off-by: Qiuxu Zhuo --- drivers/edac/i10nm_base.c | 12 ++++++------ drivers/edac/skx_common.c | 35 +++++++++++++++++++++++++++++------ drivers/edac/skx_common.h | 2 +- 3 files changed, 36 insertions(+), 13 deletions(-) diff --git a/drivers/edac/i10nm_base.c b/drivers/edac/i10nm_base.c index 2e21eefbb4f5..fa1853f252b0 100644 --- a/drivers/edac/i10nm_base.c +++ b/drivers/edac/i10nm_base.c @@ -767,7 +767,7 @@ static struct res_config i10nm_cfg0 =3D { .ddr_mdev_bdf =3D {0, 12, 0}, .hbm_mdev_bdf =3D {0, 12, 1}, .sad_all_offset =3D 0x108, - .reg_rrl_ddr =3D &icx_reg_rrl_ddr, + .reg_rrl_ddr[0] =3D &icx_reg_rrl_ddr, }; =20 static struct res_config i10nm_cfg1 =3D { @@ -785,7 +785,7 @@ static struct res_config i10nm_cfg1 =3D { .ddr_mdev_bdf =3D {0, 12, 0}, .hbm_mdev_bdf =3D {0, 12, 1}, .sad_all_offset =3D 0x108, - .reg_rrl_ddr =3D &icx_reg_rrl_ddr, + .reg_rrl_ddr[0] =3D &icx_reg_rrl_ddr, }; =20 static struct res_config spr_cfg =3D { @@ -808,7 +808,7 @@ static struct res_config spr_cfg =3D { .ddr_mdev_bdf =3D {0, 12, 0}, .hbm_mdev_bdf =3D {0, 12, 1}, .sad_all_offset =3D 0x300, - .reg_rrl_ddr =3D &spr_reg_rrl_ddr, + .reg_rrl_ddr[0] =3D &spr_reg_rrl_ddr, .reg_rrl_hbm[0] =3D &spr_reg_rrl_hbm_pch0, .reg_rrl_hbm[1] =3D &spr_reg_rrl_hbm_pch1, }; @@ -828,7 +828,7 @@ static struct res_config gnr_cfg =3D { .uracu_bdf =3D {0, 0, 1}, .ddr_mdev_bdf =3D {0, 5, 1}, .sad_all_offset =3D 0x300, - .reg_rrl_ddr =3D &gnr_reg_rrl_ddr, + .reg_rrl_ddr[0] =3D &gnr_reg_rrl_ddr, }; =20 static const struct x86_cpu_id i10nm_cpuids[] =3D { @@ -1023,7 +1023,7 @@ static int __init i10nm_init(void) skx_setup_debug("i10nm_test"); =20 res_cfg->rrl_ctrl_mode =3D retry_rd_err_log; - if (retry_rd_err_log && res_cfg->reg_rrl_ddr) { + if (retry_rd_err_log && res_cfg->reg_rrl_ddr[0]) { skx_set_show_rrl(skx_show_rrl); if (retry_rd_err_log =3D=3D RRL_CTRL_LINUX) skx_enable_rrl(true); @@ -1045,7 +1045,7 @@ static void __exit i10nm_exit(void) =20 skx_set_decode(NULL); =20 - if (retry_rd_err_log && res_cfg->reg_rrl_ddr) { + if (retry_rd_err_log && res_cfg->reg_rrl_ddr[0]) { if (retry_rd_err_log =3D=3D RRL_CTRL_LINUX) skx_enable_rrl(false); skx_set_show_rrl(NULL); diff --git a/drivers/edac/skx_common.c b/drivers/edac/skx_common.c index 4d832f02fb59..bfd0cd1689ed 100644 --- a/drivers/edac/skx_common.c +++ b/drivers/edac/skx_common.c @@ -173,15 +173,18 @@ static void enable_rrls(struct skx_imc *imc, int chan= , struct reg_rrl *rrl, =20 static void enable_rrls_ddr(struct skx_imc *imc, bool enable) { - struct reg_rrl *rrl_ddr =3D skx_res_cfg->reg_rrl_ddr; + struct reg_rrl **rrl_ddr =3D skx_res_cfg->reg_rrl_ddr; int i, chan_num =3D skx_res_cfg->ddr_chan_num; struct skx_channel *chan =3D imc->chan; =20 if (!imc->mbase) return; =20 - for (i =3D 0; i < chan_num; i++) - enable_rrls(imc, i, rrl_ddr, enable, chan[i].rrl_ctl[0]); + for (i =3D 0; i < chan_num; i++) { + enable_rrls(imc, i, rrl_ddr[0], enable, chan[i].rrl_ctl[0]); + if (rrl_ddr[1]) + enable_rrls(imc, i, rrl_ddr[1], enable, chan[i].rrl_ctl[1]); + } } =20 static void enable_rrls_hbm(struct skx_imc *imc, bool enable) @@ -218,10 +221,31 @@ void skx_enable_rrl(bool enable) } EXPORT_SYMBOL_GPL(skx_enable_rrl); =20 +static struct reg_rrl *get_rrl_reg(struct decoded_addr *res, struct res_co= nfig *cfg) +{ + struct skx_imc *imc =3D &res->dev->imc[res->imc]; + + /* HBM has two groups of RRL sets, one per pseudo-channel. */ + if (imc->hbm_mc) + return cfg->reg_rrl_hbm[res->cs & 1]; + + /* One group of RRL sets per DDR channel. */ + if (!cfg->reg_rrl_ddr[1]) + return cfg->reg_rrl_ddr[0]; + + if (res->subch =3D=3D -1) { + skx_printk(KERN_ERR, "Invalid sub-channel id (-1), possibly missing %s A= DXL component.\n", component_names[INDEX_SUBCH]); + return NULL; + } + + /* Two groups of RRL sets per DDR channel (e.g., DMR: one group per sub-c= hannel). */ + return cfg->reg_rrl_ddr[res->subch & 1]; +} + void skx_show_rrl(struct decoded_addr *res, char *msg, int len, bool scrub= _err) { - int i, j, n, ch =3D res->channel, pch =3D res->cs & 1; struct skx_imc *imc =3D &res->dev->imc[res->imc]; + int i, j, n, ch =3D res->channel; u64 log, corr, status_mask; struct reg_rrl *rrl; bool scrub; @@ -231,8 +255,7 @@ void skx_show_rrl(struct decoded_addr *res, char *msg, = int len, bool scrub_err) if (!imc->mbase) return; =20 - rrl =3D imc->hbm_mc ? skx_res_cfg->reg_rrl_hbm[pch] : skx_res_cfg->reg_rr= l_ddr; - + rrl =3D get_rrl_reg(res, skx_res_cfg); if (!rrl) return; =20 diff --git a/drivers/edac/skx_common.h b/drivers/edac/skx_common.h index 38d96bf71fd9..6d4cf0dd412a 100644 --- a/drivers/edac/skx_common.h +++ b/drivers/edac/skx_common.h @@ -283,7 +283,7 @@ struct res_config { int hbm_chan_mmio_sz; bool support_ddr5; /* RRL register sets per DDR channel */ - struct reg_rrl *reg_rrl_ddr; + struct reg_rrl *reg_rrl_ddr[2]; /* RRL register sets per HBM channel */ struct reg_rrl *reg_rrl_hbm[2]; /* RRL control mode */ --=20 2.43.0 From nobody Sun May 24 21:39:30 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.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 0BB8D343898; Thu, 21 May 2026 07:40:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.10 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779349237; cv=none; b=uySASvWEaJ7/FKrA0U423wBn1iySslyqTq9nPq442ykPcQw7eV5faBHlkkMyy31L9LxeMzvEOsm+0+W+0G5ISL08uOOm7VjIdWjS10s4RdyCeK/zBd0d7rWc3pF77UJGCw0S+oFqFMZw4as7feeyj1oL+Q5LMgA5i3PQkhE2rVY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779349237; c=relaxed/simple; bh=sbENprrx81r7afzrfzPlnOKe6bVAvLdOgMU3G+TrlNE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mkiwIr58GzDpmKxGXg6Phqq9tL36dXkq+Z3TvwlB8ckeUtEvpGZMsKoad7JfAYbjbswdF76UquewvlI7Pc+AhG9pAn9RuxlgTPeA5hrTXBeTgczzJDJK6Aq8bevRxWehIkVx3st5L9h7sibV07YKpd05ExSSZLtbmP15GH5gwVU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=jG3fv9Gv; arc=none smtp.client-ip=198.175.65.10 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="jG3fv9Gv" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1779349236; x=1810885236; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=sbENprrx81r7afzrfzPlnOKe6bVAvLdOgMU3G+TrlNE=; b=jG3fv9GvMWqtcXKVauKBeIdCYGxc3zOyiAHxnHvPo1M/W/H0+z9HXWIb 1BU4KVP+m1vmPG00zrdMbGL02dhMIwUMtHclfKjI3cw8F/xPXpW8Zp1wi /0YLRMsC4yn/0QkSO4h1WgY0HbRd2xP074cG1CmoFZk6IosQOZS/Y92PK /2ALYpkkAKlejfIbTJ7Pj8BKGK7TIf9563tElgbN2uritEFj4lpoRj/wC lj8pJsNenaBN8ghMVvO1dUQ6z+QHHSJiHKlehD7sYdsgAkS7qxkAFlEtS zsESgepKxB20KNCE3wDpAODtDKraHlT+0mJnY529C+iCRi49tJIHiuCwj g==; X-CSE-ConnectionGUID: bXMKa2kXQ8maeMtOE4A12w== X-CSE-MsgGUID: jFVcXSR8Raa8vHViFigXfg== X-IronPort-AV: E=McAfee;i="6800,10657,11792"; a="97690640" X-IronPort-AV: E=Sophos;i="6.23,245,1770624000"; d="scan'208";a="97690640" Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by orvoesa102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2026 00:40:36 -0700 X-CSE-ConnectionGUID: uxs45YUsRsKulJl7zg2Qkw== X-CSE-MsgGUID: JyYwKteSQPqv5z/TVP7Dwg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,245,1770624000"; d="scan'208";a="263974022" Received: from qiuxu-clx.sh.intel.com ([10.239.53.109]) by fmviesa002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2026 00:40:33 -0700 From: Qiuxu Zhuo To: Tony Luck , Borislav Petkov Cc: Qiuxu Zhuo , Yi Lai , linux-edac@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 8/8] EDAC/imh: Add RRL support for Intel Diamond Rapids server Date: Thu, 21 May 2026 15:31:12 +0800 Message-ID: <20260521073112.3881223-9-qiuxu.zhuo@intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260521073112.3881223-1-qiuxu.zhuo@intel.com> References: <20260521073112.3881223-1-qiuxu.zhuo@intel.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 Content-Type: text/plain; charset="utf-8" Compared to previous generations, Diamond Rapids RRL (Retry Read error Log) operates at DDR sub-channel granularity and adds an extra register per set. It also increases the CORRERRCNT register width from 4 to 8 bytes while reducing the number of registers from 8 to 4. Add the Diamond Rapids RRL register configuration table and enable support. Tested-by: Yi Lai Signed-off-by: Qiuxu Zhuo --- drivers/edac/imh_base.c | 52 +++++++++++++++++++++++++++++++++++++++ drivers/edac/skx_common.h | 2 +- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/drivers/edac/imh_base.c b/drivers/edac/imh_base.c index dfdcfa127ce7..6ca0df031bf5 100644 --- a/drivers/edac/imh_base.c +++ b/drivers/edac/imh_base.c @@ -71,6 +71,39 @@ struct local_reg { .width =3D (cfg)->ip_name##_reg_##reg_name##_width, \ } =20 +static struct res_config *res_cfg; +static int retry_rd_err_log; + +#define REG_RRL_DEFINE(a0, a1, a2, a3, a4, a5, a6, b0, b1, b2, b3) \ + { \ + .set_num =3D 4, \ + .reg_num =3D 7, \ + .sources =3D {RRL_SRC_FRE_SCRUB, RRL_SRC_FRE_DEMAND, RRL_SRC_LRE_SCRUB, = RRL_SRC_LRE_DEMAND}, \ + .offsets =3D { \ + {a0, a1, a2, a3, a4, a5, a6}, \ + {a0 + 4, a1 + 4, a2 + 8, a3 + 4, a4 + 4, a5 + 8, a6 + 8}, \ + {a0 + 8, a1 + 8, a2 + 16, a3 + 8, a4 + 8, a5 + 16, a6 + 16}, \ + {a0 + 12, a1 + 12, a2 + 24, a3 + 12, a4 + 12, a5 + 24, a6 + 24}, \ + }, \ + .widths =3D {4, 4, 8, 4, 4, 8, 8}, \ + .v_mask =3D BIT(0), \ + .uc_mask =3D BIT(1), \ + .over_mask =3D BIT(2), \ + .en_mask =3D BIT(12), \ + .en_patspr_mask =3D BIT(14), \ + .noover_mask =3D BIT(15), \ + .cecnt_num =3D 4, \ + .cecnt_offsets =3D {b0, b1, b2, b3}, \ + .cecnt_widths =3D {8, 8, 8, 8}, \ +} + +static struct reg_rrl dmr_reg_rrl_ddr_subch0 =3D REG_RRL_DEFINE( + 0x2dc0, 0x2dd0, 0x2de0, 0x2e00, 0x2e10, 0x2f70, 0x0200, + 0x2c10, 0x2c18, 0x2c20, 0x2c28); +static struct reg_rrl dmr_reg_rrl_ddr_subch1 =3D REG_RRL_DEFINE( + 0x6dc0, 0x6dd0, 0x6de0, 0x6e00, 0x6e10, 0x6f70, 0x4200, + 0x6c10, 0x6c18, 0x6c20, 0x6c28); + static void __read_local_reg(void *reg) { struct local_reg *r =3D (struct local_reg *)reg; @@ -480,6 +513,8 @@ static struct res_config dmr_cfg =3D { .ha_size =3D 0x1000, .ha_reg_mode_offset =3D 0x4a0, .ha_reg_mode_width =3D 4, + .reg_rrl_ddr[0] =3D &dmr_reg_rrl_ddr_subch0, + .reg_rrl_ddr[1] =3D &dmr_reg_rrl_ddr_subch1, }; =20 static const struct x86_cpu_id imh_cpuids[] =3D { @@ -519,6 +554,7 @@ static int __init imh_init(void) return -ENODEV; cfg =3D (struct res_config *)id->driver_data; skx_set_res_cfg(cfg); + res_cfg =3D cfg; =20 if (!imh_get_tolm_tohm(cfg, &tolm, &tohm)) return -ENODEV; @@ -553,6 +589,13 @@ static int __init imh_init(void) mce_register_decode_chain(&imh_mce_dec); skx_setup_debug("imh_test"); =20 + cfg->rrl_ctrl_mode =3D retry_rd_err_log; + if (retry_rd_err_log && cfg->reg_rrl_ddr[0]) { + skx_set_show_rrl(skx_show_rrl); + if (retry_rd_err_log =3D=3D RRL_CTRL_LINUX) + skx_enable_rrl(true); + } + imh_printk(KERN_INFO, "%s\n", IMH_REVISION); =20 return 0; @@ -565,6 +608,12 @@ static void __exit imh_exit(void) { edac_dbg(2, "\n"); =20 + if (retry_rd_err_log && res_cfg->reg_rrl_ddr[0]) { + if (retry_rd_err_log =3D=3D RRL_CTRL_LINUX) + skx_enable_rrl(false); + skx_set_show_rrl(NULL); + } + skx_teardown_debug(); mce_unregister_decode_chain(&imh_mce_dec); skx_adxl_put(); @@ -574,6 +623,9 @@ static void __exit imh_exit(void) module_init(imh_init); module_exit(imh_exit); =20 +module_param(retry_rd_err_log, int, 0444); +MODULE_PARM_DESC(retry_rd_err_log, "retry_rd_err_log: 0=3Doff(default), 1= =3Dbios(Linux doesn't reset any control bits, but just reports values.), 2= =3Dlinux(Linux tries to take control and resets mode bits, clear valid/UC b= its after reading.)"); + MODULE_LICENSE("GPL"); MODULE_AUTHOR("Qiuxu Zhuo"); MODULE_DESCRIPTION("MC Driver for Intel servers using IMH-based memory con= troller"); diff --git a/drivers/edac/skx_common.h b/drivers/edac/skx_common.h index 6d4cf0dd412a..777252cca809 100644 --- a/drivers/edac/skx_common.h +++ b/drivers/edac/skx_common.h @@ -77,7 +77,7 @@ /* Max RRL register sets per {,sub-,pseudo-}channel. */ #define NUM_RRL_SET 4 /* Max RRL registers per set. */ -#define NUM_RRL_REG 6 +#define NUM_RRL_REG 7 /* Max correctable error count registers. */ #define NUM_CECNT_REG 8 =20 --=20 2.43.0