tree 0a456358b5f919328e234868139c983813f4cb80
parent 90b54929b626c80056262d9d99b3f48522e404d0
author Ivan Kokshaysky <[EMAIL PROTECTED]> Wed, 15 Jun 2005 18:59:27 +0400
committer Greg Kroah-Hartman <[EMAIL PROTECTED]> Sat, 02 Jul 2005 03:35:50 -0700

[PATCH] PCI: pci_assign_unassigned_resources() on x86

- Add sanity check for io[port,mem]_resource in setup-bus.c. These
  resources look like "free" as they have no parents, but obviously
  we must not touch them.
- In i386.c:pci_allocate_bus_resources(), if a bridge resource cannot be
  allocated for some reason, then clear its flags. This prevents any child
  allocations in this range, so the setup-bus code will work with a clean
  resource sub-tree.
- i386.c:pcibios_enable_resources() doesn't enable bridges, as it checks
  only resources 0-5, which looks like a clear bug to me. I suspect it
  might break hotplug as well in some cases.

From: Ivan Kokshaysky <[EMAIL PROTECTED]>
Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>

 arch/i386/pci/common.c  |    1 +
 arch/i386/pci/i386.c    |   11 ++++++++---
 drivers/pci/setup-bus.c |    2 ++
 3 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/arch/i386/pci/common.c b/arch/i386/pci/common.c
--- a/arch/i386/pci/common.c
+++ b/arch/i386/pci/common.c
@@ -165,6 +165,7 @@ static int __init pcibios_init(void)
        if ((pci_probe & PCI_BIOS_SORT) && !(pci_probe & PCI_NO_SORT))
                pcibios_sort();
 #endif
+       pci_assign_unassigned_resources();
        return 0;
 }
 
diff --git a/arch/i386/pci/i386.c b/arch/i386/pci/i386.c
--- a/arch/i386/pci/i386.c
+++ b/arch/i386/pci/i386.c
@@ -106,11 +106,16 @@ static void __init pcibios_allocate_bus_
                if ((dev = bus->self)) {
                        for (idx = PCI_BRIDGE_RESOURCES; idx < 
PCI_NUM_RESOURCES; idx++) {
                                r = &dev->resource[idx];
-                               if (!r->start)
+                               if (!r->flags)
                                        continue;
                                pr = pci_find_parent_resource(dev, r);
-                               if (!pr || request_resource(pr, r) < 0)
+                               if (!r->start || !pr || request_resource(pr, r) 
< 0) {
                                        printk(KERN_ERR "PCI: Cannot allocate 
resource region %d of bridge %s\n", idx, pci_name(dev));
+                                       /* Something is wrong with the region.
+                                          Invalidate the resource to prevent 
child
+                                          resource allocations in this range. 
*/
+                                       r->flags = 0;
+                               }
                        }
                }
                pcibios_allocate_bus_resources(&bus->children);
@@ -227,7 +232,7 @@ int pcibios_enable_resources(struct pci_
 
        pci_read_config_word(dev, PCI_COMMAND, &cmd);
        old_cmd = cmd;
-       for(idx=0; idx<6; idx++) {
+       for(idx = 0; idx < PCI_NUM_RESOURCES; idx++) {
                /* Only set up the requested stuff */
                if (!(mask & (1<<idx)))
                        continue;
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -273,6 +273,8 @@ find_free_bus_resource(struct pci_bus *b
 
        for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) {
                r = bus->resource[i];
+               if (r == &ioport_resource || r == &iomem_resource)
+                       continue;
                if (r && (r->flags & type_mask) == type && !r->parent)
                        return r;
        }
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to