|
@@ -1423,6 +1423,74 @@ void pci_bus_assign_resources(const struct pci_bus *bus)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(pci_bus_assign_resources);
|
|
EXPORT_SYMBOL(pci_bus_assign_resources);
|
|
|
|
|
|
|
|
+static void pci_claim_device_resources(struct pci_dev *dev)
|
|
|
|
+{
|
|
|
|
+ int i;
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < PCI_BRIDGE_RESOURCES; i++) {
|
|
|
|
+ struct resource *r = &dev->resource[i];
|
|
|
|
+
|
|
|
|
+ if (!r->flags || r->parent)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ pci_claim_resource(dev, i);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void pci_claim_bridge_resources(struct pci_dev *dev)
|
|
|
|
+{
|
|
|
|
+ int i;
|
|
|
|
+
|
|
|
|
+ for (i = PCI_BRIDGE_RESOURCES; i < PCI_NUM_RESOURCES; i++) {
|
|
|
|
+ struct resource *r = &dev->resource[i];
|
|
|
|
+
|
|
|
|
+ if (!r->flags || r->parent)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ pci_claim_bridge_resource(dev, i);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void pci_bus_allocate_dev_resources(struct pci_bus *b)
|
|
|
|
+{
|
|
|
|
+ struct pci_dev *dev;
|
|
|
|
+ struct pci_bus *child;
|
|
|
|
+
|
|
|
|
+ list_for_each_entry(dev, &b->devices, bus_list) {
|
|
|
|
+ pci_claim_device_resources(dev);
|
|
|
|
+
|
|
|
|
+ child = dev->subordinate;
|
|
|
|
+ if (child)
|
|
|
|
+ pci_bus_allocate_dev_resources(child);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void pci_bus_allocate_resources(struct pci_bus *b)
|
|
|
|
+{
|
|
|
|
+ struct pci_bus *child;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Carry out a depth-first search on the PCI bus
|
|
|
|
+ * tree to allocate bridge apertures. Read the
|
|
|
|
+ * programmed bridge bases and recursively claim
|
|
|
|
+ * the respective bridge resources.
|
|
|
|
+ */
|
|
|
|
+ if (b->self) {
|
|
|
|
+ pci_read_bridge_bases(b);
|
|
|
|
+ pci_claim_bridge_resources(b->self);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ list_for_each_entry(child, &b->children, node)
|
|
|
|
+ pci_bus_allocate_resources(child);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void pci_bus_claim_resources(struct pci_bus *b)
|
|
|
|
+{
|
|
|
|
+ pci_bus_allocate_resources(b);
|
|
|
|
+ pci_bus_allocate_dev_resources(b);
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(pci_bus_claim_resources);
|
|
|
|
+
|
|
static void __pci_bridge_assign_resources(const struct pci_dev *bridge,
|
|
static void __pci_bridge_assign_resources(const struct pci_dev *bridge,
|
|
struct list_head *add_head,
|
|
struct list_head *add_head,
|
|
struct list_head *fail_head)
|
|
struct list_head *fail_head)
|