summaryrefslogtreecommitdiff
path: root/vmeta_lib.c
diff options
context:
space:
mode:
authorJoseph Lo <jlo@marvell.com>2010-04-21 14:24:04 +0800
committerLea Li <lea.li@marvell.com>2010-04-21 16:23:09 +0800
commita7a3e19282f435f73d0d2c9151695e40cf9b3b7c (patch)
tree873f8f3e74501a3a2bc491d38080df447917c943 /vmeta_lib.c
parentd22406f55aa68562b23cc64d3249255f608eccd7 (diff)
update for BMM update & two memory attr for vdec_os_api_dma_alloc
Diffstat (limited to 'vmeta_lib.c')
-rwxr-xr-xvmeta_lib.c64
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;