summaryrefslogtreecommitdiff
path: root/vmeta_lib.c
diff options
context:
space:
mode:
authorRussell King <rmk@arm.linux.org.uk>2012-10-18 14:28:39 +0100
committerRussell King <rmk@arm.linux.org.uk>2012-10-20 22:04:31 +0100
commitd614f345ec4f3b81ce3a856750d4a880fb9cad4e (patch)
tree33af8bccd17c8f0ee585b68c925efa3da683b84b /vmeta_lib.c
parentd098e39e50a0764326133efb8b32197670f318aa (diff)
Provide a common function to setup maps
Provide a common function to read the size and physical address from a UIO map, and to mmap() the UIO map if desired. This avoids a lot of repeated code in several functions.
Diffstat (limited to 'vmeta_lib.c')
-rw-r--r--vmeta_lib.c163
1 files changed, 80 insertions, 83 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;