mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-09 10:00:55 -04:00
drm/vc4: Use DMA Resv to implement VC4 wait BO IOCTL
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
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user