cddd459140
Add patches for linux-5.4. The patches are from NXP LSDK-20.04 release which was tagged LSDK-20.04-V5.4. https://source.codeaurora.org/external/qoriq/qoriq-components/linux/ For boards LS1021A-IOT, and Traverse-LS1043 which are not involved in LSDK, port the dts patches from 4.14. The patches are sorted into the following categories: 301-arch-xxxx 302-dts-xxxx 303-core-xxxx 701-net-xxxx 801-audio-xxxx 802-can-xxxx 803-clock-xxxx 804-crypto-xxxx 805-display-xxxx 806-dma-xxxx 807-gpio-xxxx 808-i2c-xxxx 809-jailhouse-xxxx 810-keys-xxxx 811-kvm-xxxx 812-pcie-xxxx 813-pm-xxxx 814-qe-xxxx 815-sata-xxxx 816-sdhc-xxxx 817-spi-xxxx 818-thermal-xxxx 819-uart-xxxx 820-usb-xxxx 821-vfio-xxxx Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
151 lines
4.5 KiB
Diff
151 lines
4.5 KiB
Diff
From 7f38d09c9fd7906cea160e198299a7e378f9c796 Mon Sep 17 00:00:00 2001
|
|
From: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
|
|
Date: Tue, 6 Nov 2018 09:44:05 +0800
|
|
Subject: [PATCH] PCI: mobiveil: ls_pcie_g4: add Workaround for A-011577
|
|
|
|
PCIe configuration access to non-existent function triggered
|
|
SERROR interrupt exception.
|
|
|
|
Workaround:
|
|
Disable error reporting on AXI bus during the Vendor ID read
|
|
transactions in enumeration.
|
|
|
|
This ERRATA is only for LX2160A Rev1.0, and it will be fixed
|
|
in Rev2.0.
|
|
|
|
Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
|
|
---
|
|
.../pci/controller/mobiveil/pcie-layerscape-gen4.c | 36 ++++++++++++++++++++++
|
|
.../pci/controller/mobiveil/pcie-mobiveil-host.c | 17 +++++++++-
|
|
drivers/pci/controller/mobiveil/pcie-mobiveil.h | 3 ++
|
|
3 files changed, 55 insertions(+), 1 deletion(-)
|
|
|
|
--- a/drivers/pci/controller/mobiveil/pcie-layerscape-gen4.c
|
|
+++ b/drivers/pci/controller/mobiveil/pcie-layerscape-gen4.c
|
|
@@ -22,8 +22,12 @@
|
|
|
|
#include "pcie-mobiveil.h"
|
|
|
|
+#define REV_1_0 (0x10)
|
|
+
|
|
/* LUT and PF control registers */
|
|
#define PCIE_LUT_OFF 0x80000
|
|
+#define PCIE_LUT_GCR (0x28)
|
|
+#define PCIE_LUT_GCR_RRE (0)
|
|
#define PCIE_PF_OFF 0xc0000
|
|
#define PCIE_PF_INT_STAT 0x18
|
|
#define PF_INT_STAT_PABRST BIT(31)
|
|
@@ -40,6 +44,7 @@ struct ls_pcie_g4 {
|
|
struct mobiveil_pcie pci;
|
|
struct delayed_work dwork;
|
|
int irq;
|
|
+ u8 rev;
|
|
};
|
|
|
|
static inline u32 ls_pcie_g4_lut_readl(struct ls_pcie_g4 *pcie, u32 off)
|
|
@@ -75,6 +80,15 @@ static bool ls_pcie_g4_is_bridge(struct
|
|
return header_type == PCI_HEADER_TYPE_BRIDGE;
|
|
}
|
|
|
|
+static int ls_pcie_g4_host_init(struct mobiveil_pcie *pci)
|
|
+{
|
|
+ struct ls_pcie_g4 *pcie = to_ls_pcie_g4(pci);
|
|
+
|
|
+ pcie->rev = csr_readb(pci, PCI_REVISION_ID);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static int ls_pcie_g4_link_up(struct mobiveil_pcie *pci)
|
|
{
|
|
struct ls_pcie_g4 *pcie = to_ls_pcie_g4(pci);
|
|
@@ -206,12 +220,34 @@ static void ls_pcie_g4_reset(struct work
|
|
ls_pcie_g4_enable_interrupt(pcie);
|
|
}
|
|
|
|
+static int ls_pcie_g4_read_other_conf(struct pci_bus *bus, unsigned int devfn,
|
|
+ int where, int size, u32 *val)
|
|
+{
|
|
+ struct mobiveil_pcie *pci = bus->sysdata;
|
|
+ struct ls_pcie_g4 *pcie = to_ls_pcie_g4(pci);
|
|
+ int ret;
|
|
+
|
|
+ if (pcie->rev == REV_1_0 && where == PCI_VENDOR_ID)
|
|
+ ls_pcie_g4_lut_writel(pcie, PCIE_LUT_GCR,
|
|
+ 0 << PCIE_LUT_GCR_RRE);
|
|
+
|
|
+ ret = pci_generic_config_read(bus, devfn, where, size, val);
|
|
+
|
|
+ if (pcie->rev == REV_1_0 && where == PCI_VENDOR_ID)
|
|
+ ls_pcie_g4_lut_writel(pcie, PCIE_LUT_GCR,
|
|
+ 1 << PCIE_LUT_GCR_RRE);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
static struct mobiveil_rp_ops ls_pcie_g4_rp_ops = {
|
|
.interrupt_init = ls_pcie_g4_interrupt_init,
|
|
+ .read_other_conf = ls_pcie_g4_read_other_conf,
|
|
};
|
|
|
|
static const struct mobiveil_pab_ops ls_pcie_g4_pab_ops = {
|
|
.link_up = ls_pcie_g4_link_up,
|
|
+ .host_init = ls_pcie_g4_host_init,
|
|
};
|
|
|
|
static int __init ls_pcie_g4_probe(struct platform_device *pdev)
|
|
--- a/drivers/pci/controller/mobiveil/pcie-mobiveil-host.c
|
|
+++ b/drivers/pci/controller/mobiveil/pcie-mobiveil-host.c
|
|
@@ -77,9 +77,20 @@ static void __iomem *mobiveil_pcie_map_b
|
|
return pcie->rp.config_axi_slave_base + where;
|
|
}
|
|
|
|
+static int mobiveil_pcie_config_read(struct pci_bus *bus, unsigned int devfn,
|
|
+ int where, int size, u32 *val)
|
|
+{
|
|
+ struct mobiveil_pcie *pcie = bus->sysdata;
|
|
+ struct root_port *rp = &pcie->rp;
|
|
+
|
|
+ if (bus->number > rp->root_bus_nr && rp->ops->read_other_conf)
|
|
+ return rp->ops->read_other_conf(bus, devfn, where, size, val);
|
|
+
|
|
+ return pci_generic_config_read(bus, devfn, where, size, val);
|
|
+}
|
|
static struct pci_ops mobiveil_pcie_ops = {
|
|
.map_bus = mobiveil_pcie_map_bus,
|
|
- .read = pci_generic_config_read,
|
|
+ .read = mobiveil_pcie_config_read,
|
|
.write = pci_generic_config_write,
|
|
};
|
|
|
|
@@ -300,6 +311,10 @@ int mobiveil_host_init(struct mobiveil_p
|
|
value |= (PCI_CLASS_BRIDGE_PCI << 16);
|
|
csr_writel(pcie, value, PAB_INTP_AXI_PIO_CLASS);
|
|
|
|
+ /* Platform specific host init */
|
|
+ if (pcie->ops->host_init)
|
|
+ return pcie->ops->host_init(pcie);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
--- a/drivers/pci/controller/mobiveil/pcie-mobiveil.h
|
|
+++ b/drivers/pci/controller/mobiveil/pcie-mobiveil.h
|
|
@@ -146,6 +146,8 @@ struct mobiveil_msi { /* MSI informati
|
|
|
|
struct mobiveil_rp_ops {
|
|
int (*interrupt_init)(struct mobiveil_pcie *pcie);
|
|
+ int (*read_other_conf)(struct pci_bus *bus, unsigned int devfn,
|
|
+ int where, int size, u32 *val);
|
|
};
|
|
|
|
struct root_port {
|
|
@@ -161,6 +163,7 @@ struct root_port {
|
|
|
|
struct mobiveil_pab_ops {
|
|
int (*link_up)(struct mobiveil_pcie *pcie);
|
|
+ int (*host_init)(struct mobiveil_pcie *pcie);
|
|
};
|
|
|
|
struct mobiveil_pcie {
|