|
@@ -50,3 +50,148 @@ titan_parse_c_misc(u64 c_misc, int print)
|
|
|
case 3: /* CPU 3 */
|
|
|
src = "CPU";
|
|
|
/* num is already the CPU number */
|
|
|
+ break;
|
|
|
+ case 4: /* Pchip 0 */
|
|
|
+ case 5: /* Pchip 1 */
|
|
|
+ src = "Pchip";
|
|
|
+ nxs -= 4;
|
|
|
+ break;
|
|
|
+ default:/* reserved */
|
|
|
+ src = "Unknown, NXS =";
|
|
|
+ /* leave num untouched */
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ printk("%s Non-existent memory access from: %s %d\n",
|
|
|
+ err_print_prefix, src, nxs);
|
|
|
+#endif /* CONFIG_VERBOSE_MCHECK */
|
|
|
+
|
|
|
+ return status;
|
|
|
+}
|
|
|
+
|
|
|
+static int
|
|
|
+titan_parse_p_serror(int which, u64 serror, int print)
|
|
|
+{
|
|
|
+ int status = MCHK_DISPOSITION_REPORT;
|
|
|
+
|
|
|
+#ifdef CONFIG_VERBOSE_MCHECK
|
|
|
+ static const char * const serror_src[] = {
|
|
|
+ "GPCI", "APCI", "AGP HP", "AGP LP"
|
|
|
+ };
|
|
|
+ static const char * const serror_cmd[] = {
|
|
|
+ "DMA Read", "DMA RMW", "SGTE Read", "Reserved"
|
|
|
+ };
|
|
|
+#endif /* CONFIG_VERBOSE_MCHECK */
|
|
|
+
|
|
|
+#define TITAN__PCHIP_SERROR__LOST_UECC (1UL << 0)
|
|
|
+#define TITAN__PCHIP_SERROR__UECC (1UL << 1)
|
|
|
+#define TITAN__PCHIP_SERROR__CRE (1UL << 2)
|
|
|
+#define TITAN__PCHIP_SERROR__NXIO (1UL << 3)
|
|
|
+#define TITAN__PCHIP_SERROR__LOST_CRE (1UL << 4)
|
|
|
+#define TITAN__PCHIP_SERROR__ECCMASK (TITAN__PCHIP_SERROR__UECC | \
|
|
|
+ TITAN__PCHIP_SERROR__CRE)
|
|
|
+#define TITAN__PCHIP_SERROR__ERRMASK (TITAN__PCHIP_SERROR__LOST_UECC | \
|
|
|
+ TITAN__PCHIP_SERROR__UECC | \
|
|
|
+ TITAN__PCHIP_SERROR__CRE | \
|
|
|
+ TITAN__PCHIP_SERROR__NXIO | \
|
|
|
+ TITAN__PCHIP_SERROR__LOST_CRE)
|
|
|
+#define TITAN__PCHIP_SERROR__SRC__S (52)
|
|
|
+#define TITAN__PCHIP_SERROR__SRC__M (0x3)
|
|
|
+#define TITAN__PCHIP_SERROR__CMD__S (54)
|
|
|
+#define TITAN__PCHIP_SERROR__CMD__M (0x3)
|
|
|
+#define TITAN__PCHIP_SERROR__SYN__S (56)
|
|
|
+#define TITAN__PCHIP_SERROR__SYN__M (0xff)
|
|
|
+#define TITAN__PCHIP_SERROR__ADDR__S (15)
|
|
|
+#define TITAN__PCHIP_SERROR__ADDR__M (0xffffffffUL)
|
|
|
+
|
|
|
+ if (!(serror & TITAN__PCHIP_SERROR__ERRMASK))
|
|
|
+ return MCHK_DISPOSITION_UNKNOWN_ERROR;
|
|
|
+
|
|
|
+#ifdef CONFIG_VERBOSE_MCHECK
|
|
|
+ if (!print)
|
|
|
+ return status;
|
|
|
+
|
|
|
+ printk("%s PChip %d SERROR: %016llx\n",
|
|
|
+ err_print_prefix, which, serror);
|
|
|
+ if (serror & TITAN__PCHIP_SERROR__ECCMASK) {
|
|
|
+ printk("%s %sorrectable ECC Error:\n"
|
|
|
+ " Source: %-6s Command: %-8s Syndrome: 0x%08x\n"
|
|
|
+ " Address: 0x%llx\n",
|
|
|
+ err_print_prefix,
|
|
|
+ (serror & TITAN__PCHIP_SERROR__UECC) ? "Unc" : "C",
|
|
|
+ serror_src[EXTRACT(serror, TITAN__PCHIP_SERROR__SRC)],
|
|
|
+ serror_cmd[EXTRACT(serror, TITAN__PCHIP_SERROR__CMD)],
|
|
|
+ (unsigned)EXTRACT(serror, TITAN__PCHIP_SERROR__SYN),
|
|
|
+ EXTRACT(serror, TITAN__PCHIP_SERROR__ADDR));
|
|
|
+ }
|
|
|
+ if (serror & TITAN__PCHIP_SERROR__NXIO)
|
|
|
+ printk("%s Non Existent I/O Error\n", err_print_prefix);
|
|
|
+ if (serror & TITAN__PCHIP_SERROR__LOST_UECC)
|
|
|
+ printk("%s Lost Uncorrectable ECC Error\n",
|
|
|
+ err_print_prefix);
|
|
|
+ if (serror & TITAN__PCHIP_SERROR__LOST_CRE)
|
|
|
+ printk("%s Lost Correctable ECC Error\n", err_print_prefix);
|
|
|
+#endif /* CONFIG_VERBOSE_MCHECK */
|
|
|
+
|
|
|
+ return status;
|
|
|
+}
|
|
|
+
|
|
|
+static int
|
|
|
+titan_parse_p_perror(int which, int port, u64 perror, int print)
|
|
|
+{
|
|
|
+ int cmd;
|
|
|
+ unsigned long addr;
|
|
|
+ int status = MCHK_DISPOSITION_REPORT;
|
|
|
+
|
|
|
+#ifdef CONFIG_VERBOSE_MCHECK
|
|
|
+ static const char * const perror_cmd[] = {
|
|
|
+ "Interrupt Acknowledge", "Special Cycle",
|
|
|
+ "I/O Read", "I/O Write",
|
|
|
+ "Reserved", "Reserved",
|
|
|
+ "Memory Read", "Memory Write",
|
|
|
+ "Reserved", "Reserved",
|
|
|
+ "Configuration Read", "Configuration Write",
|
|
|
+ "Memory Read Multiple", "Dual Address Cycle",
|
|
|
+ "Memory Read Line", "Memory Write and Invalidate"
|
|
|
+ };
|
|
|
+#endif /* CONFIG_VERBOSE_MCHECK */
|
|
|
+
|
|
|
+#define TITAN__PCHIP_PERROR__LOST (1UL << 0)
|
|
|
+#define TITAN__PCHIP_PERROR__SERR (1UL << 1)
|
|
|
+#define TITAN__PCHIP_PERROR__PERR (1UL << 2)
|
|
|
+#define TITAN__PCHIP_PERROR__DCRTO (1UL << 3)
|
|
|
+#define TITAN__PCHIP_PERROR__SGE (1UL << 4)
|
|
|
+#define TITAN__PCHIP_PERROR__APE (1UL << 5)
|
|
|
+#define TITAN__PCHIP_PERROR__TA (1UL << 6)
|
|
|
+#define TITAN__PCHIP_PERROR__DPE (1UL << 7)
|
|
|
+#define TITAN__PCHIP_PERROR__NDS (1UL << 8)
|
|
|
+#define TITAN__PCHIP_PERROR__IPTPR (1UL << 9)
|
|
|
+#define TITAN__PCHIP_PERROR__IPTPW (1UL << 10)
|
|
|
+#define TITAN__PCHIP_PERROR__ERRMASK (TITAN__PCHIP_PERROR__LOST | \
|
|
|
+ TITAN__PCHIP_PERROR__SERR | \
|
|
|
+ TITAN__PCHIP_PERROR__PERR | \
|
|
|
+ TITAN__PCHIP_PERROR__DCRTO | \
|
|
|
+ TITAN__PCHIP_PERROR__SGE | \
|
|
|
+ TITAN__PCHIP_PERROR__APE | \
|
|
|
+ TITAN__PCHIP_PERROR__TA | \
|
|
|
+ TITAN__PCHIP_PERROR__DPE | \
|
|
|
+ TITAN__PCHIP_PERROR__NDS | \
|
|
|
+ TITAN__PCHIP_PERROR__IPTPR | \
|
|
|
+ TITAN__PCHIP_PERROR__IPTPW)
|
|
|
+#define TITAN__PCHIP_PERROR__DAC (1UL << 47)
|
|
|
+#define TITAN__PCHIP_PERROR__MWIN (1UL << 48)
|
|
|
+#define TITAN__PCHIP_PERROR__CMD__S (52)
|
|
|
+#define TITAN__PCHIP_PERROR__CMD__M (0x0f)
|
|
|
+#define TITAN__PCHIP_PERROR__ADDR__S (14)
|
|
|
+#define TITAN__PCHIP_PERROR__ADDR__M (0x1fffffffful)
|
|
|
+
|
|
|
+ if (!(perror & TITAN__PCHIP_PERROR__ERRMASK))
|
|
|
+ return MCHK_DISPOSITION_UNKNOWN_ERROR;
|
|
|
+
|
|
|
+ cmd = EXTRACT(perror, TITAN__PCHIP_PERROR__CMD);
|
|
|
+ addr = EXTRACT(perror, TITAN__PCHIP_PERROR__ADDR) << 2;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Initializing the BIOS on a video card on a bus without
|
|
|
+ * a south bridge (subtractive decode agent) can result in
|
|
|
+ * master aborts as the BIOS probes the capabilities of the
|