Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Broadcom BCM470X / BCM5301X ARM platform code.
0003  *
0004  * Copyright 2013 Hauke Mehrtens <hauke@hauke-m.de>
0005  *
0006  * Licensed under the GNU/GPL. See COPYING for details.
0007  */
0008 #include <linux/of_platform.h>
0009 #include <asm/hardware/cache-l2x0.h>
0010 
0011 #include <asm/mach/arch.h>
0012 #include <asm/siginfo.h>
0013 #include <asm/signal.h>
0014 
0015 #define FSR_EXTERNAL        (1 << 12)
0016 #define FSR_READ        (0 << 10)
0017 #define FSR_IMPRECISE       0x0406
0018 
0019 static const char *const bcm5301x_dt_compat[] __initconst = {
0020     "brcm,bcm4708",
0021     NULL,
0022 };
0023 
0024 static int bcm5301x_abort_handler(unsigned long addr, unsigned int fsr,
0025                   struct pt_regs *regs)
0026 {
0027     /*
0028      * We want to ignore aborts forwarded from the PCIe bus that are
0029      * expected and shouldn't really be passed by the PCIe controller.
0030      * The biggest disadvantage is the same FSR code may be reported when
0031      * reading non-existing APB register and we shouldn't ignore that.
0032      */
0033     if (fsr == (FSR_EXTERNAL | FSR_READ | FSR_IMPRECISE))
0034         return 0;
0035 
0036     return 1;
0037 }
0038 
0039 static void __init bcm5301x_init_early(void)
0040 {
0041     hook_fault_code(16 + 6, bcm5301x_abort_handler, SIGBUS, BUS_OBJERR,
0042             "imprecise external abort");
0043 }
0044 
0045 DT_MACHINE_START(BCM5301X, "BCM5301X")
0046     .l2c_aux_val    = 0,
0047     .l2c_aux_mask   = ~0,
0048     .dt_compat  = bcm5301x_dt_compat,
0049     .init_early = bcm5301x_init_early,
0050 MACHINE_END