diff options
author | Tony Lindgren <tony@atomide.com> | 2015-07-23 22:33:19 -0700 |
---|---|---|
committer | Tony Lindgren <tony@atomide.com> | 2015-07-23 22:33:19 -0700 |
commit | f5887fe5d14181aef0653ab04f60988252d42461 (patch) | |
tree | db30c98305907cf1c1883911640b3a63be072e8d /arch/arm/mach-omap2/pdata-quirks.c | |
parent | 285f3690cd14eb3e7f82c98ad4b294f204438ffa (diff) | |
download | linux-stable-f5887fe5d14181aef0653ab04f60988252d42461.tar.gz linux-stable-f5887fe5d14181aef0653ab04f60988252d42461.tar.bz2 linux-stable-f5887fe5d14181aef0653ab04f60988252d42461.zip |
ARM: OMAP2+: Add custom abort handler for t410
Similar to commit fdf4850cb5b2 ("ARM: BCM5301X: workaround suppress fault"),
let's add custom handling for the aborts on t410 that prevent booting:
Unhandled fault: imprecise external abort (0xc06) at 0xee091fb0
pgd = ee4bc000
[ee091fb0] *pgd=ae00041e(bad)
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000007
Cc: Matthijs van Duin <matthijsvanduin@gmail.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'arch/arm/mach-omap2/pdata-quirks.c')
-rw-r--r-- | arch/arm/mach-omap2/pdata-quirks.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c index 4e655ae2d507..1e9917c29958 100644 --- a/arch/arm/mach-omap2/pdata-quirks.c +++ b/arch/arm/mach-omap2/pdata-quirks.c @@ -24,6 +24,9 @@ #include <linux/platform_data/iommu-omap.h> #include <linux/platform_data/wkup_m3.h> +#include <asm/siginfo.h> +#include <asm/signal.h> + #include "common.h" #include "common-board-devices.h" #include "dss-common.h" @@ -382,6 +385,29 @@ static void __init omap3_pandora_legacy_init(void) } #endif /* CONFIG_ARCH_OMAP3 */ +#ifdef CONFIG_SOC_TI81XX +static int fault_fixed_up; + +static int t410_abort_handler(unsigned long addr, unsigned int fsr, + struct pt_regs *regs) +{ + if ((fsr == 0x406 || fsr == 0xc06) && !fault_fixed_up) { + pr_warn("External imprecise Data abort at addr=%#lx, fsr=%#x ignored.\n", + addr, fsr); + fault_fixed_up = 1; + return 0; + } + + return 1; +} + +static void __init t410_abort_init(void) +{ + hook_fault_code(16 + 6, t410_abort_handler, SIGBUS, BUS_OBJERR, + "imprecise external abort"); +} +#endif + #if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) static struct iommu_platform_data omap4_iommu_pdata = { .reset_name = "mmu_cache", @@ -510,6 +536,9 @@ static struct pdata_init pdata_quirks[] __initdata = { { "openpandora,omap3-pandora-600mhz", omap3_pandora_legacy_init, }, { "openpandora,omap3-pandora-1ghz", omap3_pandora_legacy_init, }, #endif +#ifdef CONFIG_SOC_TI81XX + { "hp,t410", t410_abort_init, }, +#endif #ifdef CONFIG_SOC_OMAP5 { "ti,omap5-uevm", omap5_uevm_legacy_init, }, #endif |