]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Add Ivan's fix for pci_assign_unassigned_resources (prod from Linus).
authorChris Wright <chrisw@osdl.org>
Mon, 5 Sep 2005 18:30:42 +0000 (11:30 -0700)
committerChris Wright <chrisw@osdl.org>
Mon, 5 Sep 2005 18:30:42 +0000 (11:30 -0700)
queue/pci_assign_unassigned_resources-update.patch [new file with mode: 0644]
queue/series

diff --git a/queue/pci_assign_unassigned_resources-update.patch b/queue/pci_assign_unassigned_resources-update.patch
new file mode 100644 (file)
index 0000000..239f632
--- /dev/null
@@ -0,0 +1,134 @@
+From stable-bounces@linux.kernel.org  Mon Sep  5 07:12:23 2005
+Date: Mon, 5 Sep 2005 07:12:21 -0700 (PDT)
+From: Linus Torvalds <torvalds@osdl.org>
+To: stable@kernel.org
+Subject: [PATCH] x86: pci_assign_unassigned_resources() update
+
+From: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
+
+I had some time to think about PCI assign issues in 2.6.13-rc series.
+
+The major problem here is that we call pci_assign_unassigned_resources()
+way too early - at subsys_initcall level. Therefore we give no chances
+to ACPI and PnP routines (called at fs_initcall level) to reserve their
+respective resources properly, as the comments in drivers/pnp/system.c
+and drivers/acpi/motherboard.c suggest:
+
+ /**
+  * Reserve motherboard resources after PCI claim BARs,
+  * but before PCI assign resources for uninitialized PCI devices
+  */
+
+So I moved the pci_assign_unassigned_resources() call to
+pcibios_assign_resources() (fs_initcall), which should hopefully fix a
+lot of problems and make PCIBIOS_MIN_IO tweaks unnecessary.
+
+Other changes:
+- remove resource assignment code from pcibios_assign_resources(), since
+  it duplicates pci_assign_unassigned_resources() functionality and
+  actually does nothing in 2.6.13;
+- modify ROM assignment code as per Ben's suggestion: try to use firmware
+  settings by default (if PCI_ASSIGN_ROMS is not set);
+- set CARDBUS_IO_SIZE back to 4K as it's a wonderful stress test for
+  various setups.
+
+Confirmed by Tero Roponen <teanropo@cc.jyu.fi> (who had problems with
+the 4kB CardBus IO size previously).
+
+Signed-off-by: Linus Torvalds <torvalds@osdl.org>
+Signed-off-by: Chris Wright <chrisw@osdl.org>
+---
+ arch/i386/pci/common.c  |    1 
+ arch/i386/pci/i386.c    |   49 +++++++++++++++---------------------------------
+ drivers/pci/setup-bus.c |    2 -
+ 3 files changed, 17 insertions(+), 35 deletions(-)
+
+Index: linux-2.6.13.y/arch/i386/pci/common.c
+===================================================================
+--- linux-2.6.13.y.orig/arch/i386/pci/common.c
++++ linux-2.6.13.y/arch/i386/pci/common.c
+@@ -165,7 +165,6 @@ 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;
+ }
+Index: linux-2.6.13.y/arch/i386/pci/i386.c
+===================================================================
+--- linux-2.6.13.y.orig/arch/i386/pci/i386.c
++++ linux-2.6.13.y/arch/i386/pci/i386.c
+@@ -170,43 +170,26 @@ static void __init pcibios_allocate_reso
+ static int __init pcibios_assign_resources(void)
+ {
+       struct pci_dev *dev = NULL;
+-      int idx;
+-      struct resource *r;
++      struct resource *r, *pr;
+-      for_each_pci_dev(dev) {
+-              int class = dev->class >> 8;
+-
+-              /* Don't touch classless devices and host bridges */
+-              if (!class || class == PCI_CLASS_BRIDGE_HOST)
+-                      continue;
+-
+-              for(idx=0; idx<6; idx++) {
+-                      r = &dev->resource[idx];
+-
+-                      /*
+-                       *  Don't touch IDE controllers and I/O ports of video cards!
+-                       */
+-                      if ((class == PCI_CLASS_STORAGE_IDE && idx < 4) ||
+-                          (class == PCI_CLASS_DISPLAY_VGA && (r->flags & IORESOURCE_IO)))
+-                              continue;
+-
+-                      /*
+-                       *  We shall assign a new address to this resource, either because
+-                       *  the BIOS forgot to do so or because we have decided the old
+-                       *  address was unusable for some reason.
+-                       */
+-                      if (!r->start && r->end)
+-                              pci_assign_resource(dev, idx);
+-              }
+-
+-              if (pci_probe & PCI_ASSIGN_ROMS) {
++      if (!(pci_probe & PCI_ASSIGN_ROMS)) {
++              /* Try to use BIOS settings for ROMs, otherwise let
++                 pci_assign_unassigned_resources() allocate the new
++                 addresses. */
++              for_each_pci_dev(dev) {
+                       r = &dev->resource[PCI_ROM_RESOURCE];
+-                      r->end -= r->start;
+-                      r->start = 0;
+-                      if (r->end)
+-                              pci_assign_resource(dev, PCI_ROM_RESOURCE);
++                      if (!r->flags || !r->start)
++                              continue;
++                      pr = pci_find_parent_resource(dev, r);
++                      if (!pr || request_resource(pr, r) < 0) {
++                              r->end -= r->start;
++                              r->start = 0;
++                      }
+               }
+       }
++
++      pci_assign_unassigned_resources();
++
+       return 0;
+ }
+Index: linux-2.6.13.y/drivers/pci/setup-bus.c
+===================================================================
+--- linux-2.6.13.y.orig/drivers/pci/setup-bus.c
++++ linux-2.6.13.y/drivers/pci/setup-bus.c
+@@ -40,7 +40,7 @@
+  * FIXME: IO should be max 256 bytes.  However, since we may
+  * have a P2P bridge below a cardbus bridge, we need 4K.
+  */
+-#define CARDBUS_IO_SIZE               (256)
++#define CARDBUS_IO_SIZE               (4*1024)
+ #define CARDBUS_MEM_SIZE      (32*1024*1024)
+ static void __devinit
index 4c011c8fe593fa136d21b4fc8032b83da2a24cb9..6856e9b684288298029cda4c01828eef3d3ad948 100644 (file)
@@ -2,3 +2,4 @@ saa7134-dvb-must-select-tda1004x.patch
 aacraid-bad-BUG_ON-fix.patch
 fix-sk_forward_alloc-underflow-in-tcp_sendmsg.patch
 fix-pci-rom-mapping.patch
+pci_assign_unassigned_resources-update.patch