au1100fb: fix DMA API abuse
Virtual addresses return from dma(m)_alloc_coherent are opaque in what backs then, and drivers must not poke into them. Switch the driver to use the generic DMA API mmap helper to avoid these games. Signed-off-by: Christoph Hellwig <hch@lst.de> Acked-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
This commit is contained in:
parent
e58cfbfb32
commit
67f30ad19c
|
@ -340,14 +340,12 @@ int au1100fb_fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *fbi)
|
||||||
*/
|
*/
|
||||||
int au1100fb_fb_mmap(struct fb_info *fbi, struct vm_area_struct *vma)
|
int au1100fb_fb_mmap(struct fb_info *fbi, struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
struct au1100fb_device *fbdev;
|
struct au1100fb_device *fbdev = to_au1100fb_device(fbi);
|
||||||
|
|
||||||
fbdev = to_au1100fb_device(fbi);
|
|
||||||
|
|
||||||
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
|
|
||||||
pgprot_val(vma->vm_page_prot) |= (6 << 9); //CCA=6
|
pgprot_val(vma->vm_page_prot) |= (6 << 9); //CCA=6
|
||||||
|
|
||||||
return vm_iomap_memory(vma, fbdev->fb_phys, fbdev->fb_len);
|
return dma_mmap_coherent(fbdev->dev, vma, fbdev->fb_mem, fbdev->fb_phys,
|
||||||
|
fbdev->fb_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct fb_ops au1100fb_ops =
|
static struct fb_ops au1100fb_ops =
|
||||||
|
@ -412,7 +410,6 @@ static int au1100fb_drv_probe(struct platform_device *dev)
|
||||||
{
|
{
|
||||||
struct au1100fb_device *fbdev;
|
struct au1100fb_device *fbdev;
|
||||||
struct resource *regs_res;
|
struct resource *regs_res;
|
||||||
unsigned long page;
|
|
||||||
struct clk *c;
|
struct clk *c;
|
||||||
|
|
||||||
/* Allocate new device private */
|
/* Allocate new device private */
|
||||||
|
@ -424,6 +421,7 @@ static int au1100fb_drv_probe(struct platform_device *dev)
|
||||||
goto failed;
|
goto failed;
|
||||||
|
|
||||||
platform_set_drvdata(dev, (void *)fbdev);
|
platform_set_drvdata(dev, (void *)fbdev);
|
||||||
|
fbdev->dev = &dev->dev;
|
||||||
|
|
||||||
/* Allocate region for our registers and map them */
|
/* Allocate region for our registers and map them */
|
||||||
regs_res = platform_get_resource(dev, IORESOURCE_MEM, 0);
|
regs_res = platform_get_resource(dev, IORESOURCE_MEM, 0);
|
||||||
|
@ -472,20 +470,6 @@ static int au1100fb_drv_probe(struct platform_device *dev)
|
||||||
au1100fb_fix.smem_start = fbdev->fb_phys;
|
au1100fb_fix.smem_start = fbdev->fb_phys;
|
||||||
au1100fb_fix.smem_len = fbdev->fb_len;
|
au1100fb_fix.smem_len = fbdev->fb_len;
|
||||||
|
|
||||||
/*
|
|
||||||
* Set page reserved so that mmap will work. This is necessary
|
|
||||||
* since we'll be remapping normal memory.
|
|
||||||
*/
|
|
||||||
for (page = (unsigned long)fbdev->fb_mem;
|
|
||||||
page < PAGE_ALIGN((unsigned long)fbdev->fb_mem + fbdev->fb_len);
|
|
||||||
page += PAGE_SIZE) {
|
|
||||||
#ifdef CONFIG_DMA_NONCOHERENT
|
|
||||||
SetPageReserved(virt_to_page(CAC_ADDR((void *)page)));
|
|
||||||
#else
|
|
||||||
SetPageReserved(virt_to_page(page));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
print_dbg("Framebuffer memory map at %p", fbdev->fb_mem);
|
print_dbg("Framebuffer memory map at %p", fbdev->fb_mem);
|
||||||
print_dbg("phys=0x%08x, size=%dK", fbdev->fb_phys, fbdev->fb_len / 1024);
|
print_dbg("phys=0x%08x, size=%dK", fbdev->fb_phys, fbdev->fb_len / 1024);
|
||||||
|
|
||||||
|
|
|
@ -110,6 +110,7 @@ struct au1100fb_device {
|
||||||
dma_addr_t fb_phys;
|
dma_addr_t fb_phys;
|
||||||
int panel_idx;
|
int panel_idx;
|
||||||
struct clk *lcdclk;
|
struct clk *lcdclk;
|
||||||
|
struct device *dev;
|
||||||
};
|
};
|
||||||
|
|
||||||
/********************************************************************/
|
/********************************************************************/
|
||||||
|
|
Loading…
Reference in New Issue