Skip to content

Commit ddd33ff

Browse files
committed
drm/i915: Add function to clear scanout flag for vmas
Currently frontbuffer tracking code is directly iterating over object vmas and clearing scanout flags for them. Add function to clear scanout flag for vmas and use it from frontbuffer tracking code. v2: describe function parameter. Signed-off-by: Jouni Högander <[email protected]> Reviewed-by: Jani Nikula <[email protected]> Reviewed-by: Nirmoy Das <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 1836a6c commit ddd33ff

File tree

3 files changed

+23
-7
lines changed

3 files changed

+23
-7
lines changed

drivers/gpu/drm/i915/display/intel_frontbuffer.c

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -226,16 +226,10 @@ static void frontbuffer_release(struct kref *ref)
226226
struct intel_frontbuffer *front =
227227
container_of(ref, typeof(*front), ref);
228228
struct drm_i915_gem_object *obj = front->obj;
229-
struct i915_vma *vma;
230229

231230
drm_WARN_ON(&intel_bo_to_i915(obj)->drm, atomic_read(&front->bits));
232231

233-
spin_lock(&obj->vma.lock);
234-
for_each_ggtt_vma(vma, obj) {
235-
i915_vma_clear_scanout(vma);
236-
vma->display_alignment = I915_GTT_MIN_ALIGNMENT;
237-
}
238-
spin_unlock(&obj->vma.lock);
232+
i915_ggtt_clear_scanout(obj);
239233

240234
i915_gem_object_set_frontbuffer(obj, NULL);
241235
spin_unlock(&intel_bo_to_i915(obj)->display.fb_tracking.lock);

drivers/gpu/drm/i915/i915_vma.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1629,6 +1629,26 @@ int i915_ggtt_pin(struct i915_vma *vma, struct i915_gem_ww_ctx *ww,
16291629
return err;
16301630
}
16311631

1632+
/**
1633+
* i915_ggtt_clear_scanout - Clear scanout flag for all objects ggtt vmas
1634+
* @obj: i915 GEM object
1635+
* This function clears scanout flags for objects ggtt vmas. These flags are set
1636+
* when object is pinned for display use and this function to clear them all is
1637+
* targeted to be called by frontbuffer tracking code when the frontbuffer is
1638+
* about to be released.
1639+
*/
1640+
void i915_ggtt_clear_scanout(struct drm_i915_gem_object *obj)
1641+
{
1642+
struct i915_vma *vma;
1643+
1644+
spin_lock(&obj->vma.lock);
1645+
for_each_ggtt_vma(vma, obj) {
1646+
i915_vma_clear_scanout(vma);
1647+
vma->display_alignment = I915_GTT_MIN_ALIGNMENT;
1648+
}
1649+
spin_unlock(&obj->vma.lock);
1650+
}
1651+
16321652
static void __vma_close(struct i915_vma *vma, struct intel_gt *gt)
16331653
{
16341654
/*

drivers/gpu/drm/i915/i915_vma.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,8 @@ static inline void i915_vma_clear_scanout(struct i915_vma *vma)
435435
clear_bit(I915_VMA_SCANOUT_BIT, __i915_vma_flags(vma));
436436
}
437437

438+
void i915_ggtt_clear_scanout(struct drm_i915_gem_object *obj);
439+
438440
#define for_each_until(cond) if (cond) break; else
439441

440442
/**

0 commit comments

Comments
 (0)