Skip to content

Commit

Permalink
video: deferred io with physically contiguous memory
Browse files Browse the repository at this point in the history
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 <[email protected]>
Acked-by: Jaya Kumar <[email protected]>
Signed-off-by: Paul Mundt <[email protected]>
  • Loading branch information
Magnus Damm authored and pmundt committed Dec 22, 2008
1 parent 6e1038a commit 37b4837
Showing 1 changed file with 15 additions and 5 deletions.
20 changes: 15 additions & 5 deletions drivers/video/fb_defio.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,21 +24,32 @@
#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;
}

/* 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)
{
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;

Expand Down Expand Up @@ -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;
Expand All @@ -199,7 +209,7 @@ void fb_deferred_io_cleanup(struct fb_info *info)

/* 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;
}

Expand Down

0 comments on commit 37b4837

Please sign in to comment.