--- drivers/char/drm/drm_proc.c | 4 ++-- drivers/char/drm/drm_vm.c | 21 ++++++++++++++++----- 2 files changed, 18 insertions(+), 7 deletions(-) Index: linux/drivers/char/drm/drm_vm.c =================================================================== --- linux.orig/drivers/char/drm/drm_vm.c +++ linux/drivers/char/drm/drm_vm.c @@ -37,6 +37,9 @@ #if defined(__ia64__) #include #endif +#ifdef CONFIG_X86 +#include +#endif static void drm_vm_open(struct vm_area_struct *vma); static void drm_vm_close(struct vm_area_struct *vma); @@ -423,11 +426,16 @@ static void drm_vm_close(struct vm_area_ drm_file_t *priv = vma->vm_file->private_data; drm_device_t *dev = priv->head->dev; drm_vma_entry_t *pt, *prev; + u64 addr = (u64)vma->vm_pgoff << PAGE_SHIFT; DRM_DEBUG("0x%08lx,0x%08lx\n", vma->vm_start, vma->vm_end - vma->vm_start); atomic_dec(&dev->vma_count); +#ifdef CONFIG_X86 + free_mattr_vma(vma); +#endif + mutex_lock(&dev->struct_mutex); for (pt = dev->vmalist, prev = NULL; pt; prev = pt, pt = pt->next) { if (pt->vma == vma) { @@ -584,11 +592,14 @@ int drm_mmap(struct file *filp, struct v /* fall through to _DRM_FRAME_BUFFER... */ case _DRM_FRAME_BUFFER: case _DRM_REGISTERS: -#if defined(__i386__) || defined(__x86_64__) - if (boot_cpu_data.x86 > 3 && map->type != _DRM_AGP) { - pgprot_val(vma->vm_page_prot) |= _PAGE_PCD; - pgprot_val(vma->vm_page_prot) &= ~_PAGE_PWT; - } +#ifdef CONFIG_X86 + { + int err; + vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); + err = reserve_mattr_vma(vma); + if (err) + return err; + } #elif defined(__powerpc__) pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE; if (map->type == _DRM_REGISTERS) Index: linux/drivers/char/drm/drm_proc.c =================================================================== --- linux.orig/drivers/char/drm/drm_proc.c +++ linux/drivers/char/drm/drm_proc.c @@ -512,13 +512,13 @@ static int drm__vma_info(char *buf, char vma->vm_flags & VM_IO ? 'i' : '-', vma->vm_pgoff << PAGE_SHIFT); -#if defined(__i386__) +#if defined(CONFIG_X86) pgprot = pgprot_val(vma->vm_page_prot); DRM_PROC_PRINT(" %c%c%c%c%c%c%c%c%c", pgprot & _PAGE_PRESENT ? 'p' : '-', pgprot & _PAGE_RW ? 'w' : 'r', pgprot & _PAGE_USER ? 'u' : 's', - pgprot & _PAGE_PWT ? 't' : 'b', + ((pgprot & _PAGE_CACHE_MASK) == _PAGE_WC) ? 'w' : 'b', pgprot & _PAGE_PCD ? 'u' : 'c', pgprot & _PAGE_ACCESSED ? 'a' : '-', pgprot & _PAGE_DIRTY ? 'd' : '-',