* [PATCH 0/2] EDAC: Add Intel Nova Lake-H SoC support
@ 2026-05-21 12:38 Qiuxu Zhuo
2026-05-21 12:38 ` [PATCH 1/2] EDAC/igen6: Make registers for detecting IBECC configurable Qiuxu Zhuo
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Qiuxu Zhuo @ 2026-05-21 12:38 UTC (permalink / raw)
To: Tony Luck, Borislav Petkov; +Cc: Qiuxu Zhuo, Jie Wang, linux-edac, linux-kernel
Intel Nova Lake-H uses different IBECC detection registers than
existing igen6 platforms. Make register detection configurable to
handle platform differences cleanly, then add Nova Lake-H support.
The patch set consists of:
Patch 1: Make the IBECC detection register configurable.
Patch 2: Add Intel Nova Lake-H SoC support.
The patch set is based on:
Tree: https://git.kernel.org/pub/scm/linux/kernel/git/ras/ras.git
Branch: edac-for-next
Commit: 4b049cd5e519
Qiuxu Zhuo (2):
EDAC/igen6: Make registers for detecting IBECC configurable
EDAC/igen6: Add Intel Nova Lake-H SoC support
drivers/edac/igen6_edac.c | 101 +++++++++++++++++++++++++++-----------
1 file changed, 73 insertions(+), 28 deletions(-)
base-commit: 4b049cd5e5194c8e58cd978d2dc9d3bcf67c84f6
--
2.43.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/2] EDAC/igen6: Make registers for detecting IBECC configurable
2026-05-21 12:38 [PATCH 0/2] EDAC: Add Intel Nova Lake-H SoC support Qiuxu Zhuo
@ 2026-05-21 12:38 ` Qiuxu Zhuo
2026-05-21 12:38 ` [PATCH 2/2] EDAC/igen6: Add Intel Nova Lake-H SoC support Qiuxu Zhuo
2026-05-27 16:17 ` [PATCH 0/2] EDAC: " Luck, Tony
2 siblings, 0 replies; 4+ messages in thread
From: Qiuxu Zhuo @ 2026-05-21 12:38 UTC (permalink / raw)
To: Tony Luck, Borislav Petkov; +Cc: Qiuxu Zhuo, Jie Wang, linux-edac, linux-kernel
Some Intel CPUs with IBECC (In-Band ECC) capability use different registers
to indicate IBECC presence. Make IBECC detection registers CPU-model
specific and configure them properly for scalable IBECC detection.
No functional changes intended.
Tested-by: Jie Wang <jie.wang@intel.com>
Signed-off-by: Qiuxu Zhuo <qiuxu.zhuo@intel.com>
---
drivers/edac/igen6_edac.c | 55 +++++++++++++++++++--------------------
1 file changed, 27 insertions(+), 28 deletions(-)
diff --git a/drivers/edac/igen6_edac.c b/drivers/edac/igen6_edac.c
index f3e53d63eb54..a761d683eae3 100644
--- a/drivers/edac/igen6_edac.c
+++ b/drivers/edac/igen6_edac.c
@@ -151,6 +151,8 @@ static struct res_config {
/* MEMSS_PMA_CR registers. */
u32 reg_mem_config_offset;
u32 reg_mem_config_ddr_type_mask;
+ u32 reg_capabilities_misc_offset;
+ u32 reg_capabilities_misc_ibecc_dis;
/* Memory controller registers. */
u32 reg_mad_inter_size_mask[NUM_CHANNELS];
u64 reg_mad_inter_size_granularity;
@@ -405,27 +407,22 @@ static bool mtl_p_ibecc_available(struct pci_dev *pdev)
return !(CAPID_E_IBECC_BIT18 & v);
}
-static bool mtl_ps_ibecc_available(struct pci_dev *pdev)
+static bool generic_ibecc_available(struct pci_dev *pdev)
{
-#define MCHBAR_MEMSS_IBECCDIS 0x13c00
- void __iomem *window;
- u64 mchbar;
+ void __iomem *base = igen6_pvt->memss_pma_cr;
+ bool present;
u32 val;
- if (get_mchbar(pdev, &mchbar))
- return false;
-
- window = ioremap(mchbar, MCHBAR_SIZE * 2);
- if (!window) {
- igen6_printk(KERN_ERR, "Failed to ioremap 0x%llx\n", mchbar);
- return false;
+ if (res_cfg->reg_capabilities_misc_offset) {
+ val = readl(base + res_cfg->reg_capabilities_misc_offset);
+ present = !(val & res_cfg->reg_capabilities_misc_ibecc_dis);
+ edac_dbg(2, "capabilities misc reg 0x%x\n", val);
+ } else {
+ igen6_printk(KERN_ERR, "No register for detecting IBECC presence.\n");
+ present = false;
}
- val = readl(window + MCHBAR_MEMSS_IBECCDIS);
- iounmap(window);
-
- /* Bit6: 1 - IBECC is disabled, 0 - IBECC isn't disabled */
- return !GET_BITFIELD(val, 6, 6);
+ return present;
}
static u64 mem_addr_to_sys_addr(u64 maddr)
@@ -725,18 +722,20 @@ static struct res_config rpl_p_cfg = {
};
static struct res_config mtl_ps_cfg = {
- .machine_check = true,
- .num_imc = 2,
- .reg_mchbar_mask = GENMASK_ULL(41, 17),
- .reg_tom_mask = GENMASK_ULL(41, 20),
- .reg_touud_mask = GENMASK_ULL(41, 20),
- .reg_eccerrlog_addr_mask = GENMASK_ULL(38, 5),
- .imc_base = 0xd800,
- .ibecc_base = 0xd400,
- .ibecc_error_log_offset = 0x170,
- .ibecc_available = mtl_ps_ibecc_available,
- .err_addr_to_sys_addr = adl_err_addr_to_sys_addr,
- .err_addr_to_imc_addr = adl_err_addr_to_imc_addr,
+ .machine_check = true,
+ .num_imc = 2,
+ .reg_mchbar_mask = GENMASK_ULL(41, 17),
+ .reg_tom_mask = GENMASK_ULL(41, 20),
+ .reg_touud_mask = GENMASK_ULL(41, 20),
+ .reg_eccerrlog_addr_mask = GENMASK_ULL(38, 5),
+ .reg_capabilities_misc_offset = 0x13c00,
+ .reg_capabilities_misc_ibecc_dis = BIT(6),
+ .imc_base = 0xd800,
+ .ibecc_base = 0xd400,
+ .ibecc_error_log_offset = 0x170,
+ .ibecc_available = generic_ibecc_available,
+ .err_addr_to_sys_addr = adl_err_addr_to_sys_addr,
+ .err_addr_to_imc_addr = adl_err_addr_to_imc_addr,
};
static struct res_config mtl_p_cfg = {
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/2] EDAC/igen6: Add Intel Nova Lake-H SoC support
2026-05-21 12:38 [PATCH 0/2] EDAC: Add Intel Nova Lake-H SoC support Qiuxu Zhuo
2026-05-21 12:38 ` [PATCH 1/2] EDAC/igen6: Make registers for detecting IBECC configurable Qiuxu Zhuo
@ 2026-05-21 12:38 ` Qiuxu Zhuo
2026-05-27 16:17 ` [PATCH 0/2] EDAC: " Luck, Tony
2 siblings, 0 replies; 4+ messages in thread
From: Qiuxu Zhuo @ 2026-05-21 12:38 UTC (permalink / raw)
To: Tony Luck, Borislav Petkov; +Cc: Qiuxu Zhuo, Jie Wang, linux-edac, linux-kernel
Nova Lake-H SoCs share similar memory controller registers and IBECC
(In-Band ECC) registers with Panther Lake-H SoCs but use a new memory
subsystem register for IBECC presence detection.
Add Nova Lake-H SoC compute die IDs and create a new configuration
structure for Nova Lake-H SoCs to enable EDAC support.
Tested-by: Jie Wang <jie.wang@intel.com>
Signed-off-by: Qiuxu Zhuo <qiuxu.zhuo@intel.com>
---
drivers/edac/igen6_edac.c | 46 +++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/drivers/edac/igen6_edac.c b/drivers/edac/igen6_edac.c
index a761d683eae3..9af15ac6ff84 100644
--- a/drivers/edac/igen6_edac.c
+++ b/drivers/edac/igen6_edac.c
@@ -151,6 +151,7 @@ static struct res_config {
/* MEMSS_PMA_CR registers. */
u32 reg_mem_config_offset;
u32 reg_mem_config_ddr_type_mask;
+ u32 reg_mem_config_ibecc_en_mask;
u32 reg_capabilities_misc_offset;
u32 reg_capabilities_misc_ibecc_dis;
/* Memory controller registers. */
@@ -316,6 +317,12 @@ static struct work_struct ecclog_work;
/* Compute die IDs for Wildcat Lake with IBECC */
#define DID_WCL_SKU1 0xfd00
+/* Compute die IDs for Nova Lake-H/HX with IBECC */
+#define DID_NVL_H_SKU1 0xd701
+#define DID_NVL_H_SKU2 0xd702
+#define DID_NVL_H_SKU3 0xd704
+#define DID_NVL_H_SKU4 0xd705
+
static int get_mchbar(struct pci_dev *pdev, u64 *mchbar)
{
union {
@@ -417,6 +424,10 @@ static bool generic_ibecc_available(struct pci_dev *pdev)
val = readl(base + res_cfg->reg_capabilities_misc_offset);
present = !(val & res_cfg->reg_capabilities_misc_ibecc_dis);
edac_dbg(2, "capabilities misc reg 0x%x\n", val);
+ } else if (res_cfg->reg_mem_config_offset) {
+ val = readl(base + res_cfg->reg_mem_config_offset);
+ present = !!(val & res_cfg->reg_mem_config_ibecc_en_mask);
+ edac_dbg(2, "mem config reg 0x%x\n", val);
} else {
igen6_printk(KERN_ERR, "No register for detecting IBECC presence.\n");
present = false;
@@ -798,6 +809,37 @@ static struct res_config wcl_cfg = {
.err_addr_to_imc_addr = adl_err_addr_to_imc_addr,
};
+static struct res_config nvl_h_cfg = {
+ .machine_check = true,
+ .num_imc = 2,
+ .reg_mchbar_mask = GENMASK_ULL(41, 17),
+ .reg_tom_mask = GENMASK_ULL(41, 20),
+ .reg_touud_mask = GENMASK_ULL(41, 20),
+ .reg_eccerrlog_addr_mask = GENMASK_ULL(38, 5),
+ .reg_mem_config_offset = 0x12904,
+ .reg_mem_config_ddr_type_mask = GENMASK(8, 6),
+ .reg_mem_config_ibecc_en_mask = GENMASK(3, 2),
+ .reg_mad_inter_size_mask[0] = GENMASK(15, 8),
+ .reg_mad_inter_size_mask[1] = GENMASK(23, 16),
+ .reg_mad_inter_size_granularity = BIT_ULL(29),
+ .reg_mad_intra_rank_mask[0] = BIT(7),
+ .reg_mad_intra_rank_mask[1] = BIT(15),
+ .reg_mad_intra_width_mask[0] = BIT(6),
+ .reg_mad_intra_width_mask[1] = BIT(14),
+ .reg_mad_intra_density_mask[0] = GENMASK(3, 0),
+ .reg_mad_intra_density_mask[1] = GENMASK(11, 8),
+ .imc_base = 0xd800,
+ .ibecc_base = 0xd400,
+ .ibecc_error_log_offset = 0x170,
+ .get_mem_type = ptl_h_get_mem_type,
+ .get_dev_type = ptl_h_get_dev_type,
+ .set_chan_params = ptl_h_set_chan_params,
+ .set_dimm_params = ptl_h_set_dimm_params,
+ .ibecc_available = generic_ibecc_available,
+ .err_addr_to_sys_addr = adl_err_addr_to_sys_addr,
+ .err_addr_to_imc_addr = adl_err_addr_to_imc_addr,
+};
+
static struct pci_device_id igen6_pci_tbl[] = {
{ PCI_VDEVICE(INTEL, DID_EHL_SKU5), (kernel_ulong_t)&ehl_cfg },
{ PCI_VDEVICE(INTEL, DID_EHL_SKU6), (kernel_ulong_t)&ehl_cfg },
@@ -865,6 +907,10 @@ static struct pci_device_id igen6_pci_tbl[] = {
{ PCI_VDEVICE(INTEL, DID_PTL_H_SKU13), (kernel_ulong_t)&ptl_h_cfg },
{ PCI_VDEVICE(INTEL, DID_PTL_H_SKU14), (kernel_ulong_t)&ptl_h_cfg },
{ PCI_VDEVICE(INTEL, DID_WCL_SKU1), (kernel_ulong_t)&wcl_cfg },
+ { PCI_VDEVICE(INTEL, DID_NVL_H_SKU1), (kernel_ulong_t)&nvl_h_cfg },
+ { PCI_VDEVICE(INTEL, DID_NVL_H_SKU2), (kernel_ulong_t)&nvl_h_cfg },
+ { PCI_VDEVICE(INTEL, DID_NVL_H_SKU3), (kernel_ulong_t)&nvl_h_cfg },
+ { PCI_VDEVICE(INTEL, DID_NVL_H_SKU4), (kernel_ulong_t)&nvl_h_cfg },
{ },
};
MODULE_DEVICE_TABLE(pci, igen6_pci_tbl);
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 0/2] EDAC: Add Intel Nova Lake-H SoC support
2026-05-21 12:38 [PATCH 0/2] EDAC: Add Intel Nova Lake-H SoC support Qiuxu Zhuo
2026-05-21 12:38 ` [PATCH 1/2] EDAC/igen6: Make registers for detecting IBECC configurable Qiuxu Zhuo
2026-05-21 12:38 ` [PATCH 2/2] EDAC/igen6: Add Intel Nova Lake-H SoC support Qiuxu Zhuo
@ 2026-05-27 16:17 ` Luck, Tony
2 siblings, 0 replies; 4+ messages in thread
From: Luck, Tony @ 2026-05-27 16:17 UTC (permalink / raw)
To: Qiuxu Zhuo; +Cc: Borislav Petkov, Jie Wang, linux-edac, linux-kernel
On Thu, May 21, 2026 at 08:38:10PM +0800, Qiuxu Zhuo wrote:
> Intel Nova Lake-H uses different IBECC detection registers than
> existing igen6 platforms. Make register detection configurable to
> handle platform differences cleanly, then add Nova Lake-H support.
>
> The patch set consists of:
>
> Patch 1: Make the IBECC detection register configurable.
>
> Patch 2: Add Intel Nova Lake-H SoC support.
>
Applied for 7.2 merge window. Thanks.
-Tony
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-05-27 16:17 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-21 12:38 [PATCH 0/2] EDAC: Add Intel Nova Lake-H SoC support Qiuxu Zhuo
2026-05-21 12:38 ` [PATCH 1/2] EDAC/igen6: Make registers for detecting IBECC configurable Qiuxu Zhuo
2026-05-21 12:38 ` [PATCH 2/2] EDAC/igen6: Add Intel Nova Lake-H SoC support Qiuxu Zhuo
2026-05-27 16:17 ` [PATCH 0/2] EDAC: " Luck, Tony
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox