diff options
author | Arnd Bergmann <arnd@arndb.de> | 2016-11-30 17:49:17 +0100 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2016-11-30 17:49:17 +0100 |
commit | 9442091ed031f79df0ddc44c8dafd7537faeb4e7 (patch) | |
tree | a582c72e32688673d20b95fdd07664dfb2be836e /arch/arm | |
parent | 196249beabe34066fc4655af8bacbb5ab8b77224 (diff) | |
parent | 09f3510fb70a46c8921f2cf4a90dbcae460a6820 (diff) |
Merge tag 'arm-soc/for-4.10/soc' of http://github.com/Broadcom/stblinux into next/soc
Merge "Broadcom soc changes for 4.10" from Florian Fainelli:
This pull request contains Broadcom ARM-based SoC changes for 4.10, please pull
the following:
- Rafal adds back the abort handler hook on BCM5301x which is required to silence
errors forwared from the PCIe controller that cannot be silenced at the PCIe RC level
* tag 'arm-soc/for-4.10/soc' of http://github.com/Broadcom/stblinux:
ARM: BCM5301X: Add back handler ignoring external imprecise aborts
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/mach-bcm/bcm_5301x.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/arch/arm/mach-bcm/bcm_5301x.c b/arch/arm/mach-bcm/bcm_5301x.c index c8830a2b0d60..fe067f6cebb6 100644 --- a/arch/arm/mach-bcm/bcm_5301x.c +++ b/arch/arm/mach-bcm/bcm_5301x.c @@ -9,14 +9,42 @@ #include <asm/hardware/cache-l2x0.h> #include <asm/mach/arch.h> +#include <asm/siginfo.h> +#include <asm/signal.h> + +#define FSR_EXTERNAL (1 << 12) +#define FSR_READ (0 << 10) +#define FSR_IMPRECISE 0x0406 static const char *const bcm5301x_dt_compat[] __initconst = { "brcm,bcm4708", NULL, }; +static int bcm5301x_abort_handler(unsigned long addr, unsigned int fsr, + struct pt_regs *regs) +{ + /* + * We want to ignore aborts forwarded from the PCIe bus that are + * expected and shouldn't really be passed by the PCIe controller. + * The biggest disadvantage is the same FSR code may be reported when + * reading non-existing APB register and we shouldn't ignore that. + */ + if (fsr == (FSR_EXTERNAL | FSR_READ | FSR_IMPRECISE)) + return 0; + + return 1; +} + +static void __init bcm5301x_init_early(void) +{ + hook_fault_code(16 + 6, bcm5301x_abort_handler, SIGBUS, BUS_OBJERR, + "imprecise external abort"); +} + DT_MACHINE_START(BCM5301X, "BCM5301X") .l2c_aux_val = 0, .l2c_aux_mask = ~0, .dt_compat = bcm5301x_dt_compat, + .init_early = bcm5301x_init_early, MACHINE_END |