From a3383ac8bed9af87ff7b37e88fe9325827b9b875 Mon Sep 17 00:00:00 2001 From: Han Gao Date: Wed, 6 Mar 2024 19:02:18 +0800 Subject: [PATCH] sync: vpu-vc8000e-kernel: Linux_SDK_V1.3.3 Signed-off-by: Han Gao --- .../linux/kernel_module/hantro_mmu.c | 2 +- .../linux/kernel_module/vc8000_vcmd_driver.c | 48 +++++++++++++------ 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/drivers/staging/media/vpu-vc8000e-kernel/linux/kernel_module/hantro_mmu.c b/drivers/staging/media/vpu-vc8000e-kernel/linux/kernel_module/hantro_mmu.c index 3df60e462..8023e6c93 100755 --- a/drivers/staging/media/vpu-vc8000e-kernel/linux/kernel_module/hantro_mmu.c +++ b/drivers/staging/media/vpu-vc8000e-kernel/linux/kernel_module/hantro_mmu.c @@ -1109,7 +1109,7 @@ enum MMUStatus MMURelease(void *filp, volatile unsigned char *hwregs) { return MMU_STATUS_OK; } - pr_notice(" *****MMU Release*****\n"); + pr_debug(" *****MMU Release*****\n"); AcquireMutex(g_mmu->page_table_mutex, MMU_INFINITE); diff --git a/drivers/staging/media/vpu-vc8000e-kernel/linux/kernel_module/vc8000_vcmd_driver.c b/drivers/staging/media/vpu-vc8000e-kernel/linux/kernel_module/vc8000_vcmd_driver.c index 539a6f21d..bcdb31ede 100644 --- a/drivers/staging/media/vpu-vc8000e-kernel/linux/kernel_module/vc8000_vcmd_driver.c +++ b/drivers/staging/media/vpu-vc8000e-kernel/linux/kernel_module/vc8000_vcmd_driver.c @@ -1554,7 +1554,7 @@ static long release_cmdbuf(struct file *filp,u16 cmdbuf_id) spin_lock_irqsave(&cmdbuf_obj->process_manager_obj->spinlock, flags); cmdbuf_obj->process_manager_obj->total_exe_time -= cmdbuf_obj->executing_time; spin_unlock_irqrestore(&cmdbuf_obj->process_manager_obj->spinlock, flags); - wake_up_interruptible_all(&cmdbuf_obj->process_manager_obj->wait_queue); + wake_up_all(&cmdbuf_obj->process_manager_obj->wait_queue); } free_cmdbuf_node(new_cmdbuf_node); @@ -1913,13 +1913,18 @@ static unsigned int wait_cmdbuf_ready(struct file *filp,u16 cmdbuf_id,u32 *irq_s #endif } #endif - - if(wait_event_interruptible(*dev->wait_queue, check_cmdbuf_irq(dev,cmdbuf_obj,irq_status_ret))) + /*In suspend, it got a signal from "Freezing user space processes" period, + * wait_event_interruptible() will be interrupted,return to user space a IO error. + * So, here changed to wait_event_timeout(). + */ + if(!wait_event_timeout(*dev->wait_queue, + check_cmdbuf_irq(dev,cmdbuf_obj,irq_status_ret), msecs_to_jiffies(500) ) + ) { - PDEBUG("vcmd_wait_queue_0 interrupted\n"); + pr_err("vcmd_wait_queue_0 timeout\n"); //abort the vcmd vcmd_write_register_value((const void *)dev->hwregs,dev->reg_mirror,HWIF_VCMD_START_TRIGGER,0); - return -ERESTARTSYS; + return -ETIME; } return 0; } @@ -2358,7 +2363,7 @@ static int hantrovcmd_open(struct inode *inode, struct file *filp) PDEBUG("dev opened\n"); return result; } -static int hantrovcmd_release(struct inode *inode, struct file *filp) +static int __hantrovcmd_release(struct inode *inode, struct file *filp) { struct hantrovcmd_dev *dev = hantrovcmd_data; u32 core_id = 0; @@ -2582,7 +2587,7 @@ static int hantrovcmd_release(struct inode *inode, struct file *filp) spin_unlock_irqrestore(dev[core_id].spinlock, flags); // VCMD aborted but not restarted, nedd to wake up if (vcmd_aborted && !restart_cmdbuf) - wake_up_interruptible_all(dev[core_id].wait_queue); + wake_up_all(dev[core_id].wait_queue); } if(release_cmdbuf_num) wake_up_interruptible_all(&vcmd_cmdbuf_memory_wait); @@ -2614,6 +2619,21 @@ static int hantrovcmd_release(struct inode *inode, struct file *filp) return 0; } +static int hantrovcmd_release(struct inode *inode, struct file *filp) +{ + int i; + int ret = 0; + ret = __hantrovcmd_release(inode,filp); +#ifdef HANTROMMU_SUPPORT + for(i = 0; i < total_vcmd_core_num; i++) + { + if (mmu_hwregs[i][0] != NULL) + MMURelease(filp,mmu_hwregs[i][0]); + } +#endif + return ret; +} + static bool hantroenc_cmdbuf_range(size_t addr, size_t size); static int mmap_cmdbuf_mem(struct file *file, struct vm_area_struct *vma) @@ -4387,9 +4407,9 @@ static irqreturn_t hantrovcmd_isr(int irq, void *dev_id) } spin_unlock_irqrestore(dev->spinlock, flags); if(cmdbuf_processed_num) - wake_up_interruptible_all(dev->wait_queue); + wake_up_all(dev->wait_queue); //to let high priority cmdbuf be inserted - wake_up_interruptible_all(dev->wait_abort_queue); + wake_up_all(dev->wait_abort_queue); handled++; return IRQ_HANDLED; } @@ -4458,7 +4478,7 @@ static irqreturn_t hantrovcmd_isr(int irq, void *dev_id) } spin_unlock_irqrestore(dev->spinlock, flags); if(cmdbuf_processed_num) - wake_up_interruptible_all(dev->wait_queue); + wake_up_all(dev->wait_queue); handled++; return IRQ_HANDLED; } @@ -4523,7 +4543,7 @@ static irqreturn_t hantrovcmd_isr(int irq, void *dev_id) } spin_unlock_irqrestore(dev->spinlock, flags); if(cmdbuf_processed_num) - wake_up_interruptible_all(dev->wait_queue); + wake_up_all(dev->wait_queue); handled++; return IRQ_HANDLED; } @@ -4592,7 +4612,7 @@ static irqreturn_t hantrovcmd_isr(int irq, void *dev_id) } spin_unlock_irqrestore(dev->spinlock, flags); if(cmdbuf_processed_num) - wake_up_interruptible_all(dev->wait_queue); + wake_up_all(dev->wait_queue); handled++; return IRQ_HANDLED; } @@ -4655,7 +4675,7 @@ static irqreturn_t hantrovcmd_isr(int irq, void *dev_id) } spin_unlock_irqrestore(dev->spinlock, flags); if(cmdbuf_processed_num) - wake_up_interruptible_all(dev->wait_queue); + wake_up_all(dev->wait_queue); handled++; return IRQ_HANDLED; } @@ -4700,7 +4720,7 @@ static irqreturn_t hantrovcmd_isr(int irq, void *dev_id) spin_unlock_irqrestore(dev->spinlock, flags); if(cmdbuf_processed_num) - wake_up_interruptible_all(dev->wait_queue); + wake_up_all(dev->wait_queue); if(!handled) { PDEBUG("IRQ received, but not hantro's!\n");