Commit:     9f8daccaa05c14e5643bdd4faf5aed9cc8e6f11e
Parent:     bca25bafbb390eeec376ac994954b99489d198ec
Author:     Gary Hade <[EMAIL PROTECTED]>
AuthorDate: Wed Jan 30 13:31:59 2008 +0100
Committer:  Ingo Molnar <[EMAIL PROTECTED]>
CommitDate: Wed Jan 30 13:31:59 2008 +0100

    PCI: remove default PCI expansion ROM memory allocation
    increasing number of PCI slots in large multi-node systems.  The kernel
    currently attempts by default to allocate memory for all PCI expansion
    ROMs so there has also been an increasing number of PCI memory
    allocation failures seen on these systems.  This occurs because the BIOS
    either (1) provides insufficient PCI memory resource for all the
    expansion ROMs or (2) provides adequate PCI memory resource for
    expansion ROMs but provides the space in kernel unexpected BIOS assigned
    P2P non-prefetch windows.
    The resulting PCI memory allocation failures may be benign when related
    to memory requests for expansion ROMs themselves but in some cases they
    can occur when attempting to allocate space for more critical BARs.
    This can happen when a successful expansion ROM allocation request
    consumes memory resource that was intended for a non-ROM BAR.  We have
    seen this happen during PCI hotplug of an adapter that contains a P2P
    bridge where successful memory allocation for an expansion ROM BAR on
    device behind the bridge consumed memory that was intended for a non-ROM
    BAR on the P2P bridge.  In all cases the allocation failure messages can
    be very confusing for users.
    This patch addresses the issue by changing the kernel default behavior
    so that expansion ROM memory allocations are no longer attempted by
    default when the BIOS has not assigned a specific address range to the
    expansion ROM BAR.  This was done by changing the 'pci=rom' boot option
    behavior for BIOS unassigned expansion ROMs to actually match it's
    current kernel-parameters.txt description which already implies "off" by
    default. Behavior for BIOS assigned expansion ROMs implemented in
    pcibios_assign_resources() [arch/x86/pci/i386.c] is unchanged.
    Signed-off-by: Gary Hade <[EMAIL PROTECTED]>
    Cc: Jan Beulich <[EMAIL PROTECTED]>
    Acked-by: "Jun'ichi Nomura" <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Ingo Molnar <[EMAIL PROTECTED]>
    Signed-off-by: Thomas Gleixner <[EMAIL PROTECTED]>
 arch/x86/pci/common.c |   17 +++++++++++++++++
 1 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c
index 8627463..52deabc 100644
--- a/arch/x86/pci/common.c
+++ b/arch/x86/pci/common.c
@@ -109,6 +109,19 @@ static void __devinit pcibios_fixup_ghosts(struct pci_bus 
+static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev)
+       struct resource *rom_r = &dev->resource[PCI_ROM_RESOURCE];
+       if (rom_r->parent)
+               return;
+       if (rom_r->start)
+               /* we deal with BIOS assigned ROM later */
+               return;
+       if (!(pci_probe & PCI_ASSIGN_ROMS))
+               rom_r->start = rom_r->end = rom_r->flags = 0;
  *  Called after each bus is probed, but before its children
  *  are examined.
@@ -116,8 +129,12 @@ static void __devinit pcibios_fixup_ghosts(struct pci_bus 
 void __devinit  pcibios_fixup_bus(struct pci_bus *b)
+       struct pci_dev *dev;
+       list_for_each_entry(dev, &b->devices, bus_list)
+               pcibios_fixup_device_resources(dev);
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

Reply via email to