diff options
Diffstat (limited to 'arch/x86/pci/i386.c')
-rw-r--r-- | arch/x86/pci/i386.c | 35 |
1 files changed, 17 insertions, 18 deletions
diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c index 10fb308fded8..844df0cbbd3e 100644 --- a/arch/x86/pci/i386.c +++ b/arch/x86/pci/i386.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/bootmem.h> | 33 | #include <linux/bootmem.h> |
34 | 34 | ||
35 | #include <asm/pat.h> | 35 | #include <asm/pat.h> |
36 | #include <asm/e820.h> | ||
36 | 37 | ||
37 | #include "pci.h" | 38 | #include "pci.h" |
38 | 39 | ||
@@ -128,10 +129,7 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list) | |||
128 | pr = pci_find_parent_resource(dev, r); | 129 | pr = pci_find_parent_resource(dev, r); |
129 | if (!r->start || !pr || | 130 | if (!r->start || !pr || |
130 | request_resource(pr, r) < 0) { | 131 | request_resource(pr, r) < 0) { |
131 | printk(KERN_ERR "PCI: Cannot allocate " | 132 | dev_err(&dev->dev, "BAR %d: can't allocate resource\n", idx); |
132 | "resource region %d " | ||
133 | "of bridge %s\n", | ||
134 | idx, pci_name(dev)); | ||
135 | /* | 133 | /* |
136 | * Something is wrong with the region. | 134 | * Something is wrong with the region. |
137 | * Invalidate the resource to prevent | 135 | * Invalidate the resource to prevent |
@@ -166,15 +164,13 @@ static void __init pcibios_allocate_resources(int pass) | |||
166 | else | 164 | else |
167 | disabled = !(command & PCI_COMMAND_MEMORY); | 165 | disabled = !(command & PCI_COMMAND_MEMORY); |
168 | if (pass == disabled) { | 166 | if (pass == disabled) { |
169 | DBG("PCI: Resource %08lx-%08lx " | 167 | dev_dbg(&dev->dev, "resource %#08llx-%#08llx (f=%lx, d=%d, p=%d)\n", |
170 | "(f=%lx, d=%d, p=%d)\n", | 168 | (unsigned long long) r->start, |
171 | r->start, r->end, r->flags, disabled, pass); | 169 | (unsigned long long) r->end, |
170 | r->flags, disabled, pass); | ||
172 | pr = pci_find_parent_resource(dev, r); | 171 | pr = pci_find_parent_resource(dev, r); |
173 | if (!pr || request_resource(pr, r) < 0) { | 172 | if (!pr || request_resource(pr, r) < 0) { |
174 | printk(KERN_ERR "PCI: Cannot allocate " | 173 | dev_err(&dev->dev, "BAR %d: can't allocate resource\n", idx); |
175 | "resource region %d " | ||
176 | "of device %s\n", | ||
177 | idx, pci_name(dev)); | ||
178 | /* We'll assign a new address later */ | 174 | /* We'll assign a new address later */ |
179 | r->end -= r->start; | 175 | r->end -= r->start; |
180 | r->start = 0; | 176 | r->start = 0; |
@@ -187,8 +183,7 @@ static void __init pcibios_allocate_resources(int pass) | |||
187 | /* Turn the ROM off, leave the resource region, | 183 | /* Turn the ROM off, leave the resource region, |
188 | * but keep it unregistered. */ | 184 | * but keep it unregistered. */ |
189 | u32 reg; | 185 | u32 reg; |
190 | DBG("PCI: Switching off ROM of %s\n", | 186 | dev_dbg(&dev->dev, "disabling ROM\n"); |
191 | pci_name(dev)); | ||
192 | r->flags &= ~IORESOURCE_ROM_ENABLE; | 187 | r->flags &= ~IORESOURCE_ROM_ENABLE; |
193 | pci_read_config_dword(dev, | 188 | pci_read_config_dword(dev, |
194 | dev->rom_base_reg, ®); | 189 | dev->rom_base_reg, ®); |
@@ -233,6 +228,8 @@ void __init pcibios_resource_survey(void) | |||
233 | pcibios_allocate_bus_resources(&pci_root_buses); | 228 | pcibios_allocate_bus_resources(&pci_root_buses); |
234 | pcibios_allocate_resources(0); | 229 | pcibios_allocate_resources(0); |
235 | pcibios_allocate_resources(1); | 230 | pcibios_allocate_resources(1); |
231 | |||
232 | e820_reserve_resources_late(); | ||
236 | } | 233 | } |
237 | 234 | ||
238 | /** | 235 | /** |
@@ -257,8 +254,7 @@ void pcibios_set_master(struct pci_dev *dev) | |||
257 | lat = pcibios_max_latency; | 254 | lat = pcibios_max_latency; |
258 | else | 255 | else |
259 | return; | 256 | return; |
260 | printk(KERN_DEBUG "PCI: Setting latency timer of device %s to %d\n", | 257 | dev_printk(KERN_DEBUG, &dev->dev, "setting latency timer to %d\n", lat); |
261 | pci_name(dev), lat); | ||
262 | pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat); | 258 | pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat); |
263 | } | 259 | } |
264 | 260 | ||
@@ -280,6 +276,7 @@ static void pci_track_mmap_page_range(struct vm_area_struct *vma) | |||
280 | static struct vm_operations_struct pci_mmap_ops = { | 276 | static struct vm_operations_struct pci_mmap_ops = { |
281 | .open = pci_track_mmap_page_range, | 277 | .open = pci_track_mmap_page_range, |
282 | .close = pci_unmap_page_range, | 278 | .close = pci_unmap_page_range, |
279 | .access = generic_access_phys, | ||
283 | }; | 280 | }; |
284 | 281 | ||
285 | int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | 282 | int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, |
@@ -299,9 +296,9 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | |||
299 | return -EINVAL; | 296 | return -EINVAL; |
300 | 297 | ||
301 | prot = pgprot_val(vma->vm_page_prot); | 298 | prot = pgprot_val(vma->vm_page_prot); |
302 | if (pat_wc_enabled && write_combine) | 299 | if (pat_enabled && write_combine) |
303 | prot |= _PAGE_CACHE_WC; | 300 | prot |= _PAGE_CACHE_WC; |
304 | else if (pat_wc_enabled || boot_cpu_data.x86 > 3) | 301 | else if (pat_enabled || boot_cpu_data.x86 > 3) |
305 | /* | 302 | /* |
306 | * ioremap() and ioremap_nocache() defaults to UC MINUS for now. | 303 | * ioremap() and ioremap_nocache() defaults to UC MINUS for now. |
307 | * To avoid attribute conflicts, request UC MINUS here | 304 | * To avoid attribute conflicts, request UC MINUS here |
@@ -334,7 +331,9 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | |||
334 | flags = new_flags; | 331 | flags = new_flags; |
335 | } | 332 | } |
336 | 333 | ||
337 | if (vma->vm_pgoff <= max_pfn_mapped && | 334 | if (((vma->vm_pgoff < max_low_pfn_mapped) || |
335 | (vma->vm_pgoff >= (1UL<<(32 - PAGE_SHIFT)) && | ||
336 | vma->vm_pgoff < max_pfn_mapped)) && | ||
338 | ioremap_change_attr((unsigned long)__va(addr), len, flags)) { | 337 | ioremap_change_attr((unsigned long)__va(addr), len, flags)) { |
339 | free_memtype(addr, addr + len); | 338 | free_memtype(addr, addr + len); |
340 | return -EINVAL; | 339 | return -EINVAL; |