summaryrefslogtreecommitdiffstats
path: root/patches/linux-3.12-rc4/0028-RFC-framebuffer-provide-generic-get_fb_unmapped_area.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/linux-3.12-rc4/0028-RFC-framebuffer-provide-generic-get_fb_unmapped_area.patch')
-rw-r--r--patches/linux-3.12-rc4/0028-RFC-framebuffer-provide-generic-get_fb_unmapped_area.patch62
1 files changed, 62 insertions, 0 deletions
diff --git a/patches/linux-3.12-rc4/0028-RFC-framebuffer-provide-generic-get_fb_unmapped_area.patch b/patches/linux-3.12-rc4/0028-RFC-framebuffer-provide-generic-get_fb_unmapped_area.patch
new file mode 100644
index 0000000..cebdc48
--- /dev/null
+++ b/patches/linux-3.12-rc4/0028-RFC-framebuffer-provide-generic-get_fb_unmapped_area.patch
@@ -0,0 +1,62 @@
+From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= <u.kleine-koenig@pengutronix.de>
+Date: Mon, 18 Nov 2013 11:40:16 +0100
+Subject: [PATCH] RFC: framebuffer: provide generic get_fb_unmapped_area
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This patch makes mmapping the simple-framebuffer device work on a no-MMU
+ARM target. The code is mostly taken from
+arch/blackfin/kernel/sys_bfin.c.
+
+Note this is only tested on this no-MMU machine and I don't know enough
+about framebuffers and mm to decide if this patch is sane. Also I'm
+unsure about the size check because it triggers if userspace page aligns
+the len parameter. (I don't know how usual it is to do, I'd say it's
+wrong, but my test program (fbtest by Geert Uytterhoeven) does it.)
+
+Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
+---
+ drivers/video/fbmem.c | 22 +++++++++++++++++++---
+ 1 file changed, 19 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c
+index dacaf74..68a6fa7 100644
+--- a/drivers/video/fbmem.c
++++ b/drivers/video/fbmem.c
+@@ -1483,6 +1483,24 @@ __releases(&info->lock)
+ return 0;
+ }
+
++#ifdef HAVE_ARCH_FB_UNMAPPED_AREA
++#define fb_get_unmapped_area get_fb_unmapped_area
++#else
++unsigned long fb_get_unmapped_area(struct file *filp, unsigned long orig_addr,
++ unsigned long len, unsigned long pgoff, unsigned long flags)
++{
++ struct fb_info * const info = filp->private_data;
++ unsigned long screen_size = info->screen_size ?: info->fix.smem_len;
++
++ screen_size = PAGE_ALIGN(screen_size);
++
++ if (pgoff > screen_size || len > screen_size - pgoff)
++ return -EINVAL;
++
++ return (unsigned long)info->screen_base;
++}
++#endif
++
+ static const struct file_operations fb_fops = {
+ .owner = THIS_MODULE,
+ .read = fb_read,
+@@ -1494,9 +1512,7 @@ static const struct file_operations fb_fops = {
+ .mmap = fb_mmap,
+ .open = fb_open,
+ .release = fb_release,
+-#ifdef HAVE_ARCH_FB_UNMAPPED_AREA
+- .get_unmapped_area = get_fb_unmapped_area,
+-#endif
++ .get_unmapped_area = fb_get_unmapped_area,
+ #ifdef CONFIG_FB_DEFERRED_IO
+ .fsync = fb_deferred_io_fsync,
+ #endif