diff --git a/drivers/video/rockchip/rga3/include/rga_drv.h b/drivers/video/rockchip/rga3/include/rga_drv.h index b891fc88c788..653362f67d2c 100644 --- a/drivers/video/rockchip/rga3/include/rga_drv.h +++ b/drivers/video/rockchip/rga3/include/rga_drv.h @@ -288,13 +288,18 @@ struct rga_job { struct dma_fence *out_fence; struct dma_fence *in_fence; spinlock_t fence_lock; + /* job time stamp */ ktime_t timestamp; - ktime_t running_time; + /* The time when the job is actually executed on the hardware */ + ktime_t hw_running_time; + /* The time only for hrtimer to calculate the load */ + ktime_t hw_recoder_time; unsigned int flags; int ctx_id; int priority; int core; int ret; + pid_t pid; bool use_batch_mode; }; diff --git a/drivers/video/rockchip/rga3/rga2_reg_info.c b/drivers/video/rockchip/rga3/rga2_reg_info.c index b7db98e81a97..8e927e6dbf97 100644 --- a/drivers/video/rockchip/rga3/rga2_reg_info.c +++ b/drivers/video/rockchip/rga3/rga2_reg_info.c @@ -2271,11 +2271,11 @@ int rga2_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) pr_err("sys_ctrl = %x, int = %x, set cmd use time = %lld\n", rga_read(RGA2_SYS_CTRL, scheduler), rga_read(RGA2_INT, scheduler), - ktime_to_us(ktime_sub(now, job->running_time))); + ktime_us_delta(now, job->timestamp)); } - job->timestamp = now; - job->running_time = now; + job->hw_running_time = now; + job->hw_recoder_time = now; rga_write(1, RGA2_CMD_CTRL, scheduler); diff --git a/drivers/video/rockchip/rga3/rga3_reg_info.c b/drivers/video/rockchip/rga3/rga3_reg_info.c index d6d21c62b3ac..ee50687af697 100644 --- a/drivers/video/rockchip/rga3/rga3_reg_info.c +++ b/drivers/video/rockchip/rga3/rga3_reg_info.c @@ -1930,10 +1930,10 @@ int rga3_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) } if (DEBUGGER_EN(TIME)) - pr_err("set cmd use time = %lld\n", ktime_to_us(ktime_sub(now, job->running_time))); + pr_err("set cmd use time = %lld\n", ktime_us_delta(now, job->timestamp)); - job->timestamp = now; - job->running_time = now; + job->hw_running_time = now; + job->hw_recoder_time = now; rga_write(1, RGA3_SYS_CTRL, scheduler); diff --git a/drivers/video/rockchip/rga3/rga_debugger.c b/drivers/video/rockchip/rga3/rga_debugger.c index d431256b4580..ea5632136d31 100644 --- a/drivers/video/rockchip/rga3/rga_debugger.c +++ b/drivers/video/rockchip/rga3/rga_debugger.c @@ -160,7 +160,7 @@ static int rga_load_show(struct seq_file *m, void *data) spin_unlock_irqrestore(&rga_scheduler->irq_lock, flags); load = (busy_time_total * 100000 / RGA_LOAD_INTERVAL); - seq_printf(m, "load = %d", load); + seq_printf(m, "\t load = %d\n", load); seq_printf(m, "-----------------------------------\n"); } return 0; diff --git a/drivers/video/rockchip/rga3/rga_drv.c b/drivers/video/rockchip/rga3/rga_drv.c index 19eba6c2f5e0..bad958ec6154 100644 --- a/drivers/video/rockchip/rga3/rga_drv.c +++ b/drivers/video/rockchip/rga3/rga_drv.c @@ -158,8 +158,8 @@ static enum hrtimer_restart hrtimer_handler(struct hrtimer *timer) /* if timer action on job running */ job = scheduler->running_job; if (job) { - scheduler->timer.busy_time += ktime_us_delta(now, job->timestamp); - job->timestamp = now; + scheduler->timer.busy_time += ktime_us_delta(now, job->hw_recoder_time); + job->hw_recoder_time = now; } scheduler->timer.busy_time_record = scheduler->timer.busy_time; diff --git a/drivers/video/rockchip/rga3/rga_job.c b/drivers/video/rockchip/rga3/rga_job.c index 946cc2682e9e..0ac62f2a5380 100644 --- a/drivers/video/rockchip/rga3/rga_job.c +++ b/drivers/video/rockchip/rga3/rga_job.c @@ -136,6 +136,13 @@ static void rga_job_free(struct rga_job *job) static int rga_job_cleanup(struct rga_job *job) { + ktime_t now = ktime_get(); + + if (DEBUGGER_EN(TIME)) { + pr_err("(pid:%d) job clean use time = %lld\n", job->pid, + ktime_us_delta(now, job->timestamp)); + } + rga_job_free(job); return 0; @@ -214,7 +221,7 @@ static struct rga_job *rga_job_alloc(struct rga_req *rga_command_base) INIT_LIST_HEAD(&job->head); job->timestamp = ktime_get(); - job->running_time = ktime_get(); + job->pid = current->pid; job->rga_command_base = *rga_command_base; @@ -461,15 +468,16 @@ next_job: static void rga_job_finish_and_next(struct rga_scheduler_t *rga_scheduler, struct rga_job *job, int ret) { - ktime_t now = ktime_get(); + ktime_t now; job->ret = ret; - if (DEBUGGER_EN(TIME)) - pr_err("%s use time = %lld\n", __func__, - ktime_us_delta(now, job->running_time)); - - job->running_time = now; + if (DEBUGGER_EN(TIME)) { + now = ktime_get(); + pr_err("hw use time = %lld\n", ktime_us_delta(now, job->hw_running_time)); + pr_err("(pid:%d) job done use time = %lld\n", job->pid, + ktime_us_delta(now, job->timestamp)); + } if (job->core == RGA2_SCHEDULER_CORE0) rga2_dma_flush_cache_for_virtual_address(&job->vir_page_table, @@ -510,7 +518,7 @@ void rga_job_done(struct rga_scheduler_t *rga_scheduler, int ret) job = rga_scheduler->running_job; rga_scheduler->running_job = NULL; - rga_scheduler->timer.busy_time += ktime_us_delta(now, job->timestamp); + rga_scheduler->timer.busy_time += ktime_us_delta(now, job->hw_recoder_time); spin_unlock_irqrestore(&rga_scheduler->irq_lock, flags); @@ -527,7 +535,7 @@ static void rga_job_timeout_clean(struct rga_scheduler_t *scheduler) job = scheduler->running_job; if (job && (job->flags & RGA_JOB_ASYNC) && - (ktime_to_ms(ktime_sub(now, job->timestamp)) >= RGA_ASYNC_TIMEOUT_DELAY)) { + (ktime_ms_delta(now, job->hw_running_time) >= RGA_ASYNC_TIMEOUT_DELAY)) { scheduler->running_job = NULL; spin_unlock_irqrestore(&scheduler->irq_lock, flags); @@ -665,7 +673,7 @@ static inline int rga_job_wait(struct rga_scheduler_t *rga_scheduler, if (DEBUGGER_EN(TIME)) pr_err("%s use time = %lld\n", __func__, - ktime_to_us(ktime_sub(now, job->running_time))); + ktime_us_delta(now, job->hw_running_time)); return ret; } @@ -682,7 +690,7 @@ static void rga_input_fence_signaled(struct dma_fence *fence, if (DEBUGGER_EN(TIME)) pr_err("rga job wait in_fence signal use time = %lld\n", - ktime_to_us(ktime_sub(now, waiter->job->timestamp))); + ktime_us_delta(now, waiter->job->timestamp)); scheduler = rga_job_schedule(waiter->job); @@ -882,7 +890,7 @@ void rga_internel_ctx_kref_release(struct kref *ref) if (job->ctx_id == ctx->id) { scheduler->running_job = NULL; - scheduler->timer.busy_time += ktime_us_delta(now, job->timestamp); + scheduler->timer.busy_time += ktime_us_delta(now, job->hw_recoder_time); need_reset = true; } }