diff options
-rw-r--r-- | vmeta_lib.c | 163 | ||||
-rw-r--r-- | vmeta_lib.h | 12 |
2 files changed, 82 insertions, 93 deletions
diff --git a/vmeta_lib.c b/vmeta_lib.c index cfb4dcf..940ddc5 100644 --- a/vmeta_lib.c +++ b/vmeta_lib.c @@ -388,10 +388,65 @@ static UNSG32 get_file_unsg32(const char *fmt, ...) return result; } +static int uio_get_map(unsigned uio_num, unsigned map, unsigned size, void **rptr, unsigned *rsize, UNSG32 *rphys) +{ + UNSG32 phys; + UNSG32 map_size; + void *addr; + + map_size = get_file_unsg32("/sys/class/uio/uio%u/maps/map%u/size", + uio_num, map); + + if (map_size == (UNSG32)-VDEC_OS_DRIVER_OPEN_FAIL) + return -VDEC_OS_DRIVER_OPEN_FAIL; + + if (map_size == 0) + return -VDEC_OS_DRIVER_MMAP_FAIL; + + if (size && map_size < size) { + dbg_printf(VDEC_DEBUG_MEM, "Error: %s: requested mmap of %u bytes but map %u only has %u bytes available\n", + __FUNCTION__, size, map, map_size); + return -VDEC_OS_DRIVER_MMAP_FAIL; + } + + if (rsize) + *rsize = map_size; + + if (rphys) { + phys = get_file_unsg32("/sys/class/uio/uio%u/maps/map%u/addr", + uio_num, map); + if (phys == (UNSG32)-VDEC_OS_DRIVER_OPEN_FAIL) + return -VDEC_OS_DRIVER_OPEN_FAIL; + if (phys == 0) + return -VDEC_OS_DRIVER_MMAP_FAIL; + + *rphys = phys; + } + + if (rptr) { + if (size == 0) + size = map_size; + + addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, + vdec_iface->uiofd, map * getpagesize()); + if (addr == MAP_FAILED) { + dbg_printf(VDEC_DEBUG_MEM, "Error: %s: mmap of map %u failed: %d\n", + __FUNCTION__, map, errno); + return -VDEC_OS_DRIVER_MMAP_FAIL; + } + + *rptr = addr; + } + + return VDEC_OS_DRIVER_OK; +} + // init vdec os driver SIGN32 vdec_os_driver_init(void) { + unsigned size; void *addr; + UNSG32 phys; int ret = 0; #if VMETA_LOG_ON @@ -442,32 +497,16 @@ SIGN32 vdec_os_driver_init(void) } dbg_printf(VDEC_DEBUG_VER, "vdec os driver kern=%d user=%s\n", vdec_iface->kern_ver,VMETA_USER_VER); - // Get the IO mem size of vPro's register - vdec_iface->io_mem_size = get_file_unsg32(UIO_IO_MEM_SIZE); - if(vdec_iface->io_mem_size <= 0) { - ret = -VDEC_OS_DRIVER_MMAP_FAIL; + // Get the IO mem phy addr and size of vPro's register + ret = uio_get_map(0, UIO_IO_MEM_INDEX, 0, &addr, &size, &phys); + if (ret < 0) goto err_mmap_fail; - } - dbg_printf(VDEC_DEBUG_MEM, "vdec os driver io mem size: 0x%x\n", vdec_iface->io_mem_size); - // Get the IO mem phy addr - vdec_iface->io_mem_phy_addr = get_file_unsg32(UIO_IO_MEM_ADDR); - if(vdec_iface->io_mem_phy_addr <= 0) { - ret = -VDEC_OS_DRIVER_MMAP_FAIL; - goto err_mmap_fail; - } - dbg_printf(VDEC_DEBUG_MEM, "vdec os driver io mem phy addr: 0x%x\n", vdec_iface->io_mem_phy_addr); - - // mmap the io mem area - addr = mmap(NULL, vdec_iface->io_mem_size, PROT_READ | PROT_WRITE, - MAP_SHARED, vdec_iface->uiofd, 0); - if(addr == MAP_FAILED) { - ret = -VDEC_OS_DRIVER_MMAP_FAIL; - goto err_mmap_fail; - } - - dbg_printf(VDEC_DEBUG_MEM, "vdec os driver io mem map to: 0x%p\n", addr); + dbg_printf(VDEC_DEBUG_MEM, "vdec os driver io mem size: 0x%x, phy addr 0x%x, virt 0x%p\n", + size, phys, addr); + vdec_iface->io_mem_phy_addr = phys; + vdec_iface->io_mem_size = size; vdec_iface->io_mem_virt_addr = addr; pthread_mutex_unlock(&pmt); @@ -603,9 +642,8 @@ vdec_os_driver_cb_t *vdec_driver_get_cb(void) SIGN32 vdec_os_api_get_hw_obj_addr(UNSG32* vaddr,UNSG32 size) { - UNSG32 io_mem_size; - UNSG32 ret = VDEC_OS_DRIVER_OK; void *addr; + int ret; if(vdec_iface->vdec_obj_va != NULL) { @@ -614,25 +652,11 @@ SIGN32 vdec_os_api_get_hw_obj_addr(UNSG32* vaddr,UNSG32 size) return VDEC_OS_DRIVER_OK; } - io_mem_size = get_file_unsg32(UIO_IO_VMETA_OBJ_SIZE); - if(io_mem_size <= 0 || io_mem_size < size) { - ret = -VDEC_OS_DRIVER_MMAP_FAIL; - dbg_printf(VDEC_DEBUG_MEM, "vdec_os_api_get_hw_obj_addr error: get_mem_size io_mem_size=%d, requested size=%d!!!\n", \ - io_mem_size, size); - goto get_vdec_obj_fail; - } - dbg_printf(VDEC_DEBUG_MEM, "vdec_os_api_get_hw_obj_addr: get_mem_size io_mem_size=%d, requested size=%d\n", \ - io_mem_size,size); - - addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, - vdec_iface->uiofd, UIO_IO_VMETA_OBJ_INDEX*getpagesize()); - if(addr == MAP_FAILED) { - ret = -VDEC_OS_DRIVER_MMAP_FAIL; - dbg_printf(VDEC_DEBUG_MEM, "vdec_os_api_get_hw_obj_addr: mmap hw obj error\n"); + ret = uio_get_map(0, UIO_IO_VMETA_OBJ_INDEX, size, &addr, NULL, NULL); + if (ret < 0) goto get_vdec_obj_fail; - } - dbg_printf(VDEC_DEBUG_MEM, "UIO_IO_VMETA_OBJ_ADDR virtual 0x%p size=%d \n", addr,io_mem_size); + dbg_printf(VDEC_DEBUG_MEM, "UIO_IO_VMETA_OBJ virtual 0x%p size=%d\n", addr, size); *vaddr = (UNSG32)addr; vdec_iface->vdec_obj_va = addr; @@ -644,38 +668,24 @@ get_vdec_obj_fail: SIGN32 vdec_os_api_get_hw_context_addr(UNSG32* paddr, UNSG32* vaddr, UNSG32 size, SIGN32 flag) { - UNSG32 io_mem_size; - UNSG32 io_mem_addr; - UNSG32 ret = VDEC_OS_DRIVER_OK; + UNSG32 phys; + int ret; if(vdec_iface->hw_context_pa != 0) { dbg_printf(VDEC_DEBUG_MEM, "Already get hw context\n"); - * paddr = vdec_iface->hw_context_pa; + *paddr = vdec_iface->hw_context_pa; return VDEC_OS_DRIVER_OK; } - io_mem_size = get_file_unsg32(UIO_IO_HW_CONTEXT_SIZE); - if(io_mem_size <= 0 || io_mem_size < size) { - ret = -VDEC_OS_DRIVER_MMAP_FAIL; - dbg_printf(VDEC_DEBUG_MEM, "vdec_os_api_get_hw_context_addr error: get_mem_size io_mem_size=%d, requested size=%d!!!\n", \ - io_mem_size,size); + ret = uio_get_map(0, UIO_IO_HW_CONTEXT_INDEX, size, NULL, NULL, &phys); + if (ret < 0) goto get_hw_context_fail; - } - dbg_printf(VDEC_DEBUG_MEM, "vdec_os_api_get_hw_context_addr: get_mem_size io_mem_size=%d, requested size=%d\n", \ - io_mem_size,size); - io_mem_addr = get_file_unsg32(UIO_IO_HW_CONTEXT_ADDR); - if(io_mem_addr <= 0) { - ret = -VDEC_OS_DRIVER_MMAP_FAIL; - dbg_printf(VDEC_DEBUG_MEM, "vdec_os_api_get_hw_context_addr: get_mem_addr error\n"); - goto get_hw_context_fail; - } + *paddr = phys; + vdec_iface->hw_context_pa = phys; - *paddr = io_mem_addr; - vdec_iface->hw_context_pa = io_mem_addr; - - dbg_printf(VDEC_DEBUG_MEM, "UIO_IO_HW_CONTEXT_ADDR: 0x%08x\n", *paddr); + dbg_printf(VDEC_DEBUG_MEM, "UIO_IO_HW_CONTEXT: 0x%08x\n", *paddr); get_hw_context_fail: @@ -684,10 +694,9 @@ get_hw_context_fail: SIGN32 vdec_os_api_get_ks(kernel_share** pp_ks) { - UNSG32 io_mem_size; + unsigned size; void *addr; - - UNSG32 ret = VDEC_OS_DRIVER_OK; + int ret; if(vdec_iface->kernel_share_va != NULL) { @@ -695,27 +704,15 @@ SIGN32 vdec_os_api_get_ks(kernel_share** pp_ks) return 0; } - io_mem_size = get_file_unsg32(UIO_IO_KERNEL_SHARE_SIZE); - if(io_mem_size <= 0 ) { - ret = -VDEC_OS_DRIVER_MMAP_FAIL; - dbg_printf(VDEC_DEBUG_MEM, "vdec_os_api_get_ks: get_mem_size error\n"); + ret = uio_get_map(0, UIO_IO_KERNEL_SHARE_INDEX, 0, &addr, &size, NULL); + if (ret < 0) goto get_vos_fail; - } - dbg_printf(VDEC_DEBUG_MEM, "vdec_os_api_get_ks: get_mem_size io_mem_size=%d\n",io_mem_size); - - addr = mmap(NULL, io_mem_size, PROT_READ | PROT_WRITE, MAP_SHARED, - vdec_iface->uiofd, UIO_IO_KERNEL_SHARE_INDEX*getpagesize()); - if(addr == MAP_FAILED) { - ret = -VDEC_OS_DRIVER_MMAP_FAIL; - dbg_printf(VDEC_DEBUG_MEM, "vdec_os_api_get_ks: mmap ks error\n"); - goto get_vos_fail; - } - dbg_printf(VDEC_DEBUG_MEM, "kernel share virtual address: 0x%p size=%d \n", addr,io_mem_size); + dbg_printf(VDEC_DEBUG_MEM, "kernel share virtual address: 0x%p size=%d \n", addr, size); *pp_ks = addr; vdec_iface->kernel_share_va = addr; - vdec_iface->kernel_share_size = io_mem_size; + vdec_iface->kernel_share_size = size; get_vos_fail: return ret; diff --git a/vmeta_lib.h b/vmeta_lib.h index 013d881..058d9c9 100644 --- a/vmeta_lib.h +++ b/vmeta_lib.h @@ -16,19 +16,11 @@ extern "C" #define VDEC_DEBUG_NONE 0x0 #define UIO_DEV "/dev/uio0" -#define UIO_IO_MEM_SIZE "/sys/class/uio/uio0/maps/map0/size" -#define UIO_IO_MEM_ADDR "/sys/class/uio/uio0/maps/map0/addr" #define UIO_IO_VERSION "/sys/class/uio/uio0/version" -#define UIO_IO_HW_CONTEXT_SIZE "/sys/class/uio/uio0/maps/map1/size" -#define UIO_IO_HW_CONTEXT_ADDR "/sys/class/uio/uio0/maps/map1/addr" - -#define UIO_IO_VMETA_OBJ_SIZE "/sys/class/uio/uio0/maps/map2/size" -#define UIO_IO_VMETA_OBJ_ADDR "/sys/class/uio/uio0/maps/map2/addr" +#define UIO_IO_MEM_INDEX 0 +#define UIO_IO_HW_CONTEXT_INDEX 1 #define UIO_IO_VMETA_OBJ_INDEX 2 - -#define UIO_IO_KERNEL_SHARE_SIZE "/sys/class/uio/uio0/maps/map3/size" -#define UIO_IO_KERNEL_SHARE_ADDR "/sys/class/uio/uio0/maps/map3/addr" #define UIO_IO_KERNEL_SHARE_INDEX 3 #define VMETA_SHARED_LOCK_HANDLE "vmeta_shared_lock" |