aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gem.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
index fd56f92f3469..f0efc5db793f 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
@@ -411,16 +411,20 @@ int etnaviv_gem_cpu_prep(struct drm_gem_object *obj, u32 op,
411 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); 411 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj);
412 struct drm_device *dev = obj->dev; 412 struct drm_device *dev = obj->dev;
413 bool write = !!(op & ETNA_PREP_WRITE); 413 bool write = !!(op & ETNA_PREP_WRITE);
414 unsigned long remain = 414 int ret;
415 op & ETNA_PREP_NOSYNC ? 0 : etnaviv_timeout_to_jiffies(timeout); 415
416 long lret; 416 if (op & ETNA_PREP_NOSYNC) {
417 417 if (!reservation_object_test_signaled_rcu(etnaviv_obj->resv,
418 lret = reservation_object_wait_timeout_rcu(etnaviv_obj->resv, 418 write))
419 write, true, remain); 419 return -EBUSY;
420 if (lret < 0) 420 } else {
421 return lret; 421 unsigned long remain = etnaviv_timeout_to_jiffies(timeout);
422 else if (lret == 0) 422
423 return remain == 0 ? -EBUSY : -ETIMEDOUT; 423 ret = reservation_object_wait_timeout_rcu(etnaviv_obj->resv,
424 write, true, remain);
425 if (ret <= 0)
426 return ret == 0 ? -ETIMEDOUT : ret;
427 }
424 428
425 if (etnaviv_obj->flags & ETNA_BO_CACHED) { 429 if (etnaviv_obj->flags & ETNA_BO_CACHED) {
426 if (!etnaviv_obj->sgt) { 430 if (!etnaviv_obj->sgt) {