]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
EDAC/i10nm: Add driver decoder for Granite Rapids server
authorQiuxu Zhuo <qiuxu.zhuo@intel.com>
Wed, 18 Mar 2026 02:31:18 +0000 (10:31 +0800)
committerTony Luck <tony.luck@intel.com>
Wed, 18 Mar 2026 16:38:20 +0000 (09:38 -0700)
Current i10nm_edac only supports the firmware decoder (ACPI DSM methods)
for Granite Rapids servers. Add the driver decoder, which directly extracts
topology information from the IMC machine check bank IA32_MCi_MISC MSRs, to
improve decoding performance for Granite Rapids.

[Tony: Updated commit comment]

Signed-off-by: Qiuxu Zhuo <qiuxu.zhuo@intel.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Tested-by: Shawn Fan <shawn.fan@intel.com>
Link: https://patch.msgid.link/20260318023118.2704139-1-qiuxu.zhuo@intel.com
drivers/edac/i10nm_base.c

index 89b3e8cc38b1a14e013ef902a4384d82b17270a6..6f61b761423076c05cc1266b2f06a3d722eecadc 100644 (file)
@@ -580,6 +580,10 @@ static bool i10nm_mc_decode_available(struct mce *mce)
                if (bank < 13 || bank > 20)
                        return false;
                break;
+       case GNR:
+               if (bank < 13 || bank > 24)
+                       return false;
+               break;
        default:
                return false;
        }
@@ -637,6 +641,16 @@ static bool i10nm_mc_decode(struct decoded_addr *res)
                res->rank         = GET_BITFIELD(m->misc, 57, 57);
                res->dimm         = GET_BITFIELD(m->misc, 58, 58);
                break;
+       case GNR:
+               res->imc          = m->bank - 13;
+               res->channel      = 0;
+               res->column       = GET_BITFIELD(m->misc, 9, 18) << 2;
+               res->row          = GET_BITFIELD(m->misc, 19, 36);
+               res->bank_group   = GET_BITFIELD(m->misc, 39, 41);
+               res->bank_address = GET_BITFIELD(m->misc, 37, 38);
+               res->rank         = GET_BITFIELD(m->misc, 55, 56);
+               res->dimm         = GET_BITFIELD(m->misc, 57, 57);
+               break;
        default:
                return false;
        }