a6d7b5
From: Prarit Bhargava <prarit@redhat.com>
a6d7b5
a6d7b5
Subject: mcelog: Add decoding for Optane DC persistent memory mode
a6d7b5
a6d7b5
commit d1f37aae14d476af6260af01904aed0f2e942542
a6d7b5
Author: Tony Luck <tony.luck@intel.com>
a6d7b5
Date:   Tue Feb 5 10:10:38 2019 -0800
a6d7b5
a6d7b5
    mcelog: Add decoding for Optane DC persistent memory mode
a6d7b5
    
a6d7b5
    Recognise the new MCACOD for errors in DDR memory in use as a cache
a6d7b5
    for Optane DC persistent memory.
a6d7b5
    
a6d7b5
    In binary the new code looks similar to the old memory controller
a6d7b5
    compound error code. The only difference is that bit 9 is set in
a6d7b5
    addition to bit 7:
a6d7b5
    
a6d7b5
            000F 0010 1MMM CCCC
a6d7b5
    
a6d7b5
    Signed-off-by: Tony Luck <tony.luck@intel.com>
a6d7b5
    Signed-off-by: Andi Kleen <ak@linux.intel.com>
a6d7b5
a6d7b5
diff --git a/p4.c b/p4.c
a6d7b5
index adb4c5eab976edf2c99efddd65e6abfcfeb97da2..8e1ec2fe435f0883c5146fa55e8e703713236d0a 100644
a6d7b5
--- a/p4.c
a6d7b5
+++ b/p4.c
a6d7b5
@@ -199,6 +199,9 @@ static int decode_mca(u64 status, u64 misc, u64 track, int cpu, int *ismemerr, i
a6d7b5
 					      CACHE_RRRR_SHIFT));
a6d7b5
 		if (track == 2)
a6d7b5
 			run_yellow_trigger(cpu, typenum, levelnum, type, level,socket);
a6d7b5
+	} else if (test_prefix(9, mca) && EXTRACT(mca, 7, 8) == 1) {
a6d7b5
+		Wprintf("Memory as cache: ");
a6d7b5
+		decode_memory_controller(mca, bank);
a6d7b5
 	} else if (test_prefix(10, mca)) {
a6d7b5
 		if (mca == 0x400)
a6d7b5
 			Wprintf("Internal Timer error\n");