From 6778948f9de86c3cfaf36725a7c87dcff9ba247f Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 11 Dec 2023 08:20:59 +0000 Subject: [PATCH] kernel_5.10 no rt --- kernel/drivers/video/rockchip/mpp/mpp_common.c | 55 ++++++++++++++++++++++++------------------------------- 1 files changed, 24 insertions(+), 31 deletions(-) diff --git a/kernel/drivers/video/rockchip/mpp/mpp_common.c b/kernel/drivers/video/rockchip/mpp/mpp_common.c index dbc625c..0038df8 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_common.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_common.c @@ -36,8 +36,6 @@ #include "mpp_common.h" #include "mpp_iommu.h" -#define MPP_WAIT_TIMEOUT_DELAY (2000) - /* Use 'v' as magic number */ #define MPP_IOC_MAGIC 'v' @@ -355,9 +353,9 @@ mutex_unlock(&queue->session_lock); if (task_count) { - mpp_dbg_session("session %d:%d task not finished %d\n", - session->pid, session->index, - atomic_read(&queue->detach_count)); + mpp_dbg_session("session %d:%d not finished %d task cnt %d\n", + session->device_type, session->index, + atomic_read(&queue->detach_count), task_count); mpp_session_clear_pending(session); } else { @@ -588,6 +586,7 @@ mpp_dev_reset(mpp); mpp_power_off(mpp); + mpp_iommu_dev_deactivate(mpp->iommu_info, mpp); set_bit(TASK_STATE_TIMEOUT, &task->state); set_bit(TASK_STATE_DONE, &task->state); /* Wake up the GET thread */ @@ -717,10 +716,6 @@ group->resets[type] = rst; group->queue = mpp->queue; } - /* if reset not in the same queue, it means different device - * may reset in the same time, then rw_sem_on should set true. - */ - group->rw_sem_on |= (group->queue != mpp->queue) ? true : false; dev_info(mpp->dev, "reset_group->rw_sem_on=%d\n", group->rw_sem_on); up_write(&group->rw_sem); @@ -821,12 +816,19 @@ mpp_set_grf(mpp->grf_info); } /* + * Lock the reader locker of the device resource lock here, + * release at the finish operation + */ + mpp_reset_down_read(mpp->reset_group); + + /* * for iommu share hardware, should attach to ensure * working in current device */ ret = mpp_iommu_attach(mpp->iommu_info); if (ret) { dev_err(mpp->dev, "mpp_iommu_attach failed\n"); + mpp_reset_up_read(mpp->reset_group); return -ENODATA; } @@ -836,11 +838,6 @@ if (mpp->auto_freq_en && mpp->hw_ops->set_freq) mpp->hw_ops->set_freq(mpp, task); - /* - * TODO: Lock the reader locker of the device resource lock here, - * release at the finish operation - */ - mpp_reset_down_read(mpp->reset_group); mpp_iommu_dev_activate(mpp->iommu_info, mpp); if (mpp->dev_ops->run) @@ -922,23 +919,15 @@ } mpp = mpp_get_task_used_device(task, session); - ret = wait_event_timeout(task->wait, - test_bit(TASK_STATE_DONE, &task->state), - msecs_to_jiffies(MPP_WAIT_TIMEOUT_DELAY)); - if (ret > 0) { - if (mpp->dev_ops->result) - ret = mpp->dev_ops->result(mpp, task, msgs); - } else { - atomic_inc(&task->abort_request); - set_bit(TASK_STATE_ABORT, &task->state); - mpp_err("timeout, pid %d session %d:%d count %d cur_task %p id %d\n", - session->pid, session->pid, session->index, - atomic_read(&session->task_count), task, - task->task_id); - } + ret = wait_event_interruptible(task->wait, test_bit(TASK_STATE_DONE, &task->state)); + if (ret == -ERESTARTSYS) + mpp_err("wait task break by signal\n"); - mpp_debug_func(DEBUG_TASK_INFO, "task %d kref_%d\n", - task->task_id, kref_read(&task->ref)); + if (mpp->dev_ops->result) + ret = mpp->dev_ops->result(mpp, task, msgs); + mpp_debug_func(DEBUG_TASK_INFO, "wait done session %d:%d count %d task %d state %lx\n", + session->device_type, session->index, atomic_read(&session->task_count), + task->task_index, task->state); mpp_session_pop_pending(session, task); @@ -1013,6 +1002,10 @@ return -ENODEV; } else { mpp->reset_group = mpp->srv->reset_groups[reset_group_node]; + if (!mpp->reset_group->queue) + mpp->reset_group->queue = queue; + if (mpp->reset_group->queue != mpp->queue) + mpp->reset_group->rw_sem_on = true; } } @@ -2266,7 +2259,7 @@ irq_ret = mpp->dev_ops->irq(mpp); if (task) { - if (irq_ret != IRQ_NONE) { + if (irq_ret == IRQ_WAKE_THREAD) { /* if wait or delayed work timeout, abort request will turn on, * isr should not to response, and handle it in delayed work */ -- Gitblit v1.6.2