aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2019-01-14 09:21:10 -0500
committerChris Wilson <chris@chris-wilson.co.uk>2019-01-14 11:17:53 -0500
commit16e4dd0342a804090fd0958bb271d3a6b57056ac (patch)
tree6bb32435cc05f13a890e04f6cc6c057c1aa7b3d8 /drivers/gpu/drm
parentbd780f37a3617d3dda74b97013ae8aa9b07a1d91 (diff)
drm/i915: Markup paired operations on wakerefs
The majority of runtime-pm operations are bounded and scoped within a function; these are easy to verify that the wakeref are handled correctly. We can employ the compiler to help us, and reduce the number of wakerefs tracked when debugging, by passing around cookies provided by the various rpm_get functions to their rpm_put counterpart. This makes the pairing explicit, and given the required wakeref cookie the compiler can verify that we pass an initialised value to the rpm_put (quite handy for double checking error paths). For regular builds, the compiler should be able to eliminate the unused local variables and the program growth should be minimal. Fwiw, it came out as a net improvement as gcc was able to refactor rpm_get and rpm_get_if_in_use together, v2: Just s/rpm_put/rpm_put_unchecked/ everywhere, leaving the manual mark up for smaller more targeted patches. v3: Mention the cookie in Returns Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Jani Nikula <jani.nikula@intel.com> Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com> Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190114142129.24398-2-chris@chris-wilson.co.uk
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/i915/gvt/aperture_gm.c8
-rw-r--r--drivers/gpu/drm/i915/gvt/gvt.h2
-rw-r--r--drivers/gpu/drm/i915/gvt/sched_policy.c2
-rw-r--r--drivers/gpu/drm/i915/gvt/scheduler.c4
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c54
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h2
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c20
-rw-r--r--drivers/gpu/drm/i915/i915_gem_execbuffer.c2
-rw-r--r--drivers/gpu/drm/i915/i915_gem_fence_reg.c2
-rw-r--r--drivers/gpu/drm/i915/i915_gem_gtt.c8
-rw-r--r--drivers/gpu/drm/i915/i915_gem_shrinker.c10
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c2
-rw-r--r--drivers/gpu/drm/i915/i915_perf.c4
-rw-r--r--drivers/gpu/drm/i915/i915_pmu.c6
-rw-r--r--drivers/gpu/drm/i915/i915_sysfs.c12
-rw-r--r--drivers/gpu/drm/i915/intel_display.c2
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h15
-rw-r--r--drivers/gpu/drm/i915/intel_engine_cs.c4
-rw-r--r--drivers/gpu/drm/i915/intel_fbdev.c4
-rw-r--r--drivers/gpu/drm/i915/intel_guc_log.c6
-rw-r--r--drivers/gpu/drm/i915/intel_hotplug.c2
-rw-r--r--drivers/gpu/drm/i915/intel_huc.c2
-rw-r--r--drivers/gpu/drm/i915/intel_panel.c2
-rw-r--r--drivers/gpu/drm/i915/intel_runtime_pm.c97
-rw-r--r--drivers/gpu/drm/i915/intel_uncore.c2
-rw-r--r--drivers/gpu/drm/i915/selftests/huge_pages.c2
-rw-r--r--drivers/gpu/drm/i915/selftests/i915_gem.c10
-rw-r--r--drivers/gpu/drm/i915/selftests/i915_gem_coherency.c2
-rw-r--r--drivers/gpu/drm/i915/selftests/i915_gem_context.c10
-rw-r--r--drivers/gpu/drm/i915/selftests/i915_gem_evict.c2
-rw-r--r--drivers/gpu/drm/i915/selftests/i915_gem_gtt.c4
-rw-r--r--drivers/gpu/drm/i915/selftests/i915_gem_object.c6
-rw-r--r--drivers/gpu/drm/i915/selftests/i915_request.c8
-rw-r--r--drivers/gpu/drm/i915/selftests/intel_guc.c4
-rw-r--r--drivers/gpu/drm/i915/selftests/intel_hangcheck.c6
-rw-r--r--drivers/gpu/drm/i915/selftests/intel_lrc.c10
-rw-r--r--drivers/gpu/drm/i915/selftests/intel_workarounds.c10
37 files changed, 209 insertions, 139 deletions
diff --git a/drivers/gpu/drm/i915/gvt/aperture_gm.c b/drivers/gpu/drm/i915/gvt/aperture_gm.c
index 359d37d5c958..1fa2f65c3cd1 100644
--- a/drivers/gpu/drm/i915/gvt/aperture_gm.c
+++ b/drivers/gpu/drm/i915/gvt/aperture_gm.c
@@ -180,7 +180,7 @@ static void free_vgpu_fence(struct intel_vgpu *vgpu)
180 } 180 }
181 mutex_unlock(&dev_priv->drm.struct_mutex); 181 mutex_unlock(&dev_priv->drm.struct_mutex);
182 182
183 intel_runtime_pm_put(dev_priv); 183 intel_runtime_pm_put_unchecked(dev_priv);
184} 184}
185 185
186static int alloc_vgpu_fence(struct intel_vgpu *vgpu) 186static int alloc_vgpu_fence(struct intel_vgpu *vgpu)
@@ -206,7 +206,7 @@ static int alloc_vgpu_fence(struct intel_vgpu *vgpu)
206 _clear_vgpu_fence(vgpu); 206 _clear_vgpu_fence(vgpu);
207 207
208 mutex_unlock(&dev_priv->drm.struct_mutex); 208 mutex_unlock(&dev_priv->drm.struct_mutex);
209 intel_runtime_pm_put(dev_priv); 209 intel_runtime_pm_put_unchecked(dev_priv);
210 return 0; 210 return 0;
211out_free_fence: 211out_free_fence:
212 gvt_vgpu_err("Failed to alloc fences\n"); 212 gvt_vgpu_err("Failed to alloc fences\n");
@@ -219,7 +219,7 @@ out_free_fence:
219 vgpu->fence.regs[i] = NULL; 219 vgpu->fence.regs[i] = NULL;
220 } 220 }
221 mutex_unlock(&dev_priv->drm.struct_mutex); 221 mutex_unlock(&dev_priv->drm.struct_mutex);
222 intel_runtime_pm_put(dev_priv); 222 intel_runtime_pm_put_unchecked(dev_priv);
223 return -ENOSPC; 223 return -ENOSPC;
224} 224}
225 225
@@ -317,7 +317,7 @@ void intel_vgpu_reset_resource(struct intel_vgpu *vgpu)
317 317
318 intel_runtime_pm_get(dev_priv); 318 intel_runtime_pm_get(dev_priv);
319 _clear_vgpu_fence(vgpu); 319 _clear_vgpu_fence(vgpu);
320 intel_runtime_pm_put(dev_priv); 320 intel_runtime_pm_put_unchecked(dev_priv);
321} 321}
322 322
323/** 323/**
diff --git a/drivers/gpu/drm/i915/gvt/gvt.h b/drivers/gpu/drm/i915/gvt/gvt.h
index b4ab1dad0143..435c746c3f73 100644
--- a/drivers/gpu/drm/i915/gvt/gvt.h
+++ b/drivers/gpu/drm/i915/gvt/gvt.h
@@ -597,7 +597,7 @@ static inline void mmio_hw_access_pre(struct drm_i915_private *dev_priv)
597 597
598static inline void mmio_hw_access_post(struct drm_i915_private *dev_priv) 598static inline void mmio_hw_access_post(struct drm_i915_private *dev_priv)
599{ 599{
600 intel_runtime_pm_put(dev_priv); 600 intel_runtime_pm_put_unchecked(dev_priv);
601} 601}
602 602
603/** 603/**
diff --git a/drivers/gpu/drm/i915/gvt/sched_policy.c b/drivers/gpu/drm/i915/gvt/sched_policy.c
index c32e7d5e8629..f04b3b965bfc 100644
--- a/drivers/gpu/drm/i915/gvt/sched_policy.c
+++ b/drivers/gpu/drm/i915/gvt/sched_policy.c
@@ -474,6 +474,6 @@ void intel_vgpu_stop_schedule(struct intel_vgpu *vgpu)
474 } 474 }
475 } 475 }
476 spin_unlock_bh(&scheduler->mmio_context_lock); 476 spin_unlock_bh(&scheduler->mmio_context_lock);
477 intel_runtime_pm_put(dev_priv); 477 intel_runtime_pm_put_unchecked(dev_priv);
478 mutex_unlock(&vgpu->gvt->sched_lock); 478 mutex_unlock(&vgpu->gvt->sched_lock);
479} 479}
diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c b/drivers/gpu/drm/i915/gvt/scheduler.c
index 1ad8c5e1455d..3816dcae2185 100644
--- a/drivers/gpu/drm/i915/gvt/scheduler.c
+++ b/drivers/gpu/drm/i915/gvt/scheduler.c
@@ -997,7 +997,7 @@ complete:
997 intel_uncore_forcewake_put(gvt->dev_priv, 997 intel_uncore_forcewake_put(gvt->dev_priv,
998 FORCEWAKE_ALL); 998 FORCEWAKE_ALL);
999 999
1000 intel_runtime_pm_put(gvt->dev_priv); 1000 intel_runtime_pm_put_unchecked(gvt->dev_priv);
1001 if (ret && (vgpu_is_vm_unhealthy(ret))) 1001 if (ret && (vgpu_is_vm_unhealthy(ret)))
1002 enter_failsafe_mode(vgpu, GVT_FAILSAFE_GUEST_ERR); 1002 enter_failsafe_mode(vgpu, GVT_FAILSAFE_GUEST_ERR);
1003 } 1003 }
@@ -1451,7 +1451,7 @@ intel_vgpu_create_workload(struct intel_vgpu *vgpu, int ring_id,
1451 mutex_lock(&dev_priv->drm.struct_mutex); 1451 mutex_lock(&dev_priv->drm.struct_mutex);
1452 ret = intel_gvt_scan_and_shadow_workload(workload); 1452 ret = intel_gvt_scan_and_shadow_workload(workload);
1453 mutex_unlock(&dev_priv->drm.struct_mutex); 1453 mutex_unlock(&dev_priv->drm.struct_mutex);
1454 intel_runtime_pm_put(dev_priv); 1454 intel_runtime_pm_put_unchecked(dev_priv);
1455 } 1455 }
1456 1456
1457 if (ret && (vgpu_is_vm_unhealthy(ret))) { 1457 if (ret && (vgpu_is_vm_unhealthy(ret))) {
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 050cf8abd426..6818079669a7 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -877,7 +877,7 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
877 } 877 }
878 } 878 }
879 879
880 intel_runtime_pm_put(dev_priv); 880 intel_runtime_pm_put_unchecked(dev_priv);
881 881
882 return 0; 882 return 0;
883} 883}
@@ -953,7 +953,7 @@ static int i915_gpu_info_open(struct inode *inode, struct file *file)
953 953
954 intel_runtime_pm_get(i915); 954 intel_runtime_pm_get(i915);
955 gpu = i915_capture_gpu_state(i915); 955 gpu = i915_capture_gpu_state(i915);
956 intel_runtime_pm_put(i915); 956 intel_runtime_pm_put_unchecked(i915);
957 if (IS_ERR(gpu)) 957 if (IS_ERR(gpu))
958 return PTR_ERR(gpu); 958 return PTR_ERR(gpu);
959 959
@@ -1226,7 +1226,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
1226 seq_printf(m, "Max CD clock frequency: %d kHz\n", dev_priv->max_cdclk_freq); 1226 seq_printf(m, "Max CD clock frequency: %d kHz\n", dev_priv->max_cdclk_freq);
1227 seq_printf(m, "Max pixel clock frequency: %d kHz\n", dev_priv->max_dotclk_freq); 1227 seq_printf(m, "Max pixel clock frequency: %d kHz\n", dev_priv->max_dotclk_freq);
1228 1228
1229 intel_runtime_pm_put(dev_priv); 1229 intel_runtime_pm_put_unchecked(dev_priv);
1230 return ret; 1230 return ret;
1231} 1231}
1232 1232
@@ -1292,7 +1292,7 @@ static int i915_hangcheck_info(struct seq_file *m, void *unused)
1292 1292
1293 intel_engine_get_instdone(dev_priv->engine[RCS], &instdone); 1293 intel_engine_get_instdone(dev_priv->engine[RCS], &instdone);
1294 1294
1295 intel_runtime_pm_put(dev_priv); 1295 intel_runtime_pm_put_unchecked(dev_priv);
1296 1296
1297 if (timer_pending(&dev_priv->gpu_error.hangcheck_work.timer)) 1297 if (timer_pending(&dev_priv->gpu_error.hangcheck_work.timer))
1298 seq_printf(m, "Hangcheck active, timer fires in %dms\n", 1298 seq_printf(m, "Hangcheck active, timer fires in %dms\n",
@@ -1579,7 +1579,7 @@ static int i915_drpc_info(struct seq_file *m, void *unused)
1579 else 1579 else
1580 err = ironlake_drpc_info(m); 1580 err = ironlake_drpc_info(m);
1581 1581
1582 intel_runtime_pm_put(dev_priv); 1582 intel_runtime_pm_put_unchecked(dev_priv);
1583 1583
1584 return err; 1584 return err;
1585} 1585}
@@ -1632,7 +1632,7 @@ static int i915_fbc_status(struct seq_file *m, void *unused)
1632 } 1632 }
1633 1633
1634 mutex_unlock(&fbc->lock); 1634 mutex_unlock(&fbc->lock);
1635 intel_runtime_pm_put(dev_priv); 1635 intel_runtime_pm_put_unchecked(dev_priv);
1636 1636
1637 return 0; 1637 return 0;
1638} 1638}
@@ -1695,7 +1695,7 @@ static int i915_ips_status(struct seq_file *m, void *unused)
1695 seq_puts(m, "Currently: disabled\n"); 1695 seq_puts(m, "Currently: disabled\n");
1696 } 1696 }
1697 1697
1698 intel_runtime_pm_put(dev_priv); 1698 intel_runtime_pm_put_unchecked(dev_priv);
1699 1699
1700 return 0; 1700 return 0;
1701} 1701}
@@ -1723,7 +1723,7 @@ static int i915_sr_status(struct seq_file *m, void *unused)
1723 sr_enabled = I915_READ(FW_BLC_SELF_VLV) & FW_CSPWRDWNEN; 1723 sr_enabled = I915_READ(FW_BLC_SELF_VLV) & FW_CSPWRDWNEN;
1724 1724
1725 intel_display_power_put(dev_priv, POWER_DOMAIN_INIT); 1725 intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
1726 intel_runtime_pm_put(dev_priv); 1726 intel_runtime_pm_put_unchecked(dev_priv);
1727 1727
1728 seq_printf(m, "self-refresh: %s\n", enableddisabled(sr_enabled)); 1728 seq_printf(m, "self-refresh: %s\n", enableddisabled(sr_enabled));
1729 1729
@@ -1756,7 +1756,7 @@ static int i915_emon_status(struct seq_file *m, void *unused)
1756 seq_printf(m, "GFX power: %ld\n", gfx); 1756 seq_printf(m, "GFX power: %ld\n", gfx);
1757 seq_printf(m, "Total power: %ld\n", chipset + gfx); 1757 seq_printf(m, "Total power: %ld\n", chipset + gfx);
1758 1758
1759 intel_runtime_pm_put(dev_priv); 1759 intel_runtime_pm_put_unchecked(dev_priv);
1760 1760
1761 return 0; 1761 return 0;
1762} 1762}
@@ -1805,7 +1805,7 @@ static int i915_ring_freq_table(struct seq_file *m, void *unused)
1805 mutex_unlock(&dev_priv->pcu_lock); 1805 mutex_unlock(&dev_priv->pcu_lock);
1806 1806
1807out: 1807out:
1808 intel_runtime_pm_put(dev_priv); 1808 intel_runtime_pm_put_unchecked(dev_priv);
1809 return ret; 1809 return ret;
1810} 1810}
1811 1811
@@ -2017,7 +2017,7 @@ static int i915_swizzle_info(struct seq_file *m, void *data)
2017 if (dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES) 2017 if (dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES)
2018 seq_puts(m, "L-shaped memory detected\n"); 2018 seq_puts(m, "L-shaped memory detected\n");
2019 2019
2020 intel_runtime_pm_put(dev_priv); 2020 intel_runtime_pm_put_unchecked(dev_priv);
2021 2021
2022 return 0; 2022 return 0;
2023} 2023}
@@ -2067,7 +2067,7 @@ static int i915_rps_boost_info(struct seq_file *m, void *data)
2067 act_freq = intel_get_cagf(dev_priv, 2067 act_freq = intel_get_cagf(dev_priv,
2068 I915_READ(GEN6_RPSTAT1)); 2068 I915_READ(GEN6_RPSTAT1));
2069 } 2069 }
2070 intel_runtime_pm_put(dev_priv); 2070 intel_runtime_pm_put_unchecked(dev_priv);
2071 } 2071 }
2072 2072
2073 seq_printf(m, "RPS enabled? %d\n", rps->enabled); 2073 seq_printf(m, "RPS enabled? %d\n", rps->enabled);
@@ -2160,7 +2160,7 @@ static int i915_huc_load_status_info(struct seq_file *m, void *data)
2160 2160
2161 intel_runtime_pm_get(dev_priv); 2161 intel_runtime_pm_get(dev_priv);
2162 seq_printf(m, "\nHuC status 0x%08x:\n", I915_READ(HUC_STATUS2)); 2162 seq_printf(m, "\nHuC status 0x%08x:\n", I915_READ(HUC_STATUS2));
2163 intel_runtime_pm_put(dev_priv); 2163 intel_runtime_pm_put_unchecked(dev_priv);
2164 2164
2165 return 0; 2165 return 0;
2166} 2166}
@@ -2192,7 +2192,7 @@ static int i915_guc_load_status_info(struct seq_file *m, void *data)
2192 for (i = 0; i < 16; i++) 2192 for (i = 0; i < 16; i++)
2193 seq_printf(m, "\t%2d: \t0x%x\n", i, I915_READ(SOFT_SCRATCH(i))); 2193 seq_printf(m, "\t%2d: \t0x%x\n", i, I915_READ(SOFT_SCRATCH(i)));
2194 2194
2195 intel_runtime_pm_put(dev_priv); 2195 intel_runtime_pm_put_unchecked(dev_priv);
2196 2196
2197 return 0; 2197 return 0;
2198} 2198}
@@ -2601,7 +2601,7 @@ static int i915_edp_psr_status(struct seq_file *m, void *data)
2601 dev_priv->psr.last_exit); 2601 dev_priv->psr.last_exit);
2602 } 2602 }
2603 2603
2604 intel_runtime_pm_put(dev_priv); 2604 intel_runtime_pm_put_unchecked(dev_priv);
2605 return 0; 2605 return 0;
2606} 2606}
2607 2607
@@ -2632,7 +2632,7 @@ retry:
2632 drm_modeset_drop_locks(&ctx); 2632 drm_modeset_drop_locks(&ctx);
2633 drm_modeset_acquire_fini(&ctx); 2633 drm_modeset_acquire_fini(&ctx);
2634 2634
2635 intel_runtime_pm_put(dev_priv); 2635 intel_runtime_pm_put_unchecked(dev_priv);
2636 2636
2637 return ret; 2637 return ret;
2638} 2638}
@@ -2665,7 +2665,7 @@ static int i915_energy_uJ(struct seq_file *m, void *data)
2665 intel_runtime_pm_get(dev_priv); 2665 intel_runtime_pm_get(dev_priv);
2666 2666
2667 if (rdmsrl_safe(MSR_RAPL_POWER_UNIT, &power)) { 2667 if (rdmsrl_safe(MSR_RAPL_POWER_UNIT, &power)) {
2668 intel_runtime_pm_put(dev_priv); 2668 intel_runtime_pm_put_unchecked(dev_priv);
2669 return -ENODEV; 2669 return -ENODEV;
2670 } 2670 }
2671 2671
@@ -2673,7 +2673,7 @@ static int i915_energy_uJ(struct seq_file *m, void *data)
2673 power = I915_READ(MCH_SECP_NRG_STTS); 2673 power = I915_READ(MCH_SECP_NRG_STTS);
2674 power = (1000000 * power) >> units; /* convert to uJ */ 2674 power = (1000000 * power) >> units; /* convert to uJ */
2675 2675
2676 intel_runtime_pm_put(dev_priv); 2676 intel_runtime_pm_put_unchecked(dev_priv);
2677 2677
2678 seq_printf(m, "%llu", power); 2678 seq_printf(m, "%llu", power);
2679 2679
@@ -2775,7 +2775,7 @@ out:
2775 seq_printf(m, "ssp base: 0x%08x\n", I915_READ(CSR_SSP_BASE)); 2775 seq_printf(m, "ssp base: 0x%08x\n", I915_READ(CSR_SSP_BASE));
2776 seq_printf(m, "htp: 0x%08x\n", I915_READ(CSR_HTP_SKL)); 2776 seq_printf(m, "htp: 0x%08x\n", I915_READ(CSR_HTP_SKL));
2777 2777
2778 intel_runtime_pm_put(dev_priv); 2778 intel_runtime_pm_put_unchecked(dev_priv);
2779 2779
2780 return 0; 2780 return 0;
2781} 2781}
@@ -3114,7 +3114,7 @@ static int i915_display_info(struct seq_file *m, void *unused)
3114 drm_connector_list_iter_end(&conn_iter); 3114 drm_connector_list_iter_end(&conn_iter);
3115 mutex_unlock(&dev->mode_config.mutex); 3115 mutex_unlock(&dev->mode_config.mutex);
3116 3116
3117 intel_runtime_pm_put(dev_priv); 3117 intel_runtime_pm_put_unchecked(dev_priv);
3118 3118
3119 return 0; 3119 return 0;
3120} 3120}
@@ -3139,7 +3139,7 @@ static int i915_engine_info(struct seq_file *m, void *unused)
3139 for_each_engine(engine, dev_priv, id) 3139 for_each_engine(engine, dev_priv, id)
3140 intel_engine_dump(engine, &p, "%s\n", engine->name); 3140 intel_engine_dump(engine, &p, "%s\n", engine->name);
3141 3141
3142 intel_runtime_pm_put(dev_priv); 3142 intel_runtime_pm_put_unchecked(dev_priv);
3143 3143
3144 return 0; 3144 return 0;
3145} 3145}
@@ -3265,7 +3265,7 @@ static ssize_t i915_ipc_status_write(struct file *file, const char __user *ubuf,
3265 dev_priv->wm.distrust_bios_wm = true; 3265 dev_priv->wm.distrust_bios_wm = true;
3266 dev_priv->ipc_enabled = enable; 3266 dev_priv->ipc_enabled = enable;
3267 intel_enable_ipc(dev_priv); 3267 intel_enable_ipc(dev_priv);
3268 intel_runtime_pm_put(dev_priv); 3268 intel_runtime_pm_put_unchecked(dev_priv);
3269 3269
3270 return len; 3270 return len;
3271} 3271}
@@ -4090,7 +4090,7 @@ i915_drop_caches_set(void *data, u64 val)
4090 i915_gem_drain_freed_objects(i915); 4090 i915_gem_drain_freed_objects(i915);
4091 4091
4092out: 4092out:
4093 intel_runtime_pm_put(i915); 4093 intel_runtime_pm_put_unchecked(i915);
4094 4094
4095 return ret; 4095 return ret;
4096} 4096}
@@ -4112,7 +4112,7 @@ i915_cache_sharing_get(void *data, u64 *val)
4112 4112
4113 snpcr = I915_READ(GEN6_MBCUNIT_SNPCR); 4113 snpcr = I915_READ(GEN6_MBCUNIT_SNPCR);
4114 4114
4115 intel_runtime_pm_put(dev_priv); 4115 intel_runtime_pm_put_unchecked(dev_priv);
4116 4116
4117 *val = (snpcr & GEN6_MBC_SNPCR_MASK) >> GEN6_MBC_SNPCR_SHIFT; 4117 *val = (snpcr & GEN6_MBC_SNPCR_MASK) >> GEN6_MBC_SNPCR_SHIFT;
4118 4118
@@ -4140,7 +4140,7 @@ i915_cache_sharing_set(void *data, u64 val)
4140 snpcr |= (val << GEN6_MBC_SNPCR_SHIFT); 4140 snpcr |= (val << GEN6_MBC_SNPCR_SHIFT);
4141 I915_WRITE(GEN6_MBCUNIT_SNPCR, snpcr); 4141 I915_WRITE(GEN6_MBCUNIT_SNPCR, snpcr);
4142 4142
4143 intel_runtime_pm_put(dev_priv); 4143 intel_runtime_pm_put_unchecked(dev_priv);
4144 return 0; 4144 return 0;
4145} 4145}
4146 4146
@@ -4388,7 +4388,7 @@ static int i915_sseu_status(struct seq_file *m, void *unused)
4388 gen10_sseu_device_status(dev_priv, &sseu); 4388 gen10_sseu_device_status(dev_priv, &sseu);
4389 } 4389 }
4390 4390
4391 intel_runtime_pm_put(dev_priv); 4391 intel_runtime_pm_put_unchecked(dev_priv);
4392 4392
4393 i915_print_sseu_info(m, false, &sseu); 4393 i915_print_sseu_info(m, false, &sseu);
4394 4394
@@ -4416,7 +4416,7 @@ static int i915_forcewake_release(struct inode *inode, struct file *file)
4416 return 0; 4416 return 0;
4417 4417
4418 intel_uncore_forcewake_user_put(i915); 4418 intel_uncore_forcewake_user_put(i915);
4419 intel_runtime_pm_put(i915); 4419 intel_runtime_pm_put_unchecked(i915);
4420 4420
4421 return 0; 4421 return 0;
4422} 4422}
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 7e3566a0ba72..e9c909c43759 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -131,6 +131,8 @@ bool i915_error_injected(void);
131 __i915_printk(i915, i915_error_injected() ? KERN_DEBUG : KERN_ERR, \ 131 __i915_printk(i915, i915_error_injected() ? KERN_DEBUG : KERN_ERR, \
132 fmt, ##__VA_ARGS__) 132 fmt, ##__VA_ARGS__)
133 133
134typedef depot_stack_handle_t intel_wakeref_t;
135
134enum hpd_pin { 136enum hpd_pin {
135 HPD_NONE = 0, 137 HPD_NONE = 0,
136 HPD_TV = HPD_NONE, /* TV is known to be unreliable */ 138 HPD_TV = HPD_NONE, /* TV is known to be unreliable */
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 74710e5d946e..640e6361dda3 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -175,7 +175,7 @@ static u32 __i915_gem_park(struct drm_i915_private *i915)
175 175
176 intel_display_power_put(i915, POWER_DOMAIN_GT_IRQ); 176 intel_display_power_put(i915, POWER_DOMAIN_GT_IRQ);
177 177
178 intel_runtime_pm_put(i915); 178 intel_runtime_pm_put_unchecked(i915);
179 179
180 return i915->gt.epoch; 180 return i915->gt.epoch;
181} 181}
@@ -814,7 +814,7 @@ void i915_gem_flush_ggtt_writes(struct drm_i915_private *dev_priv)
814 POSTING_READ_FW(RING_HEAD(RENDER_RING_BASE)); 814 POSTING_READ_FW(RING_HEAD(RENDER_RING_BASE));
815 815
816 spin_unlock_irq(&dev_priv->uncore.lock); 816 spin_unlock_irq(&dev_priv->uncore.lock);
817 intel_runtime_pm_put(dev_priv); 817 intel_runtime_pm_put_unchecked(dev_priv);
818} 818}
819 819
820static void 820static void
@@ -1149,7 +1149,7 @@ out_unpin:
1149 i915_vma_unpin(vma); 1149 i915_vma_unpin(vma);
1150 } 1150 }
1151out_unlock: 1151out_unlock:
1152 intel_runtime_pm_put(i915); 1152 intel_runtime_pm_put_unchecked(i915);
1153 mutex_unlock(&i915->drm.struct_mutex); 1153 mutex_unlock(&i915->drm.struct_mutex);
1154 1154
1155 return ret; 1155 return ret;
@@ -1356,7 +1356,7 @@ out_unpin:
1356 i915_vma_unpin(vma); 1356 i915_vma_unpin(vma);
1357 } 1357 }
1358out_rpm: 1358out_rpm:
1359 intel_runtime_pm_put(i915); 1359 intel_runtime_pm_put_unchecked(i915);
1360out_unlock: 1360out_unlock:
1361 mutex_unlock(&i915->drm.struct_mutex); 1361 mutex_unlock(&i915->drm.struct_mutex);
1362 return ret; 1362 return ret;
@@ -1968,7 +1968,7 @@ err_unpin:
1968err_unlock: 1968err_unlock:
1969 mutex_unlock(&dev->struct_mutex); 1969 mutex_unlock(&dev->struct_mutex);
1970err_rpm: 1970err_rpm:
1971 intel_runtime_pm_put(dev_priv); 1971 intel_runtime_pm_put_unchecked(dev_priv);
1972 i915_gem_object_unpin_pages(obj); 1972 i915_gem_object_unpin_pages(obj);
1973err: 1973err:
1974 switch (ret) { 1974 switch (ret) {
@@ -2068,7 +2068,7 @@ i915_gem_release_mmap(struct drm_i915_gem_object *obj)
2068 wmb(); 2068 wmb();
2069 2069
2070out: 2070out:
2071 intel_runtime_pm_put(i915); 2071 intel_runtime_pm_put_unchecked(i915);
2072} 2072}
2073 2073
2074void i915_gem_runtime_suspend(struct drm_i915_private *dev_priv) 2074void i915_gem_runtime_suspend(struct drm_i915_private *dev_priv)
@@ -4765,7 +4765,7 @@ static void __i915_gem_free_objects(struct drm_i915_private *i915,
4765 if (on) 4765 if (on)
4766 cond_resched(); 4766 cond_resched();
4767 } 4767 }
4768 intel_runtime_pm_put(i915); 4768 intel_runtime_pm_put_unchecked(i915);
4769} 4769}
4770 4770
4771static void i915_gem_flush_free_objects(struct drm_i915_private *i915) 4771static void i915_gem_flush_free_objects(struct drm_i915_private *i915)
@@ -4901,7 +4901,7 @@ void i915_gem_sanitize(struct drm_i915_private *i915)
4901 intel_engines_sanitize(i915, false); 4901 intel_engines_sanitize(i915, false);
4902 4902
4903 intel_uncore_forcewake_put(i915, FORCEWAKE_ALL); 4903 intel_uncore_forcewake_put(i915, FORCEWAKE_ALL);
4904 intel_runtime_pm_put(i915); 4904 intel_runtime_pm_put_unchecked(i915);
4905 4905
4906 i915_gem_contexts_lost(i915); 4906 i915_gem_contexts_lost(i915);
4907 mutex_unlock(&i915->drm.struct_mutex); 4907 mutex_unlock(&i915->drm.struct_mutex);
@@ -4965,12 +4965,12 @@ int i915_gem_suspend(struct drm_i915_private *i915)
4965 if (WARN_ON(!intel_engines_are_idle(i915))) 4965 if (WARN_ON(!intel_engines_are_idle(i915)))
4966 i915_gem_set_wedged(i915); /* no hope, discard everything */ 4966 i915_gem_set_wedged(i915); /* no hope, discard everything */
4967 4967
4968 intel_runtime_pm_put(i915); 4968 intel_runtime_pm_put_unchecked(i915);
4969 return 0; 4969 return 0;
4970 4970
4971err_unlock: 4971err_unlock:
4972 mutex_unlock(&i915->drm.struct_mutex); 4972 mutex_unlock(&i915->drm.struct_mutex);
4973 intel_runtime_pm_put(i915); 4973 intel_runtime_pm_put_unchecked(i915);
4974 return ret; 4974 return ret;
4975} 4975}
4976 4976
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index e7994505d850..c80943698ca2 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -2424,7 +2424,7 @@ err_vma:
2424 eb_release_vmas(&eb); 2424 eb_release_vmas(&eb);
2425 mutex_unlock(&dev->struct_mutex); 2425 mutex_unlock(&dev->struct_mutex);
2426err_rpm: 2426err_rpm:
2427 intel_runtime_pm_put(eb.i915); 2427 intel_runtime_pm_put_unchecked(eb.i915);
2428 i915_gem_context_put(eb.ctx); 2428 i915_gem_context_put(eb.ctx);
2429err_destroy: 2429err_destroy:
2430 eb_destroy(&eb); 2430 eb_destroy(&eb);
diff --git a/drivers/gpu/drm/i915/i915_gem_fence_reg.c b/drivers/gpu/drm/i915/i915_gem_fence_reg.c
index d67c07cdd0b8..b3391070acf7 100644
--- a/drivers/gpu/drm/i915/i915_gem_fence_reg.c
+++ b/drivers/gpu/drm/i915/i915_gem_fence_reg.c
@@ -258,7 +258,7 @@ static int fence_update(struct drm_i915_fence_reg *fence,
258 */ 258 */
259 if (intel_runtime_pm_get_if_in_use(fence->i915)) { 259 if (intel_runtime_pm_get_if_in_use(fence->i915)) {
260 fence_write(fence, vma); 260 fence_write(fence, vma);
261 intel_runtime_pm_put(fence->i915); 261 intel_runtime_pm_put_unchecked(fence->i915);
262 } 262 }
263 263
264 if (vma) { 264 if (vma) {
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index a8807fbed0aa..51f80ddd938d 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -2536,7 +2536,7 @@ static int ggtt_bind_vma(struct i915_vma *vma,
2536 2536
2537 intel_runtime_pm_get(i915); 2537 intel_runtime_pm_get(i915);
2538 vma->vm->insert_entries(vma->vm, vma, cache_level, pte_flags); 2538 vma->vm->insert_entries(vma->vm, vma, cache_level, pte_flags);
2539 intel_runtime_pm_put(i915); 2539 intel_runtime_pm_put_unchecked(i915);
2540 2540
2541 vma->page_sizes.gtt = I915_GTT_PAGE_SIZE; 2541 vma->page_sizes.gtt = I915_GTT_PAGE_SIZE;
2542 2542
@@ -2556,7 +2556,7 @@ static void ggtt_unbind_vma(struct i915_vma *vma)
2556 2556
2557 intel_runtime_pm_get(i915); 2557 intel_runtime_pm_get(i915);
2558 vma->vm->clear_range(vma->vm, vma->node.start, vma->size); 2558 vma->vm->clear_range(vma->vm, vma->node.start, vma->size);
2559 intel_runtime_pm_put(i915); 2559 intel_runtime_pm_put_unchecked(i915);
2560} 2560}
2561 2561
2562static int aliasing_gtt_bind_vma(struct i915_vma *vma, 2562static int aliasing_gtt_bind_vma(struct i915_vma *vma,
@@ -2590,7 +2590,7 @@ static int aliasing_gtt_bind_vma(struct i915_vma *vma,
2590 if (flags & I915_VMA_GLOBAL_BIND) { 2590 if (flags & I915_VMA_GLOBAL_BIND) {
2591 intel_runtime_pm_get(i915); 2591 intel_runtime_pm_get(i915);
2592 vma->vm->insert_entries(vma->vm, vma, cache_level, pte_flags); 2592 vma->vm->insert_entries(vma->vm, vma, cache_level, pte_flags);
2593 intel_runtime_pm_put(i915); 2593 intel_runtime_pm_put_unchecked(i915);
2594 } 2594 }
2595 2595
2596 return 0; 2596 return 0;
@@ -2603,7 +2603,7 @@ static void aliasing_gtt_unbind_vma(struct i915_vma *vma)
2603 if (vma->flags & I915_VMA_GLOBAL_BIND) { 2603 if (vma->flags & I915_VMA_GLOBAL_BIND) {
2604 intel_runtime_pm_get(i915); 2604 intel_runtime_pm_get(i915);
2605 vma->vm->clear_range(vma->vm, vma->node.start, vma->size); 2605 vma->vm->clear_range(vma->vm, vma->node.start, vma->size);
2606 intel_runtime_pm_put(i915); 2606 intel_runtime_pm_put_unchecked(i915);
2607 } 2607 }
2608 2608
2609 if (vma->flags & I915_VMA_LOCAL_BIND) { 2609 if (vma->flags & I915_VMA_LOCAL_BIND) {
diff --git a/drivers/gpu/drm/i915/i915_gem_shrinker.c b/drivers/gpu/drm/i915/i915_gem_shrinker.c
index 6cc2b964c955..2bef02d0883d 100644
--- a/drivers/gpu/drm/i915/i915_gem_shrinker.c
+++ b/drivers/gpu/drm/i915/i915_gem_shrinker.c
@@ -265,7 +265,7 @@ i915_gem_shrink(struct drm_i915_private *i915,
265 } 265 }
266 266
267 if (flags & I915_SHRINK_BOUND) 267 if (flags & I915_SHRINK_BOUND)
268 intel_runtime_pm_put(i915); 268 intel_runtime_pm_put_unchecked(i915);
269 269
270 i915_retire_requests(i915); 270 i915_retire_requests(i915);
271 271
@@ -299,7 +299,7 @@ unsigned long i915_gem_shrink_all(struct drm_i915_private *i915)
299 I915_SHRINK_BOUND | 299 I915_SHRINK_BOUND |
300 I915_SHRINK_UNBOUND | 300 I915_SHRINK_UNBOUND |
301 I915_SHRINK_ACTIVE); 301 I915_SHRINK_ACTIVE);
302 intel_runtime_pm_put(i915); 302 intel_runtime_pm_put_unchecked(i915);
303 303
304 return freed; 304 return freed;
305} 305}
@@ -377,7 +377,7 @@ i915_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc)
377 I915_SHRINK_ACTIVE | 377 I915_SHRINK_ACTIVE |
378 I915_SHRINK_BOUND | 378 I915_SHRINK_BOUND |
379 I915_SHRINK_UNBOUND); 379 I915_SHRINK_UNBOUND);
380 intel_runtime_pm_put(i915); 380 intel_runtime_pm_put_unchecked(i915);
381 } 381 }
382 382
383 shrinker_unlock(i915, unlock); 383 shrinker_unlock(i915, unlock);
@@ -397,7 +397,7 @@ i915_gem_shrinker_oom(struct notifier_block *nb, unsigned long event, void *ptr)
397 freed_pages = i915_gem_shrink(i915, -1UL, NULL, 397 freed_pages = i915_gem_shrink(i915, -1UL, NULL,
398 I915_SHRINK_BOUND | 398 I915_SHRINK_BOUND |
399 I915_SHRINK_UNBOUND); 399 I915_SHRINK_UNBOUND);
400 intel_runtime_pm_put(i915); 400 intel_runtime_pm_put_unchecked(i915);
401 401
402 /* Because we may be allocating inside our own driver, we cannot 402 /* Because we may be allocating inside our own driver, we cannot
403 * assert that there are no objects with pinned pages that are not 403 * assert that there are no objects with pinned pages that are not
@@ -451,7 +451,7 @@ i915_gem_shrinker_vmap(struct notifier_block *nb, unsigned long event, void *ptr
451 I915_SHRINK_BOUND | 451 I915_SHRINK_BOUND |
452 I915_SHRINK_UNBOUND | 452 I915_SHRINK_UNBOUND |
453 I915_SHRINK_VMAPS); 453 I915_SHRINK_VMAPS);
454 intel_runtime_pm_put(i915); 454 intel_runtime_pm_put_unchecked(i915);
455 455
456 /* We also want to clear any cached iomaps as they wrap vmap */ 456 /* We also want to clear any cached iomaps as they wrap vmap */
457 list_for_each_entry_safe(vma, next, 457 list_for_each_entry_safe(vma, next,
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 288b0662f7b7..787a9ed1ef7d 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -3374,7 +3374,7 @@ void i915_handle_error(struct drm_i915_private *dev_priv,
3374 wake_up_all(&dev_priv->gpu_error.reset_queue); 3374 wake_up_all(&dev_priv->gpu_error.reset_queue);
3375 3375
3376out: 3376out:
3377 intel_runtime_pm_put(dev_priv); 3377 intel_runtime_pm_put_unchecked(dev_priv);
3378} 3378}
3379 3379
3380/* Called from drm generic code, passed 'crtc' which 3380/* Called from drm generic code, passed 'crtc' which
diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index 5b1ae5ed97b3..e4dfd1477c78 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -1365,7 +1365,7 @@ static void i915_oa_stream_destroy(struct i915_perf_stream *stream)
1365 free_oa_buffer(dev_priv); 1365 free_oa_buffer(dev_priv);
1366 1366
1367 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL); 1367 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
1368 intel_runtime_pm_put(dev_priv); 1368 intel_runtime_pm_put_unchecked(dev_priv);
1369 1369
1370 if (stream->ctx) 1370 if (stream->ctx)
1371 oa_put_render_ctx_id(stream); 1371 oa_put_render_ctx_id(stream);
@@ -2123,7 +2123,7 @@ err_oa_buf_alloc:
2123 put_oa_config(dev_priv, stream->oa_config); 2123 put_oa_config(dev_priv, stream->oa_config);
2124 2124
2125 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL); 2125 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
2126 intel_runtime_pm_put(dev_priv); 2126 intel_runtime_pm_put_unchecked(dev_priv);
2127 2127
2128err_config: 2128err_config:
2129 if (stream->ctx) 2129 if (stream->ctx)
diff --git a/drivers/gpu/drm/i915/i915_pmu.c b/drivers/gpu/drm/i915/i915_pmu.c
index d6c8f8fdfda5..c99fcfce79d5 100644
--- a/drivers/gpu/drm/i915/i915_pmu.c
+++ b/drivers/gpu/drm/i915/i915_pmu.c
@@ -210,7 +210,7 @@ engines_sample(struct drm_i915_private *dev_priv, unsigned int period_ns)
210 if (fw) 210 if (fw)
211 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL); 211 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
212 212
213 intel_runtime_pm_put(dev_priv); 213 intel_runtime_pm_put_unchecked(dev_priv);
214} 214}
215 215
216static void 216static void
@@ -231,7 +231,7 @@ frequency_sample(struct drm_i915_private *dev_priv, unsigned int period_ns)
231 intel_runtime_pm_get_if_in_use(dev_priv)) { 231 intel_runtime_pm_get_if_in_use(dev_priv)) {
232 val = intel_get_cagf(dev_priv, 232 val = intel_get_cagf(dev_priv,
233 I915_READ_NOTRACE(GEN6_RPSTAT1)); 233 I915_READ_NOTRACE(GEN6_RPSTAT1));
234 intel_runtime_pm_put(dev_priv); 234 intel_runtime_pm_put_unchecked(dev_priv);
235 } 235 }
236 236
237 add_sample_mult(&dev_priv->pmu.sample[__I915_SAMPLE_FREQ_ACT], 237 add_sample_mult(&dev_priv->pmu.sample[__I915_SAMPLE_FREQ_ACT],
@@ -448,7 +448,7 @@ static u64 get_rc6(struct drm_i915_private *i915)
448 448
449 if (intel_runtime_pm_get_if_in_use(i915)) { 449 if (intel_runtime_pm_get_if_in_use(i915)) {
450 val = __get_rc6(i915); 450 val = __get_rc6(i915);
451 intel_runtime_pm_put(i915); 451 intel_runtime_pm_put_unchecked(i915);
452 452
453 /* 453 /*
454 * If we are coming back from being runtime suspended we must 454 * If we are coming back from being runtime suspended we must
diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c
index c0cfe7ae2ba5..53c20e103d56 100644
--- a/drivers/gpu/drm/i915/i915_sysfs.c
+++ b/drivers/gpu/drm/i915/i915_sysfs.c
@@ -46,7 +46,7 @@ static u32 calc_residency(struct drm_i915_private *dev_priv,
46 46
47 intel_runtime_pm_get(dev_priv); 47 intel_runtime_pm_get(dev_priv);
48 res = intel_rc6_residency_us(dev_priv, reg); 48 res = intel_rc6_residency_us(dev_priv, reg);
49 intel_runtime_pm_put(dev_priv); 49 intel_runtime_pm_put_unchecked(dev_priv);
50 50
51 return DIV_ROUND_CLOSEST_ULL(res, 1000); 51 return DIV_ROUND_CLOSEST_ULL(res, 1000);
52} 52}
@@ -274,7 +274,7 @@ static ssize_t gt_act_freq_mhz_show(struct device *kdev,
274 } 274 }
275 mutex_unlock(&dev_priv->pcu_lock); 275 mutex_unlock(&dev_priv->pcu_lock);
276 276
277 intel_runtime_pm_put(dev_priv); 277 intel_runtime_pm_put_unchecked(dev_priv);
278 278
279 return snprintf(buf, PAGE_SIZE, "%d\n", ret); 279 return snprintf(buf, PAGE_SIZE, "%d\n", ret);
280} 280}
@@ -371,7 +371,7 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev,
371 val > rps->max_freq || 371 val > rps->max_freq ||
372 val < rps->min_freq_softlimit) { 372 val < rps->min_freq_softlimit) {
373 mutex_unlock(&dev_priv->pcu_lock); 373 mutex_unlock(&dev_priv->pcu_lock);
374 intel_runtime_pm_put(dev_priv); 374 intel_runtime_pm_put_unchecked(dev_priv);
375 return -EINVAL; 375 return -EINVAL;
376 } 376 }
377 377
@@ -392,7 +392,7 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev,
392 392
393 mutex_unlock(&dev_priv->pcu_lock); 393 mutex_unlock(&dev_priv->pcu_lock);
394 394
395 intel_runtime_pm_put(dev_priv); 395 intel_runtime_pm_put_unchecked(dev_priv);
396 396
397 return ret ?: count; 397 return ret ?: count;
398} 398}
@@ -429,7 +429,7 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev,
429 val > rps->max_freq || 429 val > rps->max_freq ||
430 val > rps->max_freq_softlimit) { 430 val > rps->max_freq_softlimit) {
431 mutex_unlock(&dev_priv->pcu_lock); 431 mutex_unlock(&dev_priv->pcu_lock);
432 intel_runtime_pm_put(dev_priv); 432 intel_runtime_pm_put_unchecked(dev_priv);
433 return -EINVAL; 433 return -EINVAL;
434 } 434 }
435 435
@@ -446,7 +446,7 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev,
446 446
447 mutex_unlock(&dev_priv->pcu_lock); 447 mutex_unlock(&dev_priv->pcu_lock);
448 448
449 intel_runtime_pm_put(dev_priv); 449 intel_runtime_pm_put_unchecked(dev_priv);
450 450
451 return ret ?: count; 451 return ret ?: count;
452} 452}
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 1cc441f06c73..a980d5d1e601 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2101,7 +2101,7 @@ intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
2101err: 2101err:
2102 atomic_dec(&dev_priv->gpu_error.pending_fb_pin); 2102 atomic_dec(&dev_priv->gpu_error.pending_fb_pin);
2103 2103
2104 intel_runtime_pm_put(dev_priv); 2104 intel_runtime_pm_put_unchecked(dev_priv);
2105 return vma; 2105 return vma;
2106} 2106}
2107 2107
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index ac513fd70315..a1e4e1033289 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -29,6 +29,7 @@
29#include <linux/i2c.h> 29#include <linux/i2c.h>
30#include <linux/hdmi.h> 30#include <linux/hdmi.h>
31#include <linux/sched/clock.h> 31#include <linux/sched/clock.h>
32#include <linux/stackdepot.h>
32#include <drm/i915_drm.h> 33#include <drm/i915_drm.h>
33#include "i915_drv.h" 34#include "i915_drv.h"
34#include <drm/drm_crtc.h> 35#include <drm/drm_crtc.h>
@@ -2182,10 +2183,16 @@ enable_rpm_wakeref_asserts(struct drm_i915_private *i915)
2182 atomic_dec(&i915->runtime_pm.wakeref_count); 2183 atomic_dec(&i915->runtime_pm.wakeref_count);
2183} 2184}
2184 2185
2185void intel_runtime_pm_get(struct drm_i915_private *i915); 2186intel_wakeref_t intel_runtime_pm_get(struct drm_i915_private *i915);
2186bool intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915); 2187intel_wakeref_t intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915);
2187void intel_runtime_pm_get_noresume(struct drm_i915_private *i915); 2188intel_wakeref_t intel_runtime_pm_get_noresume(struct drm_i915_private *i915);
2188void intel_runtime_pm_put(struct drm_i915_private *i915); 2189
2190void intel_runtime_pm_put_unchecked(struct drm_i915_private *i915);
2191#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
2192void intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref);
2193#else
2194#define intel_runtime_pm_put(i915, wref) intel_runtime_pm_put_unchecked(i915)
2195#endif
2189 2196
2190#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM) 2197#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
2191void print_intel_runtime_pm_wakeref(struct drm_i915_private *i915, 2198void print_intel_runtime_pm_wakeref(struct drm_i915_private *i915,
diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c
index 5990f8500bca..2e60463f2468 100644
--- a/drivers/gpu/drm/i915/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/intel_engine_cs.c
@@ -928,7 +928,7 @@ static bool ring_is_idle(struct intel_engine_cs *engine)
928 if (INTEL_GEN(dev_priv) > 2 && !(I915_READ_MODE(engine) & MODE_IDLE)) 928 if (INTEL_GEN(dev_priv) > 2 && !(I915_READ_MODE(engine) & MODE_IDLE))
929 idle = false; 929 idle = false;
930 930
931 intel_runtime_pm_put(dev_priv); 931 intel_runtime_pm_put_unchecked(dev_priv);
932 932
933 return idle; 933 return idle;
934} 934}
@@ -1485,7 +1485,7 @@ void intel_engine_dump(struct intel_engine_cs *engine,
1485 1485
1486 if (intel_runtime_pm_get_if_in_use(engine->i915)) { 1486 if (intel_runtime_pm_get_if_in_use(engine->i915)) {
1487 intel_engine_print_registers(engine, m); 1487 intel_engine_print_registers(engine, m);
1488 intel_runtime_pm_put(engine->i915); 1488 intel_runtime_pm_put_unchecked(engine->i915);
1489 } else { 1489 } else {
1490 drm_printf(m, "\tDevice is asleep; skipping register dump\n"); 1490 drm_printf(m, "\tDevice is asleep; skipping register dump\n");
1491 } 1491 }
diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
index a0c5046e170c..215e5894842d 100644
--- a/drivers/gpu/drm/i915/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/intel_fbdev.c
@@ -276,7 +276,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
276 ifbdev->vma = vma; 276 ifbdev->vma = vma;
277 ifbdev->vma_flags = flags; 277 ifbdev->vma_flags = flags;
278 278
279 intel_runtime_pm_put(dev_priv); 279 intel_runtime_pm_put_unchecked(dev_priv);
280 mutex_unlock(&dev->struct_mutex); 280 mutex_unlock(&dev->struct_mutex);
281 vga_switcheroo_client_fb_set(pdev, info); 281 vga_switcheroo_client_fb_set(pdev, info);
282 return 0; 282 return 0;
@@ -284,7 +284,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
284out_unpin: 284out_unpin:
285 intel_unpin_fb_vma(vma, flags); 285 intel_unpin_fb_vma(vma, flags);
286out_unlock: 286out_unlock:
287 intel_runtime_pm_put(dev_priv); 287 intel_runtime_pm_put_unchecked(dev_priv);
288 mutex_unlock(&dev->struct_mutex); 288 mutex_unlock(&dev->struct_mutex);
289 return ret; 289 return ret;
290} 290}
diff --git a/drivers/gpu/drm/i915/intel_guc_log.c b/drivers/gpu/drm/i915/intel_guc_log.c
index d3ebdbc0182e..1b1581a42aa1 100644
--- a/drivers/gpu/drm/i915/intel_guc_log.c
+++ b/drivers/gpu/drm/i915/intel_guc_log.c
@@ -445,7 +445,7 @@ static void guc_log_capture_logs(struct intel_guc_log *log)
445 */ 445 */
446 intel_runtime_pm_get(dev_priv); 446 intel_runtime_pm_get(dev_priv);
447 guc_action_flush_log_complete(guc); 447 guc_action_flush_log_complete(guc);
448 intel_runtime_pm_put(dev_priv); 448 intel_runtime_pm_put_unchecked(dev_priv);
449} 449}
450 450
451int intel_guc_log_create(struct intel_guc_log *log) 451int intel_guc_log_create(struct intel_guc_log *log)
@@ -528,7 +528,7 @@ int intel_guc_log_set_level(struct intel_guc_log *log, u32 level)
528 ret = guc_action_control_log(guc, GUC_LOG_LEVEL_IS_VERBOSE(level), 528 ret = guc_action_control_log(guc, GUC_LOG_LEVEL_IS_VERBOSE(level),
529 GUC_LOG_LEVEL_IS_ENABLED(level), 529 GUC_LOG_LEVEL_IS_ENABLED(level),
530 GUC_LOG_LEVEL_TO_VERBOSITY(level)); 530 GUC_LOG_LEVEL_TO_VERBOSITY(level));
531 intel_runtime_pm_put(dev_priv); 531 intel_runtime_pm_put_unchecked(dev_priv);
532 if (ret) { 532 if (ret) {
533 DRM_DEBUG_DRIVER("guc_log_control action failed %d\n", ret); 533 DRM_DEBUG_DRIVER("guc_log_control action failed %d\n", ret);
534 goto out_unlock; 534 goto out_unlock;
@@ -610,7 +610,7 @@ void intel_guc_log_relay_flush(struct intel_guc_log *log)
610 610
611 intel_runtime_pm_get(i915); 611 intel_runtime_pm_get(i915);
612 guc_action_flush_log(guc); 612 guc_action_flush_log(guc);
613 intel_runtime_pm_put(i915); 613 intel_runtime_pm_put_unchecked(i915);
614 614
615 /* GuC would have updated log buffer by now, so capture it */ 615 /* GuC would have updated log buffer by now, so capture it */
616 guc_log_capture_logs(log); 616 guc_log_capture_logs(log);
diff --git a/drivers/gpu/drm/i915/intel_hotplug.c b/drivers/gpu/drm/i915/intel_hotplug.c
index ae92d6560165..b1a9cb960ca4 100644
--- a/drivers/gpu/drm/i915/intel_hotplug.c
+++ b/drivers/gpu/drm/i915/intel_hotplug.c
@@ -261,7 +261,7 @@ static void intel_hpd_irq_storm_reenable_work(struct work_struct *work)
261 dev_priv->display.hpd_irq_setup(dev_priv); 261 dev_priv->display.hpd_irq_setup(dev_priv);
262 spin_unlock_irq(&dev_priv->irq_lock); 262 spin_unlock_irq(&dev_priv->irq_lock);
263 263
264 intel_runtime_pm_put(dev_priv); 264 intel_runtime_pm_put_unchecked(dev_priv);
265} 265}
266 266
267bool intel_encoder_hotplug(struct intel_encoder *encoder, 267bool intel_encoder_hotplug(struct intel_encoder *encoder,
diff --git a/drivers/gpu/drm/i915/intel_huc.c b/drivers/gpu/drm/i915/intel_huc.c
index bc27b691d824..c2b076e9bada 100644
--- a/drivers/gpu/drm/i915/intel_huc.c
+++ b/drivers/gpu/drm/i915/intel_huc.c
@@ -122,7 +122,7 @@ int intel_huc_check_status(struct intel_huc *huc)
122 122
123 intel_runtime_pm_get(dev_priv); 123 intel_runtime_pm_get(dev_priv);
124 status = I915_READ(HUC_STATUS2) & HUC_FW_VERIFIED; 124 status = I915_READ(HUC_STATUS2) & HUC_FW_VERIFIED;
125 intel_runtime_pm_put(dev_priv); 125 intel_runtime_pm_put_unchecked(dev_priv);
126 126
127 return status; 127 return status;
128} 128}
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
index ee3e0842d542..c2b7455a023e 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -1213,7 +1213,7 @@ static int intel_backlight_device_get_brightness(struct backlight_device *bd)
1213 ret = scale_hw_to_user(connector, hw_level, bd->props.max_brightness); 1213 ret = scale_hw_to_user(connector, hw_level, bd->props.max_brightness);
1214 1214
1215 drm_modeset_unlock(&dev->mode_config.connection_mutex); 1215 drm_modeset_unlock(&dev->mode_config.connection_mutex);
1216 intel_runtime_pm_put(dev_priv); 1216 intel_runtime_pm_put_unchecked(dev_priv);
1217 1217
1218 return ret; 1218 return ret;
1219} 1219}
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
index 08f809371bbd..c29577d7a35a 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -94,7 +94,7 @@ static void init_intel_runtime_pm_wakeref(struct drm_i915_private *i915)
94 spin_lock_init(&rpm->debug.lock); 94 spin_lock_init(&rpm->debug.lock);
95} 95}
96 96
97static noinline void 97static noinline depot_stack_handle_t
98track_intel_runtime_pm_wakeref(struct drm_i915_private *i915) 98track_intel_runtime_pm_wakeref(struct drm_i915_private *i915)
99{ 99{
100 struct i915_runtime_pm *rpm = &i915->runtime_pm; 100 struct i915_runtime_pm *rpm = &i915->runtime_pm;
@@ -105,11 +105,11 @@ track_intel_runtime_pm_wakeref(struct drm_i915_private *i915)
105 assert_rpm_wakelock_held(i915); 105 assert_rpm_wakelock_held(i915);
106 106
107 if (!HAS_RUNTIME_PM(i915)) 107 if (!HAS_RUNTIME_PM(i915))
108 return; 108 return -1;
109 109
110 stack = __save_depot_stack(); 110 stack = __save_depot_stack();
111 if (!stack) 111 if (!stack)
112 return; 112 return -1;
113 113
114 spin_lock_irqsave(&rpm->debug.lock, flags); 114 spin_lock_irqsave(&rpm->debug.lock, flags);
115 115
@@ -122,9 +122,57 @@ track_intel_runtime_pm_wakeref(struct drm_i915_private *i915)
122 if (stacks) { 122 if (stacks) {
123 stacks[rpm->debug.count++] = stack; 123 stacks[rpm->debug.count++] = stack;
124 rpm->debug.owners = stacks; 124 rpm->debug.owners = stacks;
125 } else {
126 stack = -1;
125 } 127 }
126 128
127 spin_unlock_irqrestore(&rpm->debug.lock, flags); 129 spin_unlock_irqrestore(&rpm->debug.lock, flags);
130
131 return stack;
132}
133
134static void cancel_intel_runtime_pm_wakeref(struct drm_i915_private *i915,
135 depot_stack_handle_t stack)
136{
137 struct i915_runtime_pm *rpm = &i915->runtime_pm;
138 unsigned long flags, n;
139 bool found = false;
140
141 if (unlikely(stack == -1))
142 return;
143
144 spin_lock_irqsave(&rpm->debug.lock, flags);
145 for (n = rpm->debug.count; n--; ) {
146 if (rpm->debug.owners[n] == stack) {
147 memmove(rpm->debug.owners + n,
148 rpm->debug.owners + n + 1,
149 (--rpm->debug.count - n) * sizeof(stack));
150 found = true;
151 break;
152 }
153 }
154 spin_unlock_irqrestore(&rpm->debug.lock, flags);
155
156 if (WARN(!found,
157 "Unmatched wakeref (tracking %lu), count %u\n",
158 rpm->debug.count, atomic_read(&rpm->wakeref_count))) {
159 char *buf;
160
161 buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
162 if (!buf)
163 return;
164
165 __print_depot_stack(stack, buf, PAGE_SIZE, 2);
166 DRM_DEBUG_DRIVER("wakeref %x from\n%s", stack, buf);
167
168 stack = READ_ONCE(rpm->debug.last_release);
169 if (stack) {
170 __print_depot_stack(stack, buf, PAGE_SIZE, 2);
171 DRM_DEBUG_DRIVER("wakeref last released at\n%s", buf);
172 }
173
174 kfree(buf);
175 }
128} 176}
129 177
130static int cmphandle(const void *_a, const void *_b) 178static int cmphandle(const void *_a, const void *_b)
@@ -249,10 +297,12 @@ static void init_intel_runtime_pm_wakeref(struct drm_i915_private *i915)
249{ 297{
250} 298}
251 299
252static void track_intel_runtime_pm_wakeref(struct drm_i915_private *i915) 300static depot_stack_handle_t
301track_intel_runtime_pm_wakeref(struct drm_i915_private *i915)
253{ 302{
254 atomic_inc(&i915->runtime_pm.wakeref_count); 303 atomic_inc(&i915->runtime_pm.wakeref_count);
255 assert_rpm_wakelock_held(i915); 304 assert_rpm_wakelock_held(i915);
305 return -1;
256} 306}
257 307
258static void untrack_intel_runtime_pm_wakeref(struct drm_i915_private *i915) 308static void untrack_intel_runtime_pm_wakeref(struct drm_i915_private *i915)
@@ -1852,7 +1902,7 @@ bool intel_display_power_get_if_enabled(struct drm_i915_private *dev_priv,
1852 mutex_unlock(&power_domains->lock); 1902 mutex_unlock(&power_domains->lock);
1853 1903
1854 if (!is_enabled) 1904 if (!is_enabled)
1855 intel_runtime_pm_put(dev_priv); 1905 intel_runtime_pm_put_unchecked(dev_priv);
1856 1906
1857 return is_enabled; 1907 return is_enabled;
1858} 1908}
@@ -1886,7 +1936,7 @@ void intel_display_power_put(struct drm_i915_private *dev_priv,
1886 1936
1887 mutex_unlock(&power_domains->lock); 1937 mutex_unlock(&power_domains->lock);
1888 1938
1889 intel_runtime_pm_put(dev_priv); 1939 intel_runtime_pm_put_unchecked(dev_priv);
1890} 1940}
1891 1941
1892#define I830_PIPES_POWER_DOMAINS ( \ 1942#define I830_PIPES_POWER_DOMAINS ( \
@@ -3994,7 +4044,7 @@ void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume)
3994void intel_power_domains_fini_hw(struct drm_i915_private *dev_priv) 4044void intel_power_domains_fini_hw(struct drm_i915_private *dev_priv)
3995{ 4045{
3996 /* Keep the power well enabled, but cancel its rpm wakeref. */ 4046 /* Keep the power well enabled, but cancel its rpm wakeref. */
3997 intel_runtime_pm_put(dev_priv); 4047 intel_runtime_pm_put_unchecked(dev_priv);
3998 4048
3999 /* Remove the refcount we took to keep power well support disabled. */ 4049 /* Remove the refcount we took to keep power well support disabled. */
4000 if (!i915_modparams.disable_power_well) 4050 if (!i915_modparams.disable_power_well)
@@ -4207,8 +4257,10 @@ static void intel_power_domains_verify_state(struct drm_i915_private *dev_priv)
4207 * 4257 *
4208 * Any runtime pm reference obtained by this function must have a symmetric 4258 * Any runtime pm reference obtained by this function must have a symmetric
4209 * call to intel_runtime_pm_put() to release the reference again. 4259 * call to intel_runtime_pm_put() to release the reference again.
4260 *
4261 * Returns: the wakeref cookie to pass to intel_runtime_pm_put()
4210 */ 4262 */
4211void intel_runtime_pm_get(struct drm_i915_private *i915) 4263intel_wakeref_t intel_runtime_pm_get(struct drm_i915_private *i915)
4212{ 4264{
4213 struct pci_dev *pdev = i915->drm.pdev; 4265 struct pci_dev *pdev = i915->drm.pdev;
4214 struct device *kdev = &pdev->dev; 4266 struct device *kdev = &pdev->dev;
@@ -4217,7 +4269,7 @@ void intel_runtime_pm_get(struct drm_i915_private *i915)
4217 ret = pm_runtime_get_sync(kdev); 4269 ret = pm_runtime_get_sync(kdev);
4218 WARN_ONCE(ret < 0, "pm_runtime_get_sync() failed: %d\n", ret); 4270 WARN_ONCE(ret < 0, "pm_runtime_get_sync() failed: %d\n", ret);
4219 4271
4220 track_intel_runtime_pm_wakeref(i915); 4272 return track_intel_runtime_pm_wakeref(i915);
4221} 4273}
4222 4274
4223/** 4275/**
@@ -4231,9 +4283,10 @@ void intel_runtime_pm_get(struct drm_i915_private *i915)
4231 * Any runtime pm reference obtained by this function must have a symmetric 4283 * Any runtime pm reference obtained by this function must have a symmetric
4232 * call to intel_runtime_pm_put() to release the reference again. 4284 * call to intel_runtime_pm_put() to release the reference again.
4233 * 4285 *
4234 * Returns: True if the wakeref was acquired, or False otherwise. 4286 * Returns: the wakeref cookie to pass to intel_runtime_pm_put(), evaluates
4287 * as True if the wakeref was acquired, or False otherwise.
4235 */ 4288 */
4236bool intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915) 4289intel_wakeref_t intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915)
4237{ 4290{
4238 if (IS_ENABLED(CONFIG_PM)) { 4291 if (IS_ENABLED(CONFIG_PM)) {
4239 struct pci_dev *pdev = i915->drm.pdev; 4292 struct pci_dev *pdev = i915->drm.pdev;
@@ -4246,12 +4299,10 @@ bool intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915)
4246 * atm to the late/early system suspend/resume handlers. 4299 * atm to the late/early system suspend/resume handlers.
4247 */ 4300 */
4248 if (pm_runtime_get_if_in_use(kdev) <= 0) 4301 if (pm_runtime_get_if_in_use(kdev) <= 0)
4249 return false; 4302 return 0;
4250 } 4303 }
4251 4304
4252 track_intel_runtime_pm_wakeref(i915); 4305 return track_intel_runtime_pm_wakeref(i915);
4253
4254 return true;
4255} 4306}
4256 4307
4257/** 4308/**
@@ -4270,8 +4321,10 @@ bool intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915)
4270 * 4321 *
4271 * Any runtime pm reference obtained by this function must have a symmetric 4322 * Any runtime pm reference obtained by this function must have a symmetric
4272 * call to intel_runtime_pm_put() to release the reference again. 4323 * call to intel_runtime_pm_put() to release the reference again.
4324 *
4325 * Returns: the wakeref cookie to pass to intel_runtime_pm_put()
4273 */ 4326 */
4274void intel_runtime_pm_get_noresume(struct drm_i915_private *i915) 4327intel_wakeref_t intel_runtime_pm_get_noresume(struct drm_i915_private *i915)
4275{ 4328{
4276 struct pci_dev *pdev = i915->drm.pdev; 4329 struct pci_dev *pdev = i915->drm.pdev;
4277 struct device *kdev = &pdev->dev; 4330 struct device *kdev = &pdev->dev;
@@ -4279,7 +4332,7 @@ void intel_runtime_pm_get_noresume(struct drm_i915_private *i915)
4279 assert_rpm_wakelock_held(i915); 4332 assert_rpm_wakelock_held(i915);
4280 pm_runtime_get_noresume(kdev); 4333 pm_runtime_get_noresume(kdev);
4281 4334
4282 track_intel_runtime_pm_wakeref(i915); 4335 return track_intel_runtime_pm_wakeref(i915);
4283} 4336}
4284 4337
4285/** 4338/**
@@ -4290,7 +4343,7 @@ void intel_runtime_pm_get_noresume(struct drm_i915_private *i915)
4290 * intel_runtime_pm_get() and might power down the corresponding 4343 * intel_runtime_pm_get() and might power down the corresponding
4291 * hardware block right away if this is the last reference. 4344 * hardware block right away if this is the last reference.
4292 */ 4345 */
4293void intel_runtime_pm_put(struct drm_i915_private *i915) 4346void intel_runtime_pm_put_unchecked(struct drm_i915_private *i915)
4294{ 4347{
4295 struct pci_dev *pdev = i915->drm.pdev; 4348 struct pci_dev *pdev = i915->drm.pdev;
4296 struct device *kdev = &pdev->dev; 4349 struct device *kdev = &pdev->dev;
@@ -4301,6 +4354,14 @@ void intel_runtime_pm_put(struct drm_i915_private *i915)
4301 pm_runtime_put_autosuspend(kdev); 4354 pm_runtime_put_autosuspend(kdev);
4302} 4355}
4303 4356
4357#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
4358void intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref)
4359{
4360 cancel_intel_runtime_pm_wakeref(i915, wref);
4361 intel_runtime_pm_put_unchecked(i915);
4362}
4363#endif
4364
4304/** 4365/**
4305 * intel_runtime_pm_enable - enable runtime pm 4366 * intel_runtime_pm_enable - enable runtime pm
4306 * @i915: i915 device instance 4367 * @i915: i915 device instance
diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
index fff468f17d2d..8d4c76ac0e7d 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -1709,7 +1709,7 @@ int i915_reg_read_ioctl(struct drm_device *dev,
1709 reg->val = I915_READ8(entry->offset_ldw); 1709 reg->val = I915_READ8(entry->offset_ldw);
1710 else 1710 else
1711 ret = -EINVAL; 1711 ret = -EINVAL;
1712 intel_runtime_pm_put(dev_priv); 1712 intel_runtime_pm_put_unchecked(dev_priv);
1713 1713
1714 return ret; 1714 return ret;
1715} 1715}
diff --git a/drivers/gpu/drm/i915/selftests/huge_pages.c b/drivers/gpu/drm/i915/selftests/huge_pages.c
index 6c10734e948d..a4d8b12be12c 100644
--- a/drivers/gpu/drm/i915/selftests/huge_pages.c
+++ b/drivers/gpu/drm/i915/selftests/huge_pages.c
@@ -1785,7 +1785,7 @@ int i915_gem_huge_page_live_selftests(struct drm_i915_private *dev_priv)
1785 err = i915_subtests(tests, ctx); 1785 err = i915_subtests(tests, ctx);
1786 1786
1787out_unlock: 1787out_unlock:
1788 intel_runtime_pm_put(dev_priv); 1788 intel_runtime_pm_put_unchecked(dev_priv);
1789 mutex_unlock(&dev_priv->drm.struct_mutex); 1789 mutex_unlock(&dev_priv->drm.struct_mutex);
1790 1790
1791 mock_file_free(dev_priv, file); 1791 mock_file_free(dev_priv, file);
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem.c b/drivers/gpu/drm/i915/selftests/i915_gem.c
index bdcc53e15e75..762e1a7125f5 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem.c
@@ -32,7 +32,7 @@ static int switch_to_context(struct drm_i915_private *i915,
32 i915_request_add(rq); 32 i915_request_add(rq);
33 } 33 }
34 34
35 intel_runtime_pm_put(i915); 35 intel_runtime_pm_put_unchecked(i915);
36 36
37 return err; 37 return err;
38} 38}
@@ -76,7 +76,7 @@ static void simulate_hibernate(struct drm_i915_private *i915)
76 */ 76 */
77 trash_stolen(i915); 77 trash_stolen(i915);
78 78
79 intel_runtime_pm_put(i915); 79 intel_runtime_pm_put_unchecked(i915);
80} 80}
81 81
82static int pm_prepare(struct drm_i915_private *i915) 82static int pm_prepare(struct drm_i915_private *i915)
@@ -98,7 +98,7 @@ static void pm_suspend(struct drm_i915_private *i915)
98 i915_gem_suspend_gtt_mappings(i915); 98 i915_gem_suspend_gtt_mappings(i915);
99 i915_gem_suspend_late(i915); 99 i915_gem_suspend_late(i915);
100 100
101 intel_runtime_pm_put(i915); 101 intel_runtime_pm_put_unchecked(i915);
102} 102}
103 103
104static void pm_hibernate(struct drm_i915_private *i915) 104static void pm_hibernate(struct drm_i915_private *i915)
@@ -110,7 +110,7 @@ static void pm_hibernate(struct drm_i915_private *i915)
110 i915_gem_freeze(i915); 110 i915_gem_freeze(i915);
111 i915_gem_freeze_late(i915); 111 i915_gem_freeze_late(i915);
112 112
113 intel_runtime_pm_put(i915); 113 intel_runtime_pm_put_unchecked(i915);
114} 114}
115 115
116static void pm_resume(struct drm_i915_private *i915) 116static void pm_resume(struct drm_i915_private *i915)
@@ -125,7 +125,7 @@ static void pm_resume(struct drm_i915_private *i915)
125 i915_gem_sanitize(i915); 125 i915_gem_sanitize(i915);
126 i915_gem_resume(i915); 126 i915_gem_resume(i915);
127 127
128 intel_runtime_pm_put(i915); 128 intel_runtime_pm_put_unchecked(i915);
129} 129}
130 130
131static int igt_gem_suspend(void *arg) 131static int igt_gem_suspend(void *arg)
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c b/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
index f7392c1ffe75..eea4fc2445ae 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
@@ -376,7 +376,7 @@ static int igt_gem_coherency(void *arg)
376 } 376 }
377 } 377 }
378unlock: 378unlock:
379 intel_runtime_pm_put(i915); 379 intel_runtime_pm_put_unchecked(i915);
380 mutex_unlock(&i915->drm.struct_mutex); 380 mutex_unlock(&i915->drm.struct_mutex);
381 kfree(offsets); 381 kfree(offsets);
382 return err; 382 return err;
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
index d00cdf3c2939..6e1a0711d201 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
@@ -243,7 +243,7 @@ static int live_nop_switch(void *arg)
243 } 243 }
244 244
245out_unlock: 245out_unlock:
246 intel_runtime_pm_put(i915); 246 intel_runtime_pm_put_unchecked(i915);
247 mutex_unlock(&i915->drm.struct_mutex); 247 mutex_unlock(&i915->drm.struct_mutex);
248 mock_file_free(i915, file); 248 mock_file_free(i915, file);
249 return err; 249 return err;
@@ -609,7 +609,7 @@ static int igt_ctx_exec(void *arg)
609 609
610 intel_runtime_pm_get(i915); 610 intel_runtime_pm_get(i915);
611 err = gpu_fill(obj, ctx, engine, dw); 611 err = gpu_fill(obj, ctx, engine, dw);
612 intel_runtime_pm_put(i915); 612 intel_runtime_pm_put_unchecked(i915);
613 if (err) { 613 if (err) {
614 pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) in ctx %u [full-ppgtt? %s], err=%d\n", 614 pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) in ctx %u [full-ppgtt? %s], err=%d\n",
615 ndwords, dw, max_dwords(obj), 615 ndwords, dw, max_dwords(obj),
@@ -715,7 +715,7 @@ static int igt_ctx_readonly(void *arg)
715 715
716 intel_runtime_pm_get(i915); 716 intel_runtime_pm_get(i915);
717 err = gpu_fill(obj, ctx, engine, dw); 717 err = gpu_fill(obj, ctx, engine, dw);
718 intel_runtime_pm_put(i915); 718 intel_runtime_pm_put_unchecked(i915);
719 if (err) { 719 if (err) {
720 pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) in ctx %u [full-ppgtt? %s], err=%d\n", 720 pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) in ctx %u [full-ppgtt? %s], err=%d\n",
721 ndwords, dw, max_dwords(obj), 721 ndwords, dw, max_dwords(obj),
@@ -1067,7 +1067,7 @@ static int igt_vm_isolation(void *arg)
1067 count, RUNTIME_INFO(i915)->num_rings); 1067 count, RUNTIME_INFO(i915)->num_rings);
1068 1068
1069out_rpm: 1069out_rpm:
1070 intel_runtime_pm_put(i915); 1070 intel_runtime_pm_put_unchecked(i915);
1071out_unlock: 1071out_unlock:
1072 if (end_live_test(&t)) 1072 if (end_live_test(&t))
1073 err = -EIO; 1073 err = -EIO;
@@ -1200,7 +1200,7 @@ out_unlock:
1200 if (igt_flush_test(i915, I915_WAIT_LOCKED)) 1200 if (igt_flush_test(i915, I915_WAIT_LOCKED))
1201 err = -EIO; 1201 err = -EIO;
1202 1202
1203 intel_runtime_pm_put(i915); 1203 intel_runtime_pm_put_unchecked(i915);
1204 mutex_unlock(&i915->drm.struct_mutex); 1204 mutex_unlock(&i915->drm.struct_mutex);
1205 1205
1206 kernel_context_close(ctx); 1206 kernel_context_close(ctx);
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
index 4365979d8222..8d22f73a9b63 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
@@ -464,7 +464,7 @@ out_locked:
464 } 464 }
465 if (drm_mm_node_allocated(&hole)) 465 if (drm_mm_node_allocated(&hole))
466 drm_mm_remove_node(&hole); 466 drm_mm_remove_node(&hole);
467 intel_runtime_pm_put(i915); 467 intel_runtime_pm_put_unchecked(i915);
468 mutex_unlock(&i915->drm.struct_mutex); 468 mutex_unlock(&i915->drm.struct_mutex);
469 469
470 return err; 470 return err;
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
index a9ed0ecc94e2..87cb0602a5fc 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
@@ -295,7 +295,7 @@ static int lowlevel_hole(struct drm_i915_private *i915,
295 295
296 intel_runtime_pm_get(i915); 296 intel_runtime_pm_get(i915);
297 vm->insert_entries(vm, &mock_vma, I915_CACHE_NONE, 0); 297 vm->insert_entries(vm, &mock_vma, I915_CACHE_NONE, 0);
298 intel_runtime_pm_put(i915); 298 intel_runtime_pm_put_unchecked(i915);
299 } 299 }
300 count = n; 300 count = n;
301 301
@@ -1216,7 +1216,7 @@ static int igt_ggtt_page(void *arg)
1216 kfree(order); 1216 kfree(order);
1217out_remove: 1217out_remove:
1218 ggtt->vm.clear_range(&ggtt->vm, tmp.start, tmp.size); 1218 ggtt->vm.clear_range(&ggtt->vm, tmp.start, tmp.size);
1219 intel_runtime_pm_put(i915); 1219 intel_runtime_pm_put_unchecked(i915);
1220 drm_mm_remove_node(&tmp); 1220 drm_mm_remove_node(&tmp);
1221out_unpin: 1221out_unpin:
1222 i915_gem_object_unpin_pages(obj); 1222 i915_gem_object_unpin_pages(obj);
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_object.c b/drivers/gpu/drm/i915/selftests/i915_gem_object.c
index be7ecb66ad11..b03890c590d7 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_object.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_object.c
@@ -444,7 +444,7 @@ next_tiling: ;
444 } 444 }
445 445
446out_unlock: 446out_unlock:
447 intel_runtime_pm_put(i915); 447 intel_runtime_pm_put_unchecked(i915);
448 mutex_unlock(&i915->drm.struct_mutex); 448 mutex_unlock(&i915->drm.struct_mutex);
449 i915_gem_object_unpin_pages(obj); 449 i915_gem_object_unpin_pages(obj);
450out: 450out:
@@ -508,7 +508,7 @@ static void disable_retire_worker(struct drm_i915_private *i915)
508 if (!i915->gt.active_requests++) { 508 if (!i915->gt.active_requests++) {
509 intel_runtime_pm_get(i915); 509 intel_runtime_pm_get(i915);
510 i915_gem_unpark(i915); 510 i915_gem_unpark(i915);
511 intel_runtime_pm_put(i915); 511 intel_runtime_pm_put_unchecked(i915);
512 } 512 }
513 mutex_unlock(&i915->drm.struct_mutex); 513 mutex_unlock(&i915->drm.struct_mutex);
514 cancel_delayed_work_sync(&i915->gt.retire_work); 514 cancel_delayed_work_sync(&i915->gt.retire_work);
@@ -590,7 +590,7 @@ static int igt_mmap_offset_exhaustion(void *arg)
590 mutex_lock(&i915->drm.struct_mutex); 590 mutex_lock(&i915->drm.struct_mutex);
591 intel_runtime_pm_get(i915); 591 intel_runtime_pm_get(i915);
592 err = make_obj_busy(obj); 592 err = make_obj_busy(obj);
593 intel_runtime_pm_put(i915); 593 intel_runtime_pm_put_unchecked(i915);
594 mutex_unlock(&i915->drm.struct_mutex); 594 mutex_unlock(&i915->drm.struct_mutex);
595 if (err) { 595 if (err) {
596 pr_err("[loop %d] Failed to busy the object\n", loop); 596 pr_err("[loop %d] Failed to busy the object\n", loop);
diff --git a/drivers/gpu/drm/i915/selftests/i915_request.c b/drivers/gpu/drm/i915/selftests/i915_request.c
index 07e557815308..e8880cabd5c7 100644
--- a/drivers/gpu/drm/i915/selftests/i915_request.c
+++ b/drivers/gpu/drm/i915/selftests/i915_request.c
@@ -403,7 +403,7 @@ static int live_nop_request(void *arg)
403 } 403 }
404 404
405out_unlock: 405out_unlock:
406 intel_runtime_pm_put(i915); 406 intel_runtime_pm_put_unchecked(i915);
407 mutex_unlock(&i915->drm.struct_mutex); 407 mutex_unlock(&i915->drm.struct_mutex);
408 return err; 408 return err;
409} 409}
@@ -553,7 +553,7 @@ out_batch:
553 i915_vma_unpin(batch); 553 i915_vma_unpin(batch);
554 i915_vma_put(batch); 554 i915_vma_put(batch);
555out_unlock: 555out_unlock:
556 intel_runtime_pm_put(i915); 556 intel_runtime_pm_put_unchecked(i915);
557 mutex_unlock(&i915->drm.struct_mutex); 557 mutex_unlock(&i915->drm.struct_mutex);
558 return err; 558 return err;
559} 559}
@@ -731,7 +731,7 @@ out_request:
731 i915_vma_unpin(batch); 731 i915_vma_unpin(batch);
732 i915_vma_put(batch); 732 i915_vma_put(batch);
733out_unlock: 733out_unlock:
734 intel_runtime_pm_put(i915); 734 intel_runtime_pm_put_unchecked(i915);
735 mutex_unlock(&i915->drm.struct_mutex); 735 mutex_unlock(&i915->drm.struct_mutex);
736 return err; 736 return err;
737} 737}
@@ -860,7 +860,7 @@ out_request:
860 i915_request_put(request[id]); 860 i915_request_put(request[id]);
861 } 861 }
862out_unlock: 862out_unlock:
863 intel_runtime_pm_put(i915); 863 intel_runtime_pm_put_unchecked(i915);
864 mutex_unlock(&i915->drm.struct_mutex); 864 mutex_unlock(&i915->drm.struct_mutex);
865 return err; 865 return err;
866} 866}
diff --git a/drivers/gpu/drm/i915/selftests/intel_guc.c b/drivers/gpu/drm/i915/selftests/intel_guc.c
index 32cba4cae31a..3590ba3d8897 100644
--- a/drivers/gpu/drm/i915/selftests/intel_guc.c
+++ b/drivers/gpu/drm/i915/selftests/intel_guc.c
@@ -225,7 +225,7 @@ out:
225 guc_clients_create(guc); 225 guc_clients_create(guc);
226 guc_clients_enable(guc); 226 guc_clients_enable(guc);
227unlock: 227unlock:
228 intel_runtime_pm_put(dev_priv); 228 intel_runtime_pm_put_unchecked(dev_priv);
229 mutex_unlock(&dev_priv->drm.struct_mutex); 229 mutex_unlock(&dev_priv->drm.struct_mutex);
230 return err; 230 return err;
231} 231}
@@ -337,7 +337,7 @@ out:
337 guc_client_free(clients[i]); 337 guc_client_free(clients[i]);
338 } 338 }
339unlock: 339unlock:
340 intel_runtime_pm_put(dev_priv); 340 intel_runtime_pm_put_unchecked(dev_priv);
341 mutex_unlock(&dev_priv->drm.struct_mutex); 341 mutex_unlock(&dev_priv->drm.struct_mutex);
342 return err; 342 return err;
343} 343}
diff --git a/drivers/gpu/drm/i915/selftests/intel_hangcheck.c b/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
index 797cf5e6d6d4..58cba8188bd2 100644
--- a/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
+++ b/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
@@ -402,7 +402,7 @@ static int igt_wedged_reset(void *arg)
402 i915_reset(i915, ALL_ENGINES, NULL); 402 i915_reset(i915, ALL_ENGINES, NULL);
403 GEM_BUG_ON(test_bit(I915_RESET_HANDOFF, &i915->gpu_error.flags)); 403 GEM_BUG_ON(test_bit(I915_RESET_HANDOFF, &i915->gpu_error.flags));
404 404
405 intel_runtime_pm_put(i915); 405 intel_runtime_pm_put_unchecked(i915);
406 mutex_unlock(&i915->drm.struct_mutex); 406 mutex_unlock(&i915->drm.struct_mutex);
407 igt_global_reset_unlock(i915); 407 igt_global_reset_unlock(i915);
408 408
@@ -1636,7 +1636,7 @@ out:
1636 force_reset(i915); 1636 force_reset(i915);
1637 1637
1638unlock: 1638unlock:
1639 intel_runtime_pm_put(i915); 1639 intel_runtime_pm_put_unchecked(i915);
1640 mutex_unlock(&i915->drm.struct_mutex); 1640 mutex_unlock(&i915->drm.struct_mutex);
1641 igt_global_reset_unlock(i915); 1641 igt_global_reset_unlock(i915);
1642 1642
@@ -1679,7 +1679,7 @@ int intel_hangcheck_live_selftests(struct drm_i915_private *i915)
1679 mutex_unlock(&i915->drm.struct_mutex); 1679 mutex_unlock(&i915->drm.struct_mutex);
1680 1680
1681 i915_modparams.enable_hangcheck = saved_hangcheck; 1681 i915_modparams.enable_hangcheck = saved_hangcheck;
1682 intel_runtime_pm_put(i915); 1682 intel_runtime_pm_put_unchecked(i915);
1683 1683
1684 return err; 1684 return err;
1685} 1685}
diff --git a/drivers/gpu/drm/i915/selftests/intel_lrc.c b/drivers/gpu/drm/i915/selftests/intel_lrc.c
index 00caaa00f02f..ac1b18a17f3c 100644
--- a/drivers/gpu/drm/i915/selftests/intel_lrc.c
+++ b/drivers/gpu/drm/i915/selftests/intel_lrc.c
@@ -65,7 +65,7 @@ err_spin:
65 igt_spinner_fini(&spin); 65 igt_spinner_fini(&spin);
66err_unlock: 66err_unlock:
67 igt_flush_test(i915, I915_WAIT_LOCKED); 67 igt_flush_test(i915, I915_WAIT_LOCKED);
68 intel_runtime_pm_put(i915); 68 intel_runtime_pm_put_unchecked(i915);
69 mutex_unlock(&i915->drm.struct_mutex); 69 mutex_unlock(&i915->drm.struct_mutex);
70 return err; 70 return err;
71} 71}
@@ -158,7 +158,7 @@ err_spin_hi:
158 igt_spinner_fini(&spin_hi); 158 igt_spinner_fini(&spin_hi);
159err_unlock: 159err_unlock:
160 igt_flush_test(i915, I915_WAIT_LOCKED); 160 igt_flush_test(i915, I915_WAIT_LOCKED);
161 intel_runtime_pm_put(i915); 161 intel_runtime_pm_put_unchecked(i915);
162 mutex_unlock(&i915->drm.struct_mutex); 162 mutex_unlock(&i915->drm.struct_mutex);
163 return err; 163 return err;
164} 164}
@@ -251,7 +251,7 @@ err_spin_hi:
251 igt_spinner_fini(&spin_hi); 251 igt_spinner_fini(&spin_hi);
252err_unlock: 252err_unlock:
253 igt_flush_test(i915, I915_WAIT_LOCKED); 253 igt_flush_test(i915, I915_WAIT_LOCKED);
254 intel_runtime_pm_put(i915); 254 intel_runtime_pm_put_unchecked(i915);
255 mutex_unlock(&i915->drm.struct_mutex); 255 mutex_unlock(&i915->drm.struct_mutex);
256 return err; 256 return err;
257 257
@@ -374,7 +374,7 @@ err_spin_hi:
374 igt_spinner_fini(&spin_hi); 374 igt_spinner_fini(&spin_hi);
375err_unlock: 375err_unlock:
376 igt_flush_test(i915, I915_WAIT_LOCKED); 376 igt_flush_test(i915, I915_WAIT_LOCKED);
377 intel_runtime_pm_put(i915); 377 intel_runtime_pm_put_unchecked(i915);
378 mutex_unlock(&i915->drm.struct_mutex); 378 mutex_unlock(&i915->drm.struct_mutex);
379 return err; 379 return err;
380} 380}
@@ -627,7 +627,7 @@ err_ctx:
627err_batch: 627err_batch:
628 i915_gem_object_put(smoke.batch); 628 i915_gem_object_put(smoke.batch);
629err_unlock: 629err_unlock:
630 intel_runtime_pm_put(smoke.i915); 630 intel_runtime_pm_put_unchecked(smoke.i915);
631 mutex_unlock(&smoke.i915->drm.struct_mutex); 631 mutex_unlock(&smoke.i915->drm.struct_mutex);
632 kfree(smoke.contexts); 632 kfree(smoke.contexts);
633 633
diff --git a/drivers/gpu/drm/i915/selftests/intel_workarounds.c b/drivers/gpu/drm/i915/selftests/intel_workarounds.c
index 8b3f3200a3bd..b1b39c70c702 100644
--- a/drivers/gpu/drm/i915/selftests/intel_workarounds.c
+++ b/drivers/gpu/drm/i915/selftests/intel_workarounds.c
@@ -94,7 +94,7 @@ read_nonprivs(struct i915_gem_context *ctx, struct intel_engine_cs *engine)
94 94
95 intel_runtime_pm_get(engine->i915); 95 intel_runtime_pm_get(engine->i915);
96 rq = i915_request_alloc(engine, ctx); 96 rq = i915_request_alloc(engine, ctx);
97 intel_runtime_pm_put(engine->i915); 97 intel_runtime_pm_put_unchecked(engine->i915);
98 if (IS_ERR(rq)) { 98 if (IS_ERR(rq)) {
99 err = PTR_ERR(rq); 99 err = PTR_ERR(rq);
100 goto err_pin; 100 goto err_pin;
@@ -241,7 +241,7 @@ switch_to_scratch_context(struct intel_engine_cs *engine,
241 else 241 else
242 rq = i915_request_alloc(engine, ctx); 242 rq = i915_request_alloc(engine, ctx);
243 243
244 intel_runtime_pm_put(engine->i915); 244 intel_runtime_pm_put_unchecked(engine->i915);
245 245
246 kernel_context_close(ctx); 246 kernel_context_close(ctx);
247 247
@@ -300,7 +300,7 @@ static int check_whitelist_across_reset(struct intel_engine_cs *engine,
300 300
301 intel_runtime_pm_get(i915); 301 intel_runtime_pm_get(i915);
302 err = reset(engine); 302 err = reset(engine);
303 intel_runtime_pm_put(i915); 303 intel_runtime_pm_put_unchecked(i915);
304 304
305 if (want_spin) { 305 if (want_spin) {
306 igt_spinner_end(&spin); 306 igt_spinner_end(&spin);
@@ -414,7 +414,7 @@ live_gpu_reset_gt_engine_workarounds(void *arg)
414 414
415out: 415out:
416 reference_lists_fini(i915, &lists); 416 reference_lists_fini(i915, &lists);
417 intel_runtime_pm_put(i915); 417 intel_runtime_pm_put_unchecked(i915);
418 igt_global_reset_unlock(i915); 418 igt_global_reset_unlock(i915);
419 419
420 return ok ? 0 : -ESRCH; 420 return ok ? 0 : -ESRCH;
@@ -496,7 +496,7 @@ live_engine_reset_gt_engine_workarounds(void *arg)
496 496
497err: 497err:
498 reference_lists_fini(i915, &lists); 498 reference_lists_fini(i915, &lists);
499 intel_runtime_pm_put(i915); 499 intel_runtime_pm_put_unchecked(i915);
500 igt_global_reset_unlock(i915); 500 igt_global_reset_unlock(i915);
501 kernel_context_close(ctx); 501 kernel_context_close(ctx);
502 502