diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c index 103b9df..3ce7ac4 100644 --- a/arch/x86/pci/i386.c +++ b/arch/x86/pci/i386.c @@ -297,6 +297,17 @@ void pcibios_set_master(struct pci_dev *dev) pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat); } +#ifdef CONFIG_MTRR +int arch_pci_resource_is_wc(struct resource *r) +{ + u8 mtrr; + + mtrr = mtrr_type_lookup(r->start, r->end); + + return (mtrr == MTRR_TYPE_WRCOMB); +} +#endif + int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, enum pci_mmap_state mmap_state, int write_combine) { @@ -312,7 +323,7 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, * address on this platform. */ prot = pgprot_val(vma->vm_page_prot); - if (boot_cpu_data.x86 > 3) + if (!write_combine && boot_cpu_data.x86 > 3) prot |= _PAGE_PCD | _PAGE_PWT; vma->vm_page_prot = __pgprot(prot); diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 8dcf145..9ee6d0f 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -415,6 +415,12 @@ pci_mmap_legacy_mem(struct kobject *kobj, struct bin_attribute *attr, #endif /* HAVE_PCI_LEGACY */ #ifdef HAVE_PCI_MMAP +static inline int __weak +arch_pci_resource_wc(struct resource *r) +{ + return 0; +} + /** * pci_mmap_resource - map a PCI resource into user memory space * @kobj: kobject for mapping @@ -433,6 +439,7 @@ pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr, struct resource *res = (struct resource *)attr->private; enum pci_mmap_state mmap_type; resource_size_t start, end; + int wc = 0; int i; for (i = 0; i < PCI_ROM_RESOURCE; i++) @@ -449,7 +456,8 @@ pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr, vma->vm_pgoff += start >> PAGE_SHIFT; mmap_type = res->flags & IORESOURCE_MEM ? pci_mmap_mem : pci_mmap_io; - return pci_mmap_page_range(pdev, vma, mmap_type, 0); + wc = arch_pci_resource_wc(res); + return pci_mmap_page_range(pdev, vma, mmap_type, wc); } /**