Some steps in gen6_alloc_va_range require the HW to be awake, so ideally
we should be grabbing the wakeref ourselves and not relying on the
caller already holding it for us.

Suggested-by: Chris Wilson <ch...@chris-wilson.co.uk>
Signed-off-by: Matthew Auld <matthew.a...@intel.com>
Reviewed-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_gem_gtt.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c 
b/drivers/gpu/drm/i915/i915_gem_gtt.c
index 7496cce0d798..9f7b136219dc 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -1746,10 +1746,13 @@ static int gen6_alloc_va_range(struct 
i915_address_space *vm,
 {
        struct gen6_hw_ppgtt *ppgtt = to_gen6_ppgtt(i915_vm_to_ppgtt(vm));
        struct i915_page_table *pt;
+       intel_wakeref_t wakeref;
        u64 from = start;
        unsigned int pde;
        bool flush = false;
 
+       wakeref = intel_runtime_pm_get(vm->i915);
+
        gen6_for_each_pde(pt, &ppgtt->base.pd, start, length, pde) {
                const unsigned int count = gen6_pte_count(start, length);
 
@@ -1775,12 +1778,15 @@ static int gen6_alloc_va_range(struct 
i915_address_space *vm,
 
        if (flush) {
                mark_tlbs_dirty(&ppgtt->base);
-               gen6_ggtt_invalidate(ppgtt->base.vm.i915);
+               gen6_ggtt_invalidate(vm->i915);
        }
 
+       intel_runtime_pm_put(vm->i915, wakeref);
+
        return 0;
 
 unwind_out:
+       intel_runtime_pm_put(vm->i915, wakeref);
        gen6_ppgtt_clear_range(vm, from, start - from);
        return -ENOMEM;
 }
-- 
2.20.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to