From 1850c0c28d013be68d398cac330a0dcfbb7a1ed6 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Wed, 22 Apr 2009 10:25:20 +0300 Subject: [PATCH 047/146] DSS2: VRAM: clear allocated area with DMA Use DMA constant fill feature to clear VRAM area when someone allocates it. --- arch/arm/plat-omap/vram.c | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 57 insertions(+), 0 deletions(-) diff --git a/arch/arm/plat-omap/vram.c b/arch/arm/plat-omap/vram.c index 8e9fe77..90276ac 100644 --- a/arch/arm/plat-omap/vram.c +++ b/arch/arm/plat-omap/vram.c @@ -31,11 +31,13 @@ #include #include #include +#include #include #include #include +#include #ifdef DEBUG #define DBG(format, ...) printk(KERN_DEBUG "VRAM: " format, ## __VA_ARGS__) @@ -276,6 +278,59 @@ int omap_vram_reserve(unsigned long paddr, size_t size) } EXPORT_SYMBOL(omap_vram_reserve); +static void _omap_vram_dma_cb(int lch, u16 ch_status, void *data) +{ + struct completion *compl = data; + complete(compl); +} + +static int _omap_vram_clear(u32 paddr, unsigned pages) +{ + struct completion compl; + unsigned elem_count; + unsigned frame_count; + int r; + int lch; + + init_completion(&compl); + + r = omap_request_dma(OMAP_DMA_NO_DEVICE, "VRAM DMA", + _omap_vram_dma_cb, + &compl, &lch); + if (r) { + pr_err("VRAM: request_dma failed for memory clear\n"); + return -EBUSY; + } + + elem_count = pages * PAGE_SIZE / 4; + frame_count = 1; + + omap_set_dma_transfer_params(lch, OMAP_DMA_DATA_TYPE_S32, + elem_count, frame_count, + OMAP_DMA_SYNC_ELEMENT, + 0, 0); + + omap_set_dma_dest_params(lch, 0, OMAP_DMA_AMODE_POST_INC, + paddr, 0, 0); + + omap_set_dma_color_mode(lch, OMAP_DMA_CONSTANT_FILL, 0x000000); + + omap_start_dma(lch); + + if (wait_for_completion_timeout(&compl, msecs_to_jiffies(1000)) == 0) { + omap_stop_dma(lch); + pr_err("VRAM: dma timeout while clearing memory\n"); + r = -EIO; + goto err; + } + + r = 0; +err: + omap_free_dma(lch); + + return r; +} + static int _omap_vram_alloc(int mtype, unsigned pages, unsigned long *paddr) { struct vram_region *rm; @@ -313,6 +368,8 @@ found: *paddr = start; + _omap_vram_clear(start, pages); + return 0; } -- 1.6.2.4