diff options
-rw-r--r-- | target/linux/bcm53xx/patches-4.4/301-Revert-ARM-BCM5301X-remove-workaround-imprecise-abor.patch | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/target/linux/bcm53xx/patches-4.4/301-Revert-ARM-BCM5301X-remove-workaround-imprecise-abor.patch b/target/linux/bcm53xx/patches-4.4/301-Revert-ARM-BCM5301X-remove-workaround-imprecise-abor.patch new file mode 100644 index 0000000000..907c581387 --- /dev/null +++ b/target/linux/bcm53xx/patches-4.4/301-Revert-ARM-BCM5301X-remove-workaround-imprecise-abor.patch @@ -0,0 +1,66 @@ +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com> +Date: Tue, 8 Mar 2016 09:03:21 +0100 +Subject: [PATCH] Revert "ARM: BCM5301X: remove workaround imprecise abort + fault handler" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reverts commit 937b12306ea79044c86f2e69b3061c7279245825. + +It seems imprecise external abort (0x1406) can be still happen on +BCM4709 during PCI initialization. + +Signed-off-by: Rafał Miłecki <zajec5@gmail.com> +--- + +--- a/arch/arm/mach-bcm/bcm_5301x.c ++++ b/arch/arm/mach-bcm/bcm_5301x.c +@@ -9,6 +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 == 0x1406 || fsr == 0x1c06) && first_fault) { ++ first_fault = false; ++ ++ /* ++ * These faults with codes 0x1406 (BCM4709) or 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 const char *const bcm5301x_dt_compat[] __initconst = { + "brcm,bcm4708", +@@ -18,5 +52,6 @@ static const char *const bcm5301x_dt_com + DT_MACHINE_START(BCM5301X, "BCM5301X") + .l2c_aux_val = 0, + .l2c_aux_mask = ~0, ++ .init_early = bcm5301x_init_early, + .dt_compat = bcm5301x_dt_compat, + MACHINE_END |