Thread (14 messages) 14 messages, 3 authors, 2008-12-25

Re: [Linux-fbdev-devel] [PATCH 03/05] video: deferred io with physically contiguous memory

From: Jaya Kumar <hidden>
Date: 2008-12-24 05:13:40
Also in: linux-sh

On Fri, Dec 19, 2008 at 1:34 AM, Magnus Damm [off-list ref] wrote:
quoted hunk ↗ jump to hunk
From: Magnus Damm <redacted>

Extend the deferred io code from only supporting vmalloc()ed frame
buffer memory to support both vmalloc()ed and physically contiguous
frame buffer memory.

The sh_mobile_lcdcfb hardware does not support scatter gather so
we need physically contiguous memory to back our frame buffer.

Signed-off-by: Magnus Damm <redacted>
---

 drivers/video/fb_defio.c |   20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)
--- 0003/drivers/video/fb_defio.c
+++ work/drivers/video/fb_defio.c       2008-12-19 14:29:45.000000000 +0900
@@ -24,6 +24,19 @@
 #include <linux/rmap.h>
 #include <linux/pagemap.h>

+struct page *fb_deferred_io_page(struct fb_info *info, unsigned long offs)
+{
+       void *screen_base = (void __force *) info->screen_base;
+       struct page *page;
+
+       if (is_vmalloc_addr(screen_base + offs))
+               page = vmalloc_to_page(screen_base + offs);
+       else
+               page = pfn_to_page((info->fix.smem_start + offs) >> PAGE_SHIFT);
+
+       return page;
+}
+
Just nitpicking about naming. I think a better name is possible for
above, no? Like fb_to_page or fbdefio_to_page or similar to remain
consistent with vmalloc/pfn_to_page. Also the comment below about
vmalloc-ed pages would no longer be accurate. Otherwise, looks fine.

Acked-by: Jaya Kumar <redacted>
quoted hunk ↗ jump to hunk
 /* this is to find and return the vmalloc-ed fb pages */
 static int fb_deferred_io_fault(struct vm_area_struct *vma,
                               struct vm_fault *vmf)
@@ -31,14 +44,12 @@ static int fb_deferred_io_fault(struct v
       unsigned long offset;
       struct page *page;
       struct fb_info *info = vma->vm_private_data;
-       /* info->screen_base is virtual memory */
-       void *screen_base = (void __force *) info->screen_base;

       offset = vmf->pgoff << PAGE_SHIFT;
       if (offset >= info->fix.smem_len)
               return VM_FAULT_SIGBUS;

-       page = vmalloc_to_page(screen_base + offset);
+       page = fb_deferred_io_page(info, offset);
       if (!page)
               return VM_FAULT_SIGBUS;
@@ -188,7 +199,6 @@ EXPORT_SYMBOL_GPL(fb_deferred_io_open);

 void fb_deferred_io_cleanup(struct fb_info *info)
 {
-       void *screen_base = (void __force *) info->screen_base;
       struct fb_deferred_io *fbdefio = info->fbdefio;
       struct page *page;
       int i;
@@ -199,7 +209,7 @@ void fb_deferred_io_cleanup(struct fb_in

       /* clear out the mapping that we setup */
       for (i = 0 ; i < info->fix.smem_len; i += PAGE_SIZE) {
-               page = vmalloc_to_page(screen_base + i);
+               page = fb_deferred_io_page(info, i);
               page->mapping = NULL;
       }


------------------------------------------------------------------------------
_______________________________________________
Linux-fbdev-devel mailing list
Linux-fbdev-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-fbdev-devel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help