162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Broadcom BCM470X / BCM5301X ARM platform code. 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright 2013 Hauke Mehrtens <hauke@hauke-m.de> 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Licensed under the GNU/GPL. See COPYING for details. 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <asm/mach/arch.h> 1062306a36Sopenharmony_ci#include <asm/siginfo.h> 1162306a36Sopenharmony_ci#include <asm/signal.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define FSR_EXTERNAL (1 << 12) 1462306a36Sopenharmony_ci#define FSR_READ (0 << 10) 1562306a36Sopenharmony_ci#define FSR_IMPRECISE 0x0406 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistatic const char *const bcm5301x_dt_compat[] __initconst = { 1862306a36Sopenharmony_ci "brcm,bcm4708", 1962306a36Sopenharmony_ci NULL, 2062306a36Sopenharmony_ci}; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cistatic int bcm5301x_abort_handler(unsigned long addr, unsigned int fsr, 2362306a36Sopenharmony_ci struct pt_regs *regs) 2462306a36Sopenharmony_ci{ 2562306a36Sopenharmony_ci /* 2662306a36Sopenharmony_ci * We want to ignore aborts forwarded from the PCIe bus that are 2762306a36Sopenharmony_ci * expected and shouldn't really be passed by the PCIe controller. 2862306a36Sopenharmony_ci * The biggest disadvantage is the same FSR code may be reported when 2962306a36Sopenharmony_ci * reading non-existing APB register and we shouldn't ignore that. 3062306a36Sopenharmony_ci */ 3162306a36Sopenharmony_ci if (fsr == (FSR_EXTERNAL | FSR_READ | FSR_IMPRECISE)) 3262306a36Sopenharmony_ci return 0; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci return 1; 3562306a36Sopenharmony_ci} 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cistatic void __init bcm5301x_init_early(void) 3862306a36Sopenharmony_ci{ 3962306a36Sopenharmony_ci hook_fault_code(16 + 6, bcm5301x_abort_handler, SIGBUS, BUS_OBJERR, 4062306a36Sopenharmony_ci "imprecise external abort"); 4162306a36Sopenharmony_ci} 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ciDT_MACHINE_START(BCM5301X, "BCM5301X") 4462306a36Sopenharmony_ci .l2c_aux_val = 0, 4562306a36Sopenharmony_ci .l2c_aux_mask = ~0, 4662306a36Sopenharmony_ci .dt_compat = bcm5301x_dt_compat, 4762306a36Sopenharmony_ci .init_early = bcm5301x_init_early, 4862306a36Sopenharmony_ciMACHINE_END 49