diff options
Diffstat (limited to 'drivers/char/drm/drm_vm.c')
-rw-r--r-- | drivers/char/drm/drm_vm.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/drivers/char/drm/drm_vm.c b/drivers/char/drm/drm_vm.c index 675d2397def9..99b5c86f7513 100644 --- a/drivers/char/drm/drm_vm.c +++ b/drivers/char/drm/drm_vm.c | |||
@@ -73,12 +73,13 @@ static __inline__ struct page *drm_do_vm_nopage(struct vm_area_struct *vma, | |||
73 | r_list = list_entry(list, drm_map_list_t, head); | 73 | r_list = list_entry(list, drm_map_list_t, head); |
74 | map = r_list->map; | 74 | map = r_list->map; |
75 | if (!map) continue; | 75 | if (!map) continue; |
76 | if (map->offset == VM_OFFSET(vma)) break; | 76 | if (r_list->user_token == VM_OFFSET(vma)) |
77 | break; | ||
77 | } | 78 | } |
78 | 79 | ||
79 | if (map && map->type == _DRM_AGP) { | 80 | if (map && map->type == _DRM_AGP) { |
80 | unsigned long offset = address - vma->vm_start; | 81 | unsigned long offset = address - vma->vm_start; |
81 | unsigned long baddr = VM_OFFSET(vma) + offset; | 82 | unsigned long baddr = map->offset + offset; |
82 | struct drm_agp_mem *agpmem; | 83 | struct drm_agp_mem *agpmem; |
83 | struct page *page; | 84 | struct page *page; |
84 | 85 | ||
@@ -304,7 +305,7 @@ static __inline__ struct page *drm_do_vm_sg_nopage(struct vm_area_struct *vma, | |||
304 | 305 | ||
305 | 306 | ||
306 | offset = address - vma->vm_start; | 307 | offset = address - vma->vm_start; |
307 | map_offset = map->offset - dev->sg->handle; | 308 | map_offset = map->offset - (unsigned long)dev->sg->virtual; |
308 | page_offset = (offset >> PAGE_SHIFT) + (map_offset >> PAGE_SHIFT); | 309 | page_offset = (offset >> PAGE_SHIFT) + (map_offset >> PAGE_SHIFT); |
309 | page = entry->pagelist[page_offset]; | 310 | page = entry->pagelist[page_offset]; |
310 | get_page(page); | 311 | get_page(page); |
@@ -568,13 +569,12 @@ int drm_mmap(struct file *filp, struct vm_area_struct *vma) | |||
568 | for performance, even if the list was a | 569 | for performance, even if the list was a |
569 | bit longer. */ | 570 | bit longer. */ |
570 | list_for_each(list, &dev->maplist->head) { | 571 | list_for_each(list, &dev->maplist->head) { |
571 | unsigned long off; | ||
572 | 572 | ||
573 | r_list = list_entry(list, drm_map_list_t, head); | 573 | r_list = list_entry(list, drm_map_list_t, head); |
574 | map = r_list->map; | 574 | map = r_list->map; |
575 | if (!map) continue; | 575 | if (!map) continue; |
576 | off = dev->driver->get_map_ofs(map); | 576 | if (r_list->user_token == VM_OFFSET(vma)) |
577 | if (off == VM_OFFSET(vma)) break; | 577 | break; |
578 | } | 578 | } |
579 | 579 | ||
580 | if (!map || ((map->flags&_DRM_RESTRICTED) && !capable(CAP_SYS_ADMIN))) | 580 | if (!map || ((map->flags&_DRM_RESTRICTED) && !capable(CAP_SYS_ADMIN))) |
@@ -613,7 +613,7 @@ int drm_mmap(struct file *filp, struct vm_area_struct *vma) | |||
613 | /* fall through to _DRM_FRAME_BUFFER... */ | 613 | /* fall through to _DRM_FRAME_BUFFER... */ |
614 | case _DRM_FRAME_BUFFER: | 614 | case _DRM_FRAME_BUFFER: |
615 | case _DRM_REGISTERS: | 615 | case _DRM_REGISTERS: |
616 | if (VM_OFFSET(vma) >= __pa(high_memory)) { | 616 | if (map->offset >= __pa(high_memory)) { |
617 | #if defined(__i386__) || defined(__x86_64__) | 617 | #if defined(__i386__) || defined(__x86_64__) |
618 | if (boot_cpu_data.x86 > 3 && map->type != _DRM_AGP) { | 618 | if (boot_cpu_data.x86 > 3 && map->type != _DRM_AGP) { |
619 | pgprot_val(vma->vm_page_prot) |= _PAGE_PCD; | 619 | pgprot_val(vma->vm_page_prot) |= _PAGE_PCD; |
@@ -636,12 +636,12 @@ int drm_mmap(struct file *filp, struct vm_area_struct *vma) | |||
636 | offset = dev->driver->get_reg_ofs(dev); | 636 | offset = dev->driver->get_reg_ofs(dev); |
637 | #ifdef __sparc__ | 637 | #ifdef __sparc__ |
638 | if (io_remap_pfn_range(DRM_RPR_ARG(vma) vma->vm_start, | 638 | if (io_remap_pfn_range(DRM_RPR_ARG(vma) vma->vm_start, |
639 | (VM_OFFSET(vma) + offset) >> PAGE_SHIFT, | 639 | (map->offset + offset) >> PAGE_SHIFT, |
640 | vma->vm_end - vma->vm_start, | 640 | vma->vm_end - vma->vm_start, |
641 | vma->vm_page_prot)) | 641 | vma->vm_page_prot)) |
642 | #else | 642 | #else |
643 | if (io_remap_pfn_range(vma, vma->vm_start, | 643 | if (io_remap_pfn_range(vma, vma->vm_start, |
644 | (VM_OFFSET(vma) + offset) >> PAGE_SHIFT, | 644 | (map->offset + offset) >> PAGE_SHIFT, |
645 | vma->vm_end - vma->vm_start, | 645 | vma->vm_end - vma->vm_start, |
646 | vma->vm_page_prot)) | 646 | vma->vm_page_prot)) |
647 | #endif | 647 | #endif |
@@ -649,7 +649,7 @@ int drm_mmap(struct file *filp, struct vm_area_struct *vma) | |||
649 | DRM_DEBUG(" Type = %d; start = 0x%lx, end = 0x%lx," | 649 | DRM_DEBUG(" Type = %d; start = 0x%lx, end = 0x%lx," |
650 | " offset = 0x%lx\n", | 650 | " offset = 0x%lx\n", |
651 | map->type, | 651 | map->type, |
652 | vma->vm_start, vma->vm_end, VM_OFFSET(vma) + offset); | 652 | vma->vm_start, vma->vm_end, map->offset + offset); |
653 | vma->vm_ops = &drm_vm_ops; | 653 | vma->vm_ops = &drm_vm_ops; |
654 | break; | 654 | break; |
655 | case _DRM_SHM: | 655 | case _DRM_SHM: |