diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2.c b/drivers/video/rockchip/mpp/mpp_rkvdec2.c index a5c7ef0fbaee..d08af9d466ad 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvdec2.c +++ b/drivers/video/rockchip/mpp/mpp_rkvdec2.c @@ -478,6 +478,18 @@ static int rkvdec2_finish(struct mpp_dev *mpp, struct mpp_task *mpp_task) task->reg[RKVDEC_REG_RLC_BASE_INDEX] = dec_length << 10; mpp_debug(DEBUG_REGISTER, "dec_get %08x dec_length %d\n", dec_get, dec_length); + if (mpp->srv->timing_en) { + s64 time_diff; + + mpp_task->on_finish = ktime_get(); + set_bit(TASK_TIMING_FINISH, &mpp_task->state); + + time_diff = ktime_us_delta(mpp_task->on_finish, mpp_task->on_create); + + if (mpp->timing_check && time_diff > (s64)mpp->timing_check) + mpp_task_dump_timing(mpp_task, time_diff); + } + mpp_debug_leave(); return 0; diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c index b1d327084ee4..dcbc766f6a5b 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c +++ b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c @@ -1637,10 +1637,22 @@ static int rkvdec2_soft_ccu_dequeue(struct mpp_taskqueue *queue) u32 irq_status = mpp->irq_status; u32 timeout_flag = test_bit(TASK_STATE_TIMEOUT, &mpp_task->state); u32 abort_flag = test_bit(TASK_STATE_ABORT, &mpp_task->state); + u32 timing_en = mpp->srv->timing_en; if (irq_status || timeout_flag || abort_flag) { struct rkvdec2_task *task = to_rkvdec2_task(mpp_task); + if (timing_en) { + mpp_task->on_irq = ktime_get(); + set_bit(TASK_TIMING_IRQ, &mpp_task->state); + + mpp_task->on_cancel_timeout = mpp_task->on_irq; + set_bit(TASK_TIMING_TO_CANCEL, &mpp_task->state); + + mpp_task->on_isr = mpp_task->on_irq; + set_bit(TASK_TIMING_ISR, &mpp_task->state); + } + set_bit(TASK_STATE_HANDLE, &mpp_task->state); cancel_delayed_work(&mpp_task->timeout_work); mpp_time_diff(mpp_task); @@ -1916,6 +1928,7 @@ void rkvdec2_soft_ccu_worker(struct kthread_work *work_s) struct mpp_dev *mpp = container_of(work_s, struct mpp_dev, work); struct mpp_taskqueue *queue = mpp->queue; struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); + u32 timing_en = mpp->srv->timing_en; mpp_debug_enter(); @@ -1959,6 +1972,11 @@ get_task: if (!mpp) goto out; + if (timing_en) { + mpp_task->on_run = ktime_get(); + set_bit(TASK_TIMING_RUN, &mpp_task->state); + } + /* set session index */ rkvdec2_set_core_info(mpp_task->reg, mpp_task->session->index); /* set rcb buffer */ @@ -1976,8 +1994,20 @@ get_task: set_bit(TASK_STATE_START, &mpp_task->state); INIT_DELAYED_WORK(&mpp_task->timeout_work, rkvdec2_ccu_link_timeout_work); schedule_delayed_work(&mpp_task->timeout_work, msecs_to_jiffies(WORK_TIMEOUT_MS)); + + if (timing_en) { + mpp_task->on_sched_timeout = ktime_get(); + set_bit(TASK_TIMING_TO_SCHED, &mpp_task->state); + } + rkvdec2_ccu_power_on(queue, dec->ccu); rkvdec2_soft_ccu_enqueue(mpp, mpp_task); + + if (timing_en) { + mpp_task->on_run_end = ktime_get(); + set_bit(TASK_TIMING_RUN_END, &mpp_task->state); + } + done: if (list_empty(&queue->running_list) && list_empty(&queue->pending_list))