diff options
Diffstat (limited to 'arch/x86/pci/common.c')
-rw-r--r-- | arch/x86/pci/common.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index 88b5416cf009..a6d27797ef47 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c | |||
@@ -90,6 +90,50 @@ static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev) | |||
90 | rom_r->start = rom_r->end = rom_r->flags = 0; | 90 | rom_r->start = rom_r->end = rom_r->flags = 0; |
91 | } | 91 | } |
92 | 92 | ||
93 | static int __devinit can_skip_ioresource_align(const struct dmi_system_id *d) | ||
94 | { | ||
95 | pci_probe |= PCI_CAN_SKIP_ISA_ALIGN; | ||
96 | printk(KERN_INFO "PCI: %s detected, can skip ISA alignment\n", d->ident); | ||
97 | return 0; | ||
98 | } | ||
99 | |||
100 | static struct dmi_system_id can_skip_pciprobe_dmi_table[] __devinitdata = { | ||
101 | /* | ||
102 | * Systems where PCI IO resource ISA alignment can be skipped | ||
103 | * when the ISA enable bit in the bridge control is not set | ||
104 | */ | ||
105 | { | ||
106 | .callback = can_skip_ioresource_align, | ||
107 | .ident = "IBM System x3800", | ||
108 | .matches = { | ||
109 | DMI_MATCH(DMI_SYS_VENDOR, "IBM"), | ||
110 | DMI_MATCH(DMI_PRODUCT_NAME, "x3800"), | ||
111 | }, | ||
112 | }, | ||
113 | { | ||
114 | .callback = can_skip_ioresource_align, | ||
115 | .ident = "IBM System x3850", | ||
116 | .matches = { | ||
117 | DMI_MATCH(DMI_SYS_VENDOR, "IBM"), | ||
118 | DMI_MATCH(DMI_PRODUCT_NAME, "x3850"), | ||
119 | }, | ||
120 | }, | ||
121 | { | ||
122 | .callback = can_skip_ioresource_align, | ||
123 | .ident = "IBM System x3950", | ||
124 | .matches = { | ||
125 | DMI_MATCH(DMI_SYS_VENDOR, "IBM"), | ||
126 | DMI_MATCH(DMI_PRODUCT_NAME, "x3950"), | ||
127 | }, | ||
128 | }, | ||
129 | {} | ||
130 | }; | ||
131 | |||
132 | void __init dmi_check_skip_isa_align(void) | ||
133 | { | ||
134 | dmi_check_system(can_skip_pciprobe_dmi_table); | ||
135 | } | ||
136 | |||
93 | /* | 137 | /* |
94 | * Called after each bus is probed, but before its children | 138 | * Called after each bus is probed, but before its children |
95 | * are examined. | 139 | * are examined. |
@@ -462,6 +506,9 @@ char * __devinit pcibios_setup(char *str) | |||
462 | } else if (!strcmp(str, "routeirq")) { | 506 | } else if (!strcmp(str, "routeirq")) { |
463 | pci_routeirq = 1; | 507 | pci_routeirq = 1; |
464 | return NULL; | 508 | return NULL; |
509 | } else if (!strcmp(str, "skip_isa_align")) { | ||
510 | pci_probe |= PCI_CAN_SKIP_ISA_ALIGN; | ||
511 | return NULL; | ||
465 | } | 512 | } |
466 | return str; | 513 | return str; |
467 | } | 514 | } |