|
@@ -1373,15 +1373,12 @@ fb_mmap(struct file *file, struct vm_area_struct * vma)
|
|
|
{
|
|
|
struct fb_info *info = file_fb_info(file);
|
|
|
struct fb_ops *fb;
|
|
|
- unsigned long off;
|
|
|
+ unsigned long mmio_pgoff;
|
|
|
unsigned long start;
|
|
|
u32 len;
|
|
|
|
|
|
if (!info)
|
|
|
return -ENODEV;
|
|
|
- if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
|
|
|
- return -EINVAL;
|
|
|
- off = vma->vm_pgoff << PAGE_SHIFT;
|
|
|
fb = info->fbops;
|
|
|
if (!fb)
|
|
|
return -ENODEV;
|
|
@@ -1393,32 +1390,24 @@ fb_mmap(struct file *file, struct vm_area_struct * vma)
|
|
|
return res;
|
|
|
}
|
|
|
|
|
|
- /* frame buffer memory */
|
|
|
+ /*
|
|
|
+ * Ugh. This can be either the frame buffer mapping, or
|
|
|
+ * if pgoff points past it, the mmio mapping.
|
|
|
+ */
|
|
|
start = info->fix.smem_start;
|
|
|
- len = PAGE_ALIGN((start & ~PAGE_MASK) + info->fix.smem_len);
|
|
|
- if (off >= len) {
|
|
|
- /* memory mapped io */
|
|
|
- off -= len;
|
|
|
- if (info->var.accel_flags) {
|
|
|
- mutex_unlock(&info->mm_lock);
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
+ len = info->fix.smem_len;
|
|
|
+ mmio_pgoff = PAGE_ALIGN((start & ~PAGE_MASK) + len) >> PAGE_SHIFT;
|
|
|
+ if (vma->vm_pgoff >= mmio_pgoff) {
|
|
|
+ vma->vm_pgoff -= mmio_pgoff;
|
|
|
start = info->fix.mmio_start;
|
|
|
- len = PAGE_ALIGN((start & ~PAGE_MASK) + info->fix.mmio_len);
|
|
|
+ len = info->fix.mmio_len;
|
|
|
}
|
|
|
mutex_unlock(&info->mm_lock);
|
|
|
- start &= PAGE_MASK;
|
|
|
- if ((vma->vm_end - vma->vm_start + off) > len)
|
|
|
- return -EINVAL;
|
|
|
- off += start;
|
|
|
- vma->vm_pgoff = off >> PAGE_SHIFT;
|
|
|
- /* VM_IO | VM_DONTEXPAND | VM_DONTDUMP are set by io_remap_pfn_range()*/
|
|
|
+
|
|
|
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
|
|
|
- fb_pgprotect(file, vma, off);
|
|
|
- if (io_remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT,
|
|
|
- vma->vm_end - vma->vm_start, vma->vm_page_prot))
|
|
|
- return -EAGAIN;
|
|
|
- return 0;
|
|
|
+ fb_pgprotect(file, vma, start);
|
|
|
+
|
|
|
+ return vm_iomap_memory(vma, start, len);
|
|
|
}
|
|
|
|
|
|
static int
|