diff options
author | Bjorn Helgaas <bhelgaas@google.com> | 2014-02-18 17:50:12 -0500 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2014-02-18 17:50:12 -0500 |
commit | ec5130ba7907a2ad30a595c7d64fd629c69d3a66 (patch) | |
tree | 0f15afcd416494ea12ff0208f94594e889252f3f | |
parent | 6354647f55b9848dc9aaa091e2f762ca1a3eb085 (diff) | |
parent | 2613ba480fb7b40c67eea36d03c9946977828623 (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.c | 4 | ||||
-rw-r--r-- | drivers/pci/host/pci-mvebu.c | 37 |
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 */ |
72 | struct mvebu_sw_pci_bridge { | 64 | struct 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 | ||