mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 04:10:18 +09:00
video: rockchip: mpp: Add rk3588 decoder timing
NOTE: rk3588 use link table to config hardware and can not get accurate timing on task finished. The task timing of irq and isr is combined together. Signed-off-by: Herman Chen <herman.chen@rock-chips.com> Change-Id: I3469fb56145de1929c41b6a3e9fb43d88003daa3
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user