Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=fb0f2b40faff41f03acaa2ee6e6231fc96ca497c
Commit:     fb0f2b40faff41f03acaa2ee6e6231fc96ca497c
Parent:     7e7a43c32a8970ea2bfc3d1af353dcb1a9237769
Author:     Ralf Baechle <[EMAIL PROTECTED]>
AuthorDate: Tue Dec 19 13:12:08 2006 -0800
Committer:  Greg Kroah-Hartman <[EMAIL PROTECTED]>
CommitDate: Wed Dec 20 10:54:43 2006 -0800

    PCI legacy resource fix
    
    Since commit 368c73d4f689dae0807d0a2aa74c61fd2b9b075f the kernel will try
    to update the non-writeable BAR registers 0..3 of PIIX4 IDE adapters if
    pci_assign_unassigned_resources() is used to do full resource assignment of
    the bus.  This fails because in the PIIX4 these BAR registers have
    implicitly assumed values and read back as zero; it used to work because
    the kernel used to just write zero to that register the read back value did
    match what was written.
    
    The fix is a new resource flag IORESOURCE_PCI_FIXED used to mark a resource
    as non-movable.  This will also be useful to keep other import system
    resources from being moved around - for example system consoles on PCI
    busses.
    
    [EMAIL PROTECTED]: cleanup]
    Signed-off-by: Ralf Baechle <[EMAIL PROTECTED]>
    Acked-by: Alan Cox <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>
---
 drivers/pci/probe.c     |   11 +++++++----
 drivers/pci/setup-res.c |   19 +++++++++++++++++--
 include/linux/ioport.h  |    3 +++
 3 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 6a3c1e7..1ae9c3f 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -649,6 +649,9 @@ static void pci_read_irq(struct pci_dev *dev)
  * Returns 0 on success and -1 if unknown type of device (not normal, bridge
  * or CardBus).
  */
+
+#define LEGACY_IO_RESOURCE     (IORESOURCE_IO | IORESOURCE_PCI_FIXED)
+
 static int pci_setup_device(struct pci_dev * dev)
 {
        u32 class;
@@ -692,18 +695,18 @@ static int pci_setup_device(struct pci_dev * dev)
                        if ((progif & 1) == 0) {
                                dev->resource[0].start = 0x1F0;
                                dev->resource[0].end = 0x1F7;
-                               dev->resource[0].flags = IORESOURCE_IO;
+                               dev->resource[0].flags = LEGACY_IO_RESOURCE;
                                dev->resource[1].start = 0x3F6;
                                dev->resource[1].end = 0x3F6;
-                               dev->resource[1].flags = IORESOURCE_IO;
+                               dev->resource[1].flags = LEGACY_IO_RESOURCE;
                        }
                        if ((progif & 4) == 0) {
                                dev->resource[2].start = 0x170;
                                dev->resource[2].end = 0x177;
-                               dev->resource[2].flags = IORESOURCE_IO;
+                               dev->resource[2].flags = LEGACY_IO_RESOURCE;
                                dev->resource[3].start = 0x376;
                                dev->resource[3].end = 0x376;
-                               dev->resource[3].flags = IORESOURCE_IO;
+                               dev->resource[3].flags = LEGACY_IO_RESOURCE;
                        }
                }
                break;
diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c
index ab78e4b..cb4ced3 100644
--- a/drivers/pci/setup-res.c
+++ b/drivers/pci/setup-res.c
@@ -33,11 +33,22 @@ pci_update_resource(struct pci_dev *dev, struct resource 
*res, int resno)
        u32 new, check, mask;
        int reg;
 
-       /* Ignore resources for unimplemented BARs and unused resource slots
-          for 64 bit BARs. */
+       /*
+        * Ignore resources for unimplemented BARs and unused resource slots
+        * for 64 bit BARs.
+        */
        if (!res->flags)
                return;
 
+       /*
+        * Ignore non-moveable resources.  This might be legacy resources for
+        * which no functional BAR register exists or another important
+        * system resource we should better not move around in system address
+        * space.
+        */
+       if (res->flags & IORESOURCE_PCI_FIXED)
+               return;
+
        pcibios_resource_to_bus(dev, &region, res);
 
        pr_debug("  got res [%llx:%llx] bus [%lx:%lx] flags %lx for "
@@ -212,6 +223,10 @@ pdev_sort_resources(struct pci_dev *dev, struct 
resource_list *head)
                resource_size_t r_align;
 
                r = &dev->resource[i];
+
+               if (r->flags & IORESOURCE_PCI_FIXED)
+                       continue;
+
                r_align = r->end - r->start;
                
                if (!(r->flags) || r->parent)
diff --git a/include/linux/ioport.h b/include/linux/ioport.h
index cf8696d..15228d7 100644
--- a/include/linux/ioport.h
+++ b/include/linux/ioport.h
@@ -91,6 +91,9 @@ struct resource_list {
 #define IORESOURCE_ROM_COPY            (1<<2)  /* ROM is alloc'd copy, 
resource field overlaid */
 #define IORESOURCE_ROM_BIOS_COPY       (1<<3)  /* ROM is BIOS copy, resource 
field overlaid */
 
+/* PCI control bits.  Shares IORESOURCE_BITS with above PCI ROM.  */
+#define IORESOURCE_PCI_FIXED           (1<<4)  /* Do not move resource */
+
 /* PC/ISA/whatever - the normal PC address spaces: IO and memory */
 extern struct resource ioport_resource;
 extern struct resource iomem_resource;
-
To unsubscribe from this list: send the line "unsubscribe git-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