summaryrefslogtreecommitdiffstats
path: root/target/linux/bcm53xx/patches-3.14/042-ARM-BCM5301X-workaround-suppress-fault.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm53xx/patches-3.14/042-ARM-BCM5301X-workaround-suppress-fault.patch')
-rw-r--r--target/linux/bcm53xx/patches-3.14/042-ARM-BCM5301X-workaround-suppress-fault.patch93
1 files changed, 93 insertions, 0 deletions
diff --git a/target/linux/bcm53xx/patches-3.14/042-ARM-BCM5301X-workaround-suppress-fault.patch b/target/linux/bcm53xx/patches-3.14/042-ARM-BCM5301X-workaround-suppress-fault.patch
new file mode 100644
index 0000000000..41a9dd1ac2
--- /dev/null
+++ b/target/linux/bcm53xx/patches-3.14/042-ARM-BCM5301X-workaround-suppress-fault.patch
@@ -0,0 +1,93 @@
+From fdf4850cb5b2e5e549a18b8b41abb001bfb19e9c Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
+Date: Tue, 4 Feb 2014 00:01:46 +0100
+Subject: [PATCH 3/3] ARM: BCM5301X: workaround suppress fault
+
+Without this patch I am getting a unhandled fault exception like this
+one after "Freeing unused kernel memory":
+
+Freeing unused kernel memory: 1260K (c02c1000 - c03fc000)
+Unhandled fault: imprecise external abort (0x1c06) at 0xb6f89005
+Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000007
+
+The address which is here 0xb6f89005 changes from boot to boot, with a
+new build the changes are bigger. With kernel 3.10 I have also seen
+this fault at different places in the boot process, but starting with
+3.11 they are always occurring after the "Freeing unused kernel memory"
+message. I never was able to completely boot to userspace without this
+handler. The abort code is constant 0x1c06. This fault just happens
+once in the boot process I have never seen it happing twice or more.
+
+I also tried changing the CPSR.A bit to 0 in init_early, with this code
+like Afzal suggested, but that did not change anything:
+asm volatile("mrs r12, cpsr\n"
+ "bic r12, r12, #0x00000100\n"
+ "msr cpsr_c, r12" ::: "r12", "cc", "memory");
+
+Disabling the L2 cache by building with CONFIG_CACHE_L2X0 unset did not
+help.
+
+This workaround was copied from the vendor code including most of the
+comments. It says it they think this is caused by the CFE boot loader
+used on this device. I do not have any access to any datasheet or
+errata document to check this.
+
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+Acked-by: Arnd Bergmann <arnd@arndb.de>
+Acked-by: Christian Daudt <bcm@fixthebug.org>
+Signed-off-by: Matt Porter <mporter@linaro.org>
+---
+ arch/arm/mach-bcm/bcm_5301x.c | 33 +++++++++++++++++++++++++++++++++
+ 1 file changed, 33 insertions(+)
+
+--- a/arch/arm/mach-bcm/bcm_5301x.c
++++ b/arch/arm/mach-bcm/bcm_5301x.c
+@@ -9,8 +9,40 @@
+ #include <asm/hardware/cache-l2x0.h>
+
+ #include <asm/mach/arch.h>
++#include <asm/siginfo.h>
++#include <asm/signal.h>
+
+
++static bool first_fault = true;
++
++static int bcm5301x_abort_handler(unsigned long addr, unsigned int fsr,
++ struct pt_regs *regs)
++{
++ if (fsr == 0x1c06 && first_fault) {
++ first_fault = false;
++
++ /*
++ * These faults with code 0x1c06 happens for no good reason,
++ * possibly left over from the CFE boot loader.
++ */
++ pr_warn("External imprecise Data abort at addr=%#lx, fsr=%#x ignored.\n",
++ addr, fsr);
++
++ /* Returning non-zero causes fault display and panic */
++ return 0;
++ }
++
++ /* Others should cause a fault */
++ return 1;
++}
++
++static void __init bcm5301x_init_early(void)
++{
++ /* Install our hook */
++ hook_fault_code(16 + 6, bcm5301x_abort_handler, SIGBUS, BUS_OBJERR,
++ "imprecise external abort");
++}
++
+ static void __init bcm5301x_dt_init(void)
+ {
+ l2x0_of_init(0, ~0UL);
+@@ -23,6 +55,7 @@ static const char __initconst *bcm5301x_
+ };
+
+ DT_MACHINE_START(BCM5301X, "BCM5301X")
++ .init_early = bcm5301x_init_early,
+ .init_machine = bcm5301x_dt_init,
+ .dt_compat = bcm5301x_dt_compat,
+ MACHINE_END