diff options
author | Lajos Molnar <molnar@ti.com> | 2011-12-16 14:11:08 +0800 |
---|---|---|
committer | Andy Green <andy.green@linaro.org> | 2011-12-26 22:33:22 +0800 |
commit | e39649db98031bebd24454f91fd037f4bb970bf3 (patch) | |
tree | 6b0f0ebc2e9a2b10ffdf83bc40b9bef945f77597 | |
parent | 904b49257314d5559d781812e2825bc9bdec3dd1 (diff) |
OMAP: TILER: Added 1D area allocation + memory pinning operations
Added new tiler kernel methods:
tiler_alloc_block_area() allocates a 1D container area of certain size
tiler_pin_memory() can pin memory-backing to a 1D container area (or replace
its previous mapping)
tiler_unpin_memory() clears the memory-backing of a 1D container area
tiler_free_block() can be still used to free the container area.
Signed-off-by: Lajos Molnar <molnar@ti.com>
-rw-r--r-- | drivers/media/video/tiler/tiler-main.c | 45 |
1 files changed, 37 insertions, 8 deletions
diff --git a/drivers/media/video/tiler/tiler-main.c b/drivers/media/video/tiler/tiler-main.c index c6e729d3c57..ede63bfd702 100644 --- a/drivers/media/video/tiler/tiler-main.c +++ b/drivers/media/video/tiler/tiler-main.c @@ -558,18 +558,13 @@ static s32 lay_nv12(int n, u16 w, u16 w1, u16 h, struct gid_info *gi, u8 *p) return n; } -/* (must have mutex) free block and any freed areas */ -static s32 _m_free(struct mem_info *mi) +static void _m_unpin(struct mem_info *mi) { - struct area_info *ai = NULL; - struct page *page = NULL; - s32 res = 0; - u32 i; - /* release memory */ if (mi->pa.memtype == TILER_MEM_GOT_PAGES) { + int i; for (i = 0; i < mi->pa.num_pg; i++) { - page = phys_to_page(mi->pa.mem[i]); + struct page *page = phys_to_page(mi->pa.mem[i]); if (page) { if (!PageReserved(page)) SetPageDirty(page); @@ -585,7 +580,18 @@ static s32 _m_free(struct mem_info *mi) mi->pa.mem = NULL; } kfree(mi->pa.mem); + mi->pa.mem = NULL; + mi->pa.num_pg = 0; clear_pat(tmm[tiler_fmt(mi->blk.phys)], &mi->area); +} + +/* (must have mutex) free block and any freed areas */ +static s32 _m_free(struct mem_info *mi) +{ + struct area_info *ai = NULL; + s32 res = 0; + + _m_unpin(mi); /* safe deletion as list may not have been assigned */ if (mi->global.next) @@ -1378,6 +1384,29 @@ void tiler_free_block(tiler_blk_handle block) } EXPORT_SYMBOL(tiler_free_block); +tiler_blk_handle tiler_alloc_block_area(u32 size) +{ + return alloc_block_area(TILFMT_PAGE, size >> PAGE_SHIFT, 1, 0, 0, 0, 0, + __get_pi(0, true)); +} +EXPORT_SYMBOL(tiler_alloc_block_area); + +void tiler_unpin_memory(tiler_blk_handle block) +{ + mutex_lock(&mtx); + _m_unpin(block); + mutex_unlock(&mtx); +} +EXPORT_SYMBOL(tiler_unpin_memory); + +s32 tiler_pin_memory(tiler_blk_handle block, struct tiler_pa_info *pa) +{ + struct tiler_pa_info *pa_tmp = kmemdup(pa, sizeof(*pa), GFP_KERNEL); + tiler_unpin_memory(block); + return pin_memory(block, pa_tmp); +} +EXPORT_SYMBOL(tiler_pin_memory); + MODULE_LICENSE("GPL v2"); MODULE_AUTHOR("Lajos Molnar <molnar@ti.com>"); MODULE_AUTHOR("David Sin <davidsin@ti.com>"); |