|
@@ -1106,3 +1106,107 @@ cia_decode_mchk(unsigned long la_ptr)
|
|
|
struct el_CIA_sysdata_mcheck *cia;
|
|
|
|
|
|
com = (void *)la_ptr;
|
|
|
+ cia = (void *)(la_ptr + com->sys_offset);
|
|
|
+
|
|
|
+ if ((cia->cia_err & CIA_ERR_VALID) == 0)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+#ifdef CONFIG_VERBOSE_MCHECK
|
|
|
+ if (!alpha_verbose_mcheck)
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ switch (ffs(cia->cia_err & 0xfff) - 1) {
|
|
|
+ case 0: /* CIA_ERR_COR_ERR */
|
|
|
+ cia_decode_ecc_error(cia, "Corrected ECC error");
|
|
|
+ break;
|
|
|
+ case 1: /* CIA_ERR_UN_COR_ERR */
|
|
|
+ cia_decode_ecc_error(cia, "Uncorrected ECC error");
|
|
|
+ break;
|
|
|
+ case 2: /* CIA_ERR_CPU_PE */
|
|
|
+ cia_decode_parity_error(cia);
|
|
|
+ break;
|
|
|
+ case 3: /* CIA_ERR_MEM_NEM */
|
|
|
+ cia_decode_mem_error(cia, "Access to nonexistent memory");
|
|
|
+ break;
|
|
|
+ case 4: /* CIA_ERR_PCI_SERR */
|
|
|
+ cia_decode_pci_error(cia, "PCI bus system error");
|
|
|
+ break;
|
|
|
+ case 5: /* CIA_ERR_PERR */
|
|
|
+ cia_decode_pci_error(cia, "PCI data parity error");
|
|
|
+ break;
|
|
|
+ case 6: /* CIA_ERR_PCI_ADDR_PE */
|
|
|
+ cia_decode_pci_error(cia, "PCI address parity error");
|
|
|
+ break;
|
|
|
+ case 7: /* CIA_ERR_RCVD_MAS_ABT */
|
|
|
+ cia_decode_pci_error(cia, "PCI master abort");
|
|
|
+ break;
|
|
|
+ case 8: /* CIA_ERR_RCVD_TAR_ABT */
|
|
|
+ cia_decode_pci_error(cia, "PCI target abort");
|
|
|
+ break;
|
|
|
+ case 9: /* CIA_ERR_PA_PTE_INV */
|
|
|
+ cia_decode_pci_error(cia, "PCI invalid PTE");
|
|
|
+ break;
|
|
|
+ case 10: /* CIA_ERR_FROM_WRT_ERR */
|
|
|
+ cia_decode_mem_error(cia, "Write to flash ROM attempted");
|
|
|
+ break;
|
|
|
+ case 11: /* CIA_ERR_IOA_TIMEOUT */
|
|
|
+ cia_decode_pci_error(cia, "I/O timeout");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (cia->cia_err & CIA_ERR_LOST_CORR_ERR)
|
|
|
+ printk(KERN_CRIT "CIA lost machine check: "
|
|
|
+ "Correctable ECC error\n");
|
|
|
+ if (cia->cia_err & CIA_ERR_LOST_UN_CORR_ERR)
|
|
|
+ printk(KERN_CRIT "CIA lost machine check: "
|
|
|
+ "Uncorrectable ECC error\n");
|
|
|
+ if (cia->cia_err & CIA_ERR_LOST_CPU_PE)
|
|
|
+ printk(KERN_CRIT "CIA lost machine check: "
|
|
|
+ "System bus parity error\n");
|
|
|
+ if (cia->cia_err & CIA_ERR_LOST_MEM_NEM)
|
|
|
+ printk(KERN_CRIT "CIA lost machine check: "
|
|
|
+ "Access to nonexistent memory\n");
|
|
|
+ if (cia->cia_err & CIA_ERR_LOST_PERR)
|
|
|
+ printk(KERN_CRIT "CIA lost machine check: "
|
|
|
+ "PCI data parity error\n");
|
|
|
+ if (cia->cia_err & CIA_ERR_LOST_PCI_ADDR_PE)
|
|
|
+ printk(KERN_CRIT "CIA lost machine check: "
|
|
|
+ "PCI address parity error\n");
|
|
|
+ if (cia->cia_err & CIA_ERR_LOST_RCVD_MAS_ABT)
|
|
|
+ printk(KERN_CRIT "CIA lost machine check: "
|
|
|
+ "PCI master abort\n");
|
|
|
+ if (cia->cia_err & CIA_ERR_LOST_RCVD_TAR_ABT)
|
|
|
+ printk(KERN_CRIT "CIA lost machine check: "
|
|
|
+ "PCI target abort\n");
|
|
|
+ if (cia->cia_err & CIA_ERR_LOST_PA_PTE_INV)
|
|
|
+ printk(KERN_CRIT "CIA lost machine check: "
|
|
|
+ "PCI invalid PTE\n");
|
|
|
+ if (cia->cia_err & CIA_ERR_LOST_FROM_WRT_ERR)
|
|
|
+ printk(KERN_CRIT "CIA lost machine check: "
|
|
|
+ "Write to flash ROM attempted\n");
|
|
|
+ if (cia->cia_err & CIA_ERR_LOST_IOA_TIMEOUT)
|
|
|
+ printk(KERN_CRIT "CIA lost machine check: "
|
|
|
+ "I/O timeout\n");
|
|
|
+#endif /* CONFIG_VERBOSE_MCHECK */
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+void
|
|
|
+cia_machine_check(unsigned long vector, unsigned long la_ptr)
|
|
|
+{
|
|
|
+ int expected;
|
|
|
+
|
|
|
+ /* Clear the error before any reporting. */
|
|
|
+ mb();
|
|
|
+ mb(); /* magic */
|
|
|
+ draina();
|
|
|
+ cia_pci_clr_err();
|
|
|
+ wrmces(rdmces()); /* reset machine check pending flag. */
|
|
|
+ mb();
|
|
|
+
|
|
|
+ expected = mcheck_expected(0);
|
|
|
+ if (!expected && vector == 0x660)
|
|
|
+ expected = cia_decode_mchk(la_ptr);
|
|
|
+ process_mcheck_info(vector, la_ptr, "CIA", expected);
|
|
|
+}
|