mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 11:26:02 +09:00
video: rockchip: rga3: Add timeout clean job func for async mode
Signed-off-by: Li Huang <putin.li@rock-chips.com> Change-Id: Ice2632589b1f4325f277ecf73083b273cd554cae
This commit is contained in:
@@ -75,7 +75,7 @@
|
||||
"." STR(DRIVER_REVISION_VERSION))
|
||||
|
||||
/* time limit */
|
||||
#define RGA_ASYNC_TIMEOUT_DELAY HZ
|
||||
#define RGA_ASYNC_TIMEOUT_DELAY 500
|
||||
#define RGA_SYNC_TIMEOUT_DELAY HZ
|
||||
#define RGA_RESET_TIMEOUT 1000
|
||||
|
||||
|
||||
@@ -175,8 +175,8 @@ next_job:
|
||||
|
||||
/* If some error before hw run */
|
||||
if (job->ret < 0) {
|
||||
pr_err("some error on rga_job_run, %s(%d)\n", __func__,
|
||||
__LINE__);
|
||||
pr_err("some error on rga_job_run before hw start, %s(%d)\n",
|
||||
__func__, __LINE__);
|
||||
|
||||
spin_lock_irqsave(&rga_scheduler->irq_lock, flags);
|
||||
|
||||
@@ -547,6 +547,38 @@ finish:
|
||||
return core;
|
||||
}
|
||||
|
||||
static void rga_job_timeout_clean(struct rga_scheduler_t *scheduler)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct rga_job *job = NULL;
|
||||
ktime_t now = ktime_get();
|
||||
|
||||
spin_lock_irqsave(&scheduler->irq_lock, flags);
|
||||
|
||||
job = scheduler->running_job;
|
||||
if (job && (job->flags & RGA_JOB_ASYNC) &&
|
||||
(ktime_to_ms(ktime_sub(now, job->timestamp)) >= RGA_ASYNC_TIMEOUT_DELAY)) {
|
||||
scheduler->running_job = NULL;
|
||||
|
||||
spin_unlock_irqrestore(&scheduler->irq_lock, flags);
|
||||
|
||||
scheduler->ops->soft_reset(scheduler);
|
||||
|
||||
rga_dma_put_info(job);
|
||||
|
||||
mmdrop(job->mm);
|
||||
|
||||
if (job->out_fence)
|
||||
dma_fence_signal(job->out_fence);
|
||||
|
||||
rga_job_cleanup(job);
|
||||
|
||||
rga_power_disable(scheduler);
|
||||
} else {
|
||||
spin_unlock_irqrestore(&scheduler->irq_lock, flags);
|
||||
}
|
||||
}
|
||||
|
||||
static struct rga_scheduler_t *rga_job_schedule(struct rga_job *job)
|
||||
{
|
||||
unsigned long flags;
|
||||
@@ -570,6 +602,8 @@ static struct rga_scheduler_t *rga_job_schedule(struct rga_job *job)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
rga_job_timeout_clean(scheduler);
|
||||
|
||||
spin_lock_irqsave(&scheduler->irq_lock, flags);
|
||||
|
||||
/* priority policy set by userspace */
|
||||
@@ -610,19 +644,16 @@ static void rga_running_job_abort(struct rga_job *job,
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (job->ret == -ETIMEDOUT)
|
||||
rga_scheduler->ops->soft_reset(rga_scheduler);
|
||||
|
||||
spin_lock_irqsave(&rga_scheduler->irq_lock, flags);
|
||||
|
||||
/* invalid job */
|
||||
if (job == rga_scheduler->running_job) {
|
||||
rga_scheduler->running_job = NULL;
|
||||
|
||||
rga_job_cleanup(job);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&rga_scheduler->irq_lock, flags);
|
||||
|
||||
rga_job_cleanup(job);
|
||||
}
|
||||
|
||||
static void rga_invalid_job_abort(struct rga_job *job)
|
||||
@@ -716,8 +747,6 @@ int rga_commit(struct rga_req *rga_command_base, int flags)
|
||||
job->flags |= RGA_JOB_ASYNC;
|
||||
rga_command_base->out_fence_fd = rga_out_fence_get_fd(job);
|
||||
|
||||
//TODO: job timeout clean, need add pd disable
|
||||
|
||||
if (RGA_DEBUG_MSG)
|
||||
pr_err("in_fence_fd = %d",
|
||||
rga_command_base->in_fence_fd);
|
||||
@@ -794,6 +823,7 @@ int rga_commit(struct rga_req *rga_command_base, int flags)
|
||||
pr_err("failed to wait rga job! May be timeout\n");
|
||||
goto running_job_abort;
|
||||
}
|
||||
|
||||
rga_job_cleanup(job);
|
||||
}
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user