diff options
| author | Dave Airlie <airlied@linux.ie> | 2007-02-09 19:53:13 -0500 |
|---|---|---|
| committer | Dave Airlie <airlied@linux.ie> | 2007-03-10 20:07:17 -0500 |
| commit | 5cc7f9abec8391e43b0a052c8880509668e24b35 (patch) | |
| tree | b22d62ab223bc7de7cfd154773c523c0bbeab0d2 | |
| parent | 8311d570bcb3faea68941ebd5e240eb2e96d65a0 (diff) | |
drm: move protection stuff into separate function
Signed-off-by: Dave Airlie <airlied@linux.ie>
| -rw-r--r-- | drivers/char/drm/drm_vm.c | 44 |
1 files changed, 26 insertions, 18 deletions
diff --git a/drivers/char/drm/drm_vm.c b/drivers/char/drm/drm_vm.c index 54a632848955..7ed77e16488c 100644 --- a/drivers/char/drm/drm_vm.c +++ b/drivers/char/drm/drm_vm.c | |||
| @@ -41,6 +41,30 @@ | |||
| 41 | static void drm_vm_open(struct vm_area_struct *vma); | 41 | static void drm_vm_open(struct vm_area_struct *vma); |
| 42 | static void drm_vm_close(struct vm_area_struct *vma); | 42 | static void drm_vm_close(struct vm_area_struct *vma); |
| 43 | 43 | ||
| 44 | pgprot_t drm_io_prot(uint32_t map_type, struct vm_area_struct *vma) | ||
| 45 | { | ||
| 46 | pgprot_t tmp = vm_get_page_prot(vma->vm_flags); | ||
| 47 | |||
| 48 | #if defined(__i386__) || defined(__x86_64__) | ||
| 49 | if (boot_cpu_data.x86 > 3 && map_type != _DRM_AGP) { | ||
| 50 | pgprot_val(tmp) |= _PAGE_PCD; | ||
| 51 | pgprot_val(tmp) &= ~_PAGE_PWT; | ||
| 52 | } | ||
| 53 | #elif defined(__powerpc__) | ||
| 54 | pgprot_val(tmp) |= _PAGE_NO_CACHE; | ||
| 55 | if (map_type == _DRM_REGISTERS) | ||
| 56 | pgprot_val(tmp) |= _PAGE_GUARDED; | ||
| 57 | #endif | ||
| 58 | #if defined(__ia64__) | ||
| 59 | if (efi_range_is_wc(vma->vm_start, vma->vm_end - | ||
| 60 | vma->vm_start)) | ||
| 61 | tmp = pgprot_writecombine(tmp); | ||
| 62 | else | ||
| 63 | tmp = pgprot_noncached(tmp); | ||
| 64 | #endif | ||
| 65 | return tmp; | ||
| 66 | } | ||
| 67 | |||
| 44 | /** | 68 | /** |
| 45 | * \c nopage method for AGP virtual memory. | 69 | * \c nopage method for AGP virtual memory. |
| 46 | * | 70 | * |
| @@ -600,25 +624,9 @@ int drm_mmap(struct file *filp, struct vm_area_struct *vma) | |||
| 600 | /* fall through to _DRM_FRAME_BUFFER... */ | 624 | /* fall through to _DRM_FRAME_BUFFER... */ |
| 601 | case _DRM_FRAME_BUFFER: | 625 | case _DRM_FRAME_BUFFER: |
| 602 | case _DRM_REGISTERS: | 626 | case _DRM_REGISTERS: |
| 603 | #if defined(__i386__) || defined(__x86_64__) | ||
| 604 | if (boot_cpu_data.x86 > 3 && map->type != _DRM_AGP) { | ||
| 605 | pgprot_val(vma->vm_page_prot) |= _PAGE_PCD; | ||
| 606 | pgprot_val(vma->vm_page_prot) &= ~_PAGE_PWT; | ||
| 607 | } | ||
| 608 | #elif defined(__powerpc__) | ||
| 609 | pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE; | ||
| 610 | if (map->type == _DRM_REGISTERS) | ||
| 611 | pgprot_val(vma->vm_page_prot) |= _PAGE_GUARDED; | ||
| 612 | #endif | ||
| 613 | vma->vm_flags |= VM_IO; /* not in core dump */ | ||
| 614 | #if defined(__ia64__) | ||
| 615 | if (efi_range_is_wc(vma->vm_start, vma->vm_end - vma->vm_start)) | ||
| 616 | vma->vm_page_prot = | ||
| 617 | pgprot_writecombine(vma->vm_page_prot); | ||
| 618 | else | ||
| 619 | vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); | ||
| 620 | #endif | ||
| 621 | offset = dev->driver->get_reg_ofs(dev); | 627 | offset = dev->driver->get_reg_ofs(dev); |
| 628 | vma->vm_flags |= VM_IO; /* not in core dump */ | ||
| 629 | vma->vm_page_prot = drm_io_prot(map->type, vma); | ||
| 622 | #ifdef __sparc__ | 630 | #ifdef __sparc__ |
| 623 | vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); | 631 | vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); |
| 624 | if (io_remap_pfn_range(vma, vma->vm_start, | 632 | if (io_remap_pfn_range(vma, vma->vm_start, |
