]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/vc4: Use DMA Resv to implement VC4 wait BO IOCTL
authorMaíra Canal <mcanal@igalia.com>
Fri, 20 Dec 2024 13:37:08 +0000 (10:37 -0300)
committerMaíra Canal <mcanal@igalia.com>
Sun, 19 Jan 2025 18:30:54 +0000 (15:30 -0300)
Since the BOs used by VC4 have DMA Reservation Objects attached to
them, waiting for seqnos to check BO availability is unnecessary.
Instead, `drm_gem_dma_resv_wait()` can be used.

Signed-off-by: Maíra Canal <mcanal@igalia.com>
Reviewed-by: Melissa Wen <mwen@igalia.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241220134204.634577-3-mcanal@igalia.com
drivers/gpu/drm/vc4/vc4_gem.c

index 1021f45cb53cc498613fd8c7549c6bcdbc77f526..de7be9942c1342ea55538cf51dd0e9b8d6a4ac7d 100644 (file)
@@ -1020,8 +1020,10 @@ vc4_wait_bo_ioctl(struct drm_device *dev, void *data,
        struct vc4_dev *vc4 = to_vc4_dev(dev);
        int ret;
        struct drm_vc4_wait_bo *args = data;
-       struct drm_gem_object *gem_obj;
-       struct vc4_bo *bo;
+       unsigned long timeout_jiffies =
+               usecs_to_jiffies(div_u64(args->timeout_ns, 1000));
+       ktime_t start = ktime_get();
+       u64 delta_ns;
 
        if (WARN_ON_ONCE(vc4->gen > VC4_GEN_4))
                return -ENODEV;
@@ -1029,17 +1031,18 @@ vc4_wait_bo_ioctl(struct drm_device *dev, void *data,
        if (args->pad != 0)
                return -EINVAL;
 
-       gem_obj = drm_gem_object_lookup(file_priv, args->handle);
-       if (!gem_obj) {
-               DRM_DEBUG("Failed to look up GEM BO %d\n", args->handle);
-               return -EINVAL;
-       }
-       bo = to_vc4_bo(gem_obj);
+       ret = drm_gem_dma_resv_wait(file_priv, args->handle,
+                                   true, timeout_jiffies);
 
-       ret = vc4_wait_for_seqno_ioctl_helper(dev, bo->seqno,
-                                             &args->timeout_ns);
+       /* Decrement the user's timeout, in case we got interrupted
+        * such that the ioctl will be restarted.
+        */
+       delta_ns = ktime_to_ns(ktime_sub(ktime_get(), start));
+       if (delta_ns < args->timeout_ns)
+               args->timeout_ns -= delta_ns;
+       else
+               args->timeout_ns = 0;
 
-       drm_gem_object_put(gem_obj);
        return ret;
 }