From: Chris Wright Date: Mon, 5 Sep 2005 18:30:42 +0000 (-0700) Subject: Add Ivan's fix for pci_assign_unassigned_resources (prod from Linus). X-Git-Tag: v2.6.13.1~13 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c24ad1c8b30873ef8215fed172ab13dcddfe28c1;p=thirdparty%2Fkernel%2Fstable-queue.git Add Ivan's fix for pci_assign_unassigned_resources (prod from Linus). --- diff --git a/queue/pci_assign_unassigned_resources-update.patch b/queue/pci_assign_unassigned_resources-update.patch new file mode 100644 index 00000000000..239f632369e --- /dev/null +++ b/queue/pci_assign_unassigned_resources-update.patch @@ -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 +To: stable@kernel.org +Subject: [PATCH] x86: pci_assign_unassigned_resources() update + +From: Ivan Kokshaysky + +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 (who had problems with +the 4kB CardBus IO size previously). + +Signed-off-by: Linus Torvalds +Signed-off-by: Chris Wright +--- + 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 diff --git a/queue/series b/queue/series index 4c011c8fe59..6856e9b6842 100644 --- a/queue/series +++ b/queue/series @@ -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