From 5d6f043685fed86153ea6aeadd098a11267f58ef Mon Sep 17 00:00:00 2001 From: Dmitry Osipenko Date: Tue, 7 Aug 2018 16:07:12 +0300 Subject: gpu: host1x: Don't complete a completed job There is a chance that the last job has been completed at the time of CDMA timeout handler invocation. In this case there is no need to complete the completed job. Signed-off-by: Dmitry Osipenko Reviewed-by: Mikko Perttunen Signed-off-by: Thierry Reding --- drivers/gpu/host1x/cdma.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'drivers/gpu/host1x') diff --git a/drivers/gpu/host1x/cdma.c b/drivers/gpu/host1x/cdma.c index 2314f37cb735..7556e0efd35a 100644 --- a/drivers/gpu/host1x/cdma.c +++ b/drivers/gpu/host1x/cdma.c @@ -383,7 +383,7 @@ void host1x_cdma_update_sync_queue(struct host1x_cdma *cdma, { struct host1x *host1x = cdma_to_host1x(cdma); u32 restart_addr, syncpt_incrs, syncpt_val; - struct host1x_job *job = NULL; + struct host1x_job *job; syncpt_val = host1x_syncpt_load(cdma->timeout.syncpt); @@ -402,11 +402,16 @@ void host1x_cdma_update_sync_queue(struct host1x_cdma *cdma, list_for_each_entry(job, &cdma->sync_queue, list) { if (syncpt_val < job->syncpt_end) - break; + goto syncpt_incr; host1x_job_dump(dev, job); } + /* all jobs have been completed */ + job = NULL; + +syncpt_incr: + /* * Increment with CPU the remaining syncpts of a partially executed job. * @@ -419,16 +424,16 @@ void host1x_cdma_update_sync_queue(struct host1x_cdma *cdma, * modified NOP-ed PB slots). This lets things appear to have completed * properly for this buffer and resources are freed. */ - - dev_dbg(dev, "%s: perform CPU incr on pending buffers\n", __func__); - - if (!list_empty(&cdma->sync_queue)) + if (job) restart_addr = job->first_get; else restart_addr = cdma->last_pos; /* do CPU increments for the remaining syncpts */ if (job) { + dev_dbg(dev, "%s: perform CPU incr on pending buffers\n", + __func__); + /* won't need a timeout when replayed */ job->timeout = 0; @@ -441,9 +446,10 @@ void host1x_cdma_update_sync_queue(struct host1x_cdma *cdma, host1x_hw_cdma_timeout_cpu_incr(host1x, cdma, job->first_get, syncpt_incrs, job->syncpt_end, job->num_slots); - } - dev_dbg(dev, "%s: finished sync_queue modification\n", __func__); + dev_dbg(dev, "%s: finished sync_queue modification\n", + __func__); + } /* roll back DMAGET and start up channel again */ host1x_hw_cdma_resume(host1x, cdma, restart_addr); -- cgit v1.2.3-59-g8ed1b