diff options
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.patch | 62 |
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 |