From: Tomi Valkeinen Date: Wed, 22 Apr 2009 07:25:20 +0000 (+0300) Subject: DSS2: VRAM: clear allocated area with DMA X-Git-Tag: Release-2010-05/1~2^2~93 X-Git-Url: https://git.openpandora.org/cgi-bin/gitweb.cgi?p=pandora-kernel.git;a=commitdiff_plain;h=4c2df6f39af09435c3e714c18d10004879269709 DSS2: VRAM: clear allocated area with DMA Use DMA constant fill feature to clear VRAM area when someone allocates it. --- diff --git a/arch/arm/plat-omap/vram.c b/arch/arm/plat-omap/vram.c index 8e9fe775c890..90276ac65c34 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; }