mirror of https://github.com/hak5/openwrt.git
bcm53xx: use upstream accepted fix for ARM core aborts
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>lede-17.01
parent
cb7ab730c7
commit
32875a2d79
|
@ -0,0 +1,75 @@
|
||||||
|
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
|
|
@ -1,42 +0,0 @@
|
||||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
|
||||||
Subject: [PATCH] PCI: iproc: Ignore ARM core aborts when running on bcma bus
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
Northstar devices have host bridges that forward errors to the ARM core.
|
|
||||||
These errors happen during PCI bus probing (device enumeration) and are
|
|
||||||
expected. There is no reason for them to cause a die() so this patch
|
|
||||||
adds a handler silencing them.
|
|
||||||
|
|
||||||
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
|
||||||
---
|
|
||||||
|
|
||||||
--- a/drivers/pci/host/pcie-iproc-bcma.c
|
|
||||||
+++ b/drivers/pci/host/pcie-iproc-bcma.c
|
|
||||||
@@ -40,6 +40,15 @@ static int iproc_pcie_bcma_map_irq(const
|
|
||||||
return bcma_core_irq(bdev, 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
+static int iproc_pcie_bcma_abort_handler(unsigned long addr, unsigned int fsr,
|
|
||||||
+ struct pt_regs *regs)
|
|
||||||
+{
|
|
||||||
+ if (fsr == 0x1406)
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
+ return 1;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static int iproc_pcie_bcma_probe(struct bcma_device *bdev)
|
|
||||||
{
|
|
||||||
struct iproc_pcie *pcie;
|
|
||||||
@@ -65,6 +74,9 @@ static int iproc_pcie_bcma_probe(struct
|
|
||||||
|
|
||||||
pcie->map_irq = iproc_pcie_bcma_map_irq;
|
|
||||||
|
|
||||||
+ hook_fault_code(16 + 6, iproc_pcie_bcma_abort_handler, SIGBUS, BUS_OBJERR,
|
|
||||||
+ "imprecise external abort");
|
|
||||||
+
|
|
||||||
ret = iproc_pcie_setup(pcie, &res);
|
|
||||||
if (ret)
|
|
||||||
dev_err(pcie->dev, "PCIe controller setup failed\n");
|
|
Loading…
Reference in New Issue