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