Commit 48a8dd17 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'drm-fixes-2019-12-28' of git://anongit.freedesktop.org/drm/drm

Pull drm fixes from Dave Airlie:
 "Post-xmas food coma recovery fixes. Only three fixes for i915 since I
  expect most people are holidaying.

  i915:
   - power management rc6 fix
   - framebuffer tracking fix
   - display power management ratelimit fix"

* tag 'drm-fixes-2019-12-28' of git://anongit.freedesktop.org/drm/drm:
  drm/i915: Hold reference to intel_frontbuffer as we track activity
  drm/i915/gt: Ratelimit display power w/a
  drm/i915/pmu: Ensure monotonic rc6
parents f4b39746 e31d941c
...@@ -15112,7 +15112,7 @@ intel_prepare_plane_fb(struct drm_plane *plane, ...@@ -15112,7 +15112,7 @@ intel_prepare_plane_fb(struct drm_plane *plane,
return ret; return ret;
fb_obj_bump_render_priority(obj); fb_obj_bump_render_priority(obj);
intel_frontbuffer_flush(obj->frontbuffer, ORIGIN_DIRTYFB); i915_gem_object_flush_frontbuffer(obj, ORIGIN_DIRTYFB);
if (!new_plane_state->base.fence) { /* implicit fencing */ if (!new_plane_state->base.fence) { /* implicit fencing */
struct dma_fence *fence; struct dma_fence *fence;
......
...@@ -229,11 +229,11 @@ static void frontbuffer_release(struct kref *ref) ...@@ -229,11 +229,11 @@ static void frontbuffer_release(struct kref *ref)
vma->display_alignment = I915_GTT_MIN_ALIGNMENT; vma->display_alignment = I915_GTT_MIN_ALIGNMENT;
spin_unlock(&obj->vma.lock); spin_unlock(&obj->vma.lock);
obj->frontbuffer = NULL; RCU_INIT_POINTER(obj->frontbuffer, NULL);
spin_unlock(&to_i915(obj->base.dev)->fb_tracking.lock); spin_unlock(&to_i915(obj->base.dev)->fb_tracking.lock);
i915_gem_object_put(obj); i915_gem_object_put(obj);
kfree(front); kfree_rcu(front, rcu);
} }
struct intel_frontbuffer * struct intel_frontbuffer *
...@@ -242,11 +242,7 @@ intel_frontbuffer_get(struct drm_i915_gem_object *obj) ...@@ -242,11 +242,7 @@ intel_frontbuffer_get(struct drm_i915_gem_object *obj)
struct drm_i915_private *i915 = to_i915(obj->base.dev); struct drm_i915_private *i915 = to_i915(obj->base.dev);
struct intel_frontbuffer *front; struct intel_frontbuffer *front;
spin_lock(&i915->fb_tracking.lock); front = __intel_frontbuffer_get(obj);
front = obj->frontbuffer;
if (front)
kref_get(&front->ref);
spin_unlock(&i915->fb_tracking.lock);
if (front) if (front)
return front; return front;
...@@ -262,13 +258,13 @@ intel_frontbuffer_get(struct drm_i915_gem_object *obj) ...@@ -262,13 +258,13 @@ intel_frontbuffer_get(struct drm_i915_gem_object *obj)
i915_active_may_sleep(frontbuffer_retire)); i915_active_may_sleep(frontbuffer_retire));
spin_lock(&i915->fb_tracking.lock); spin_lock(&i915->fb_tracking.lock);
if (obj->frontbuffer) { if (rcu_access_pointer(obj->frontbuffer)) {
kfree(front); kfree(front);
front = obj->frontbuffer; front = rcu_dereference_protected(obj->frontbuffer, true);
kref_get(&front->ref); kref_get(&front->ref);
} else { } else {
i915_gem_object_get(obj); i915_gem_object_get(obj);
obj->frontbuffer = front; rcu_assign_pointer(obj->frontbuffer, front);
} }
spin_unlock(&i915->fb_tracking.lock); spin_unlock(&i915->fb_tracking.lock);
......
...@@ -27,10 +27,10 @@ ...@@ -27,10 +27,10 @@
#include <linux/atomic.h> #include <linux/atomic.h>
#include <linux/kref.h> #include <linux/kref.h>
#include "gem/i915_gem_object_types.h"
#include "i915_active.h" #include "i915_active.h"
struct drm_i915_private; struct drm_i915_private;
struct drm_i915_gem_object;
enum fb_op_origin { enum fb_op_origin {
ORIGIN_GTT, ORIGIN_GTT,
...@@ -45,6 +45,7 @@ struct intel_frontbuffer { ...@@ -45,6 +45,7 @@ struct intel_frontbuffer {
atomic_t bits; atomic_t bits;
struct i915_active write; struct i915_active write;
struct drm_i915_gem_object *obj; struct drm_i915_gem_object *obj;
struct rcu_head rcu;
}; };
void intel_frontbuffer_flip_prepare(struct drm_i915_private *i915, void intel_frontbuffer_flip_prepare(struct drm_i915_private *i915,
...@@ -54,6 +55,35 @@ void intel_frontbuffer_flip_complete(struct drm_i915_private *i915, ...@@ -54,6 +55,35 @@ void intel_frontbuffer_flip_complete(struct drm_i915_private *i915,
void intel_frontbuffer_flip(struct drm_i915_private *i915, void intel_frontbuffer_flip(struct drm_i915_private *i915,
unsigned frontbuffer_bits); unsigned frontbuffer_bits);
void intel_frontbuffer_put(struct intel_frontbuffer *front);
static inline struct intel_frontbuffer *
__intel_frontbuffer_get(const struct drm_i915_gem_object *obj)
{
struct intel_frontbuffer *front;
if (likely(!rcu_access_pointer(obj->frontbuffer)))
return NULL;
rcu_read_lock();
do {
front = rcu_dereference(obj->frontbuffer);
if (!front)
break;
if (unlikely(!kref_get_unless_zero(&front->ref)))
continue;
if (likely(front == rcu_access_pointer(obj->frontbuffer)))
break;
intel_frontbuffer_put(front);
} while (1);
rcu_read_unlock();
return front;
}
struct intel_frontbuffer * struct intel_frontbuffer *
intel_frontbuffer_get(struct drm_i915_gem_object *obj); intel_frontbuffer_get(struct drm_i915_gem_object *obj);
...@@ -119,6 +149,4 @@ void intel_frontbuffer_track(struct intel_frontbuffer *old, ...@@ -119,6 +149,4 @@ void intel_frontbuffer_track(struct intel_frontbuffer *old,
struct intel_frontbuffer *new, struct intel_frontbuffer *new,
unsigned int frontbuffer_bits); unsigned int frontbuffer_bits);
void intel_frontbuffer_put(struct intel_frontbuffer *front);
#endif /* __INTEL_FRONTBUFFER_H__ */ #endif /* __INTEL_FRONTBUFFER_H__ */
...@@ -279,12 +279,21 @@ static void intel_overlay_flip_prepare(struct intel_overlay *overlay, ...@@ -279,12 +279,21 @@ static void intel_overlay_flip_prepare(struct intel_overlay *overlay,
struct i915_vma *vma) struct i915_vma *vma)
{ {
enum pipe pipe = overlay->crtc->pipe; enum pipe pipe = overlay->crtc->pipe;
struct intel_frontbuffer *from = NULL, *to = NULL;
WARN_ON(overlay->old_vma); WARN_ON(overlay->old_vma);
intel_frontbuffer_track(overlay->vma ? overlay->vma->obj->frontbuffer : NULL, if (overlay->vma)
vma ? vma->obj->frontbuffer : NULL, from = intel_frontbuffer_get(overlay->vma->obj);
INTEL_FRONTBUFFER_OVERLAY(pipe)); if (vma)
to = intel_frontbuffer_get(vma->obj);
intel_frontbuffer_track(from, to, INTEL_FRONTBUFFER_OVERLAY(pipe));
if (to)
intel_frontbuffer_put(to);
if (from)
intel_frontbuffer_put(from);
intel_frontbuffer_flip_prepare(overlay->i915, intel_frontbuffer_flip_prepare(overlay->i915,
INTEL_FRONTBUFFER_OVERLAY(pipe)); INTEL_FRONTBUFFER_OVERLAY(pipe));
...@@ -766,7 +775,7 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay, ...@@ -766,7 +775,7 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay,
ret = PTR_ERR(vma); ret = PTR_ERR(vma);
goto out_pin_section; goto out_pin_section;
} }
intel_frontbuffer_flush(new_bo->frontbuffer, ORIGIN_DIRTYFB); i915_gem_object_flush_frontbuffer(new_bo, ORIGIN_DIRTYFB);
if (!overlay->active) { if (!overlay->active) {
u32 oconfig; u32 oconfig;
......
...@@ -20,7 +20,8 @@ static void __do_clflush(struct drm_i915_gem_object *obj) ...@@ -20,7 +20,8 @@ static void __do_clflush(struct drm_i915_gem_object *obj)
{ {
GEM_BUG_ON(!i915_gem_object_has_pages(obj)); GEM_BUG_ON(!i915_gem_object_has_pages(obj));
drm_clflush_sg(obj->mm.pages); drm_clflush_sg(obj->mm.pages);
intel_frontbuffer_flush(obj->frontbuffer, ORIGIN_CPU);
i915_gem_object_flush_frontbuffer(obj, ORIGIN_CPU);
} }
static int clflush_work(struct dma_fence_work *base) static int clflush_work(struct dma_fence_work *base)
......
...@@ -664,7 +664,7 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data, ...@@ -664,7 +664,7 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
i915_gem_object_unlock(obj); i915_gem_object_unlock(obj);
if (write_domain) if (write_domain)
intel_frontbuffer_invalidate(obj->frontbuffer, ORIGIN_CPU); i915_gem_object_invalidate_frontbuffer(obj, ORIGIN_CPU);
out_unpin: out_unpin:
i915_gem_object_unpin_pages(obj); i915_gem_object_unpin_pages(obj);
...@@ -784,7 +784,7 @@ int i915_gem_object_prepare_write(struct drm_i915_gem_object *obj, ...@@ -784,7 +784,7 @@ int i915_gem_object_prepare_write(struct drm_i915_gem_object *obj,
} }
out: out:
intel_frontbuffer_invalidate(obj->frontbuffer, ORIGIN_CPU); i915_gem_object_invalidate_frontbuffer(obj, ORIGIN_CPU);
obj->mm.dirty = true; obj->mm.dirty = true;
/* return with the pages pinned */ /* return with the pages pinned */
return 0; return 0;
......
...@@ -280,7 +280,7 @@ i915_gem_object_flush_write_domain(struct drm_i915_gem_object *obj, ...@@ -280,7 +280,7 @@ i915_gem_object_flush_write_domain(struct drm_i915_gem_object *obj,
for_each_ggtt_vma(vma, obj) for_each_ggtt_vma(vma, obj)
intel_gt_flush_ggtt_writes(vma->vm->gt); intel_gt_flush_ggtt_writes(vma->vm->gt);
intel_frontbuffer_flush(obj->frontbuffer, ORIGIN_CPU); i915_gem_object_flush_frontbuffer(obj, ORIGIN_CPU);
for_each_ggtt_vma(vma, obj) { for_each_ggtt_vma(vma, obj) {
if (vma->iomap) if (vma->iomap)
...@@ -308,6 +308,30 @@ i915_gem_object_flush_write_domain(struct drm_i915_gem_object *obj, ...@@ -308,6 +308,30 @@ i915_gem_object_flush_write_domain(struct drm_i915_gem_object *obj,
obj->write_domain = 0; obj->write_domain = 0;
} }
void __i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object *obj,
enum fb_op_origin origin)
{
struct intel_frontbuffer *front;
front = __intel_frontbuffer_get(obj);
if (front) {
intel_frontbuffer_flush(front, origin);
intel_frontbuffer_put(front);
}
}
void __i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
enum fb_op_origin origin)
{
struct intel_frontbuffer *front;
front = __intel_frontbuffer_get(obj);
if (front) {
intel_frontbuffer_invalidate(front, origin);
intel_frontbuffer_put(front);
}
}
void i915_gem_init__objects(struct drm_i915_private *i915) void i915_gem_init__objects(struct drm_i915_private *i915)
{ {
INIT_WORK(&i915->mm.free_work, __i915_gem_free_work); INIT_WORK(&i915->mm.free_work, __i915_gem_free_work);
......
...@@ -13,8 +13,8 @@ ...@@ -13,8 +13,8 @@
#include <drm/i915_drm.h> #include <drm/i915_drm.h>
#include "display/intel_frontbuffer.h"
#include "i915_gem_object_types.h" #include "i915_gem_object_types.h"
#include "i915_gem_gtt.h" #include "i915_gem_gtt.h"
void i915_gem_init__objects(struct drm_i915_private *i915); void i915_gem_init__objects(struct drm_i915_private *i915);
...@@ -463,4 +463,25 @@ int i915_gem_object_wait_priority(struct drm_i915_gem_object *obj, ...@@ -463,4 +463,25 @@ int i915_gem_object_wait_priority(struct drm_i915_gem_object *obj,
unsigned int flags, unsigned int flags,
const struct i915_sched_attr *attr); const struct i915_sched_attr *attr);
void __i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object *obj,
enum fb_op_origin origin);
void __i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
enum fb_op_origin origin);
static inline void
i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object *obj,
enum fb_op_origin origin)
{
if (unlikely(rcu_access_pointer(obj->frontbuffer)))
__i915_gem_object_flush_frontbuffer(obj, origin);
}
static inline void
i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
enum fb_op_origin origin)
{
if (unlikely(rcu_access_pointer(obj->frontbuffer)))
__i915_gem_object_invalidate_frontbuffer(obj, origin);
}
#endif #endif
...@@ -150,7 +150,7 @@ struct drm_i915_gem_object { ...@@ -150,7 +150,7 @@ struct drm_i915_gem_object {
*/ */
u16 write_domain; u16 write_domain;
struct intel_frontbuffer *frontbuffer; struct intel_frontbuffer __rcu *frontbuffer;
/** Current tiling stride for the object, if it's tiled. */ /** Current tiling stride for the object, if it's tiled. */
unsigned int tiling_and_stride; unsigned int tiling_and_stride;
......
...@@ -94,8 +94,9 @@ static int __gt_park(struct intel_wakeref *wf) ...@@ -94,8 +94,9 @@ static int __gt_park(struct intel_wakeref *wf)
intel_uncore_forcewake_put(&i915->uncore, FORCEWAKE_ALL); intel_uncore_forcewake_put(&i915->uncore, FORCEWAKE_ALL);
} }
/* Defer dropping the display power well for 100ms, it's slow! */
GEM_BUG_ON(!wakeref); GEM_BUG_ON(!wakeref);
intel_display_power_put(i915, POWER_DOMAIN_GT_IRQ, wakeref); intel_display_power_put_async(i915, POWER_DOMAIN_GT_IRQ, wakeref);
i915_globals_park(); i915_globals_park();
......
...@@ -161,7 +161,7 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj, ...@@ -161,7 +161,7 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
* We manually control the domain here and pretend that it * We manually control the domain here and pretend that it
* remains coherent i.e. in the GTT domain, like shmem_pwrite. * remains coherent i.e. in the GTT domain, like shmem_pwrite.
*/ */
intel_frontbuffer_invalidate(obj->frontbuffer, ORIGIN_CPU); i915_gem_object_invalidate_frontbuffer(obj, ORIGIN_CPU);
if (copy_from_user(vaddr, user_data, args->size)) if (copy_from_user(vaddr, user_data, args->size))
return -EFAULT; return -EFAULT;
...@@ -169,7 +169,7 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj, ...@@ -169,7 +169,7 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
drm_clflush_virt_range(vaddr, args->size); drm_clflush_virt_range(vaddr, args->size);
intel_gt_chipset_flush(&to_i915(obj->base.dev)->gt); intel_gt_chipset_flush(&to_i915(obj->base.dev)->gt);
intel_frontbuffer_flush(obj->frontbuffer, ORIGIN_CPU); i915_gem_object_flush_frontbuffer(obj, ORIGIN_CPU);
return 0; return 0;
} }
...@@ -589,7 +589,7 @@ i915_gem_gtt_pwrite_fast(struct drm_i915_gem_object *obj, ...@@ -589,7 +589,7 @@ i915_gem_gtt_pwrite_fast(struct drm_i915_gem_object *obj,
goto out_unpin; goto out_unpin;
} }
intel_frontbuffer_invalidate(obj->frontbuffer, ORIGIN_CPU); i915_gem_object_invalidate_frontbuffer(obj, ORIGIN_CPU);
user_data = u64_to_user_ptr(args->data_ptr); user_data = u64_to_user_ptr(args->data_ptr);
offset = args->offset; offset = args->offset;
...@@ -631,7 +631,7 @@ i915_gem_gtt_pwrite_fast(struct drm_i915_gem_object *obj, ...@@ -631,7 +631,7 @@ i915_gem_gtt_pwrite_fast(struct drm_i915_gem_object *obj,
user_data += page_length; user_data += page_length;
offset += page_length; offset += page_length;
} }
intel_frontbuffer_flush(obj->frontbuffer, ORIGIN_CPU); i915_gem_object_flush_frontbuffer(obj, ORIGIN_CPU);
i915_gem_object_unlock_fence(obj, fence); i915_gem_object_unlock_fence(obj, fence);
out_unpin: out_unpin:
...@@ -721,7 +721,7 @@ i915_gem_shmem_pwrite(struct drm_i915_gem_object *obj, ...@@ -721,7 +721,7 @@ i915_gem_shmem_pwrite(struct drm_i915_gem_object *obj,
offset = 0; offset = 0;
} }
intel_frontbuffer_flush(obj->frontbuffer, ORIGIN_CPU); i915_gem_object_flush_frontbuffer(obj, ORIGIN_CPU);
i915_gem_object_unlock_fence(obj, fence); i915_gem_object_unlock_fence(obj, fence);
return ret; return ret;
......
...@@ -144,61 +144,40 @@ static inline s64 ktime_since(const ktime_t kt) ...@@ -144,61 +144,40 @@ static inline s64 ktime_since(const ktime_t kt)
return ktime_to_ns(ktime_sub(ktime_get(), kt)); return ktime_to_ns(ktime_sub(ktime_get(), kt));
} }
static u64 __pmu_estimate_rc6(struct i915_pmu *pmu)
{
u64 val;
/*
* We think we are runtime suspended.
*
* Report the delta from when the device was suspended to now,
* on top of the last known real value, as the approximated RC6
* counter value.
*/
val = ktime_since(pmu->sleep_last);
val += pmu->sample[__I915_SAMPLE_RC6].cur;
pmu->sample[__I915_SAMPLE_RC6_ESTIMATED].cur = val;
return val;
}
static u64 __pmu_update_rc6(struct i915_pmu *pmu, u64 val)
{
/*
* If we are coming back from being runtime suspended we must
* be careful not to report a larger value than returned
* previously.
*/
if (val >= pmu->sample[__I915_SAMPLE_RC6_ESTIMATED].cur) {
pmu->sample[__I915_SAMPLE_RC6_ESTIMATED].cur = 0;
pmu->sample[__I915_SAMPLE_RC6].cur = val;
} else {
val = pmu->sample[__I915_SAMPLE_RC6_ESTIMATED].cur;
}
return val;
}
static u64 get_rc6(struct intel_gt *gt) static u64 get_rc6(struct intel_gt *gt)
{ {
struct drm_i915_private *i915 = gt->i915; struct drm_i915_private *i915 = gt->i915;
struct i915_pmu *pmu = &i915->pmu; struct i915_pmu *pmu = &i915->pmu;
unsigned long flags; unsigned long flags;
bool awake = false;
u64 val; u64 val;
val = 0;
if (intel_gt_pm_get_if_awake(gt)) { if (intel_gt_pm_get_if_awake(gt)) {
val = __get_rc6(gt); val = __get_rc6(gt);
intel_gt_pm_put_async(gt); intel_gt_pm_put_async(gt);
awake = true;
} }
spin_lock_irqsave(&pmu->lock, flags); spin_lock_irqsave(&pmu->lock, flags);
if (val) if (awake) {
val = __pmu_update_rc6(pmu, val); pmu->sample[__I915_SAMPLE_RC6].cur = val;
} else {
/*
* We think we are runtime suspended.
*
* Report the delta from when the device was suspended to now,
* on top of the last known real value, as the approximated RC6
* counter value.
*/
val = ktime_since(pmu->sleep_last);
val += pmu->sample[__I915_SAMPLE_RC6].cur;
}
if (val < pmu->sample[__I915_SAMPLE_RC6_LAST_REPORTED].cur)
val = pmu->sample[__I915_SAMPLE_RC6_LAST_REPORTED].cur;
else else
val = __pmu_estimate_rc6(pmu); pmu->sample[__I915_SAMPLE_RC6_LAST_REPORTED].cur = val;
spin_unlock_irqrestore(&pmu->lock, flags); spin_unlock_irqrestore(&pmu->lock, flags);
...@@ -210,20 +189,11 @@ static void park_rc6(struct drm_i915_private *i915) ...@@ -210,20 +189,11 @@ static void park_rc6(struct drm_i915_private *i915)
struct i915_pmu *pmu = &i915->pmu; struct i915_pmu *pmu = &i915->pmu;
if (pmu->enable & config_enabled_mask(I915_PMU_RC6_RESIDENCY)) if (pmu->enable & config_enabled_mask(I915_PMU_RC6_RESIDENCY))
__pmu_update_rc6(pmu, __get_rc6(&i915->gt)); pmu->sample[__I915_SAMPLE_RC6].cur = __get_rc6(&i915->gt);
pmu->sleep_last = ktime_get(); pmu->sleep_last = ktime_get();
} }
static void unpark_rc6(struct drm_i915_private *i915)
{
struct i915_pmu *pmu = &i915->pmu;
/* Estimate how long we slept and accumulate that into rc6 counters */
if (pmu->enable & config_enabled_mask(I915_PMU_RC6_RESIDENCY))
__pmu_estimate_rc6(pmu);
}
#else #else
static u64 get_rc6(struct intel_gt *gt) static u64 get_rc6(struct intel_gt *gt)
...@@ -232,7 +202,6 @@ static u64 get_rc6(struct intel_gt *gt) ...@@ -232,7 +202,6 @@ static u64 get_rc6(struct intel_gt *gt)
} }
static void park_rc6(struct drm_i915_private *i915) {} static void park_rc6(struct drm_i915_private *i915) {}
static void unpark_rc6(struct drm_i915_private *i915) {}
#endif #endif
...@@ -281,8 +250,6 @@ void i915_pmu_gt_unparked(struct drm_i915_private *i915) ...@@ -281,8 +250,6 @@ void i915_pmu_gt_unparked(struct drm_i915_private *i915)
*/ */
__i915_pmu_maybe_start_timer(pmu); __i915_pmu_maybe_start_timer(pmu);
unpark_rc6(i915);
spin_unlock_irq(&pmu->lock); spin_unlock_irq(&pmu->lock);
} }
......
...@@ -18,7 +18,7 @@ enum { ...@@ -18,7 +18,7 @@ enum {
__I915_SAMPLE_FREQ_ACT = 0, __I915_SAMPLE_FREQ_ACT = 0,
__I915_SAMPLE_FREQ_REQ, __I915_SAMPLE_FREQ_REQ,
__I915_SAMPLE_RC6, __I915_SAMPLE_RC6,
__I915_SAMPLE_RC6_ESTIMATED, __I915_SAMPLE_RC6_LAST_REPORTED,
__I915_NUM_PMU_SAMPLERS __I915_NUM_PMU_SAMPLERS
}; };
......
...@@ -1104,8 +1104,14 @@ int i915_vma_move_to_active(struct i915_vma *vma, ...@@ -1104,8 +1104,14 @@ int i915_vma_move_to_active(struct i915_vma *vma,
return err; return err;
if (flags & EXEC_OBJECT_WRITE) { if (flags & EXEC_OBJECT_WRITE) {
if (intel_frontbuffer_invalidate(obj->frontbuffer, ORIGIN_CS)) struct intel_frontbuffer *front;
i915_active_add_request(&obj->frontbuffer->write, rq);
front = __intel_frontbuffer_get(obj);
if (unlikely(front)) {
if (intel_frontbuffer_invalidate(front, ORIGIN_CS))
i915_active_add_request(&front->write, rq);
intel_frontbuffer_put(front);
}
dma_resv_add_excl_fence(vma->resv, &rq->fence); dma_resv_add_excl_fence(vma->resv, &rq->fence);
obj->write_domain = I915_GEM_DOMAIN_RENDER; obj->write_domain = I915_GEM_DOMAIN_RENDER;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment