xref: /linux/arch/arm/mach-bcm/bcm_5301x.c (revision 9095bf25ea08135a5b74875dd0e3eeaddc4218a0)
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