Commit | Line | Data |
---|---|---|
5b293ebe HM |
1 | /* |
2 | * Broadcom BCM470X / BCM5301X ARM platform code. | |
3 | * | |
4 | * Copyright 2013 Hauke Mehrtens <hauke@hauke-m.de> | |
5 | * | |
6 | * Licensed under the GNU/GPL. See COPYING for details. | |
7 | */ | |
8 | #include <linux/of_platform.h> | |
9 | #include <asm/hardware/cache-l2x0.h> | |
10 | ||
11 | #include <asm/mach/arch.h> | |
fdf4850c HM |
12 | #include <asm/siginfo.h> |
13 | #include <asm/signal.h> | |
5b293ebe HM |
14 | |
15 | ||
fdf4850c HM |
16 | static bool first_fault = true; |
17 | ||
18 | static int bcm5301x_abort_handler(unsigned long addr, unsigned int fsr, | |
19 | struct pt_regs *regs) | |
20 | { | |
21 | if (fsr == 0x1c06 && first_fault) { | |
22 | first_fault = false; | |
23 | ||
24 | /* | |
25 | * These faults with code 0x1c06 happens for no good reason, | |
26 | * possibly left over from the CFE boot loader. | |
27 | */ | |
28 | pr_warn("External imprecise Data abort at addr=%#lx, fsr=%#x ignored.\n", | |
29 | addr, fsr); | |
30 | ||
31 | /* Returning non-zero causes fault display and panic */ | |
32 | return 0; | |
33 | } | |
34 | ||
35 | /* Others should cause a fault */ | |
36 | return 1; | |
37 | } | |
38 | ||
39 | static void __init bcm5301x_init_early(void) | |
40 | { | |
41 | /* Install our hook */ | |
42 | hook_fault_code(16 + 6, bcm5301x_abort_handler, SIGBUS, BUS_OBJERR, | |
43 | "imprecise external abort"); | |
44 | } | |
45 | ||
5b293ebe HM |
46 | static void __init bcm5301x_dt_init(void) |
47 | { | |
d453ef75 | 48 | l2x0_of_init(0, ~0); |
5b293ebe HM |
49 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); |
50 | } | |
51 | ||
52 | static const char __initconst *bcm5301x_dt_compat[] = { | |
53 | "brcm,bcm4708", | |
54 | NULL, | |
55 | }; | |
56 | ||
57 | DT_MACHINE_START(BCM5301X, "BCM5301X") | |
fdf4850c | 58 | .init_early = bcm5301x_init_early, |
5b293ebe HM |
59 | .init_machine = bcm5301x_dt_init, |
60 | .dt_compat = bcm5301x_dt_compat, | |
61 | MACHINE_END |