diff options
Diffstat (limited to 'recipes/linux/linux-omap-2.6.29/dss2/0049-DSS2-VRAM-clear-allocated-area-with-DMA.patch')
-rw-r--r-- | recipes/linux/linux-omap-2.6.29/dss2/0049-DSS2-VRAM-clear-allocated-area-with-DMA.patch | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0049-DSS2-VRAM-clear-allocated-area-with-DMA.patch b/recipes/linux/linux-omap-2.6.29/dss2/0049-DSS2-VRAM-clear-allocated-area-with-DMA.patch new file mode 100644 index 0000000000..e9fc76ce15 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0049-DSS2-VRAM-clear-allocated-area-with-DMA.patch @@ -0,0 +1,101 @@ +From 02034cc79f69512a6037f03ad1243c28f59fdd8a Mon Sep 17 00:00:00 2001 +From: Tomi Valkeinen <tomi.valkeinen@nokia.com> +Date: Wed, 22 Apr 2009 10:25:20 +0300 +Subject: [PATCH] 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 <linux/seq_file.h> + #include <linux/bootmem.h> + #include <linux/omapfb.h> ++#include <linux/completion.h> + + #include <asm/setup.h> + + #include <mach/sram.h> + #include <mach/vram.h> ++#include <mach/dma.h> + + #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.5.6.5 + |