diff options
Diffstat (limited to 'vmeta_lib.c')
-rwxr-xr-x | vmeta_lib.c | 64 |
1 files changed, 63 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; |