Commit 0049fb26 authored by Tomi Valkeinen's avatar Tomi Valkeinen

OMAPFB: use dma_alloc_attrs to allocate memory

Use dma_alloc_attrs to allocate memory instead of omap specific vram
allocator. After this we can remove the omap vram allocator.

There are some downsides to this change:

1) dma_alloc_attrs doesn't let us allocate at certain physical address.
However, this should not be a problem as this feature of vram allocator
is only used when reserving the framebuffer that was initialized by the
bootloader, and we don't currently support "passing" a framebuffer from
the bootloader to the kernel anyway.

2) dma_alloc_attrs, as of now, always ioremaps the allocated area, and
we don't need the ioremap when using VRFB. This patch uses
DMA_ATTR_NO_KERNEL_MAPPING for the allocation, but the flag is currently
not operational.

3) OMAPFB_GET_VRAM_INFO ioctl cannot return real values anymore. I
changed the ioctl to return 64M for all the values, which, I hope, the
applications will interpret as "there's enough vram".

4) "vram" kernel parameter to define how much ram to reserve for video
use no longer works. The user needs to enable CMA and use "cma"
parameter.
Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
parent 3f5ba55e
...@@ -285,7 +285,10 @@ FB0 +-- GFX ---- LCD ---- LCD ...@@ -285,7 +285,10 @@ FB0 +-- GFX ---- LCD ---- LCD
Misc notes Misc notes
---------- ----------
OMAP FB allocates the framebuffer memory using the OMAP VRAM allocator. OMAP FB allocates the framebuffer memory using the standard dma allocator. You
can enable Contiguous Memory Allocator (CONFIG_CMA) to improve the dma
allocator, and if CMA is enabled, you use "cma=" kernel parameter to increase
the global memory area for CMA.
Using DSI DPLL to generate pixel clock it is possible produce the pixel clock Using DSI DPLL to generate pixel clock it is possible produce the pixel clock
of 86.5MHz (max possible), and with that you get 1280x1024@57 output from DVI. of 86.5MHz (max possible), and with that you get 1280x1024@57 output from DVI.
...@@ -301,11 +304,6 @@ framebuffer parameters. ...@@ -301,11 +304,6 @@ framebuffer parameters.
Kernel boot arguments Kernel boot arguments
--------------------- ---------------------
vram=<size>[,<physaddr>]
- Amount of total VRAM to preallocate and optionally a physical start
memory address. For example, "10M". omapfb allocates memory for
framebuffers from VRAM.
omapfb.mode=<display>:<mode>[,...] omapfb.mode=<display>:<mode>[,...]
- Default video mode for specified displays. For example, - Default video mode for specified displays. For example,
"dvi:800x400MR-24@60". See drivers/video/modedb.c. "dvi:800x400MR-24@60". See drivers/video/modedb.c.
......
...@@ -2,7 +2,6 @@ menuconfig FB_OMAP2 ...@@ -2,7 +2,6 @@ menuconfig FB_OMAP2
tristate "OMAP2+ frame buffer support" tristate "OMAP2+ frame buffer support"
depends on FB && OMAP2_DSS && !DRM_OMAP depends on FB && OMAP2_DSS && !DRM_OMAP
select OMAP2_VRAM
select OMAP2_VRFB if ARCH_OMAP2 || ARCH_OMAP3 select OMAP2_VRFB if ARCH_OMAP2 || ARCH_OMAP3
select FB_CFB_FILLRECT select FB_CFB_FILLRECT
select FB_CFB_COPYAREA select FB_CFB_COPYAREA
......
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
#include <video/omapdss.h> #include <video/omapdss.h>
#include <plat/vrfb.h> #include <plat/vrfb.h>
#include <plat/vram.h>
#include "omapfb.h" #include "omapfb.h"
...@@ -853,14 +852,15 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) ...@@ -853,14 +852,15 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
break; break;
case OMAPFB_GET_VRAM_INFO: { case OMAPFB_GET_VRAM_INFO: {
unsigned long vram, free, largest;
DBG("ioctl GET_VRAM_INFO\n"); DBG("ioctl GET_VRAM_INFO\n");
omap_vram_get_info(&vram, &free, &largest); /*
p.vram_info.total = vram; * We don't have the ability to get this vram info anymore.
p.vram_info.free = free; * Fill in something that should keep the applications working.
p.vram_info.largest_free_block = largest; */
p.vram_info.total = SZ_1M * 64;
p.vram_info.free = SZ_1M * 64;
p.vram_info.largest_free_block = SZ_1M * 64;
if (copy_to_user((void __user *)arg, &p.vram_info, if (copy_to_user((void __user *)arg, &p.vram_info,
sizeof(p.vram_info))) sizeof(p.vram_info)))
......
...@@ -32,7 +32,6 @@ ...@@ -32,7 +32,6 @@
#include <video/omapdss.h> #include <video/omapdss.h>
#include <plat/cpu.h> #include <plat/cpu.h>
#include <plat/vram.h>
#include <plat/vrfb.h> #include <plat/vrfb.h>
#include "omapfb.h" #include "omapfb.h"
...@@ -1336,24 +1335,25 @@ static void omapfb_free_fbmem(struct fb_info *fbi) ...@@ -1336,24 +1335,25 @@ static void omapfb_free_fbmem(struct fb_info *fbi)
rg = ofbi->region; rg = ofbi->region;
WARN_ON(atomic_read(&rg->map_count)); if (rg->token == NULL)
return;
if (rg->paddr)
if (omap_vram_free(rg->paddr, rg->size))
dev_err(fbdev->dev, "VRAM FREE failed\n");
if (rg->vaddr) WARN_ON(atomic_read(&rg->map_count));
iounmap(rg->vaddr);
if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) { if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) {
/* unmap the 0 angle rotation */ /* unmap the 0 angle rotation */
if (rg->vrfb.vaddr[0]) { if (rg->vrfb.vaddr[0]) {
iounmap(rg->vrfb.vaddr[0]); iounmap(rg->vrfb.vaddr[0]);
omap_vrfb_release_ctx(&rg->vrfb);
rg->vrfb.vaddr[0] = NULL; rg->vrfb.vaddr[0] = NULL;
} }
omap_vrfb_release_ctx(&rg->vrfb);
} }
dma_free_attrs(fbdev->dev, rg->size, rg->token, rg->dma_handle,
&rg->attrs);
rg->token = NULL;
rg->vaddr = NULL; rg->vaddr = NULL;
rg->paddr = 0; rg->paddr = 0;
rg->alloc = 0; rg->alloc = 0;
...@@ -1388,7 +1388,9 @@ static int omapfb_alloc_fbmem(struct fb_info *fbi, unsigned long size, ...@@ -1388,7 +1388,9 @@ static int omapfb_alloc_fbmem(struct fb_info *fbi, unsigned long size,
struct omapfb_info *ofbi = FB2OFB(fbi); struct omapfb_info *ofbi = FB2OFB(fbi);
struct omapfb2_device *fbdev = ofbi->fbdev; struct omapfb2_device *fbdev = ofbi->fbdev;
struct omapfb2_mem_region *rg; struct omapfb2_mem_region *rg;
void __iomem *vaddr; void *token;
DEFINE_DMA_ATTRS(attrs);
dma_addr_t dma_handle;
int r; int r;
rg = ofbi->region; rg = ofbi->region;
...@@ -1403,42 +1405,43 @@ static int omapfb_alloc_fbmem(struct fb_info *fbi, unsigned long size, ...@@ -1403,42 +1405,43 @@ static int omapfb_alloc_fbmem(struct fb_info *fbi, unsigned long size,
size = PAGE_ALIGN(size); size = PAGE_ALIGN(size);
if (!paddr) { WARN_ONCE(paddr,
DBG("allocating %lu bytes for fb %d\n", size, ofbi->id); "reserving memory at predefined address not supported\n");
r = omap_vram_alloc(size, &paddr);
} else {
DBG("reserving %lu bytes at %lx for fb %d\n", size, paddr,
ofbi->id);
r = omap_vram_reserve(paddr, size);
}
if (r) { dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs);
if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB)
dma_set_attr(DMA_ATTR_NO_KERNEL_MAPPING, &attrs);
DBG("allocating %lu bytes for fb %d\n", size, ofbi->id);
token = dma_alloc_attrs(fbdev->dev, size, &dma_handle,
GFP_KERNEL, &attrs);
if (token == NULL) {
dev_err(fbdev->dev, "failed to allocate framebuffer\n"); dev_err(fbdev->dev, "failed to allocate framebuffer\n");
return -ENOMEM; return -ENOMEM;
} }
if (ofbi->rotation_type != OMAP_DSS_ROT_VRFB) { DBG("allocated VRAM paddr %lx, vaddr %p\n",
vaddr = ioremap_wc(paddr, size); (unsigned long)dma_handle, token);
if (!vaddr) {
dev_err(fbdev->dev, "failed to ioremap framebuffer\n");
omap_vram_free(paddr, size);
return -ENOMEM;
}
DBG("allocated VRAM paddr %lx, vaddr %p\n", paddr, vaddr); if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) {
} else {
r = omap_vrfb_request_ctx(&rg->vrfb); r = omap_vrfb_request_ctx(&rg->vrfb);
if (r) { if (r) {
dma_free_attrs(fbdev->dev, size, token, dma_handle,
&attrs);
dev_err(fbdev->dev, "vrfb create ctx failed\n"); dev_err(fbdev->dev, "vrfb create ctx failed\n");
return r; return r;
} }
vaddr = NULL;
} }
rg->paddr = paddr; rg->attrs = attrs;
rg->vaddr = vaddr; rg->token = token;
rg->dma_handle = dma_handle;
rg->paddr = (unsigned long)dma_handle;
rg->vaddr = (void __iomem *)token;
rg->size = size; rg->size = size;
rg->alloc = 1; rg->alloc = 1;
......
...@@ -28,6 +28,8 @@ ...@@ -28,6 +28,8 @@
#endif #endif
#include <linux/rwsem.h> #include <linux/rwsem.h>
#include <linux/dma-attrs.h>
#include <linux/dma-mapping.h>
#include <video/omapdss.h> #include <video/omapdss.h>
...@@ -49,6 +51,9 @@ extern bool omapfb_debug; ...@@ -49,6 +51,9 @@ extern bool omapfb_debug;
struct omapfb2_mem_region { struct omapfb2_mem_region {
int id; int id;
struct dma_attrs attrs;
void *token;
dma_addr_t dma_handle;
u32 paddr; u32 paddr;
void __iomem *vaddr; void __iomem *vaddr;
struct vrfb vrfb; struct vrfb vrfb;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment