mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-24 15:56:49 +00:00
76 lines
2.4 KiB
Diff
76 lines
2.4 KiB
Diff
|
From 09f3510fb70a46c8921f2cf4a90dbcae460a6820 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||
|
Date: Sat, 29 Oct 2016 13:12:29 +0200
|
||
|
Subject: [PATCH] ARM: BCM5301X: Add back handler ignoring external imprecise
|
||
|
aborts
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
Since early BCM5301X days we got abort handler that was removed by
|
||
|
commit 937b12306ea79 ("ARM: BCM5301X: remove workaround imprecise abort
|
||
|
fault handler"). It assumed we need to deal only with pending aborts
|
||
|
left by the bootloader. Unfortunately this isn't true for BCM5301X.
|
||
|
|
||
|
When probing PCI config space (device enumeration) it is expected to
|
||
|
have master aborts on the PCI bus. Most bridges don't forward (or they
|
||
|
allow disabling it) these errors onto the AXI/AMBA bus but not the
|
||
|
Northstar (BCM5301X) one.
|
||
|
|
||
|
iProc PCIe controller on Northstar seems to be some older one, without
|
||
|
a control register for errors forwarding. It means we need to workaround
|
||
|
this at platform level. All newer platforms are not affected by this
|
||
|
issue.
|
||
|
|
||
|
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||
|
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||
|
---
|
||
|
arch/arm/mach-bcm/bcm_5301x.c | 28 ++++++++++++++++++++++++++++
|
||
|
1 file changed, 28 insertions(+)
|
||
|
|
||
|
--- a/arch/arm/mach-bcm/bcm_5301x.c
|
||
|
+++ b/arch/arm/mach-bcm/bcm_5301x.c
|
||
|
@@ -9,14 +9,42 @@
|
||
|
#include <asm/hardware/cache-l2x0.h>
|
||
|
|
||
|
#include <asm/mach/arch.h>
|
||
|
+#include <asm/siginfo.h>
|
||
|
+#include <asm/signal.h>
|
||
|
+
|
||
|
+#define FSR_EXTERNAL (1 << 12)
|
||
|
+#define FSR_READ (0 << 10)
|
||
|
+#define FSR_IMPRECISE 0x0406
|
||
|
|
||
|
static const char *const bcm5301x_dt_compat[] __initconst = {
|
||
|
"brcm,bcm4708",
|
||
|
NULL,
|
||
|
};
|
||
|
|
||
|
+static int bcm5301x_abort_handler(unsigned long addr, unsigned int fsr,
|
||
|
+ struct pt_regs *regs)
|
||
|
+{
|
||
|
+ /*
|
||
|
+ * We want to ignore aborts forwarded from the PCIe bus that are
|
||
|
+ * expected and shouldn't really be passed by the PCIe controller.
|
||
|
+ * The biggest disadvantage is the same FSR code may be reported when
|
||
|
+ * reading non-existing APB register and we shouldn't ignore that.
|
||
|
+ */
|
||
|
+ if (fsr == (FSR_EXTERNAL | FSR_READ | FSR_IMPRECISE))
|
||
|
+ return 0;
|
||
|
+
|
||
|
+ return 1;
|
||
|
+}
|
||
|
+
|
||
|
+static void __init bcm5301x_init_early(void)
|
||
|
+{
|
||
|
+ hook_fault_code(16 + 6, bcm5301x_abort_handler, SIGBUS, BUS_OBJERR,
|
||
|
+ "imprecise external abort");
|
||
|
+}
|
||
|
+
|
||
|
DT_MACHINE_START(BCM5301X, "BCM5301X")
|
||
|
.l2c_aux_val = 0,
|
||
|
.l2c_aux_mask = ~0,
|
||
|
.dt_compat = bcm5301x_dt_compat,
|
||
|
+ .init_early = bcm5301x_init_early,
|
||
|
MACHINE_END
|