aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Getz <rgetz@blackfin.uclinux.org>2008-10-09 05:06:32 -0400
committerBryan Wu <cooloney@kernel.org>2008-10-09 05:06:32 -0400
commit1d5ff7e27d2ca30cd3f61afd353b03dd67330818 (patch)
treeceadc8dd11d69c438eca73285c1d8faab7b58977
parent55f2feae3a1e075d9b4b0e73a6024f3e25717878 (diff)
Blackfin arch: Fix bug - HW Errors never recover on BF548
The kernel does not properly clear the EBIU Error Master (EBIU_ERRMST) Register on BF548, which causes the kernel to panic. We need to make sure that we clear the EBIU_ERRMST (necessary on BF54x) Signed-off-by: Robin Getz <rgetz@blackfin.uclinux.org> Signed-off-by: Bryan Wu <cooloney@kernel.org>
-rw-r--r--arch/blackfin/kernel/traps.c15
-rw-r--r--arch/blackfin/mach-common/interrupt.S9
2 files changed, 22 insertions, 2 deletions
diff --git a/arch/blackfin/kernel/traps.c b/arch/blackfin/kernel/traps.c
index 1a3c4daf557a..709c247b7016 100644
--- a/arch/blackfin/kernel/traps.c
+++ b/arch/blackfin/kernel/traps.c
@@ -1025,8 +1025,19 @@ void show_regs(struct pt_regs *fp)
1025 printk(KERN_NOTICE "\n" KERN_NOTICE "SEQUENCER STATUS:\t\t%s\n", print_tainted()); 1025 printk(KERN_NOTICE "\n" KERN_NOTICE "SEQUENCER STATUS:\t\t%s\n", print_tainted());
1026 printk(KERN_NOTICE " SEQSTAT: %08lx IPEND: %04lx SYSCFG: %04lx\n", 1026 printk(KERN_NOTICE " SEQSTAT: %08lx IPEND: %04lx SYSCFG: %04lx\n",
1027 (long)fp->seqstat, fp->ipend, fp->syscfg); 1027 (long)fp->seqstat, fp->ipend, fp->syscfg);
1028 printk(KERN_NOTICE " HWERRCAUSE: 0x%lx\n", 1028 if ((fp->seqstat & SEQSTAT_EXCAUSE) == VEC_HWERR) {
1029 (fp->seqstat & SEQSTAT_HWERRCAUSE) >> 14); 1029 printk(KERN_NOTICE " HWERRCAUSE: 0x%lx\n",
1030 (fp->seqstat & SEQSTAT_HWERRCAUSE) >> 14);
1031#ifdef EBIU_ERRMST
1032 /* If the error was from the EBIU, print it out */
1033 if (bfin_read_EBIU_ERRMST() & CORE_ERROR) {
1034 printk(KERN_NOTICE " EBIU Error Reason : 0x%04x\n",
1035 bfin_read_EBIU_ERRMST());
1036 printk(KERN_NOTICE " EBIU Error Address : 0x%08x\n",
1037 bfin_read_EBIU_ERRADD());
1038 }
1039#endif
1040 }
1030 printk(KERN_NOTICE " EXCAUSE : 0x%lx\n", 1041 printk(KERN_NOTICE " EXCAUSE : 0x%lx\n",
1031 fp->seqstat & SEQSTAT_EXCAUSE); 1042 fp->seqstat & SEQSTAT_EXCAUSE);
1032 for (i = 6; i <= 15 ; i++) { 1043 for (i = 6; i <= 15 ; i++) {
diff --git a/arch/blackfin/mach-common/interrupt.S b/arch/blackfin/mach-common/interrupt.S
index 647f0f522910..4a2ec7a9675a 100644
--- a/arch/blackfin/mach-common/interrupt.S
+++ b/arch/blackfin/mach-common/interrupt.S
@@ -179,7 +179,16 @@ ENTRY(_evt_ivhw)
179 call _trap_c; 179 call _trap_c;
180 SP += 12; 180 SP += 12;
181 181
182#ifdef EBIU_ERRMST
183 /* make sure EBIU_ERRMST is clear */
184 p0.l = LO(EBIU_ERRMST);
185 p0.h = HI(EBIU_ERRMST);
186 r0.l = (CORE_ERROR | CORE_MERROR);
187 w[p0] = r0.l;
188#endif
189
182 call _ret_from_exception; 190 call _ret_from_exception;
191
183.Lcommon_restore_all_sys: 192.Lcommon_restore_all_sys:
184 RESTORE_ALL_SYS 193 RESTORE_ALL_SYS
185 rti; 194 rti;