diff options
author | Gary Hade <garyhade@us.ibm.com> | 2007-10-03 18:56:14 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-10-12 18:03:18 -0400 |
commit | 036fff4cf732c4d69f99a2915924935705744b00 (patch) | |
tree | 87f6f02e40e8f5c28e6d629e009e6e64a45eec58 /arch/x86/pci/i386.c | |
parent | 8fa5913d54f3b1e09948e6a0db34da887e05ff1f (diff) |
PCI: skip ISA ioresource alignment on some systems
Skip ISA ioresource alignment on some systems
To conserve limited PCI i/o resource on some IBM multi-node systems, the
BIOS allocates (via _CRS) and expects the kernel to use addresses in
ranges currently excluded by pcibios_align_resource() [i386/pci/i386.c].
This change allows the kernel to use the currently excluded address
ranges on the IBM x3800, x3850, and x3950.
Signed-off-by: Gary Hade <gary.hade@us.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'arch/x86/pci/i386.c')
-rw-r--r-- | arch/x86/pci/i386.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c index bcd2f94b732c..055187bc255a 100644 --- a/arch/x86/pci/i386.c +++ b/arch/x86/pci/i386.c | |||
@@ -33,6 +33,15 @@ | |||
33 | 33 | ||
34 | #include "pci.h" | 34 | #include "pci.h" |
35 | 35 | ||
36 | static int | ||
37 | skip_isa_ioresource_align(struct pci_dev *dev) { | ||
38 | |||
39 | if ((pci_probe & PCI_CAN_SKIP_ISA_ALIGN) && | ||
40 | (dev->bus->bridge_ctl & PCI_BRIDGE_CTL_NO_ISA)) | ||
41 | return 1; | ||
42 | return 0; | ||
43 | } | ||
44 | |||
36 | /* | 45 | /* |
37 | * We need to avoid collisions with `mirrored' VGA ports | 46 | * We need to avoid collisions with `mirrored' VGA ports |
38 | * and other strange ISA hardware, so we always want the | 47 | * and other strange ISA hardware, so we always want the |
@@ -50,9 +59,13 @@ void | |||
50 | pcibios_align_resource(void *data, struct resource *res, | 59 | pcibios_align_resource(void *data, struct resource *res, |
51 | resource_size_t size, resource_size_t align) | 60 | resource_size_t size, resource_size_t align) |
52 | { | 61 | { |
62 | struct pci_dev *dev = data; | ||
63 | |||
53 | if (res->flags & IORESOURCE_IO) { | 64 | if (res->flags & IORESOURCE_IO) { |
54 | resource_size_t start = res->start; | 65 | resource_size_t start = res->start; |
55 | 66 | ||
67 | if (skip_isa_ioresource_align(dev)) | ||
68 | return; | ||
56 | if (start & 0x300) { | 69 | if (start & 0x300) { |
57 | start = (start + 0x3ff) & ~0x3ff; | 70 | start = (start + 0x3ff) & ~0x3ff; |
58 | res->start = start; | 71 | res->start = start; |