diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c index 2ead723..24ee7bc 100644 --- a/arch/x86/pci/i386.c +++ b/arch/x86/pci/i386.c @@ -320,6 +320,15 @@ static struct vm_operations_struct pci_mmap_ops = { .close = pci_unmap_page_range, }; +int arch_pci_resource_wc(struct resource *r) +{ + u8 ret; + + ret = mtrr_type_lookup(r->start, r->end); + + return (ret == MTRR_TYPE_WRCOMB); +} + int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, enum pci_mmap_state mmap_state, int write_combine) { 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); } /**