15b293ebeSHauke Mehrtens /*
25b293ebeSHauke Mehrtens * Broadcom BCM470X / BCM5301X ARM platform code.
35b293ebeSHauke Mehrtens *
45b293ebeSHauke Mehrtens * Copyright 2013 Hauke Mehrtens <hauke@hauke-m.de>
55b293ebeSHauke Mehrtens *
65b293ebeSHauke Mehrtens * Licensed under the GNU/GPL. See COPYING for details.
75b293ebeSHauke Mehrtens */
85b293ebeSHauke Mehrtens
95b293ebeSHauke Mehrtens #include <asm/mach/arch.h>
10*09f3510fSRafał Miłecki #include <asm/siginfo.h>
11*09f3510fSRafał Miłecki #include <asm/signal.h>
12*09f3510fSRafał Miłecki
13*09f3510fSRafał Miłecki #define FSR_EXTERNAL (1 << 12)
14*09f3510fSRafał Miłecki #define FSR_READ (0 << 10)
15*09f3510fSRafał Miłecki #define FSR_IMPRECISE 0x0406
16fdf4850cSHauke Mehrtens
1719c233b7SNicolas Pitre static const char *const bcm5301x_dt_compat[] __initconst = {
185b293ebeSHauke Mehrtens "brcm,bcm4708",
195b293ebeSHauke Mehrtens NULL,
205b293ebeSHauke Mehrtens };
215b293ebeSHauke Mehrtens
bcm5301x_abort_handler(unsigned long addr,unsigned int fsr,struct pt_regs * regs)22*09f3510fSRafał Miłecki static int bcm5301x_abort_handler(unsigned long addr, unsigned int fsr,
23*09f3510fSRafał Miłecki struct pt_regs *regs)
24*09f3510fSRafał Miłecki {
25*09f3510fSRafał Miłecki /*
26*09f3510fSRafał Miłecki * We want to ignore aborts forwarded from the PCIe bus that are
27*09f3510fSRafał Miłecki * expected and shouldn't really be passed by the PCIe controller.
28*09f3510fSRafał Miłecki * The biggest disadvantage is the same FSR code may be reported when
29*09f3510fSRafał Miłecki * reading non-existing APB register and we shouldn't ignore that.
30*09f3510fSRafał Miłecki */
31*09f3510fSRafał Miłecki if (fsr == (FSR_EXTERNAL | FSR_READ | FSR_IMPRECISE))
32*09f3510fSRafał Miłecki return 0;
33*09f3510fSRafał Miłecki
34*09f3510fSRafał Miłecki return 1;
35*09f3510fSRafał Miłecki }
36*09f3510fSRafał Miłecki
bcm5301x_init_early(void)37*09f3510fSRafał Miłecki static void __init bcm5301x_init_early(void)
38*09f3510fSRafał Miłecki {
39*09f3510fSRafał Miłecki hook_fault_code(16 + 6, bcm5301x_abort_handler, SIGBUS, BUS_OBJERR,
40*09f3510fSRafał Miłecki "imprecise external abort");
41*09f3510fSRafał Miłecki }
42*09f3510fSRafał Miłecki
435b293ebeSHauke Mehrtens DT_MACHINE_START(BCM5301X, "BCM5301X")
44d458773fSRussell King .l2c_aux_val = 0,
45d458773fSRussell King .l2c_aux_mask = ~0,
465b293ebeSHauke Mehrtens .dt_compat = bcm5301x_dt_compat,
47*09f3510fSRafał Miłecki .init_early = bcm5301x_init_early,
485b293ebeSHauke Mehrtens MACHINE_END
49