|
@@ -51,6 +51,9 @@
|
|
|
|
|
|
#define VPU_DEVICE_NAME "/dev/vdec"
|
|
|
|
|
|
+#define VPU_MUTEX_NAME "/vpumutex"
|
|
|
+static int mutex_fd = -1;
|
|
|
+
|
|
|
typedef pthread_mutex_t MUTEX_HANDLE;
|
|
|
|
|
|
|
|
@@ -119,6 +122,7 @@ void vdi_flush_ddr(unsigned long core_idx,unsigned long start,unsigned long size
|
|
|
ioctl(vdi->vpu_fd, VDI_IOCTL_FLUSH_DCACHE, &cache_info);
|
|
|
}
|
|
|
|
|
|
+#if defined(ANDROID) || !defined(PTHREAD_MUTEX_ROBUST_NP)
|
|
|
static void restore_mutex_in_dead(MUTEX_HANDLE *mutex)
|
|
|
{
|
|
|
int mutex_value;
|
|
@@ -138,20 +142,22 @@ static void restore_mutex_in_dead(MUTEX_HANDLE *mutex)
|
|
|
pthread_mutex_init(mutex, &mutexattr);
|
|
|
}
|
|
|
}
|
|
|
+#endif //defined(ANDROID) || !defined(PTHREAD_MUTEX_ROBUST_NP)
|
|
|
|
|
|
static void vmem_lock(vdi_info_t* vdi)
|
|
|
{
|
|
|
-#if defined(ANDROID) || !defined(PTHREAD_MUTEX_ROBUST_NP)
|
|
|
-#else
|
|
|
- const int MUTEX_TIMEOUT = 0x7fffffff;
|
|
|
-#endif
|
|
|
-
|
|
|
#if defined(ANDROID) || !defined(PTHREAD_MUTEX_ROBUST_NP)
|
|
|
restore_mutex_in_dead((MUTEX_HANDLE *)vdi->vmem_mutex);
|
|
|
pthread_mutex_lock((MUTEX_HANDLE*)vdi->vmem_mutex);
|
|
|
#else
|
|
|
- if (pthread_mutex_lock((MUTEX_HANDLE *)vdi->vmem_mutex) != 0) {
|
|
|
- VLOG(ERR, "%s:%d failed to pthread_mutex_locK\n", __FUNCTION__, __LINE__);
|
|
|
+ int ret = -1;
|
|
|
+ ret = pthread_mutex_lock((MUTEX_HANDLE *)vdi->vmem_mutex);
|
|
|
+ if (ret != 0) {
|
|
|
+ if (ret == EOWNERDEAD)
|
|
|
+ ret = pthread_mutex_consistent((MUTEX_HANDLE *)vdi->vmem_mutex);
|
|
|
+
|
|
|
+ if (ret != 0)
|
|
|
+ VLOG(ERR, "%s:%d failed to pthread_mutex_locK\n", __FUNCTION__, __LINE__);
|
|
|
}
|
|
|
#endif
|
|
|
return; //lint !e454
|
|
@@ -234,7 +240,7 @@ int vdi_init(unsigned long core_idx)
|
|
|
* pthread_mutexattr_setrobust_np(attr, PTHREAD_MUTEX_ROBUST_NP) makes
|
|
|
* next onwer call pthread_mutex_lock() without deadlock.
|
|
|
*/
|
|
|
- pthread_mutexattr_setrobust_np(&mutexattr, PTHREAD_MUTEX_ROBUST_NP);
|
|
|
+ pthread_mutexattr_setrobust(&mutexattr, PTHREAD_MUTEX_ROBUST);
|
|
|
#endif
|
|
|
pthread_mutex_init((MUTEX_HANDLE *)vdi->vpu_mutex, &mutexattr);
|
|
|
pthread_mutex_init((MUTEX_HANDLE *)vdi->vpu_disp_mutex, &mutexattr);
|
|
@@ -246,6 +252,8 @@ int vdi_init(unsigned long core_idx)
|
|
|
pCodecInst[0] = 0; // indicate inUse of CodecInst
|
|
|
}
|
|
|
vdi->pvip->instance_pool_inited = TRUE;
|
|
|
+
|
|
|
+ pthread_mutexattr_destroy(&mutexattr);
|
|
|
}
|
|
|
#ifdef USE_VMALLOC_FOR_INSTANCE_POOL_MEMORY
|
|
|
if (ioctl(vdi->vpu_fd, VDI_IOCTL_GET_REGISTER_INFO, &vdi->vdb_register) < 0)
|
|
@@ -414,6 +422,17 @@ int vdi_release(unsigned long core_idx)
|
|
|
}
|
|
|
realese_cpu_freq_fixed();
|
|
|
|
|
|
+ if (vdi->vpu_mutex)
|
|
|
+ {
|
|
|
+ munmap(vdi->vpu_mutex, sizeof(MUTEX_HANDLE) * VDI_NUM_LOCK_HANDLES);
|
|
|
+ close(mutex_fd);
|
|
|
+
|
|
|
+ vdi->vpu_mutex = NULL;
|
|
|
+ vdi->vpu_disp_mutex = NULL;
|
|
|
+ vdi->vmem_mutex = NULL;
|
|
|
+ mutex_fd = -1;
|
|
|
+ }
|
|
|
+
|
|
|
memset(vdi, 0x00, sizeof(vdi_info_t));
|
|
|
|
|
|
return 0;
|
|
@@ -513,7 +532,9 @@ vpu_instance_pool_t *vdi_get_instance_pool(unsigned long core_idx)
|
|
|
osal_memset(&vdb, 0x00, sizeof(vpudrv_buffer_t));
|
|
|
if (!vdi->pvip)
|
|
|
{
|
|
|
- vdb.size = sizeof(vpu_instance_pool_t) + sizeof(MUTEX_HANDLE)*VDI_NUM_LOCK_HANDLES;
|
|
|
+ void *mutex_addr = NULL;
|
|
|
+
|
|
|
+ vdb.size = sizeof(vpu_instance_pool_t);
|
|
|
#ifdef SUPPORT_MULTI_CORE_IN_ONE_DRIVER
|
|
|
vdb.size *= MAX_NUM_VPU_CORE;
|
|
|
#endif
|
|
@@ -536,13 +557,44 @@ vpu_instance_pool_t *vdi_get_instance_pool(unsigned long core_idx)
|
|
|
}
|
|
|
|
|
|
#ifdef SUPPORT_MULTI_CORE_IN_ONE_DRIVER
|
|
|
- vdi->pvip = (vpu_instance_pool_t *)(vdb.virt_addr + (core_idx*(sizeof(vpu_instance_pool_t) + sizeof(MUTEX_HANDLE)*VDI_NUM_LOCK_HANDLES)));
|
|
|
+ vdi->pvip = (vpu_instance_pool_t *)(vdb.virt_addr + (core_idx*sizeof(vpu_instance_pool_t)));
|
|
|
#else
|
|
|
vdi->pvip = (vpu_instance_pool_t *)(vdb.virt_addr);
|
|
|
#endif
|
|
|
- vdi->vpu_mutex = (void *)((unsigned long)vdi->pvip + sizeof(vpu_instance_pool_t)); //change the pointer of vpu_mutex to at end pointer of vpu_instance_pool_t to assign at allocated position.
|
|
|
- vdi->vpu_disp_mutex = (void *)((unsigned long)vdi->pvip + sizeof(vpu_instance_pool_t) + sizeof(MUTEX_HANDLE));
|
|
|
- vdi->vmem_mutex = (void *)((unsigned long)vdi->pvip + sizeof(vpu_instance_pool_t) + 2*sizeof(MUTEX_HANDLE));
|
|
|
+
|
|
|
+ if (vdi->pvip && (vdi->pvip->instance_pool_inited == FALSE)) {
|
|
|
+ mutex_fd = shm_open(VPU_MUTEX_NAME, O_CREAT | O_RDWR | O_TRUNC, S_IRWXU | S_IRWXG);
|
|
|
+ if (mutex_fd < 0)
|
|
|
+ {
|
|
|
+ VLOG(ERR, "[VDI] shm_open failed with %s\n", VPU_MUTEX_NAME);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ftruncate(mutex_fd, sizeof(MUTEX_HANDLE) * VDI_NUM_LOCK_HANDLES) == -1)
|
|
|
+ {
|
|
|
+ shm_unlink(VPU_MUTEX_NAME);
|
|
|
+ VLOG(ERR, "[VDI] ftruncate failed with %s\n" VPU_MUTEX_NAME);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ mutex_fd = shm_open(VPU_MUTEX_NAME, O_RDWR, S_IRWXU | S_IRWXG);
|
|
|
+ if (mutex_fd < 0)
|
|
|
+ {
|
|
|
+ VLOG(ERR, "[VDI] shm_open exist mutex failed with %s\n", VPU_MUTEX_NAME);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ mutex_addr = mmap(NULL, sizeof(MUTEX_HANDLE) * VDI_NUM_LOCK_HANDLES, PROT_READ | PROT_WRITE, MAP_SHARED, mutex_fd, 0);
|
|
|
+ if (mutex_addr == MAP_FAILED)
|
|
|
+ {
|
|
|
+ VLOG(ERR, "[VDI] mmap failed with %s\n", VPU_MUTEX_NAME);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ vdi->vpu_mutex = mutex_addr;
|
|
|
+ vdi->vpu_disp_mutex = mutex_addr + sizeof(MUTEX_HANDLE);
|
|
|
+ vdi->vmem_mutex = mutex_addr + 2 * sizeof(MUTEX_HANDLE);
|
|
|
|
|
|
VLOG(INFO, "[VDI] instance pool physaddr=0x%lx, virtaddr=0x%lx, base=0x%lx, size=%ld\n", (int)vdb.phys_addr, (int)vdb.virt_addr, (int)vdb.base, (int)vdb.size);
|
|
|
}
|
|
@@ -634,10 +686,6 @@ int vdi_hw_reset(unsigned long core_idx) // DEVICE_ADDR_SW_RESET
|
|
|
int vdi_lock(unsigned long core_idx)
|
|
|
{
|
|
|
vdi_info_t *vdi;
|
|
|
-#if defined(ANDROID) || !defined(PTHREAD_MUTEX_ROBUST_NP)
|
|
|
-#else
|
|
|
- const int MUTEX_TIMEOUT = 0x7fffffff;
|
|
|
-#endif
|
|
|
|
|
|
if (core_idx >= MAX_NUM_VPU_CORE)
|
|
|
return -1;
|
|
@@ -650,9 +698,18 @@ int vdi_lock(unsigned long core_idx)
|
|
|
restore_mutex_in_dead((MUTEX_HANDLE *)vdi->vpu_mutex);
|
|
|
pthread_mutex_lock((MUTEX_HANDLE*)vdi->vpu_mutex);
|
|
|
#else
|
|
|
- if (pthread_mutex_lock((MUTEX_HANDLE *)vdi->vpu_mutex) != 0) {
|
|
|
- VLOG(ERR, "%s:%d failed to pthread_mutex_locK\n", __FUNCTION__, __LINE__);
|
|
|
- return -1;
|
|
|
+ int ret = -1;
|
|
|
+ ret = pthread_mutex_lock((MUTEX_HANDLE *)vdi->vpu_mutex);
|
|
|
+ if (ret != 0)
|
|
|
+ {
|
|
|
+ if (ret == EOWNERDEAD)
|
|
|
+ ret = pthread_mutex_consistent((MUTEX_HANDLE *)vdi->vpu_mutex);
|
|
|
+
|
|
|
+ if (ret != 0)
|
|
|
+ {
|
|
|
+ VLOG(ERR, "%s:%d failed to pthread_mutex_locK\n", __FUNCTION__, __LINE__);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
}
|
|
|
#endif
|
|
|
|
|
@@ -677,10 +734,6 @@ void vdi_unlock(unsigned long core_idx)
|
|
|
int vdi_disp_lock(unsigned long core_idx)
|
|
|
{
|
|
|
vdi_info_t *vdi;
|
|
|
-#if defined(ANDROID) || !defined(PTHREAD_MUTEX_ROBUST_NP)
|
|
|
-#else
|
|
|
- const int MUTEX_TIMEOUT = 5000; // ms
|
|
|
-#endif
|
|
|
|
|
|
if (core_idx >= MAX_NUM_VPU_CORE)
|
|
|
return -1;
|
|
@@ -693,9 +746,18 @@ int vdi_disp_lock(unsigned long core_idx)
|
|
|
restore_mutex_in_dead((MUTEX_HANDLE *)vdi->vpu_disp_mutex);
|
|
|
pthread_mutex_lock((MUTEX_HANDLE*)vdi->vpu_disp_mutex);
|
|
|
#else
|
|
|
- if (pthread_mutex_lock((MUTEX_HANDLE *)vdi->vpu_disp_mutex) != 0)
|
|
|
- VLOG(ERR, "%s:%d failed to pthread_mutex_lock\n", __FUNCTION__, __LINE__);
|
|
|
- return -1;
|
|
|
+ int ret = -1;
|
|
|
+ ret = pthread_mutex_lock((MUTEX_HANDLE *)vdi->vpu_disp_mutex);
|
|
|
+ if (ret != 0)
|
|
|
+ {
|
|
|
+ if (ret == EOWNERDEAD)
|
|
|
+ ret = pthread_mutex_consistent((MUTEX_HANDLE *)vdi->vpu_disp_mutex);
|
|
|
+
|
|
|
+ if (ret != 0)
|
|
|
+ {
|
|
|
+ VLOG(ERR, "%s:%d failed to pthread_mutex_lock\n", __FUNCTION__, __LINE__);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
#endif /* ANDROID */
|
|
@@ -1276,6 +1338,7 @@ void vdi_free_dma_memory(unsigned long core_idx, vpu_buffer_t *vb, int memTypes,
|
|
|
{
|
|
|
VLOG(ERR, "[VDI] fail to vdi_free_dma_memory virtial address = 0x%lx\n", (int)vdb.virt_addr);
|
|
|
}
|
|
|
+
|
|
|
osal_memset(vb, 0, sizeof(vpu_buffer_t));
|
|
|
}
|
|
|
|