mirror of
https://git.freebsd.org/ports.git
synced 2025-06-07 22:00:31 -04:00
- Fix memory controller bank channel mappings for Skylake - Add decoding for Optane DC persistent memory mode
81 lines
2.9 KiB
C
81 lines
2.9 KiB
C
--- p4.c.orig 2019-02-05 19:57:07 UTC
|
|
+++ p4.c
|
|
@@ -177,8 +177,10 @@ static int decode_mca(u64 status, u64 misc, u64 track,
|
|
levelnum = mca & 3;
|
|
level = get_LL_str(levelnum);
|
|
Wprintf("%s Generic cache hierarchy error\n", level);
|
|
+#ifdef __Linux__
|
|
if (track == 2)
|
|
run_yellow_trigger(cpu, -1, levelnum, "unknown", level, socket);
|
|
+#endif
|
|
} else if (test_prefix(4, mca)) {
|
|
unsigned levelnum, typenum;
|
|
char *level, *type;
|
|
@@ -187,8 +189,10 @@ static int decode_mca(u64 status, u64 misc, u64 track,
|
|
levelnum = (mca & TLB_LL_MASK) >> TLB_LL_SHIFT;
|
|
level = get_LL_str(levelnum);
|
|
Wprintf("%s TLB %s Error\n", type, level);
|
|
+#ifdef __Linux__
|
|
if (track == 2)
|
|
run_yellow_trigger(cpu, typenum, levelnum, type, level, socket);
|
|
+#endif
|
|
} else if (test_prefix(8, mca)) {
|
|
unsigned typenum = (mca & CACHE_TT_MASK) >> CACHE_TT_SHIFT;
|
|
unsigned levelnum = (mca & CACHE_LL_MASK) >> CACHE_LL_SHIFT;
|
|
@@ -197,8 +201,10 @@ static int decode_mca(u64 status, u64 misc, u64 track,
|
|
Wprintf("%s CACHE %s %s Error\n", type, level,
|
|
get_RRRR_str((mca & CACHE_RRRR_MASK) >>
|
|
CACHE_RRRR_SHIFT));
|
|
+#ifdef __Linux__
|
|
if (track == 2)
|
|
run_yellow_trigger(cpu, typenum, levelnum, type, level,socket);
|
|
+#endif
|
|
} else if (test_prefix(9, mca) && EXTRACT(mca, 7, 8) == 1) {
|
|
Wprintf("Memory as cache: ");
|
|
decode_memory_controller(mca, bank);
|
|
@@ -220,7 +226,9 @@ static int decode_mca(u64 status, u64 misc, u64 track,
|
|
|
|
Wprintf("BUS error: %d %d %s %s %s %s %s\n", socket, cpu,
|
|
level, pp, rrrr, ii, timeout);
|
|
+#ifdef __Linux__
|
|
run_bus_trigger(socket, cpu, level, pp, rrrr, ii, timeout);
|
|
+#endif
|
|
/* IO MCA - reported as bus/interconnect with specific PP,T,RRRR,II,LL values
|
|
* and MISCV set. MISC register points to root port that reported the error
|
|
* need to cross check with AER logs for more details.
|
|
@@ -236,7 +244,9 @@ static int decode_mca(u64 status, u64 misc, u64 track,
|
|
fn = EXTRACT(misc, 16, 18);
|
|
Wprintf("IO MCA reported by root port %x:%02x:%02x.%x\n",
|
|
seg, bus, dev, fn);
|
|
+#ifdef __Linux__
|
|
run_iomca_trigger(socket, cpu, seg, bus, dev, fn);
|
|
+#endif
|
|
}
|
|
} else if (test_prefix(7, mca)) {
|
|
decode_memory_controller(mca, bank);
|
|
@@ -386,19 +396,25 @@ static void decode_thermal(struct mce *log, int cpu)
|
|
|
|
void decode_intel_mc(struct mce *log, int cputype, int *ismemerr, unsigned size)
|
|
{
|
|
+#ifdef __Linux__
|
|
int socket = size > offsetof(struct mce, socketid) ? (int)log->socketid : -1;
|
|
+#endif
|
|
int cpu = log->extcpu ? log->extcpu : log->cpu;
|
|
|
|
if (log->bank == MCE_THERMAL_BANK) {
|
|
decode_thermal(log, cpu);
|
|
+#ifdef __Linux__
|
|
run_unknown_trigger(socket, cpu, log);
|
|
+#endif
|
|
return;
|
|
}
|
|
|
|
decode_mcg(log->mcgstatus);
|
|
+#ifdef __Linux__
|
|
if (decode_mci(log->status, log->misc, cpu, log->mcgcap, ismemerr,
|
|
socket, log->bank))
|
|
run_unknown_trigger(socket, cpu, log);
|
|
+#endif
|
|
|
|
if (test_prefix(11, (log->status & 0xffffL))) {
|
|
switch (cputype) {
|