diff options
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.patch | 93 |
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 |