|
@@ -39,8 +39,12 @@ static void pcibios_scanbus(struct pci_channel *hose)
|
|
|
LIST_HEAD(resources);
|
|
|
struct resource *res;
|
|
|
resource_size_t offset;
|
|
|
- int i;
|
|
|
- struct pci_bus *bus;
|
|
|
+ int i, ret;
|
|
|
+ struct pci_host_bridge *bridge;
|
|
|
+
|
|
|
+ bridge = pci_alloc_host_bridge(0);
|
|
|
+ if (!bridge)
|
|
|
+ return;
|
|
|
|
|
|
for (i = 0; i < hose->nr_resources; i++) {
|
|
|
res = hose->resources + i;
|
|
@@ -52,19 +56,26 @@ static void pcibios_scanbus(struct pci_channel *hose)
|
|
|
pci_add_resource_offset(&resources, res, offset);
|
|
|
}
|
|
|
|
|
|
- bus = pci_scan_root_bus(NULL, next_busno, hose->pci_ops, hose,
|
|
|
- &resources);
|
|
|
- hose->bus = bus;
|
|
|
+ list_splice_init(&resources, &bridge->windows);
|
|
|
+ bridge->dev.parent = NULL;
|
|
|
+ bridge->sysdata = hose;
|
|
|
+ bridge->busnr = next_busno;
|
|
|
+ bridge->ops = hose->pci_ops;
|
|
|
+ bridge->swizzle_irq = pci_common_swizzle;
|
|
|
+ bridge->map_irq = pcibios_map_platform_irq;
|
|
|
+
|
|
|
+ ret = pci_scan_root_bus_bridge(bridge);
|
|
|
+ if (ret) {
|
|
|
+ pci_free_host_bridge(bridge);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ hose->bus = bridge->bus;
|
|
|
|
|
|
need_domain_info = need_domain_info || hose->index;
|
|
|
hose->need_domain_info = need_domain_info;
|
|
|
|
|
|
- if (!bus) {
|
|
|
- pci_free_resource_list(&resources);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- next_busno = bus->busn_res.end + 1;
|
|
|
+ next_busno = hose->bus->busn_res.end + 1;
|
|
|
/* Don't allow 8-bit bus number overflow inside the hose -
|
|
|
reserve some space for bridges. */
|
|
|
if (next_busno > 224) {
|
|
@@ -72,9 +83,9 @@ static void pcibios_scanbus(struct pci_channel *hose)
|
|
|
need_domain_info = 1;
|
|
|
}
|
|
|
|
|
|
- pci_bus_size_bridges(bus);
|
|
|
- pci_bus_assign_resources(bus);
|
|
|
- pci_bus_add_devices(bus);
|
|
|
+ pci_bus_size_bridges(hose->bus);
|
|
|
+ pci_bus_assign_resources(hose->bus);
|
|
|
+ pci_bus_add_devices(hose->bus);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -144,8 +155,6 @@ static int __init pcibios_init(void)
|
|
|
for (hose = hose_head; hose; hose = hose->next)
|
|
|
pcibios_scanbus(hose);
|
|
|
|
|
|
- pci_fixup_irqs(pci_common_swizzle, pcibios_map_platform_irq);
|
|
|
-
|
|
|
dma_debug_add_bus(&pci_bus_type);
|
|
|
|
|
|
pci_initialized = 1;
|