mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 19:08:57 +09:00
video: rockchip: rga3: fixup rga load
Signed-off-by: Li Huang <putin.li@rock-chips.com> Change-Id: Id09a22819f4d118d1702b6eb7299279f0bd3fcc8
This commit is contained in:
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user