|
@@ -1010,3 +1010,99 @@ cia_decode_mem_error(struct el_CIA_sysdata_mcheck *cia, const char *msg)
|
|
|
case 0x0B: set_select = "Set B selected"; break;
|
|
|
case 0x0C: set_select = "Set C selected"; break;
|
|
|
case 0x0D: set_select = "Set D selected"; break;
|
|
|
+ case 0x0E: set_select = "Set E selected"; break;
|
|
|
+ case 0x0F: set_select = "Set F selected"; break;
|
|
|
+ case 0x10: set_select = "No set selected"; break;
|
|
|
+ case 0x1F: set_select = "Refresh cycle"; break;
|
|
|
+ default: set_select = "Unknown"; break;
|
|
|
+ }
|
|
|
+
|
|
|
+ printk(KERN_CRIT " Memory port command: %s\n", mem_port_cmd);
|
|
|
+ printk(KERN_CRIT " Memory port address: %#010lx, mask: %#lx\n",
|
|
|
+ mem_port_addr, mem_port_mask);
|
|
|
+ printk(KERN_CRIT " Memory sequencer state: %s\n", seq_state);
|
|
|
+ printk(KERN_CRIT " Memory set: %s\n", set_select);
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+cia_decode_ecc_error(struct el_CIA_sysdata_mcheck *cia, const char *msg)
|
|
|
+{
|
|
|
+ long syn;
|
|
|
+ long i;
|
|
|
+ const char *fmt;
|
|
|
+
|
|
|
+ cia_decode_mem_error(cia, msg);
|
|
|
+
|
|
|
+ syn = cia->cia_syn & 0xff;
|
|
|
+ if (syn == (syn & -syn)) {
|
|
|
+ fmt = KERN_CRIT " ECC syndrome %#x -- check bit %d\n";
|
|
|
+ i = ffs(syn) - 1;
|
|
|
+ } else {
|
|
|
+ static unsigned char const data_bit[64] = {
|
|
|
+ 0xCE, 0xCB, 0xD3, 0xD5,
|
|
|
+ 0xD6, 0xD9, 0xDA, 0xDC,
|
|
|
+ 0x23, 0x25, 0x26, 0x29,
|
|
|
+ 0x2A, 0x2C, 0x31, 0x34,
|
|
|
+ 0x0E, 0x0B, 0x13, 0x15,
|
|
|
+ 0x16, 0x19, 0x1A, 0x1C,
|
|
|
+ 0xE3, 0xE5, 0xE6, 0xE9,
|
|
|
+ 0xEA, 0xEC, 0xF1, 0xF4,
|
|
|
+ 0x4F, 0x4A, 0x52, 0x54,
|
|
|
+ 0x57, 0x58, 0x5B, 0x5D,
|
|
|
+ 0xA2, 0xA4, 0xA7, 0xA8,
|
|
|
+ 0xAB, 0xAD, 0xB0, 0xB5,
|
|
|
+ 0x8F, 0x8A, 0x92, 0x94,
|
|
|
+ 0x97, 0x98, 0x9B, 0x9D,
|
|
|
+ 0x62, 0x64, 0x67, 0x68,
|
|
|
+ 0x6B, 0x6D, 0x70, 0x75
|
|
|
+ };
|
|
|
+
|
|
|
+ for (i = 0; i < 64; ++i)
|
|
|
+ if (data_bit[i] == syn)
|
|
|
+ break;
|
|
|
+
|
|
|
+ if (i < 64)
|
|
|
+ fmt = KERN_CRIT " ECC syndrome %#x -- data bit %d\n";
|
|
|
+ else
|
|
|
+ fmt = KERN_CRIT " ECC syndrome %#x -- unknown bit\n";
|
|
|
+ }
|
|
|
+
|
|
|
+ printk (fmt, syn, i);
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+cia_decode_parity_error(struct el_CIA_sysdata_mcheck *cia)
|
|
|
+{
|
|
|
+ static const char * const cmd_desc[16] = {
|
|
|
+ "NOP", "LOCK", "FETCH", "FETCH_M", "MEMORY BARRIER",
|
|
|
+ "SET DIRTY", "WRITE BLOCK", "WRITE BLOCK LOCK",
|
|
|
+ "READ MISS0", "READ MISS1", "READ MISS MOD0",
|
|
|
+ "READ MISS MOD1", "BCACHE VICTIM", "Spare",
|
|
|
+ "READ MISS MOD STC0", "READ MISS MOD STC1"
|
|
|
+ };
|
|
|
+
|
|
|
+ unsigned long addr;
|
|
|
+ unsigned long mask;
|
|
|
+ const char *cmd;
|
|
|
+ int par;
|
|
|
+
|
|
|
+ addr = cia->cpu_err0 & 0xfffffff0;
|
|
|
+ addr |= (cia->cpu_err1 & 0x83UL) << 32;
|
|
|
+ cmd = cmd_desc[(cia->cpu_err1 >> 8) & 0xF];
|
|
|
+ mask = (cia->cpu_err1 >> 12) & 0xF;
|
|
|
+ par = (cia->cpu_err1 >> 21) & 1;
|
|
|
+
|
|
|
+ printk(KERN_CRIT "CIA machine check: System bus parity error\n");
|
|
|
+ printk(KERN_CRIT " Command: %s, Parity bit: %d\n", cmd, par);
|
|
|
+ printk(KERN_CRIT " Address: %#010lx, Mask: %#lx\n", addr, mask);
|
|
|
+}
|
|
|
+#endif /* CONFIG_VERBOSE_MCHECK */
|
|
|
+
|
|
|
+
|
|
|
+static int
|
|
|
+cia_decode_mchk(unsigned long la_ptr)
|
|
|
+{
|
|
|
+ struct el_common *com;
|
|
|
+ struct el_CIA_sysdata_mcheck *cia;
|
|
|
+
|
|
|
+ com = (void *)la_ptr;
|