|
@@ -487,45 +487,39 @@ int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int is_valid_resource(struct pci_dev *dev, int idx)
|
|
|
+void pcibios_fixup_device_resources(struct pci_dev *dev)
|
|
|
{
|
|
|
- unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM;
|
|
|
- struct resource *devr = &dev->resource[idx], *busr;
|
|
|
+ int idx;
|
|
|
|
|
|
if (!dev->bus)
|
|
|
- return 0;
|
|
|
-
|
|
|
- pci_bus_for_each_resource(dev->bus, busr, i) {
|
|
|
- if (!busr || ((busr->flags ^ devr->flags) & type_mask))
|
|
|
- continue;
|
|
|
- if ((devr->start) && (devr->start >= busr->start) &&
|
|
|
- (devr->end <= busr->end))
|
|
|
- return 1;
|
|
|
- }
|
|
|
- return 0;
|
|
|
-}
|
|
|
+ return;
|
|
|
|
|
|
-static void pcibios_fixup_resources(struct pci_dev *dev, int start, int limit)
|
|
|
-{
|
|
|
- int i;
|
|
|
+ for (idx = 0; idx < PCI_BRIDGE_RESOURCES; idx++) {
|
|
|
+ struct resource *r = &dev->resource[idx];
|
|
|
|
|
|
- for (i = start; i < limit; i++) {
|
|
|
- if (!dev->resource[i].flags)
|
|
|
+ if (!r->flags || r->parent || !r->start)
|
|
|
continue;
|
|
|
- if ((is_valid_resource(dev, i)))
|
|
|
- pci_claim_resource(dev, i);
|
|
|
- }
|
|
|
-}
|
|
|
|
|
|
-void pcibios_fixup_device_resources(struct pci_dev *dev)
|
|
|
-{
|
|
|
- pcibios_fixup_resources(dev, 0, PCI_BRIDGE_RESOURCES);
|
|
|
+ pci_claim_resource(dev, idx);
|
|
|
+ }
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(pcibios_fixup_device_resources);
|
|
|
|
|
|
static void pcibios_fixup_bridge_resources(struct pci_dev *dev)
|
|
|
{
|
|
|
- pcibios_fixup_resources(dev, PCI_BRIDGE_RESOURCES, PCI_NUM_RESOURCES);
|
|
|
+ int idx;
|
|
|
+
|
|
|
+ if (!dev->bus)
|
|
|
+ return;
|
|
|
+
|
|
|
+ for (idx = PCI_BRIDGE_RESOURCES; idx < PCI_NUM_RESOURCES; idx++) {
|
|
|
+ struct resource *r = &dev->resource[idx];
|
|
|
+
|
|
|
+ if (!r->flags || r->parent || !r->start)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ pci_claim_bridge_resource(dev, idx);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/*
|