|
@@ -195,3 +195,63 @@ titan_parse_p_perror(int which, int port, u64 perror, int print)
|
|
|
* 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
|
|
|
+ * card. XFree86 does such initialization. If the error
|
|
|
+ * is a master abort (No DevSel as PCI Master) and the command
|
|
|
+ * is an I/O read or write below the address where we start
|
|
|
+ * assigning PCI I/O spaces (SRM uses 0x1000), then mark the
|
|
|
+ * error as dismissable so starting XFree86 doesn't result
|
|
|
+ * in a series of uncorrectable errors being reported. Also
|
|
|
+ * dismiss master aborts to VGA frame buffer space
|
|
|
+ * (0xA0000 - 0xC0000) and legacy BIOS space (0xC0000 - 0x100000)
|
|
|
+ * for the same reason.
|
|
|
+ *
|
|
|
+ * Also mark the error dismissible if it looks like the right
|
|
|
+ * error but only the Lost bit is set. Since the BIOS initialization
|
|
|
+ * can cause multiple master aborts and the error interrupt can
|
|
|
+ * be handled on a different CPU than the BIOS code is run on,
|
|
|
+ * it is possible for a second master abort to occur between the
|
|
|
+ * time the PALcode reads PERROR and the time it writes PERROR
|
|
|
+ * to acknowledge the error. If this timing happens, a second
|
|
|
+ * error will be signalled after the first, and if no additional
|
|
|
+ * errors occur, will look like a Lost error with no additional
|
|
|
+ * errors on the same transaction as the previous error.
|
|
|
+ */
|
|
|
+ if (((perror & TITAN__PCHIP_PERROR__NDS) ||
|
|
|
+ ((perror & TITAN__PCHIP_PERROR__ERRMASK) ==
|
|
|
+ TITAN__PCHIP_PERROR__LOST)) &&
|
|
|
+ ((((cmd & 0xE) == 2) && (addr < 0x1000)) ||
|
|
|
+ (((cmd & 0xE) == 6) && (addr >= 0xA0000) && (addr < 0x100000)))) {
|
|
|
+ status = MCHK_DISPOSITION_DISMISS;
|
|
|
+ }
|
|
|
+
|
|
|
+#ifdef CONFIG_VERBOSE_MCHECK
|
|
|
+ if (!print)
|
|
|
+ return status;
|
|
|
+
|
|
|
+ printk("%s PChip %d %cPERROR: %016llx\n",
|
|
|
+ err_print_prefix, which,
|
|
|
+ port ? 'A' : 'G', perror);
|
|
|
+ if (perror & TITAN__PCHIP_PERROR__IPTPW)
|
|
|
+ printk("%s Invalid Peer-to-Peer Write\n", err_print_prefix);
|
|
|
+ if (perror & TITAN__PCHIP_PERROR__IPTPR)
|
|
|
+ printk("%s Invalid Peer-to-Peer Read\n", err_print_prefix);
|
|
|
+ if (perror & TITAN__PCHIP_PERROR__NDS)
|
|
|
+ printk("%s No DEVSEL as PCI Master [Master Abort]\n",
|
|
|
+ err_print_prefix);
|
|
|
+ if (perror & TITAN__PCHIP_PERROR__DPE)
|
|
|
+ printk("%s Data Parity Error\n", err_print_prefix);
|
|
|
+ if (perror & TITAN__PCHIP_PERROR__TA)
|
|
|
+ printk("%s Target Abort\n", err_print_prefix);
|
|
|
+ if (perror & TITAN__PCHIP_PERROR__APE)
|
|
|
+ printk("%s Address Parity Error\n", err_print_prefix);
|
|
|
+ if (perror & TITAN__PCHIP_PERROR__SGE)
|
|
|
+ printk("%s Scatter-Gather Error, Invalid PTE\n",
|
|
|
+ err_print_prefix);
|
|
|
+ if (perror & TITAN__PCHIP_PERROR__DCRTO)
|
|
|
+ printk("%s Delayed-Completion Retry Timeout\n",
|
|
|
+ err_print_prefix);
|
|
|
+ if (perror & TITAN__PCHIP_PERROR__PERR)
|
|
|
+ printk("%s PERR Asserted\n", err_print_prefix);
|
|
|
+ if (perror & TITAN__PCHIP_PERROR__SERR)
|
|
|
+ printk("%s SERR Asserted\n", err_print_prefix);
|
|
|
+ if (perror & TITAN__PCHIP_PERROR__LOST)
|