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 #include <linux/of_platform.h> 95b293ebeSHauke Mehrtens #include <asm/hardware/cache-l2x0.h> 105b293ebeSHauke Mehrtens 115b293ebeSHauke Mehrtens #include <asm/mach/arch.h> 12*09f3510fSRafał Miłecki #include <asm/siginfo.h> 13*09f3510fSRafał Miłecki #include <asm/signal.h> 14*09f3510fSRafał Miłecki 15*09f3510fSRafał Miłecki #define FSR_EXTERNAL (1 << 12) 16*09f3510fSRafał Miłecki #define FSR_READ (0 << 10) 17*09f3510fSRafał Miłecki #define FSR_IMPRECISE 0x0406 18fdf4850cSHauke Mehrtens 1919c233b7SNicolas Pitre static const char *const bcm5301x_dt_compat[] __initconst = { 205b293ebeSHauke Mehrtens "brcm,bcm4708", 215b293ebeSHauke Mehrtens NULL, 225b293ebeSHauke Mehrtens }; 235b293ebeSHauke Mehrtens 24*09f3510fSRafał Miłecki static int bcm5301x_abort_handler(unsigned long addr, unsigned int fsr, 25*09f3510fSRafał Miłecki struct pt_regs *regs) 26*09f3510fSRafał Miłecki { 27*09f3510fSRafał Miłecki /* 28*09f3510fSRafał Miłecki * We want to ignore aborts forwarded from the PCIe bus that are 29*09f3510fSRafał Miłecki * expected and shouldn't really be passed by the PCIe controller. 30*09f3510fSRafał Miłecki * The biggest disadvantage is the same FSR code may be reported when 31*09f3510fSRafał Miłecki * reading non-existing APB register and we shouldn't ignore that. 32*09f3510fSRafał Miłecki */ 33*09f3510fSRafał Miłecki if (fsr == (FSR_EXTERNAL | FSR_READ | FSR_IMPRECISE)) 34*09f3510fSRafał Miłecki return 0; 35*09f3510fSRafał Miłecki 36*09f3510fSRafał Miłecki return 1; 37*09f3510fSRafał Miłecki } 38*09f3510fSRafał Miłecki 39*09f3510fSRafał Miłecki static void __init bcm5301x_init_early(void) 40*09f3510fSRafał Miłecki { 41*09f3510fSRafał Miłecki hook_fault_code(16 + 6, bcm5301x_abort_handler, SIGBUS, BUS_OBJERR, 42*09f3510fSRafał Miłecki "imprecise external abort"); 43*09f3510fSRafał Miłecki } 44*09f3510fSRafał Miłecki 455b293ebeSHauke Mehrtens DT_MACHINE_START(BCM5301X, "BCM5301X") 46d458773fSRussell King .l2c_aux_val = 0, 47d458773fSRussell King .l2c_aux_mask = ~0, 485b293ebeSHauke Mehrtens .dt_compat = bcm5301x_dt_compat, 49*09f3510fSRafał Miłecki .init_early = bcm5301x_init_early, 505b293ebeSHauke Mehrtens MACHINE_END 51