Skip to content

Commit cfa3e9a

Browse files
qzhuo2shiqingd
authored andcommitted
EDAC/igen6: Add several Intel Raptor Lake-P SoCs support
Mainline: commit d23627a("EDAC/igen6: Add Intel Raptor Lake-P SoCs support") from: v6.8-rc1 Add several Intel Raptor Lake-P SoC compute die IDs for EDAC support. These Raptor Lake-P SoCs use similar memory controller and IBECC as Alder Lake-P SoC but extend the most significant bit of error address logged in IBECC from bit 38 to bit 45. Intel-SIG: Upstream commit d23627a ("EDAC/igen6: Add Intel Raptor Lake-P SoCs support"). upstream link: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d23627a7688f&dt=2 Signed-off-by: Qiuxu Zhuo <[email protected]> Signed-off-by: Tony Luck <[email protected]> [ Qingdong Shi: amend commit log ] Signed-off-by: Qingdong Shi <[email protected]>
1 parent 8f077b8 commit cfa3e9a

File tree

1 file changed

+37
-2
lines changed

1 file changed

+37
-2
lines changed

drivers/edac/igen6_edac.c

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
#define ECC_ERROR_LOG_UE BIT_ULL(63)
8282
#define ECC_ERROR_LOG_ADDR_SHIFT 5
8383
#define ECC_ERROR_LOG_ADDR(v) GET_BITFIELD(v, 5, 38)
84+
#define ECC_ERROR_LOG_ADDR45(v) GET_BITFIELD(v, 5, 45)
8485
#define ECC_ERROR_LOG_SYND(v) GET_BITFIELD(v, 46, 61)
8586

8687
/* Host MMIO base address */
@@ -134,6 +135,8 @@ static struct res_config {
134135
u32 ibecc_base;
135136
u32 ibecc_error_log_offset;
136137
bool (*ibecc_available)(struct pci_dev *pdev);
138+
/* Extract error address logged in IBECC */
139+
u64 (*err_addr)(u64 ecclog);
137140
/* Convert error address logged in IBECC to system physical address */
138141
u64 (*err_addr_to_sys_addr)(u64 eaddr, int mc);
139142
/* Convert error address logged in IBECC to integrated memory controller address */
@@ -236,6 +239,13 @@ static struct work_struct ecclog_work;
236239
#define DID_ADL_N_SKU10 0x4679
237240
#define DID_ADL_N_SKU11 0x467c
238241

242+
/* Compute die IDs for Raptor Lake-P with IBECC */
243+
#define DID_RPL_P_SKU1 0xa706
244+
#define DID_RPL_P_SKU2 0xa707
245+
#define DID_RPL_P_SKU3 0xa708
246+
#define DID_RPL_P_SKU4 0xa716
247+
#define DID_RPL_P_SKU5 0xa718
248+
239249
static bool ehl_ibecc_available(struct pci_dev *pdev)
240250
{
241251
u32 v;
@@ -372,6 +382,11 @@ static u64 adl_err_addr_to_imc_addr(u64 eaddr, int mc)
372382
return imc_addr;
373383
}
374384

385+
static u64 rpl_p_err_addr(u64 ecclog)
386+
{
387+
return ECC_ERROR_LOG_ADDR45(ecclog);
388+
}
389+
375390
static struct res_config ehl_cfg = {
376391
.num_imc = 1,
377392
.imc_base = 0x5000,
@@ -428,6 +443,18 @@ static struct res_config adl_n_cfg = {
428443
.err_addr_to_imc_addr = adl_err_addr_to_imc_addr,
429444
};
430445

446+
static struct res_config rpl_p_cfg = {
447+
.machine_check = true,
448+
.num_imc = 2,
449+
.imc_base = 0xd800,
450+
.ibecc_base = 0xd400,
451+
.ibecc_error_log_offset = 0x68,
452+
.ibecc_available = tgl_ibecc_available,
453+
.err_addr = rpl_p_err_addr,
454+
.err_addr_to_sys_addr = adl_err_addr_to_sys_addr,
455+
.err_addr_to_imc_addr = adl_err_addr_to_imc_addr,
456+
};
457+
431458
static const struct pci_device_id igen6_pci_tbl[] = {
432459
{ PCI_VDEVICE(INTEL, DID_EHL_SKU5), (kernel_ulong_t)&ehl_cfg },
433460
{ PCI_VDEVICE(INTEL, DID_EHL_SKU6), (kernel_ulong_t)&ehl_cfg },
@@ -460,6 +487,11 @@ static const struct pci_device_id igen6_pci_tbl[] = {
460487
{ PCI_VDEVICE(INTEL, DID_ADL_N_SKU9), (kernel_ulong_t)&adl_n_cfg },
461488
{ PCI_VDEVICE(INTEL, DID_ADL_N_SKU10), (kernel_ulong_t)&adl_n_cfg },
462489
{ PCI_VDEVICE(INTEL, DID_ADL_N_SKU11), (kernel_ulong_t)&adl_n_cfg },
490+
{ PCI_VDEVICE(INTEL, DID_RPL_P_SKU1), (kernel_ulong_t)&rpl_p_cfg },
491+
{ PCI_VDEVICE(INTEL, DID_RPL_P_SKU2), (kernel_ulong_t)&rpl_p_cfg },
492+
{ PCI_VDEVICE(INTEL, DID_RPL_P_SKU3), (kernel_ulong_t)&rpl_p_cfg },
493+
{ PCI_VDEVICE(INTEL, DID_RPL_P_SKU4), (kernel_ulong_t)&rpl_p_cfg },
494+
{ PCI_VDEVICE(INTEL, DID_RPL_P_SKU5), (kernel_ulong_t)&rpl_p_cfg },
463495
{ },
464496
};
465497
MODULE_DEVICE_TABLE(pci, igen6_pci_tbl);
@@ -737,8 +769,11 @@ static void ecclog_work_cb(struct work_struct *work)
737769

738770
llist_for_each_entry_safe(node, tmp, head, llnode) {
739771
memset(&res, 0, sizeof(res));
740-
eaddr = ECC_ERROR_LOG_ADDR(node->ecclog) <<
741-
ECC_ERROR_LOG_ADDR_SHIFT;
772+
if (res_cfg->err_addr)
773+
eaddr = res_cfg->err_addr(node->ecclog);
774+
else
775+
eaddr = ECC_ERROR_LOG_ADDR(node->ecclog) <<
776+
ECC_ERROR_LOG_ADDR_SHIFT;
742777
res.mc = node->mc;
743778
res.sys_addr = res_cfg->err_addr_to_sys_addr(eaddr, res.mc);
744779
res.imc_addr = res_cfg->err_addr_to_imc_addr(eaddr, res.mc);

0 commit comments

Comments
 (0)