EDAC, skx_common: Add code to recognise new compound error code
authorTony Luck <tony.luck@intel.com>
Tue, 5 Feb 2019 18:21:09 +0000 (10:21 -0800)
committerBorislav Petkov <bp@suse.de>
Wed, 6 Feb 2019 10:03:06 +0000 (11:03 +0100)
A new error code for systems that use DRAM as an extra level of cache
looks like:

    000F 0010 1MMM CCCC

where the MMM and CCCC bits are used for the same purpose as the
original code. For this new class of errors the ADXL translation will
provide details of both the DIMM used as cache for the error location
and the component that is being cached.

Note: This new error code is first supported in Skylake. Older EDAC
drivers do not need to be updated.

Signed-off-by: Tony Luck <tony.luck@intel.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Cc: Aristeu Rozanski <aris@redhat.com>
Cc: James Morse <james.morse@arm.com>
Cc: Mauro Carvalho Chehab <mchehab@kernel.org>
Cc: Qiuxu Zhuo <qiuxu.zhuo@intel.com>
Cc: linux-edac <linux-edac@vger.kernel.org>
Link: https://lkml.kernel.org/r/20190205182109.27828-1-tony.luck@intel.com
drivers/edac/skx_common.c

index 513523ad5649c48f45f7da9843198002d6ad76dc..0e96e7b5b0a78748cb3899731370a1f0cc875112 100644 (file)
@@ -494,9 +494,11 @@ static void skx_mce_output_error(struct mem_ctl_info *mci,
        }
 
        /*
-        * According with Table 15-9 of the Intel Architecture spec vol 3A,
-        * memory errors should fit in this mask:
+        * According to Intel Architecture spec vol 3B,
+        * Table 15-10 "IA32_MCi_Status [15:0] Compound Error Code Encoding"
+        * memory errors should fit one of these masks:
         *      000f 0000 1mmm cccc (binary)
+        *      000f 0010 1mmm cccc (binary)    [RAM used as cache]
         * where:
         *      f = Correction Report Filtering Bit. If 1, subsequent errors
         *          won't be shown
@@ -504,7 +506,7 @@ static void skx_mce_output_error(struct mem_ctl_info *mci,
         *      cccc = channel
         * If the mask doesn't match, report an error to the parsing logic
         */
-       if (!((errcode & 0xef80) == 0x80)) {
+       if (!((errcode & 0xef80) == 0x80 || (errcode & 0xef80) == 0x280)) {
                optype = "Can't parse: it is not a mem";
        } else {
                switch (optypenum) {