|
@@ -301,3 +301,72 @@ lca_init_arch(void)
|
|
/*
|
|
/*
|
|
* Finally, set up for restoring the correct HAE if using SRM.
|
|
* Finally, set up for restoring the correct HAE if using SRM.
|
|
* Again, since we cannot read many of the CSRs on the LCA,
|
|
* Again, since we cannot read many of the CSRs on the LCA,
|
|
|
|
+ * one of which happens to be the HAE, we save the value that
|
|
|
|
+ * the SRM will expect...
|
|
|
|
+ */
|
|
|
|
+ if (alpha_using_srm)
|
|
|
|
+ srm_hae = 0x80000000UL;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Constants used during machine-check handling. I suppose these
|
|
|
|
+ * could be moved into lca.h but I don't see much reason why anybody
|
|
|
|
+ * else would want to use them.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#define ESR_EAV (1UL<< 0) /* error address valid */
|
|
|
|
+#define ESR_CEE (1UL<< 1) /* correctable error */
|
|
|
|
+#define ESR_UEE (1UL<< 2) /* uncorrectable error */
|
|
|
|
+#define ESR_WRE (1UL<< 3) /* write-error */
|
|
|
|
+#define ESR_SOR (1UL<< 4) /* error source */
|
|
|
|
+#define ESR_CTE (1UL<< 7) /* cache-tag error */
|
|
|
|
+#define ESR_MSE (1UL<< 9) /* multiple soft errors */
|
|
|
|
+#define ESR_MHE (1UL<<10) /* multiple hard errors */
|
|
|
|
+#define ESR_NXM (1UL<<12) /* non-existent memory */
|
|
|
|
+
|
|
|
|
+#define IOC_ERR ( 1<<4) /* ioc logs an error */
|
|
|
|
+#define IOC_CMD_SHIFT 0
|
|
|
|
+#define IOC_CMD (0xf<<IOC_CMD_SHIFT)
|
|
|
|
+#define IOC_CODE_SHIFT 8
|
|
|
|
+#define IOC_CODE (0xf<<IOC_CODE_SHIFT)
|
|
|
|
+#define IOC_LOST ( 1<<5)
|
|
|
|
+#define IOC_P_NBR ((__u32) ~((1<<13) - 1))
|
|
|
|
+
|
|
|
|
+static void
|
|
|
|
+mem_error(unsigned long esr, unsigned long ear)
|
|
|
|
+{
|
|
|
|
+ printk(" %s %s error to %s occurred at address %x\n",
|
|
|
|
+ ((esr & ESR_CEE) ? "Correctable" :
|
|
|
|
+ (esr & ESR_UEE) ? "Uncorrectable" : "A"),
|
|
|
|
+ (esr & ESR_WRE) ? "write" : "read",
|
|
|
|
+ (esr & ESR_SOR) ? "memory" : "b-cache",
|
|
|
|
+ (unsigned) (ear & 0x1ffffff8));
|
|
|
|
+ if (esr & ESR_CTE) {
|
|
|
|
+ printk(" A b-cache tag parity error was detected.\n");
|
|
|
|
+ }
|
|
|
|
+ if (esr & ESR_MSE) {
|
|
|
|
+ printk(" Several other correctable errors occurred.\n");
|
|
|
|
+ }
|
|
|
|
+ if (esr & ESR_MHE) {
|
|
|
|
+ printk(" Several other uncorrectable errors occurred.\n");
|
|
|
|
+ }
|
|
|
|
+ if (esr & ESR_NXM) {
|
|
|
|
+ printk(" Attempted to access non-existent memory.\n");
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void
|
|
|
|
+ioc_error(__u32 stat0, __u32 stat1)
|
|
|
|
+{
|
|
|
|
+ static const char * const pci_cmd[] = {
|
|
|
|
+ "Interrupt Acknowledge", "Special", "I/O Read", "I/O Write",
|
|
|
|
+ "Rsvd 1", "Rsvd 2", "Memory Read", "Memory Write", "Rsvd3",
|
|
|
|
+ "Rsvd4", "Configuration Read", "Configuration Write",
|
|
|
|
+ "Memory Read Multiple", "Dual Address", "Memory Read Line",
|
|
|
|
+ "Memory Write and Invalidate"
|
|
|
|
+ };
|
|
|
|
+ static const char * const err_name[] = {
|
|
|
|
+ "exceeded retry limit", "no device", "bad data parity",
|
|
|
|
+ "target abort", "bad address parity", "page table read error",
|
|
|
|
+ "invalid page", "data error"
|
|
|
|
+ };
|