summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King <rmk@arm.linux.org.uk>2012-10-18 14:59:20 +0100
committerRussell King <rmk@arm.linux.org.uk>2012-10-23 11:14:38 +0100
commit23d335ed2bacd2a4aa40eb50bdc11bcb1cd6b715 (patch)
treec42d6c92a7d08187dd8542bb89c1705ae453f5dc
parentee42d1797b8bfb431323edb002a15b1871ccc208 (diff)
Consolidate bmm allocation functions
-rw-r--r--vmeta_lib.c77
1 files changed, 17 insertions, 60 deletions
diff --git a/vmeta_lib.c b/vmeta_lib.c
index d357fac..dea64c4 100644
--- a/vmeta_lib.c
+++ b/vmeta_lib.c
@@ -176,21 +176,22 @@ void vdec_os_api_dma_free(void *ptr)
bmm_free((void *)paddr);
}
-void * vdec_os_api_dma_alloc(UNSG32 size, UNSG32 align, UNSG32 * pPhysical)
+static void *vmeta_bmm_malloc_aligned(UNSG32 size, UNSG32 align, UNSG32 *phys, int attr)
{
- unsigned int *ptr;
- unsigned int tmp;
+ unsigned int tmp, *ptr;
- if(size <= 0)
+ if (size == 0)
return NULL;
- dbg_printf(VDEC_DEBUG_MEM, "vdec_os_api_dma_alloc -> size: 0x%x\n", size);
+ dbg_printf(VDEC_DEBUG_MEM, "%s: size 0x%x attr %u\n",
+ __FUNCTION__, size, attr);
align = ALIGN(align, sizeof(int));
size += align;
- ptr = bmm_malloc(size, BMM_ATTR_NONCACHED);
+ ptr = bmm_malloc(size, attr);
if (!ptr) {
- dbg_printf(VDEC_DEBUG_MEM, "vdec_os_api_vmalloc not enough memory\n");
+ dbg_printf(VDEC_DEBUG_MEM, "%s: not enough memory\n",
+ __FUNCTION__);
return NULL;
}
@@ -199,70 +200,26 @@ void * vdec_os_api_dma_alloc(UNSG32 size, UNSG32 align, UNSG32 * pPhysical)
ptr = (unsigned int *)((unsigned int)ptr + tmp);
*(ptr - 1) = tmp;
- *pPhysical = (unsigned long)bmm_get_paddr(ptr);
+ *phys = (UNSG32)bmm_get_paddr(ptr);
- dbg_printf(VDEC_DEBUG_MEM, "vdec_os_api_dma_alloc ptr: 0x%x\n", ptr);
+ dbg_printf(VDEC_DEBUG_MEM, "%s: ptr: 0x%x\n", __FUNCTION__, ptr);
return ptr;
}
-void * vdec_os_api_dma_alloc_cached(UNSG32 size, UNSG32 align, UNSG32 * pPhysical)
+void * vdec_os_api_dma_alloc(UNSG32 size, UNSG32 align, UNSG32 * pPhysical)
{
- unsigned int *ptr;
- unsigned int tmp;
-
- if(size <= 0)
- return NULL;
-
- dbg_printf(VDEC_DEBUG_MEM, "vdec_os_api_dma_alloc_cached -> size: 0x%x\n", size);
-
- align = ALIGN(align, sizeof(int));
- size += align;
- ptr = bmm_malloc(size, BMM_ATTR_DEFAULT);
- if (!ptr) {
- dbg_printf(VDEC_DEBUG_MEM,"\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_cached ptr: 0x%x\n", ptr);
+ return vmeta_bmm_malloc_aligned(size, align, pPhysical, BMM_ATTR_NONCACHED);
+}
- return ptr;
+void * vdec_os_api_dma_alloc_cached(UNSG32 size, UNSG32 align, UNSG32 * pPhysical)
+{
+ return vmeta_bmm_malloc_aligned(size, align, pPhysical, BMM_ATTR_DEFAULT);
}
void * vdec_os_api_dma_alloc_writecombine(UNSG32 size, UNSG32 align, UNSG32 * pPhysical)
{
- unsigned int *ptr;
- unsigned int tmp;
-
- if(size <= 0)
- return NULL;
-
- dbg_printf(VDEC_DEBUG_MEM, "vdec_os_api_dma_alloc_cached -> size: 0x%x\n", size);
-
- align = ALIGN(align, sizeof(int));
- size += align;
- ptr = bmm_malloc(size, BMM_ATTR_WRITECOMBINE);
- if (!ptr) {
- dbg_printf(VDEC_DEBUG_MEM, "\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_writecombine ptr: 0x%x\n", ptr);
-
- return ptr;
+ return vmeta_bmm_malloc_aligned(size, align, pPhysical, BMM_ATTR_WRITECOMBINE);
}
UNSG32 vdec_os_api_flush_cache(UNSG32 vaddr, UNSG32 size, enum dma_data_direction direction)