diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-11 21:50:26 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-11 21:50:26 -0500 |
commit | 7b67e751479d50b7f84d1a3cc5216eed5e534b66 (patch) | |
tree | a1a6746857cf65f04dde739fe271bf4143d55eaf /arch/powerpc | |
parent | 9f13a1fd452f11c18004ba2422a6384b424ec8a9 (diff) | |
parent | 76ccc297018d25d55b789bbd508861ef1e2cdb0c (diff) |
Merge branch 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci
* 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci: (80 commits)
x86/PCI: Expand the x86_msi_ops to have a restore MSIs.
PCI: Increase resource array mask bit size in pcim_iomap_regions()
PCI: DEVICE_COUNT_RESOURCE should be equal to PCI_NUM_RESOURCES
PCI: pci_ids: add device ids for STA2X11 device (aka ConneXT)
PNP: work around Dell 1536/1546 BIOS MMCONFIG bug that breaks USB
x86/PCI: amd: factor out MMCONFIG discovery
PCI: Enable ATS at the device state restore
PCI: msi: fix imbalanced refcount of msi irq sysfs objects
PCI: kconfig: English typo in pci/pcie/Kconfig
PCI/PM/Runtime: make PCI traces quieter
PCI: remove pci_create_bus()
xtensa/PCI: convert to pci_scan_root_bus() for correct root bus resources
x86/PCI: convert to pci_create_root_bus() and pci_scan_root_bus()
x86/PCI: use pci_scan_bus() instead of pci_scan_bus_parented()
x86/PCI: read Broadcom CNB20LE host bridge info before PCI scan
sparc32, leon/PCI: convert to pci_scan_root_bus() for correct root bus resources
sparc/PCI: convert to pci_create_root_bus()
sh/PCI: convert to pci_scan_root_bus() for correct root bus resources
powerpc/PCI: convert to pci_create_root_bus()
powerpc/PCI: split PHB part out of pcibios_map_io_space()
...
Fix up conflicts in drivers/pci/msi.c and include/linux/pci_regs.h due
to the same patches being applied in other branches.
Diffstat (limited to 'arch/powerpc')
-rw-r--r-- | arch/powerpc/include/asm/pci-bridge.h | 1 | ||||
-rw-r--r-- | arch/powerpc/include/asm/pci.h | 5 | ||||
-rw-r--r-- | arch/powerpc/kernel/pci-common.c | 30 | ||||
-rw-r--r-- | arch/powerpc/kernel/pci_64.c | 40 |
4 files changed, 40 insertions, 36 deletions
diff --git a/arch/powerpc/include/asm/pci-bridge.h b/arch/powerpc/include/asm/pci-bridge.h index 882b6aa6c857..5d487657322e 100644 --- a/arch/powerpc/include/asm/pci-bridge.h +++ b/arch/powerpc/include/asm/pci-bridge.h | |||
@@ -226,7 +226,6 @@ extern void pci_process_bridge_OF_ranges(struct pci_controller *hose, | |||
226 | /* Allocate & free a PCI host bridge structure */ | 226 | /* Allocate & free a PCI host bridge structure */ |
227 | extern struct pci_controller *pcibios_alloc_controller(struct device_node *dev); | 227 | extern struct pci_controller *pcibios_alloc_controller(struct device_node *dev); |
228 | extern void pcibios_free_controller(struct pci_controller *phb); | 228 | extern void pcibios_free_controller(struct pci_controller *phb); |
229 | extern void pcibios_setup_phb_resources(struct pci_controller *hose); | ||
230 | 229 | ||
231 | #ifdef CONFIG_PCI | 230 | #ifdef CONFIG_PCI |
232 | extern int pcibios_vaddr_is_ioport(void __iomem *address); | 231 | extern int pcibios_vaddr_is_ioport(void __iomem *address); |
diff --git a/arch/powerpc/include/asm/pci.h b/arch/powerpc/include/asm/pci.h index 1c92013466e3..f54b3d26ce9d 100644 --- a/arch/powerpc/include/asm/pci.h +++ b/arch/powerpc/include/asm/pci.h | |||
@@ -46,11 +46,6 @@ struct pci_dev; | |||
46 | #define pcibios_assign_all_busses() \ | 46 | #define pcibios_assign_all_busses() \ |
47 | (pci_has_flag(PCI_REASSIGN_ALL_BUS)) | 47 | (pci_has_flag(PCI_REASSIGN_ALL_BUS)) |
48 | 48 | ||
49 | static inline void pcibios_set_master(struct pci_dev *dev) | ||
50 | { | ||
51 | /* No special bus mastering setup handling */ | ||
52 | } | ||
53 | |||
54 | static inline void pcibios_penalize_isa_irq(int irq, int active) | 49 | static inline void pcibios_penalize_isa_irq(int irq, int active) |
55 | { | 50 | { |
56 | /* We don't do dynamic PCI IRQ allocation */ | 51 | /* We don't do dynamic PCI IRQ allocation */ |
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index fa4a573d6716..cce98d76e905 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c | |||
@@ -1131,6 +1131,11 @@ void __devinit pcibios_setup_bus_devices(struct pci_bus *bus) | |||
1131 | } | 1131 | } |
1132 | } | 1132 | } |
1133 | 1133 | ||
1134 | void pcibios_set_master(struct pci_dev *dev) | ||
1135 | { | ||
1136 | /* No special bus mastering setup handling */ | ||
1137 | } | ||
1138 | |||
1134 | void __devinit pcibios_fixup_bus(struct pci_bus *bus) | 1139 | void __devinit pcibios_fixup_bus(struct pci_bus *bus) |
1135 | { | 1140 | { |
1136 | /* When called from the generic PCI probe, read PCI<->PCI bridge | 1141 | /* When called from the generic PCI probe, read PCI<->PCI bridge |
@@ -1560,14 +1565,13 @@ int pcibios_enable_device(struct pci_dev *dev, int mask) | |||
1560 | return pci_enable_resources(dev, mask); | 1565 | return pci_enable_resources(dev, mask); |
1561 | } | 1566 | } |
1562 | 1567 | ||
1563 | void __devinit pcibios_setup_phb_resources(struct pci_controller *hose) | 1568 | static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, struct list_head *resources) |
1564 | { | 1569 | { |
1565 | struct pci_bus *bus = hose->bus; | ||
1566 | struct resource *res; | 1570 | struct resource *res; |
1567 | int i; | 1571 | int i; |
1568 | 1572 | ||
1569 | /* Hookup PHB IO resource */ | 1573 | /* Hookup PHB IO resource */ |
1570 | bus->resource[0] = res = &hose->io_resource; | 1574 | res = &hose->io_resource; |
1571 | 1575 | ||
1572 | if (!res->flags) { | 1576 | if (!res->flags) { |
1573 | printk(KERN_WARNING "PCI: I/O resource not set for host" | 1577 | printk(KERN_WARNING "PCI: I/O resource not set for host" |
@@ -1585,6 +1589,7 @@ void __devinit pcibios_setup_phb_resources(struct pci_controller *hose) | |||
1585 | (unsigned long long)res->start, | 1589 | (unsigned long long)res->start, |
1586 | (unsigned long long)res->end, | 1590 | (unsigned long long)res->end, |
1587 | (unsigned long)res->flags); | 1591 | (unsigned long)res->flags); |
1592 | pci_add_resource(resources, res); | ||
1588 | 1593 | ||
1589 | /* Hookup PHB Memory resources */ | 1594 | /* Hookup PHB Memory resources */ |
1590 | for (i = 0; i < 3; ++i) { | 1595 | for (i = 0; i < 3; ++i) { |
@@ -1602,12 +1607,12 @@ void __devinit pcibios_setup_phb_resources(struct pci_controller *hose) | |||
1602 | res->flags = IORESOURCE_MEM; | 1607 | res->flags = IORESOURCE_MEM; |
1603 | #endif /* CONFIG_PPC32 */ | 1608 | #endif /* CONFIG_PPC32 */ |
1604 | } | 1609 | } |
1605 | bus->resource[i+1] = res; | ||
1606 | 1610 | ||
1607 | pr_debug("PCI: PHB MEM resource %d = %016llx-%016llx [%lx]\n", i, | 1611 | pr_debug("PCI: PHB MEM resource %d = %016llx-%016llx [%lx]\n", i, |
1608 | (unsigned long long)res->start, | 1612 | (unsigned long long)res->start, |
1609 | (unsigned long long)res->end, | 1613 | (unsigned long long)res->end, |
1610 | (unsigned long)res->flags); | 1614 | (unsigned long)res->flags); |
1615 | pci_add_resource(resources, res); | ||
1611 | } | 1616 | } |
1612 | 1617 | ||
1613 | pr_debug("PCI: PHB MEM offset = %016llx\n", | 1618 | pr_debug("PCI: PHB MEM offset = %016llx\n", |
@@ -1701,6 +1706,7 @@ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus) | |||
1701 | */ | 1706 | */ |
1702 | void __devinit pcibios_scan_phb(struct pci_controller *hose) | 1707 | void __devinit pcibios_scan_phb(struct pci_controller *hose) |
1703 | { | 1708 | { |
1709 | LIST_HEAD(resources); | ||
1704 | struct pci_bus *bus; | 1710 | struct pci_bus *bus; |
1705 | struct device_node *node = hose->dn; | 1711 | struct device_node *node = hose->dn; |
1706 | int mode; | 1712 | int mode; |
@@ -1708,22 +1714,24 @@ void __devinit pcibios_scan_phb(struct pci_controller *hose) | |||
1708 | pr_debug("PCI: Scanning PHB %s\n", | 1714 | pr_debug("PCI: Scanning PHB %s\n", |
1709 | node ? node->full_name : "<NO NAME>"); | 1715 | node ? node->full_name : "<NO NAME>"); |
1710 | 1716 | ||
1717 | /* Get some IO space for the new PHB */ | ||
1718 | pcibios_setup_phb_io_space(hose); | ||
1719 | |||
1720 | /* Wire up PHB bus resources */ | ||
1721 | pcibios_setup_phb_resources(hose, &resources); | ||
1722 | |||
1711 | /* Create an empty bus for the toplevel */ | 1723 | /* Create an empty bus for the toplevel */ |
1712 | bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, hose); | 1724 | bus = pci_create_root_bus(hose->parent, hose->first_busno, |
1725 | hose->ops, hose, &resources); | ||
1713 | if (bus == NULL) { | 1726 | if (bus == NULL) { |
1714 | pr_err("Failed to create bus for PCI domain %04x\n", | 1727 | pr_err("Failed to create bus for PCI domain %04x\n", |
1715 | hose->global_number); | 1728 | hose->global_number); |
1729 | pci_free_resource_list(&resources); | ||
1716 | return; | 1730 | return; |
1717 | } | 1731 | } |
1718 | bus->secondary = hose->first_busno; | 1732 | bus->secondary = hose->first_busno; |
1719 | hose->bus = bus; | 1733 | hose->bus = bus; |
1720 | 1734 | ||
1721 | /* Get some IO space for the new PHB */ | ||
1722 | pcibios_setup_phb_io_space(hose); | ||
1723 | |||
1724 | /* Wire up PHB bus resources */ | ||
1725 | pcibios_setup_phb_resources(hose); | ||
1726 | |||
1727 | /* Get probe mode and perform scan */ | 1735 | /* Get probe mode and perform scan */ |
1728 | mode = PCI_PROBE_NORMAL; | 1736 | mode = PCI_PROBE_NORMAL; |
1729 | if (node && ppc_md.pci_probe_mode) | 1737 | if (node && ppc_md.pci_probe_mode) |
diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c index bcf4bf9e72d9..3318d39b7d4c 100644 --- a/arch/powerpc/kernel/pci_64.c +++ b/arch/powerpc/kernel/pci_64.c | |||
@@ -131,30 +131,13 @@ EXPORT_SYMBOL_GPL(pcibios_unmap_io_space); | |||
131 | 131 | ||
132 | #endif /* CONFIG_HOTPLUG */ | 132 | #endif /* CONFIG_HOTPLUG */ |
133 | 133 | ||
134 | int __devinit pcibios_map_io_space(struct pci_bus *bus) | 134 | static int __devinit pcibios_map_phb_io_space(struct pci_controller *hose) |
135 | { | 135 | { |
136 | struct vm_struct *area; | 136 | struct vm_struct *area; |
137 | unsigned long phys_page; | 137 | unsigned long phys_page; |
138 | unsigned long size_page; | 138 | unsigned long size_page; |
139 | unsigned long io_virt_offset; | 139 | unsigned long io_virt_offset; |
140 | struct pci_controller *hose; | ||
141 | |||
142 | WARN_ON(bus == NULL); | ||
143 | |||
144 | /* If this not a PHB, nothing to do, page tables still exist and | ||
145 | * thus HPTEs will be faulted in when needed | ||
146 | */ | ||
147 | if (bus->self) { | ||
148 | pr_debug("IO mapping for PCI-PCI bridge %s\n", | ||
149 | pci_name(bus->self)); | ||
150 | pr_debug(" virt=0x%016llx...0x%016llx\n", | ||
151 | bus->resource[0]->start + _IO_BASE, | ||
152 | bus->resource[0]->end + _IO_BASE); | ||
153 | return 0; | ||
154 | } | ||
155 | 140 | ||
156 | /* Get the host bridge */ | ||
157 | hose = pci_bus_to_host(bus); | ||
158 | phys_page = _ALIGN_DOWN(hose->io_base_phys, PAGE_SIZE); | 141 | phys_page = _ALIGN_DOWN(hose->io_base_phys, PAGE_SIZE); |
159 | size_page = _ALIGN_UP(hose->pci_io_size, PAGE_SIZE); | 142 | size_page = _ALIGN_UP(hose->pci_io_size, PAGE_SIZE); |
160 | 143 | ||
@@ -198,11 +181,30 @@ int __devinit pcibios_map_io_space(struct pci_bus *bus) | |||
198 | 181 | ||
199 | return 0; | 182 | return 0; |
200 | } | 183 | } |
184 | |||
185 | int __devinit pcibios_map_io_space(struct pci_bus *bus) | ||
186 | { | ||
187 | WARN_ON(bus == NULL); | ||
188 | |||
189 | /* If this not a PHB, nothing to do, page tables still exist and | ||
190 | * thus HPTEs will be faulted in when needed | ||
191 | */ | ||
192 | if (bus->self) { | ||
193 | pr_debug("IO mapping for PCI-PCI bridge %s\n", | ||
194 | pci_name(bus->self)); | ||
195 | pr_debug(" virt=0x%016llx...0x%016llx\n", | ||
196 | bus->resource[0]->start + _IO_BASE, | ||
197 | bus->resource[0]->end + _IO_BASE); | ||
198 | return 0; | ||
199 | } | ||
200 | |||
201 | return pcibios_map_phb_io_space(pci_bus_to_host(bus)); | ||
202 | } | ||
201 | EXPORT_SYMBOL_GPL(pcibios_map_io_space); | 203 | EXPORT_SYMBOL_GPL(pcibios_map_io_space); |
202 | 204 | ||
203 | void __devinit pcibios_setup_phb_io_space(struct pci_controller *hose) | 205 | void __devinit pcibios_setup_phb_io_space(struct pci_controller *hose) |
204 | { | 206 | { |
205 | pcibios_map_io_space(hose->bus); | 207 | pcibios_map_phb_io_space(hose); |
206 | } | 208 | } |
207 | 209 | ||
208 | #define IOBASE_BRIDGE_NUMBER 0 | 210 | #define IOBASE_BRIDGE_NUMBER 0 |