diff options
Diffstat (limited to 'arm64-socionext-96b-enablement.patch')
-rw-r--r-- | arm64-socionext-96b-enablement.patch | 158 |
1 files changed, 0 insertions, 158 deletions
diff --git a/arm64-socionext-96b-enablement.patch b/arm64-socionext-96b-enablement.patch index fa93f0c8e..d5d6cda86 100644 --- a/arm64-socionext-96b-enablement.patch +++ b/arm64-socionext-96b-enablement.patch @@ -1,161 +1,3 @@ -From 26e7bb47b0fb03a01be1e391a08c7375b45335a2 Mon Sep 17 00:00:00 2001 -From: Ard Biesheuvel <ard.biesheuvel@linaro.org> -Date: Mon, 21 Aug 2017 20:29:05 +0100 -Subject: pci: designware: add driver for DWC controller in ECAM shift mode - -Some implementations of the Synopsys Designware PCIe controller implement -a so-called ECAM shift mode, which allows a static memory window to be -configured that covers the configuration space of the entire bus range. - -If the firmware performs all the low level configuration that is required -to expose this controller in a fully ECAM compatible manner, we can -simply describe it as "pci-host-ecam-generic" and be done with it. -However, it appears that in some cases (one of which is the Armada 80x0), -the IP is synthesized with an ATU window size that does not allow the -first bus to be mapped in a way that prevents the device on the -downstream port from appearing more than once. - -So implement a driver that relies on the firmware to perform all low -level initialization, and drives the controller in ECAM mode, but -overrides the config space accessors to take the above quirk into -account. - -Note that, unlike most drivers for this IP, this driver does not expose -a fake bridge device at B/D/F 00:00.0. There is no point in doing so, -given that this is not a true bridge, and does not require any windows -to be configured in order for the downstream device to operate correctly. -Omitting it also prevents the PCI resource allocation routines from -handing out BAR space to it unnecessarily. - -Cc: Bjorn Helgaas <bhelgaas@google.com> -Cc: Jingoo Han <jingoohan1@gmail.com> -Cc: Joao Pinto <Joao.Pinto@synopsys.com> -Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> ---- - drivers/pci/dwc/Kconfig | 11 +++++ - drivers/pci/dwc/Makefile | 1 + - drivers/pci/dwc/pcie-designware-ecam.c | 77 ++++++++++++++++++++++++++++++++++ - 3 files changed, 89 insertions(+) - create mode 100644 drivers/pci/dwc/pcie-designware-ecam.c - -diff --git a/drivers/pci/dwc/Kconfig b/drivers/pci/dwc/Kconfig -index 22ec82f..19856b1 100644 ---- a/drivers/pci/dwc/Kconfig -+++ b/drivers/pci/dwc/Kconfig -@@ -169,4 +169,15 @@ config PCIE_KIRIN - Say Y here if you want PCIe controller support - on HiSilicon Kirin series SoCs. - -+config PCIE_DW_HOST_ECAM -+ bool "Synopsys DesignWare PCIe controller in ECAM mode" -+ depends on OF && PCI -+ select PCI_HOST_COMMON -+ select IRQ_DOMAIN -+ help -+ Add support for Synopsys DesignWare PCIe controllers configured -+ by the firmware into ECAM shift mode. In some cases, these are -+ fully ECAM compliant, in which case the pci-host-generic driver -+ may be used instead. -+ - endmenu -diff --git a/drivers/pci/dwc/Makefile b/drivers/pci/dwc/Makefile -index c61be97..7d5a23e 100644 ---- a/drivers/pci/dwc/Makefile -+++ b/drivers/pci/dwc/Makefile -@@ -1,5 +1,6 @@ - # SPDX-License-Identifier: GPL-2.0 - obj-$(CONFIG_PCIE_DW) += pcie-designware.o - obj-$(CONFIG_PCIE_DW_HOST) += pcie-designware-host.o -+obj-$(CONFIG_PCIE_DW_HOST_ECAM) += pcie-designware-ecam.o - obj-$(CONFIG_PCIE_DW_EP) += pcie-designware-ep.o - obj-$(CONFIG_PCIE_DW_PLAT) += pcie-designware-plat.o - ifneq ($(filter y,$(CONFIG_PCI_DRA7XX_HOST) $(CONFIG_PCI_DRA7XX_EP)),) -diff --git a/drivers/pci/dwc/pcie-designware-ecam.c b/drivers/pci/dwc/pcie-designware-ecam.c -new file mode 100644 -index 0000000..ede627d ---- /dev/null -+++ b/drivers/pci/dwc/pcie-designware-ecam.c -@@ -0,0 +1,77 @@ -+/* -+ * Driver for mostly ECAM compatible Synopsys dw PCIe controllers -+ * configured by the firmware into RC mode -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * Copyright (C) 2014 ARM Limited -+ * Copyright (C) 2017 Linaro Limited -+ * -+ * Authors: Will Deacon <will.deacon@arm.com> -+ * Ard Biesheuvel <ard.biesheuvel@linaro.org> -+ */ -+ -+#include <linux/kernel.h> -+#include <linux/init.h> -+#include <linux/of_address.h> -+#include <linux/of_pci.h> -+#include <linux/pci-ecam.h> -+#include <linux/platform_device.h> -+ -+static int pci_dw_ecam_config_read(struct pci_bus *bus, u32 devfn, int where, -+ int size, u32 *val) -+{ -+ struct pci_config_window *cfg = bus->sysdata; -+ -+ /* -+ * The Synopsys dw PCIe controller in RC mode will not filter type 0 -+ * config TLPs sent to devices 1 and up on its downstream port, -+ * resulting in devices appearing multiple times on bus 0 unless we -+ * filter them here. -+ */ -+ if (bus->number == cfg->busr.start && PCI_SLOT(devfn) > 0) { -+ *val = 0xffffffff; -+ return PCIBIOS_DEVICE_NOT_FOUND; -+ } -+ return pci_generic_config_read(bus, devfn, where, size, val); -+} -+ -+static int pci_dw_ecam_config_write(struct pci_bus *bus, u32 devfn, int where, -+ int size, u32 val) -+{ -+ struct pci_config_window *cfg = bus->sysdata; -+ -+ if (bus->number == cfg->busr.start && PCI_SLOT(devfn) > 0) -+ return PCIBIOS_DEVICE_NOT_FOUND; -+ -+ return pci_generic_config_write(bus, devfn, where, size, val); -+} -+ -+static struct pci_ecam_ops pci_dw_ecam_bus_ops = { -+ .pci_ops.map_bus = pci_ecam_map_bus, -+ .pci_ops.read = pci_dw_ecam_config_read, -+ .pci_ops.write = pci_dw_ecam_config_write, -+ .bus_shift = 20, -+}; -+ -+static const struct of_device_id pci_dw_ecam_of_match[] = { -+ { .compatible = "marvell,armada8k-pcie-ecam" }, -+ { .compatible = "socionext,synquacer-pcie-ecam" }, -+ { .compatible = "snps,dw-pcie-ecam" }, -+ { }, -+}; -+ -+static int pci_dw_ecam_probe(struct platform_device *pdev) -+{ -+ return pci_host_common_probe(pdev, &pci_dw_ecam_bus_ops); -+} -+ -+static struct platform_driver pci_dw_ecam_driver = { -+ .driver.name = "pcie-designware-ecam", -+ .driver.of_match_table = pci_dw_ecam_of_match, -+ .driver.suppress_bind_attrs = true, -+ .probe = pci_dw_ecam_probe, -+}; -+builtin_platform_driver(pci_dw_ecam_driver); --- -cgit v1.1 - From e3dff048a10f16aa0fd32438442ce39558bbdbef Mon Sep 17 00:00:00 2001 From: Jassi Brar <jaswinder.singh@linaro.org> Date: Tue, 29 Aug 2017 22:45:59 +0530 |