diff options
author | Joseph Lo <jlo@marvell.com> | 2010-04-21 14:24:04 +0800 |
---|---|---|
committer | Lea Li <lea.li@marvell.com> | 2010-04-21 16:23:09 +0800 |
commit | a7a3e19282f435f73d0d2c9151695e40cf9b3b7c (patch) | |
tree | 873f8f3e74501a3a2bc491d38080df447917c943 | |
parent | d22406f55aa68562b23cc64d3249255f608eccd7 (diff) |
update for BMM update & two memory attr for vdec_os_api_dma_alloc
-rwxr-xr-x | vmeta_lib.c | 64 | ||||
-rwxr-xr-x | vmeta_lib.h | 2 |
2 files changed, 65 insertions, 1 deletions
diff --git a/vmeta_lib.c b/vmeta_lib.c index 9d83f30..15b3820 100755 --- a/vmeta_lib.c +++ b/vmeta_lib.c @@ -148,7 +148,69 @@ void * vdec_os_api_dma_alloc(UNSG32 size, UNSG32 align, UNSG32 * pPhysical) align = ALIGN(align, sizeof(int)); size += align; - ptr = bmm_malloc(size, BMM_ATTR_NONBUFFERABLE | BMM_ATTR_NONCACHEABLE); + ptr = bmm_malloc(size, BMM_ATTR_NONCACHED); + if (!ptr) { + printf("\tno enough memory\n"); + return NULL; + } + + tmp = (unsigned int)((unsigned int)(ptr) & (align - 1)); + tmp = (unsigned int)(align - tmp); + ptr = (unsigned int *)((unsigned int)ptr + tmp); + *(ptr - 1) = tmp; + + *pPhysical = (unsigned long)bmm_get_paddr(ptr); + + dbg_printf(VDEC_DEBUG_MEM, "vdec_os_api_dma_alloc ptr: 0x%x\n", ptr); + //memset(ptr, 0, size); + + return ptr; +} + +void * vdec_os_api_dma_alloc_writecombine(UNSG32 size, UNSG32 align, UNSG32 * pPhysical) +{ + unsigned int *ptr = NULL; + unsigned int tmp = 0; + + if(size <= 0) + return NULL; + + dbg_printf(VDEC_DEBUG_MEM, "vdec_os_api_dma_alloc -> size: 0x%x\n", size); + + align = ALIGN(align, sizeof(int)); + size += align; + ptr = bmm_malloc(size, BMM_ATTR_WRITECOMBINE); + if (!ptr) { + printf("\tno enough memory\n"); + return NULL; + } + + tmp = (unsigned int)((unsigned int)(ptr) & (align - 1)); + tmp = (unsigned int)(align - tmp); + ptr = (unsigned int *)((unsigned int)ptr + tmp); + *(ptr - 1) = tmp; + + *pPhysical = (unsigned long)bmm_get_paddr(ptr); + + dbg_printf(VDEC_DEBUG_MEM, "vdec_os_api_dma_alloc ptr: 0x%x\n", ptr); + //memset(ptr, 0, size); + + return ptr; +} + +void * vdec_os_api_dma_alloc_cached(UNSG32 size, UNSG32 align, UNSG32 * pPhysical) +{ + unsigned int *ptr = NULL; + unsigned int tmp = 0; + + if(size <= 0) + return NULL; + + dbg_printf(VDEC_DEBUG_MEM, "vdec_os_api_dma_alloc -> size: 0x%x\n", size); + + align = ALIGN(align, sizeof(int)); + size += align; + ptr = bmm_malloc(size, BMM_ATTR_DEFAULT); if (!ptr) { printf("\tno enough memory\n"); return NULL; diff --git a/vmeta_lib.h b/vmeta_lib.h index 561e855..3c44412 100755 --- a/vmeta_lib.h +++ b/vmeta_lib.h @@ -55,6 +55,8 @@ SIGN32 vdec_os_driver_clean(void); // Memory operation API //--------------------------------------------------------------------------- void * vdec_os_api_dma_alloc(UNSG32 size, UNSG32 align, UNSG32 * pPhysical); +void * vdec_os_api_dma_alloc_writecombine(UNSG32 size, UNSG32 align, UNSG32 * pPhysical); +void * vdec_os_api_dma_alloc_cached(UNSG32 size, UNSG32 align, UNSG32 * pPhysical); void vdec_os_api_dma_free(void *ptr); void *vdec_os_api_vmalloc(UNSG32 size, UNSG32 align); // always return VA and can't be translated to PA |