aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjorn Helgaas <bhelgaas@google.com>2014-02-18 17:50:12 -0500
committerBjorn Helgaas <bhelgaas@google.com>2014-02-18 17:50:12 -0500
commitec5130ba7907a2ad30a595c7d64fd629c69d3a66 (patch)
tree0f15afcd416494ea12ff0208f94594e889252f3f
parent6354647f55b9848dc9aaa091e2f762ca1a3eb085 (diff)
parent2613ba480fb7b40c67eea36d03c9946977828623 (diff)
Merge branch 'pci/host-mvebu' into next
* pci/host-mvebu: PCI: mvebu: Call request_resource() on the apertures bus: mvebu-mbus: Fix incorrect size for PCI aperture resources PCI: mvebu: Fix potential issue in range parsing PCI: mvebu: Use Device ID and revision from underlying endpoint
-rw-r--r--drivers/bus/mvebu-mbus.c4
-rw-r--r--drivers/pci/host/pci-mvebu.c37
2 files changed, 28 insertions, 13 deletions
diff --git a/drivers/bus/mvebu-mbus.c b/drivers/bus/mvebu-mbus.c
index 725c46162bbd..2ac754e18bcf 100644
--- a/drivers/bus/mvebu-mbus.c
+++ b/drivers/bus/mvebu-mbus.c
@@ -870,14 +870,14 @@ static void __init mvebu_mbus_get_pcie_resources(struct device_node *np,
870 ret = of_property_read_u32_array(np, "pcie-mem-aperture", reg, ARRAY_SIZE(reg)); 870 ret = of_property_read_u32_array(np, "pcie-mem-aperture", reg, ARRAY_SIZE(reg));
871 if (!ret) { 871 if (!ret) {
872 mem->start = reg[0]; 872 mem->start = reg[0];
873 mem->end = mem->start + reg[1]; 873 mem->end = mem->start + reg[1] - 1;
874 mem->flags = IORESOURCE_MEM; 874 mem->flags = IORESOURCE_MEM;
875 } 875 }
876 876
877 ret = of_property_read_u32_array(np, "pcie-io-aperture", reg, ARRAY_SIZE(reg)); 877 ret = of_property_read_u32_array(np, "pcie-io-aperture", reg, ARRAY_SIZE(reg));
878 if (!ret) { 878 if (!ret) {
879 io->start = reg[0]; 879 io->start = reg[0];
880 io->end = io->start + reg[1]; 880 io->end = io->start + reg[1] - 1;
881 io->flags = IORESOURCE_IO; 881 io->flags = IORESOURCE_IO;
882 } 882 }
883} 883}
diff --git a/drivers/pci/host/pci-mvebu.c b/drivers/pci/host/pci-mvebu.c
index 13478ecd4113..d3d1cfd51e09 100644
--- a/drivers/pci/host/pci-mvebu.c
+++ b/drivers/pci/host/pci-mvebu.c
@@ -60,14 +60,6 @@
60#define PCIE_DEBUG_CTRL 0x1a60 60#define PCIE_DEBUG_CTRL 0x1a60
61#define PCIE_DEBUG_SOFT_RESET BIT(20) 61#define PCIE_DEBUG_SOFT_RESET BIT(20)
62 62
63/*
64 * This product ID is registered by Marvell, and used when the Marvell
65 * SoC is not the root complex, but an endpoint on the PCIe bus. It is
66 * therefore safe to re-use this PCI ID for our emulated PCI-to-PCI
67 * bridge.
68 */
69#define MARVELL_EMULATED_PCI_PCI_BRIDGE_ID 0x7846
70
71/* PCI configuration space of a PCI-to-PCI bridge */ 63/* PCI configuration space of a PCI-to-PCI bridge */
72struct mvebu_sw_pci_bridge { 64struct mvebu_sw_pci_bridge {
73 u16 vendor; 65 u16 vendor;
@@ -109,7 +101,9 @@ struct mvebu_pcie {
109 struct mvebu_pcie_port *ports; 101 struct mvebu_pcie_port *ports;
110 struct msi_chip *msi; 102 struct msi_chip *msi;
111 struct resource io; 103 struct resource io;
104 char io_name[30];
112 struct resource realio; 105 struct resource realio;
106 char mem_name[30];
113 struct resource mem; 107 struct resource mem;
114 struct resource busn; 108 struct resource busn;
115 int nports; 109 int nports;
@@ -388,7 +382,8 @@ static void mvebu_sw_pci_bridge_init(struct mvebu_pcie_port *port)
388 382
389 bridge->class = PCI_CLASS_BRIDGE_PCI; 383 bridge->class = PCI_CLASS_BRIDGE_PCI;
390 bridge->vendor = PCI_VENDOR_ID_MARVELL; 384 bridge->vendor = PCI_VENDOR_ID_MARVELL;
391 bridge->device = MARVELL_EMULATED_PCI_PCI_BRIDGE_ID; 385 bridge->device = mvebu_readl(port, PCIE_DEV_ID_OFF) >> 16;
386 bridge->revision = mvebu_readl(port, PCIE_DEV_REV_OFF) & 0xff;
392 bridge->header_type = PCI_HEADER_TYPE_BRIDGE; 387 bridge->header_type = PCI_HEADER_TYPE_BRIDGE;
393 bridge->cache_line_size = 0x10; 388 bridge->cache_line_size = 0x10;
394 389
@@ -679,10 +674,30 @@ static int mvebu_pcie_setup(int nr, struct pci_sys_data *sys)
679{ 674{
680 struct mvebu_pcie *pcie = sys_to_pcie(sys); 675 struct mvebu_pcie *pcie = sys_to_pcie(sys);
681 int i; 676 int i;
677 int domain = 0;
678
679#ifdef CONFIG_PCI_DOMAINS
680 domain = sys->domain;
681#endif
682
683 snprintf(pcie->mem_name, sizeof(pcie->mem_name), "PCI MEM %04x",
684 domain);
685 pcie->mem.name = pcie->mem_name;
682 686
683 if (resource_size(&pcie->realio) != 0) 687 snprintf(pcie->io_name, sizeof(pcie->io_name), "PCI I/O %04x", domain);
688 pcie->realio.name = pcie->io_name;
689
690 if (request_resource(&iomem_resource, &pcie->mem))
691 return 0;
692
693 if (resource_size(&pcie->realio) != 0) {
694 if (request_resource(&ioport_resource, &pcie->realio)) {
695 release_resource(&pcie->mem);
696 return 0;
697 }
684 pci_add_resource_offset(&sys->resources, &pcie->realio, 698 pci_add_resource_offset(&sys->resources, &pcie->realio,
685 sys->io_offset); 699 sys->io_offset);
700 }
686 pci_add_resource_offset(&sys->resources, &pcie->mem, sys->mem_offset); 701 pci_add_resource_offset(&sys->resources, &pcie->mem, sys->mem_offset);
687 pci_add_resource(&sys->resources, &pcie->busn); 702 pci_add_resource(&sys->resources, &pcie->busn);
688 703
@@ -804,7 +819,7 @@ static int mvebu_get_tgt_attr(struct device_node *np, int devfn,
804 819
805 for (i = 0; i < nranges; i++) { 820 for (i = 0; i < nranges; i++) {
806 u32 flags = of_read_number(range, 1); 821 u32 flags = of_read_number(range, 1);
807 u32 slot = of_read_number(range, 2); 822 u32 slot = of_read_number(range + 1, 1);
808 u64 cpuaddr = of_read_number(range + na, pna); 823 u64 cpuaddr = of_read_number(range + na, pna);
809 unsigned long rtype; 824 unsigned long rtype;
810 825