diff options
-rw-r--r-- | uio_vmeta.h | 13 | ||||
-rw-r--r-- | vmeta_lib.c | 101 |
2 files changed, 112 insertions, 2 deletions
diff --git a/uio_vmeta.h b/uio_vmeta.h index bab40dd..d1cef5f 100644 --- a/uio_vmeta.h +++ b/uio_vmeta.h @@ -37,6 +37,11 @@ typedef struct _kernel_share id_instance user_id_list[MAX_VMETA_INSTANCE]; }kernel_share; +struct vmeta_lock { + unsigned long timeout; + unsigned int user_id; +}; + #define IOP_MAGIC 'v' #define VMETA_CMD_POWER_ON _IO(IOP_MAGIC, 0) @@ -52,5 +57,13 @@ typedef struct _kernel_share #define VMETA_CMD_SUSPEND_READY _IO(IOP_MAGIC, 10) #define VMETA_CMD_SUSPEND_SET _IO(IOP_MAGIC, 11) #define VMETA_CMD_SUSPEND_UNSET _IO(IOP_MAGIC, 12) +#define VMETA_CMD_GET_USER_ID _IOR(IOP_MAGIC, 13, unsigned) +#define VMETA_CMD_FREE_USER_ID _IO(IOP_MAGIC, 14) +#define VMETA_CMD_REGISTER_USER_ID _IO(IOP_MAGIC, 15) +#define VMETA_CMD_UNREGISTER_USER_ID _IO(IOP_MAGIC, 16) +#define VMETA_CMD_LOCK_USER_ID _IOW(IOP_MAGIC, 17, struct vmeta_lock) +#define VMETA_CMD_UNLOCK_USER_ID _IO(IOP_MAGIC, 18) +#define VMETA_CMD_FORCE_INI _IO(IOP_MAGIC, 19) +#define VMETA_CMD_GET_USER_NUM _IOR(IOP_MAGIC, 20, unsigned) #endif /* __UIO_VMETA_H */ diff --git a/vmeta_lib.c b/vmeta_lib.c index de811ad..d8e7bcf 100644 --- a/vmeta_lib.c +++ b/vmeta_lib.c @@ -684,6 +684,14 @@ 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 && p_cb->kern_ver >= 100) { + int ret; + + ret = ioctl(p_cb->uiofd, VMETA_CMD_FORCE_INI); + + return ret < 0 ? -1 : 0; + } + if(p_cb->kernel_share_va == NULL) { vdec_os_api_get_ks(&p_ks); } else { @@ -703,9 +711,18 @@ SIGN32 vdec_os_api_force_ini(void) SIGN32 vdec_os_api_get_user_id(void) { kernel_share *p_ks; - SIGN32 ret = -1; + SIGN32 ret; vdec_os_driver_cb_t *p_cb = vdec_driver_get_cb(); + if (p_cb->kern_ver >= 100) { + unsigned id; + + ret = ioctl(p_cb->uiofd, VMETA_CMD_GET_USER_ID, &id); + + return ret == 0 && id < MAX_VMETA_INSTANCE ? id : + -VDEC_OS_DRIVER_USER_ID_FAIL; + } + if(p_cb->kernel_share_va == NULL) { vdec_os_api_get_ks(&p_ks); } else { @@ -727,6 +744,14 @@ 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->kern_ver >= 100) { + int ret; + + ret = ioctl(p_cb->uiofd, VMETA_CMD_FREE_USER_ID, user_id); + + return ret == 0 ? VDEC_OS_DRIVER_OK : VDEC_OS_DRIVER_USER_ID_FAIL; + } + 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; @@ -850,6 +875,20 @@ SIGN32 vdec_os_api_register_user_id(SIGN32 user_id) pthread_t tmp; struct monitor_data *p_md; + if (p_cb->kern_ver >= 100) { + int ret; + + ret = ioctl(p_cb->uiofd, VMETA_CMD_REGISTER_USER_ID, user_id); + + if (ret < 0) { + dbg_printf(VDEC_DEBUG_ALL, "%s: error %d\n", + __FUNCTION__, errno); + return VDEC_OS_DRIVER_USER_ID_FAIL; + } + + return VDEC_OS_DRIVER_OK; + } + 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; @@ -888,6 +927,19 @@ 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 (p_cb->kern_ver >= 100) { + int ret; + + ret = ioctl(p_cb->uiofd, VMETA_CMD_UNREGISTER_USER_ID, user_id); + if (ret < 0) { + dbg_printf(VDEC_DEBUG_ALL, "%s: error: %d\n", + __FUNCTION__, errno); + return VDEC_OS_DRIVER_USER_ID_FAIL; + } + + return VDEC_OS_DRIVER_OK; + } + 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; @@ -933,6 +985,15 @@ SIGN32 vdec_os_api_get_user_count(void) return -1; } + if (p_cb->kern_ver >= 100) { + unsigned num; + int ret; + + ret = ioctl(p_cb->uiofd, VMETA_CMD_GET_USER_NUM, &num); + + return ret < 0 ? -1 : num; + } + if(p_cb->kernel_share_va == NULL) { vdec_os_api_get_ks(&p_ks); } else { @@ -954,6 +1015,31 @@ SIGN32 vdec_os_api_lock(SIGN32 user_id, long to_ms) dbg_printf(VDEC_DEBUG_ALL,"vdec_os_api_lock error: point is NULL\n"); return LOCK_RET_ERROR_UNKNOWN; } + + if (p_cb->kern_ver >= 100) { + struct vmeta_lock lock; + int ret; + + lock.user_id = user_id; + lock.timeout = to_ms; + + ret = ioctl(p_cb->uiofd, VMETA_CMD_LOCK_USER_ID, &lock); + + if (ret < 0) { + switch (errno) { + case ETIME: + return LOCK_RET_ERROR_TIMEOUT; + case EDEADLOCK: + return LOCK_RET_ME; + case EUCLEAN: + return LOCK_RET_FORCE_INIT; + default: + return LOCK_RET_ERROR_UNKNOWN; + } + } + return LOCK_RET_OHTERS_NORM; + } + p_ks = p_cb->kernel_share_va; if(p_ks->active_user_id == user_id) { @@ -990,7 +1076,18 @@ SIGN32 vdec_os_api_unlock(SIGN32 user_id) if(p_cb == NULL) { dbg_printf(VDEC_DEBUG_LOCK,"vdec_os_api_unlock error: point is NULL\n"); return LOCK_RET_ERROR_UNKNOWN; - } + } + + if (p_cb->kern_ver >= 100) { + ret = ioctl(p_cb->uiofd, VMETA_CMD_UNLOCK_USER_ID, user_id); + + if (ret < 0) { + dbg_printf(VDEC_DEBUG_LOCK, "%s: error %d\n", + __FUNCTION__, errno); + return LOCK_RET_ERROR_UNKNOWN; + } + return LOCK_RET_OHTERS_NORM; + } p_ks = p_cb->kernel_share_va; vmeta_private_lock(); |