diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_context.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_gtt.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_shrinker.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_guc_submission.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_vma.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 14 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_engine_cs.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_lrc.c | 29 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 53 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.h | 34 |
12 files changed, 133 insertions, 52 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 026cb52ece0b..94b23fcbc989 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -4603,11 +4603,17 @@ static void __i915_gem_free_work(struct work_struct *work) | |||
| 4603 | * unbound now. | 4603 | * unbound now. |
| 4604 | */ | 4604 | */ |
| 4605 | 4605 | ||
| 4606 | spin_lock(&i915->mm.free_lock); | ||
| 4606 | while ((freed = llist_del_all(&i915->mm.free_list))) { | 4607 | while ((freed = llist_del_all(&i915->mm.free_list))) { |
| 4608 | spin_unlock(&i915->mm.free_lock); | ||
| 4609 | |||
| 4607 | __i915_gem_free_objects(i915, freed); | 4610 | __i915_gem_free_objects(i915, freed); |
| 4608 | if (need_resched()) | 4611 | if (need_resched()) |
| 4609 | break; | 4612 | return; |
| 4613 | |||
| 4614 | spin_lock(&i915->mm.free_lock); | ||
| 4610 | } | 4615 | } |
| 4616 | spin_unlock(&i915->mm.free_lock); | ||
| 4611 | } | 4617 | } |
| 4612 | 4618 | ||
| 4613 | static void __i915_gem_free_object_rcu(struct rcu_head *head) | 4619 | static void __i915_gem_free_object_rcu(struct rcu_head *head) |
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c index 5bf96a258509..e304dcbc6042 100644 --- a/drivers/gpu/drm/i915/i915_gem_context.c +++ b/drivers/gpu/drm/i915/i915_gem_context.c | |||
| @@ -106,14 +106,9 @@ static void lut_close(struct i915_gem_context *ctx) | |||
| 106 | 106 | ||
| 107 | radix_tree_for_each_slot(slot, &ctx->handles_vma, &iter, 0) { | 107 | radix_tree_for_each_slot(slot, &ctx->handles_vma, &iter, 0) { |
| 108 | struct i915_vma *vma = rcu_dereference_raw(*slot); | 108 | struct i915_vma *vma = rcu_dereference_raw(*slot); |
| 109 | struct drm_i915_gem_object *obj = vma->obj; | ||
| 110 | 109 | ||
| 111 | radix_tree_iter_delete(&ctx->handles_vma, &iter, slot); | 110 | radix_tree_iter_delete(&ctx->handles_vma, &iter, slot); |
| 112 | 111 | __i915_gem_object_release_unless_active(vma->obj); | |
| 113 | if (!i915_vma_is_ggtt(vma)) | ||
| 114 | i915_vma_close(vma); | ||
| 115 | |||
| 116 | __i915_gem_object_release_unless_active(obj); | ||
| 117 | } | 112 | } |
| 118 | } | 113 | } |
| 119 | 114 | ||
| @@ -198,6 +193,11 @@ static void context_close(struct i915_gem_context *ctx) | |||
| 198 | { | 193 | { |
| 199 | i915_gem_context_set_closed(ctx); | 194 | i915_gem_context_set_closed(ctx); |
| 200 | 195 | ||
| 196 | /* | ||
| 197 | * The LUT uses the VMA as a backpointer to unref the object, | ||
| 198 | * so we need to clear the LUT before we close all the VMA (inside | ||
| 199 | * the ppgtt). | ||
| 200 | */ | ||
| 201 | lut_close(ctx); | 201 | lut_close(ctx); |
| 202 | if (ctx->ppgtt) | 202 | if (ctx->ppgtt) |
| 203 | i915_ppgtt_close(&ctx->ppgtt->base); | 203 | i915_ppgtt_close(&ctx->ppgtt->base); |
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index 527a2d2d6281..5eaa6893daaa 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c | |||
| @@ -1341,7 +1341,7 @@ static int gen8_ppgtt_alloc_pd(struct i915_address_space *vm, | |||
| 1341 | if (IS_ERR(pt)) | 1341 | if (IS_ERR(pt)) |
| 1342 | goto unwind; | 1342 | goto unwind; |
| 1343 | 1343 | ||
| 1344 | if (count < GEN8_PTES) | 1344 | if (count < GEN8_PTES || intel_vgpu_active(vm->i915)) |
| 1345 | gen8_initialize_pt(vm, pt); | 1345 | gen8_initialize_pt(vm, pt); |
| 1346 | 1346 | ||
| 1347 | gen8_ppgtt_set_pde(vm, pd, pt, pde); | 1347 | gen8_ppgtt_set_pde(vm, pd, pt, pde); |
diff --git a/drivers/gpu/drm/i915/i915_gem_shrinker.c b/drivers/gpu/drm/i915/i915_gem_shrinker.c index eb31f8aa5c21..3770e3323fc8 100644 --- a/drivers/gpu/drm/i915/i915_gem_shrinker.c +++ b/drivers/gpu/drm/i915/i915_gem_shrinker.c | |||
| @@ -162,6 +162,18 @@ i915_gem_shrink(struct drm_i915_private *dev_priv, | |||
| 162 | if (!shrinker_lock(dev_priv, &unlock)) | 162 | if (!shrinker_lock(dev_priv, &unlock)) |
| 163 | return 0; | 163 | return 0; |
| 164 | 164 | ||
| 165 | /* | ||
| 166 | * When shrinking the active list, also consider active contexts. | ||
| 167 | * Active contexts are pinned until they are retired, and so can | ||
| 168 | * not be simply unbound to retire and unpin their pages. To shrink | ||
| 169 | * the contexts, we must wait until the gpu is idle. | ||
| 170 | * | ||
| 171 | * We don't care about errors here; if we cannot wait upon the GPU, | ||
| 172 | * we will free as much as we can and hope to get a second chance. | ||
| 173 | */ | ||
| 174 | if (flags & I915_SHRINK_ACTIVE) | ||
| 175 | i915_gem_wait_for_idle(dev_priv, I915_WAIT_LOCKED); | ||
| 176 | |||
| 165 | trace_i915_gem_shrink(dev_priv, target, flags); | 177 | trace_i915_gem_shrink(dev_priv, target, flags); |
| 166 | i915_gem_retire_requests(dev_priv); | 178 | i915_gem_retire_requests(dev_priv); |
| 167 | 179 | ||
diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c b/drivers/gpu/drm/i915/i915_guc_submission.c index a2e8114b739d..f84c267728fd 100644 --- a/drivers/gpu/drm/i915/i915_guc_submission.c +++ b/drivers/gpu/drm/i915/i915_guc_submission.c | |||
| @@ -610,6 +610,7 @@ done: | |||
| 610 | execlists->first = rb; | 610 | execlists->first = rb; |
| 611 | if (submit) { | 611 | if (submit) { |
| 612 | port_assign(port, last); | 612 | port_assign(port, last); |
| 613 | execlists_set_active(execlists, EXECLISTS_ACTIVE_USER); | ||
| 613 | i915_guc_submit(engine); | 614 | i915_guc_submit(engine); |
| 614 | } | 615 | } |
| 615 | spin_unlock_irq(&engine->timeline->lock); | 616 | spin_unlock_irq(&engine->timeline->lock); |
| @@ -633,6 +634,8 @@ static void i915_guc_irq_handler(unsigned long data) | |||
| 633 | 634 | ||
| 634 | rq = port_request(&port[0]); | 635 | rq = port_request(&port[0]); |
| 635 | } | 636 | } |
| 637 | if (!rq) | ||
| 638 | execlists_clear_active(execlists, EXECLISTS_ACTIVE_USER); | ||
| 636 | 639 | ||
| 637 | if (!port_isset(last_port)) | 640 | if (!port_isset(last_port)) |
| 638 | i915_guc_dequeue(engine); | 641 | i915_guc_dequeue(engine); |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index b1296a55c1e4..f8205841868b 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -1388,8 +1388,10 @@ gen8_cs_irq_handler(struct intel_engine_cs *engine, u32 iir, int test_shift) | |||
| 1388 | bool tasklet = false; | 1388 | bool tasklet = false; |
| 1389 | 1389 | ||
| 1390 | if (iir & (GT_CONTEXT_SWITCH_INTERRUPT << test_shift)) { | 1390 | if (iir & (GT_CONTEXT_SWITCH_INTERRUPT << test_shift)) { |
| 1391 | __set_bit(ENGINE_IRQ_EXECLIST, &engine->irq_posted); | 1391 | if (READ_ONCE(engine->execlists.active)) { |
| 1392 | tasklet = true; | 1392 | __set_bit(ENGINE_IRQ_EXECLIST, &engine->irq_posted); |
| 1393 | tasklet = true; | ||
| 1394 | } | ||
| 1393 | } | 1395 | } |
| 1394 | 1396 | ||
| 1395 | if (iir & (GT_RENDER_USER_INTERRUPT << test_shift)) { | 1397 | if (iir & (GT_RENDER_USER_INTERRUPT << test_shift)) { |
diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c index fc77e8191eb5..fbfab2f33023 100644 --- a/drivers/gpu/drm/i915/i915_vma.c +++ b/drivers/gpu/drm/i915/i915_vma.c | |||
| @@ -54,6 +54,13 @@ i915_vma_retire(struct i915_gem_active *active, | |||
| 54 | if (--obj->active_count) | 54 | if (--obj->active_count) |
| 55 | return; | 55 | return; |
| 56 | 56 | ||
| 57 | /* Prune the shared fence arrays iff completely idle (inc. external) */ | ||
| 58 | if (reservation_object_trylock(obj->resv)) { | ||
| 59 | if (reservation_object_test_signaled_rcu(obj->resv, true)) | ||
| 60 | reservation_object_add_excl_fence(obj->resv, NULL); | ||
| 61 | reservation_object_unlock(obj->resv); | ||
| 62 | } | ||
| 63 | |||
| 57 | /* Bump our place on the bound list to keep it roughly in LRU order | 64 | /* Bump our place on the bound list to keep it roughly in LRU order |
| 58 | * so that we don't steal from recently used but inactive objects | 65 | * so that we don't steal from recently used but inactive objects |
| 59 | * (unless we are forced to ofc!) | 66 | * (unless we are forced to ofc!) |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index e2ac976844d8..f4a9a182868f 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -3676,6 +3676,7 @@ void intel_finish_reset(struct drm_i915_private *dev_priv) | |||
| 3676 | 3676 | ||
| 3677 | intel_pps_unlock_regs_wa(dev_priv); | 3677 | intel_pps_unlock_regs_wa(dev_priv); |
| 3678 | intel_modeset_init_hw(dev); | 3678 | intel_modeset_init_hw(dev); |
| 3679 | intel_init_clock_gating(dev_priv); | ||
| 3679 | 3680 | ||
| 3680 | spin_lock_irq(&dev_priv->irq_lock); | 3681 | spin_lock_irq(&dev_priv->irq_lock); |
| 3681 | if (dev_priv->display.hpd_irq_setup) | 3682 | if (dev_priv->display.hpd_irq_setup) |
| @@ -14350,8 +14351,6 @@ void intel_modeset_init_hw(struct drm_device *dev) | |||
| 14350 | 14351 | ||
| 14351 | intel_update_cdclk(dev_priv); | 14352 | intel_update_cdclk(dev_priv); |
| 14352 | dev_priv->cdclk.logical = dev_priv->cdclk.actual = dev_priv->cdclk.hw; | 14353 | dev_priv->cdclk.logical = dev_priv->cdclk.actual = dev_priv->cdclk.hw; |
| 14353 | |||
| 14354 | intel_init_clock_gating(dev_priv); | ||
| 14355 | } | 14354 | } |
| 14356 | 14355 | ||
| 14357 | /* | 14356 | /* |
| @@ -15063,6 +15062,15 @@ intel_modeset_setup_hw_state(struct drm_device *dev, | |||
| 15063 | struct intel_encoder *encoder; | 15062 | struct intel_encoder *encoder; |
