summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/host1x
diff options
context:
space:
mode:
authorMikko Perttunen <mperttunen@nvidia.com>2023-03-01 15:51:06 +0200
committerThierry Reding <treding@nvidia.com>2023-04-04 14:24:24 +0200
commitc1aaee94380874fd40f7bb8417c597aba3f72c75 (patch)
tree0193b6841f85b30d86aee9ede799e2c9400916e3 /drivers/gpu/host1x
parent1d83d1a2df0bfb6bd79400746c289e2c4edc5909 (diff)
downloadlinux-stable-c1aaee94380874fd40f7bb8417c597aba3f72c75.tar.gz
linux-stable-c1aaee94380874fd40f7bb8417c597aba3f72c75.tar.bz2
linux-stable-c1aaee94380874fd40f7bb8417c597aba3f72c75.zip
gpu: host1x: Don't rely on dma_fence_wait_timeout return value
dma_fence_wait_timeout (along with a host of other jiffies-based timeouting functions) returns zero both in case of timeout and when the wait completes during the last jiffy before timeout. As such, we can't rely on it to distinguish between success and timeout. To prevent confusing callers by returning -EAGAIN before the timeout period has elapsed, check if the fence got signaled again after the wait. Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com> Signed-off-by: Thierry Reding <treding@nvidia.com>
Diffstat (limited to 'drivers/gpu/host1x')
-rw-r--r--drivers/gpu/host1x/syncpt.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/gpu/host1x/syncpt.c b/drivers/gpu/host1x/syncpt.c
index 2d2007760eac..f63d14a57a1d 100644
--- a/drivers/gpu/host1x/syncpt.c
+++ b/drivers/gpu/host1x/syncpt.c
@@ -248,7 +248,13 @@ int host1x_syncpt_wait(struct host1x_syncpt *sp, u32 thresh, long timeout,
if (value)
*value = host1x_syncpt_load(sp);
- if (wait_err == 0)
+ /*
+ * Don't rely on dma_fence_wait_timeout return value,
+ * since it returns zero both on timeout and if the
+ * wait completed with 0 jiffies left.
+ */
+ host1x_hw_syncpt_load(sp->host, sp);
+ if (wait_err == 0 && !host1x_syncpt_is_expired(sp, thresh))
return -EAGAIN;
else if (wait_err < 0)
return wait_err;