diff options
Diffstat (limited to 'vmeta_lib.c')
-rw-r--r-- | vmeta_lib.c | 342 |
1 files changed, 159 insertions, 183 deletions
diff --git a/vmeta_lib.c b/vmeta_lib.c index 0026877..d357fac 100644 --- a/vmeta_lib.c +++ b/vmeta_lib.c @@ -78,7 +78,7 @@ static inline int clear_bit(int nr, unsigned int *addr) old = *addr; *addr = old & ~mask; - + return (old & mask) != 0; } @@ -134,13 +134,13 @@ UNSG32 vdec_os_api_get_va(UNSG32 paddr) void vdec_os_api_vfree(void *ptr) { - unsigned int offset; - unsigned int *paddr; + unsigned int offset; + unsigned int *paddr; - paddr = ptr; - offset = *(paddr - 1); - paddr = (unsigned int *)((unsigned int)paddr - offset); - free(paddr); + paddr = ptr; + offset = *(paddr - 1); + paddr = (unsigned int *)((unsigned int)paddr - offset); + free(paddr); } void *vdec_os_api_vmalloc(UNSG32 size, UNSG32 align) @@ -208,61 +208,61 @@ void * vdec_os_api_dma_alloc(UNSG32 size, UNSG32 align, UNSG32 * pPhysical) void * vdec_os_api_dma_alloc_cached(UNSG32 size, UNSG32 align, UNSG32 * pPhysical) { - unsigned int *ptr; - unsigned int tmp; + unsigned int *ptr; + unsigned int tmp; - if(size <= 0) - return NULL; + if(size <= 0) + return NULL; - dbg_printf(VDEC_DEBUG_MEM, "vdec_os_api_dma_alloc_cached -> size: 0x%x\n", size); + 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 ptr; + 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 ptr; } void * vdec_os_api_dma_alloc_writecombine(UNSG32 size, UNSG32 align, UNSG32 * pPhysical) { - unsigned int *ptr; - unsigned int tmp; + unsigned int *ptr; + unsigned int tmp; - if(size <= 0) - return NULL; + if(size <= 0) + return NULL; - dbg_printf(VDEC_DEBUG_MEM, "vdec_os_api_dma_alloc_cached -> size: 0x%x\n", size); + 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; + 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; } UNSG32 vdec_os_api_flush_cache(UNSG32 vaddr, UNSG32 size, enum dma_data_direction direction) @@ -320,7 +320,7 @@ SIGN32 vdec_os_api_sync_event() { struct pollfd ufds; int result = 0; - + ufds.fd = vdec_iface->uiofd; ufds.events = POLLIN; @@ -601,7 +601,7 @@ static int dbg_printf(UNSG32 dbglevel, const char* format, ...) { return -1; } #endif - + if(VDEC_DEBUG_NONE == globalDbgLevel) goto DBG_EXIT; else { @@ -661,7 +661,7 @@ SIGN32 vdec_os_api_get_hw_obj_addr(UNSG32* vaddr,UNSG32 size) *vaddr = (UNSG32)addr; vdec_iface->vdec_obj_va = addr; vdec_iface->vdec_obj_size = size; - + get_vdec_obj_fail: return ret; } @@ -686,8 +686,7 @@ SIGN32 vdec_os_api_get_hw_context_addr(UNSG32* paddr, UNSG32* vaddr, UNSG32 size vdec_iface->hw_context_pa = phys; dbg_printf(VDEC_DEBUG_MEM, "UIO_IO_HW_CONTEXT: 0x%08x\n", *paddr); - - + get_hw_context_fail: return ret; } @@ -713,7 +712,7 @@ SIGN32 vdec_os_api_get_ks(kernel_share** pp_ks) *pp_ks = addr; vdec_iface->kernel_share_va = addr; vdec_iface->kernel_share_size = size; - + get_vos_fail: return ret; } @@ -732,26 +731,23 @@ static int find_user_id(id_instance *list)//return unoccupied id SIGN32 vdec_os_api_force_ini(void) { - kernel_share *p_ks; - vdec_os_driver_cb_t *p_cb = vdec_driver_get_cb(); - - if(p_cb->kernel_share_va == NULL) - { - vdec_os_api_get_ks(&p_ks); - } - else - { - p_ks = p_cb->kernel_share_va; - } - - vmeta_private_lock(); - memset(p_ks, 0, sizeof(kernel_share)); - p_ks->active_user_id = MAX_VMETA_INSTANCE; - vmeta_private_unlock(); - - ioctl(vdec_iface->uiofd,VMETA_CMD_UNLOCK); - - return 0; + kernel_share *p_ks; + vdec_os_driver_cb_t *p_cb = vdec_driver_get_cb(); + + if(p_cb->kernel_share_va == NULL) { + vdec_os_api_get_ks(&p_ks); + } else { + p_ks = p_cb->kernel_share_va; + } + + vmeta_private_lock(); + memset(p_ks, 0, sizeof(kernel_share)); + p_ks->active_user_id = MAX_VMETA_INSTANCE; + vmeta_private_unlock(); + + ioctl(vdec_iface->uiofd,VMETA_CMD_UNLOCK); + + return 0; } SIGN32 vdec_os_api_get_user_id(void) @@ -760,24 +756,20 @@ SIGN32 vdec_os_api_get_user_id(void) SIGN32 ret = -1; vdec_os_driver_cb_t *p_cb = vdec_driver_get_cb(); - if(p_cb->kernel_share_va == NULL) - { + if(p_cb->kernel_share_va == NULL) { vdec_os_api_get_ks(&p_ks); - } - else - { + } else { p_ks = p_cb->kernel_share_va; } vmeta_private_lock(); ret = find_user_id(p_ks->user_id_list); - if( ret < 0) { + if(ret < 0) { dbg_printf(VDEC_DEBUG_ALL, "vdec_os_api_get_user_id: find_user_id error\n"); } vmeta_private_unlock(); return ret; - } SIGN32 vdec_os_api_free_user_id(SIGN32 user_id) @@ -785,8 +777,7 @@ SIGN32 vdec_os_api_free_user_id(SIGN32 user_id) kernel_share *p_ks; vdec_os_driver_cb_t *p_cb = vdec_driver_get_cb(); - if(p_cb->kernel_share_va == NULL) - { + if(p_cb->kernel_share_va == NULL) { dbg_printf(VDEC_DEBUG_ALL,"vdec_os_api_free_user_id error: not init yet\n"); return VDEC_OS_DRIVER_USER_ID_FAIL; } @@ -801,11 +792,11 @@ SIGN32 vdec_os_api_free_user_id(SIGN32 user_id) clear_bit(VMETA_STATUS_BIT_REGISTED,&(p_ks->user_id_list[user_id].status)); clear_bit(VMETA_STATUS_BIT_USED,&(p_ks->user_id_list[user_id].status)); - - vmeta_private_unlock(); - - return VDEC_OS_DRIVER_OK; - } + + vmeta_private_unlock(); + + return VDEC_OS_DRIVER_OK; +} static void *vmeta_thread_monitor(void *_data) { @@ -818,8 +809,7 @@ static void *vmeta_thread_monitor(void *_data) pthread_mutex_lock(&pmt); - if(p_cb->kernel_share_va == NULL || pmd == NULL) - { + if(p_cb->kernel_share_va == NULL || pmd == NULL) { dbg_printf(VDEC_DEBUG_ALL,"vdec_os_api_free_user_id error: not init yet\n"); free(pmd); pthread_detach(pthread_self()); @@ -828,8 +818,7 @@ static void *vmeta_thread_monitor(void *_data) } p_md = malloc(sizeof(struct monitor_data)); - if(p_md == NULL) - { + if(p_md == NULL) { free(pmd); pthread_detach(pthread_self()); pthread_mutex_unlock(&pmt); @@ -841,20 +830,17 @@ static void *vmeta_thread_monitor(void *_data) p_ks = p_cb->kernel_share_va; - if(pthread_getattr_np(p_md->pt,&pat) != 0) - { + if(pthread_getattr_np(p_md->pt,&pat) != 0) { dbg_printf(VDEC_DEBUG_LOCK,"get thread attr failed\n"); goto tag_monitor_fail; } - if( pthread_attr_getdetachstate(&pat,&detach_attr) != 0) - { + if( pthread_attr_getdetachstate(&pat,&detach_attr) != 0) { dbg_printf(VDEC_DEBUG_LOCK,"get detach attr failed\n"); goto tag_monitor_fail; } - if( detach_attr == PTHREAD_CREATE_DETACHED) - { + if( detach_attr == PTHREAD_CREATE_DETACHED) { dbg_printf(VDEC_DEBUG_LOCK,"The thread is a detached thread, cannot join\nexit monitor!\n"); goto tag_monitor_fail; } @@ -909,36 +895,33 @@ tag_monitor_fail: SIGN32 vdec_os_api_register_user_id(SIGN32 user_id) { - kernel_share *p_ks; - vdec_os_driver_cb_t *p_cb = vdec_driver_get_cb(); + kernel_share *p_ks; + vdec_os_driver_cb_t *p_cb = vdec_driver_get_cb(); pthread_t tmp; struct monitor_data *p_md; - - if(user_id>=MAX_VMETA_INSTANCE || user_id<0) { + + if(user_id>=MAX_VMETA_INSTANCE || user_id<0) { dbg_printf(VDEC_DEBUG_ALL,"vdec_os_api_register_user_id error: exceeds max user_id\n"); - return VDEC_OS_DRIVER_USER_ID_FAIL; - } - - if(p_cb->kernel_share_va == NULL) - { - vdec_os_api_get_ks(&p_ks); - } - else - { - p_ks = p_cb->kernel_share_va; - } - - if(set_bit(VMETA_STATUS_BIT_REGISTED, &(p_ks->user_id_list[user_id].status)) == 1) { + return VDEC_OS_DRIVER_USER_ID_FAIL; + } + + if(p_cb->kernel_share_va == NULL) { + vdec_os_api_get_ks(&p_ks); + } else { + p_ks = p_cb->kernel_share_va; + } + + if(set_bit(VMETA_STATUS_BIT_REGISTED, &(p_ks->user_id_list[user_id].status)) == 1) { dbg_printf(VDEC_DEBUG_ALL, "vdec_os_api_register_user_id error: user id has already been registered\n"); - return VDEC_OS_DRIVER_USER_ID_FAIL; - } - + return VDEC_OS_DRIVER_USER_ID_FAIL; + } + p_md = malloc(sizeof(struct monitor_data));//This is freed monitor function if(p_md == NULL) { dbg_printf(VDEC_DEBUG_ALL,"vdec_os_api_register_user_id error: OOM\n"); return VDEC_OS_DRIVER_USER_ID_FAIL; } - p_ks->ref_count++; + p_ks->ref_count++; p_ks->user_id_list[user_id].pid = getpid(); p_md->pt = pthread_self(); p_ks->user_id_list[user_id].pt = (unsigned int) p_md->pt; @@ -946,95 +929,88 @@ SIGN32 vdec_os_api_register_user_id(SIGN32 user_id) pthread_create(&tmp,NULL,vmeta_thread_monitor,p_md); dbg_printf(VDEC_DEBUG_LOCK,"pid=%x,pt=0x%x are monitored user_id(%d)\n",p_ks->user_id_list[user_id].pid,p_ks->user_id_list[user_id].pt,user_id); - - return VDEC_OS_DRIVER_OK; - + + return VDEC_OS_DRIVER_OK; } - + SIGN32 vdec_os_api_unregister_user_id(SIGN32 user_id) { - kernel_share *p_ks; - vdec_os_driver_cb_t *p_cb = vdec_driver_get_cb(); - - if(user_id>=MAX_VMETA_INSTANCE || user_id<0) { + kernel_share *p_ks; + vdec_os_driver_cb_t *p_cb = vdec_driver_get_cb(); + + if(user_id>=MAX_VMETA_INSTANCE || user_id<0) { dbg_printf(VDEC_DEBUG_ALL,"vdec_os_api_unregister_user_id error: exceeds max user_id\n"); - return VDEC_OS_DRIVER_USER_ID_FAIL; - } - - if(p_cb->kernel_share_va == NULL) - { + return VDEC_OS_DRIVER_USER_ID_FAIL; + } + + if(p_cb->kernel_share_va == NULL) { dbg_printf(VDEC_DEBUG_ALL,"vdec_os_api_unregister_user_id error: not init yet\n"); - return VDEC_OS_DRIVER_USER_ID_FAIL; - } - else - { - p_ks = p_cb->kernel_share_va; - } - - if(clear_bit(VMETA_STATUS_BIT_REGISTED,&(p_ks->user_id_list[user_id].status)) == 0) { + return VDEC_OS_DRIVER_USER_ID_FAIL; + } else { + p_ks = p_cb->kernel_share_va; + } + + if(clear_bit(VMETA_STATUS_BIT_REGISTED,&(p_ks->user_id_list[user_id].status)) == 0) { dbg_printf(VDEC_DEBUG_ALL,"vdec_os_api_unregister_user_id error: user id[%d] has not been registered\n",user_id); - return VDEC_OS_DRIVER_USER_ID_FAIL; - } - - p_ks->ref_count--; - - return VDEC_OS_DRIVER_OK; + return VDEC_OS_DRIVER_USER_ID_FAIL; + } + + p_ks->ref_count--; + + return VDEC_OS_DRIVER_OK; } - + static SIGN32 vmeta_private_lock() { ioctl(vdec_iface->uiofd,VMETA_CMD_PRIV_LOCK,(unsigned long)0xffffffff); return 0; } - + static SIGN32 vmeta_private_unlock() { ioctl(vdec_iface->uiofd,VMETA_CMD_PRIV_UNLOCK); - return 0; + return 0; } - + SIGN32 vdec_os_api_get_user_count(void) { - vdec_os_driver_cb_t *p_cb = vdec_driver_get_cb(); - kernel_share *p_ks; - - if(p_cb == NULL) { + vdec_os_driver_cb_t *p_cb = vdec_driver_get_cb(); + kernel_share *p_ks; + + if(p_cb == NULL) { dbg_printf(VDEC_DEBUG_ALL,"vdec_os_api_get_user_count error: point is NULL\n"); - return -1; - } + return -1; + } - if(p_cb->kernel_share_va == NULL) - { + if(p_cb->kernel_share_va == NULL) { vdec_os_api_get_ks(&p_ks); - } - else - { + } else { p_ks = p_cb->kernel_share_va; } - + dbg_printf(VDEC_DEBUG_ALL, "get_user_count=%d\n",p_ks->ref_count); - return p_ks->ref_count; + return p_ks->ref_count; } - + SIGN32 vdec_os_api_lock(SIGN32 user_id, long to_ms) { - vdec_os_driver_cb_t *p_cb = vdec_driver_get_cb(); - kernel_share* p_ks; - SIGN32 ret; - - if(p_cb == NULL) { + vdec_os_driver_cb_t *p_cb = vdec_driver_get_cb(); + kernel_share* p_ks; + SIGN32 ret; + + if(p_cb == NULL) { dbg_printf(VDEC_DEBUG_ALL,"vdec_os_api_lock error: point is NULL\n"); - return LOCK_RET_ERROR_UNKNOWN; - } - p_ks = p_cb->kernel_share_va; - - if(p_ks->active_user_id == user_id) { + return LOCK_RET_ERROR_UNKNOWN; + } + p_ks = p_cb->kernel_share_va; + + if(p_ks->active_user_id == user_id) { dbg_printf(VDEC_DEBUG_LOCK,"lock same user=%d, lock_flag=%d,ref_count=%d\n",\ user_id,p_ks->lock_flag,p_ks->ref_count); - return LOCK_RET_ME;//just return since they are the same caller - } + return LOCK_RET_ME;//just return since they are the same caller + } ret = ioctl(vdec_iface->uiofd,VMETA_CMD_LOCK,(unsigned long)to_ms); if(ret!=0) { @@ -1042,19 +1018,19 @@ SIGN32 vdec_os_api_lock(SIGN32 user_id, long to_ms) return LOCK_RET_ERROR_TIMEOUT; } - vmeta_private_lock(); - p_ks->active_user_id = user_id; + vmeta_private_lock(); + p_ks->active_user_id = user_id; if(p_ks->lock_flag == VMETA_LOCK_FORCE_INIT){ p_ks->lock_flag = VMETA_LOCK_ON; vmeta_private_unlock(); return LOCK_RET_FORCE_INIT; } p_ks->lock_flag = VMETA_LOCK_ON; - vmeta_private_unlock(); + vmeta_private_unlock(); - return LOCK_RET_OHTERS_NORM; + return LOCK_RET_OHTERS_NORM; } - + SIGN32 vdec_os_api_unlock(SIGN32 user_id) { vdec_os_driver_cb_t *p_cb = vdec_driver_get_cb(); |