diff options
Diffstat (limited to 'arch/i386/pci/i386.c')
-rw-r--r-- | arch/i386/pci/i386.c | 49 |
1 files changed, 16 insertions, 33 deletions
diff --git a/arch/i386/pci/i386.c b/arch/i386/pci/i386.c index 93a364c82150..3cc480998a47 100644 --- a/arch/i386/pci/i386.c +++ b/arch/i386/pci/i386.c | |||
@@ -170,43 +170,26 @@ static void __init pcibios_allocate_resources(int pass) | |||
170 | static int __init pcibios_assign_resources(void) | 170 | static int __init pcibios_assign_resources(void) |
171 | { | 171 | { |
172 | struct pci_dev *dev = NULL; | 172 | struct pci_dev *dev = NULL; |
173 | int idx; | 173 | struct resource *r, *pr; |
174 | struct resource *r; | ||
175 | |||
176 | for_each_pci_dev(dev) { | ||
177 | int class = dev->class >> 8; | ||
178 | |||
179 | /* Don't touch classless devices and host bridges */ | ||
180 | if (!class || class == PCI_CLASS_BRIDGE_HOST) | ||
181 | continue; | ||
182 | |||
183 | for(idx=0; idx<6; idx++) { | ||
184 | r = &dev->resource[idx]; | ||
185 | |||
186 | /* | ||
187 | * Don't touch IDE controllers and I/O ports of video cards! | ||
188 | */ | ||
189 | if ((class == PCI_CLASS_STORAGE_IDE && idx < 4) || | ||
190 | (class == PCI_CLASS_DISPLAY_VGA && (r->flags & IORESOURCE_IO))) | ||
191 | continue; | ||
192 | |||
193 | /* | ||
194 | * We shall assign a new address to this resource, either because | ||
195 | * the BIOS forgot to do so or because we have decided the old | ||
196 | * address was unusable for some reason. | ||
197 | */ | ||
198 | if (!r->start && r->end) | ||
199 | pci_assign_resource(dev, idx); | ||
200 | } | ||
201 | 174 | ||
202 | if (pci_probe & PCI_ASSIGN_ROMS) { | 175 | if (!(pci_probe & PCI_ASSIGN_ROMS)) { |
176 | /* Try to use BIOS settings for ROMs, otherwise let | ||
177 | pci_assign_unassigned_resources() allocate the new | ||
178 | addresses. */ | ||
179 | for_each_pci_dev(dev) { | ||
203 | r = &dev->resource[PCI_ROM_RESOURCE]; | 180 | r = &dev->resource[PCI_ROM_RESOURCE]; |
204 | r->end -= r->start; | 181 | if (!r->flags || !r->start) |
205 | r->start = 0; | 182 | continue; |
206 | if (r->end) | 183 | pr = pci_find_parent_resource(dev, r); |
207 | pci_assign_resource(dev, PCI_ROM_RESOURCE); | 184 | if (!pr || request_resource(pr, r) < 0) { |
185 | r->end -= r->start; | ||
186 | r->start = 0; | ||
187 | } | ||
208 | } | 188 | } |
209 | } | 189 | } |
190 | |||
191 | pci_assign_unassigned_resources(); | ||
192 | |||
210 | return 0; | 193 | return 0; |
211 | } | 194 | } |
212 | 195 | ||