Commit d4225a53 authored by Chris Wilson's avatar Chris Wilson

drm/i915: Syntatic sugar for using intel_runtime_pm

Frequently, we use intel_runtime_pm_get/_put around a small block.
Formalise that usage by providing a macro to define such a block with an
automatic closure to scope the intel_runtime_pm wakeref to that block,
i.e. macro abuse smelling of python.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190114142129.24398-15-chris@chris-wilson.co.uk
parent c9d08cc3
...@@ -953,9 +953,9 @@ static int i915_gpu_info_open(struct inode *inode, struct file *file) ...@@ -953,9 +953,9 @@ static int i915_gpu_info_open(struct inode *inode, struct file *file)
struct i915_gpu_state *gpu; struct i915_gpu_state *gpu;
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
wakeref = intel_runtime_pm_get(i915); gpu = NULL;
gpu = i915_capture_gpu_state(i915); with_intel_runtime_pm(i915, wakeref)
intel_runtime_pm_put(i915, wakeref); gpu = i915_capture_gpu_state(i915);
if (IS_ERR(gpu)) if (IS_ERR(gpu))
return PTR_ERR(gpu); return PTR_ERR(gpu);
...@@ -1287,17 +1287,15 @@ static int i915_hangcheck_info(struct seq_file *m, void *unused) ...@@ -1287,17 +1287,15 @@ static int i915_hangcheck_info(struct seq_file *m, void *unused)
return 0; return 0;
} }
wakeref = intel_runtime_pm_get(dev_priv); with_intel_runtime_pm(dev_priv, wakeref) {
for_each_engine(engine, dev_priv, id) {
acthd[id] = intel_engine_get_active_head(engine);
seqno[id] = intel_engine_get_seqno(engine);
}
for_each_engine(engine, dev_priv, id) { intel_engine_get_instdone(dev_priv->engine[RCS], &instdone);
acthd[id] = intel_engine_get_active_head(engine);
seqno[id] = intel_engine_get_seqno(engine);
} }
intel_engine_get_instdone(dev_priv->engine[RCS], &instdone);
intel_runtime_pm_put(dev_priv, wakeref);
if (timer_pending(&dev_priv->gpu_error.hangcheck_work.timer)) if (timer_pending(&dev_priv->gpu_error.hangcheck_work.timer))
seq_printf(m, "Hangcheck active, timer fires in %dms\n", seq_printf(m, "Hangcheck active, timer fires in %dms\n",
jiffies_to_msecs(dev_priv->gpu_error.hangcheck_work.timer.expires - jiffies_to_msecs(dev_priv->gpu_error.hangcheck_work.timer.expires -
...@@ -1573,18 +1571,16 @@ static int i915_drpc_info(struct seq_file *m, void *unused) ...@@ -1573,18 +1571,16 @@ static int i915_drpc_info(struct seq_file *m, void *unused)
{ {
struct drm_i915_private *dev_priv = node_to_i915(m->private); struct drm_i915_private *dev_priv = node_to_i915(m->private);
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
int err; int err = -ENODEV;
wakeref = intel_runtime_pm_get(dev_priv);
if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
err = vlv_drpc_info(m);
else if (INTEL_GEN(dev_priv) >= 6)
err = gen6_drpc_info(m);
else
err = ironlake_drpc_info(m);
intel_runtime_pm_put(dev_priv, wakeref); with_intel_runtime_pm(dev_priv, wakeref) {
if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
err = vlv_drpc_info(m);
else if (INTEL_GEN(dev_priv) >= 6)
err = gen6_drpc_info(m);
else
err = ironlake_drpc_info(m);
}
return err; return err;
} }
...@@ -2068,8 +2064,7 @@ static int i915_rps_boost_info(struct seq_file *m, void *data) ...@@ -2068,8 +2064,7 @@ static int i915_rps_boost_info(struct seq_file *m, void *data)
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
struct drm_file *file; struct drm_file *file;
wakeref = intel_runtime_pm_get_if_in_use(dev_priv); with_intel_runtime_pm_if_in_use(dev_priv, wakeref) {
if (wakeref) {
if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) { if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
mutex_lock(&dev_priv->pcu_lock); mutex_lock(&dev_priv->pcu_lock);
act_freq = vlv_punit_read(dev_priv, act_freq = vlv_punit_read(dev_priv,
...@@ -2080,7 +2075,6 @@ static int i915_rps_boost_info(struct seq_file *m, void *data) ...@@ -2080,7 +2075,6 @@ static int i915_rps_boost_info(struct seq_file *m, void *data)
act_freq = intel_get_cagf(dev_priv, act_freq = intel_get_cagf(dev_priv,
I915_READ(GEN6_RPSTAT1)); I915_READ(GEN6_RPSTAT1));
} }
intel_runtime_pm_put(dev_priv, wakeref);
} }
seq_printf(m, "RPS enabled? %d\n", rps->enabled); seq_printf(m, "RPS enabled? %d\n", rps->enabled);
...@@ -2172,9 +2166,8 @@ static int i915_huc_load_status_info(struct seq_file *m, void *data) ...@@ -2172,9 +2166,8 @@ static int i915_huc_load_status_info(struct seq_file *m, void *data)
p = drm_seq_file_printer(m); p = drm_seq_file_printer(m);
intel_uc_fw_dump(&dev_priv->huc.fw, &p); intel_uc_fw_dump(&dev_priv->huc.fw, &p);
wakeref = intel_runtime_pm_get(dev_priv); with_intel_runtime_pm(dev_priv, wakeref)
seq_printf(m, "\nHuC status 0x%08x:\n", I915_READ(HUC_STATUS2)); seq_printf(m, "\nHuC status 0x%08x:\n", I915_READ(HUC_STATUS2));
intel_runtime_pm_put(dev_priv, wakeref);
return 0; return 0;
} }
...@@ -2184,7 +2177,6 @@ static int i915_guc_load_status_info(struct seq_file *m, void *data) ...@@ -2184,7 +2177,6 @@ static int i915_guc_load_status_info(struct seq_file *m, void *data)
struct drm_i915_private *dev_priv = node_to_i915(m->private); struct drm_i915_private *dev_priv = node_to_i915(m->private);
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
struct drm_printer p; struct drm_printer p;
u32 tmp, i;
if (!HAS_GUC(dev_priv)) if (!HAS_GUC(dev_priv))
return -ENODEV; return -ENODEV;
...@@ -2192,22 +2184,23 @@ static int i915_guc_load_status_info(struct seq_file *m, void *data) ...@@ -2192,22 +2184,23 @@ static int i915_guc_load_status_info(struct seq_file *m, void *data)
p = drm_seq_file_printer(m); p = drm_seq_file_printer(m);
intel_uc_fw_dump(&dev_priv->guc.fw, &p); intel_uc_fw_dump(&dev_priv->guc.fw, &p);
wakeref = intel_runtime_pm_get(dev_priv); with_intel_runtime_pm(dev_priv, wakeref) {
u32 tmp = I915_READ(GUC_STATUS);
tmp = I915_READ(GUC_STATUS); u32 i;
seq_printf(m, "\nGuC status 0x%08x:\n", tmp); seq_printf(m, "\nGuC status 0x%08x:\n", tmp);
seq_printf(m, "\tBootrom status = 0x%x\n", seq_printf(m, "\tBootrom status = 0x%x\n",
(tmp & GS_BOOTROM_MASK) >> GS_BOOTROM_SHIFT); (tmp & GS_BOOTROM_MASK) >> GS_BOOTROM_SHIFT);
seq_printf(m, "\tuKernel status = 0x%x\n", seq_printf(m, "\tuKernel status = 0x%x\n",
(tmp & GS_UKERNEL_MASK) >> GS_UKERNEL_SHIFT); (tmp & GS_UKERNEL_MASK) >> GS_UKERNEL_SHIFT);
seq_printf(m, "\tMIA Core status = 0x%x\n", seq_printf(m, "\tMIA Core status = 0x%x\n",
(tmp & GS_MIA_MASK) >> GS_MIA_SHIFT); (tmp & GS_MIA_MASK) >> GS_MIA_SHIFT);
seq_puts(m, "\nScratch registers:\n"); seq_puts(m, "\nScratch registers:\n");
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++) {
seq_printf(m, "\t%2d: \t0x%x\n", i, I915_READ(SOFT_SCRATCH(i))); seq_printf(m, "\t%2d: \t0x%x\n",
i, I915_READ(SOFT_SCRATCH(i)));
intel_runtime_pm_put(dev_priv, wakeref); }
}
return 0; return 0;
} }
...@@ -2680,19 +2673,14 @@ static int i915_energy_uJ(struct seq_file *m, void *data) ...@@ -2680,19 +2673,14 @@ static int i915_energy_uJ(struct seq_file *m, void *data)
if (INTEL_GEN(dev_priv) < 6) if (INTEL_GEN(dev_priv) < 6)
return -ENODEV; return -ENODEV;
wakeref = intel_runtime_pm_get(dev_priv); if (rdmsrl_safe(MSR_RAPL_POWER_UNIT, &power))
if (rdmsrl_safe(MSR_RAPL_POWER_UNIT, &power)) {
intel_runtime_pm_put(dev_priv, wakeref);
return -ENODEV; return -ENODEV;
}
units = (power & 0x1f00) >> 8; units = (power & 0x1f00) >> 8;
power = I915_READ(MCH_SECP_NRG_STTS); with_intel_runtime_pm(dev_priv, wakeref)
power = (1000000 * power) >> units; /* convert to uJ */ power = I915_READ(MCH_SECP_NRG_STTS);
intel_runtime_pm_put(dev_priv, wakeref);
power = (1000000 * power) >> units; /* convert to uJ */
seq_printf(m, "%llu", power); seq_printf(m, "%llu", power);
return 0; return 0;
...@@ -3275,22 +3263,20 @@ static ssize_t i915_ipc_status_write(struct file *file, const char __user *ubuf, ...@@ -3275,22 +3263,20 @@ static ssize_t i915_ipc_status_write(struct file *file, const char __user *ubuf,
struct seq_file *m = file->private_data; struct seq_file *m = file->private_data;
struct drm_i915_private *dev_priv = m->private; struct drm_i915_private *dev_priv = m->private;
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
int ret;
bool enable; bool enable;
int ret;
ret = kstrtobool_from_user(ubuf, len, &enable); ret = kstrtobool_from_user(ubuf, len, &enable);
if (ret < 0) if (ret < 0)
return ret; return ret;
wakeref = intel_runtime_pm_get(dev_priv); with_intel_runtime_pm(dev_priv, wakeref) {
if (!dev_priv->ipc_enabled && enable)
if (!dev_priv->ipc_enabled && enable) DRM_INFO("Enabling IPC: WM will be proper only after next commit\n");
DRM_INFO("Enabling IPC: WM will be proper only after next commit\n"); dev_priv->wm.distrust_bios_wm = true;
dev_priv->wm.distrust_bios_wm = true; dev_priv->ipc_enabled = enable;
dev_priv->ipc_enabled = enable; intel_enable_ipc(dev_priv);
intel_enable_ipc(dev_priv); }
intel_runtime_pm_put(dev_priv, wakeref);
return len; return len;
} }
...@@ -4130,16 +4116,13 @@ i915_cache_sharing_get(void *data, u64 *val) ...@@ -4130,16 +4116,13 @@ i915_cache_sharing_get(void *data, u64 *val)
{ {
struct drm_i915_private *dev_priv = data; struct drm_i915_private *dev_priv = data;
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
u32 snpcr; u32 snpcr = 0;
if (!(IS_GEN_RANGE(dev_priv, 6, 7))) if (!(IS_GEN_RANGE(dev_priv, 6, 7)))
return -ENODEV; return -ENODEV;
wakeref = intel_runtime_pm_get(dev_priv); with_intel_runtime_pm(dev_priv, wakeref)
snpcr = I915_READ(GEN6_MBCUNIT_SNPCR);
snpcr = I915_READ(GEN6_MBCUNIT_SNPCR);
intel_runtime_pm_put(dev_priv, wakeref);
*val = (snpcr & GEN6_MBC_SNPCR_MASK) >> GEN6_MBC_SNPCR_SHIFT; *val = (snpcr & GEN6_MBC_SNPCR_MASK) >> GEN6_MBC_SNPCR_SHIFT;
...@@ -4151,7 +4134,6 @@ i915_cache_sharing_set(void *data, u64 val) ...@@ -4151,7 +4134,6 @@ i915_cache_sharing_set(void *data, u64 val)
{ {
struct drm_i915_private *dev_priv = data; struct drm_i915_private *dev_priv = data;
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
u32 snpcr;
if (!(IS_GEN_RANGE(dev_priv, 6, 7))) if (!(IS_GEN_RANGE(dev_priv, 6, 7)))
return -ENODEV; return -ENODEV;
...@@ -4159,16 +4141,17 @@ i915_cache_sharing_set(void *data, u64 val) ...@@ -4159,16 +4141,17 @@ i915_cache_sharing_set(void *data, u64 val)
if (val > 3) if (val > 3)
return -EINVAL; return -EINVAL;
wakeref = intel_runtime_pm_get(dev_priv);
DRM_DEBUG_DRIVER("Manually setting uncore sharing to %llu\n", val); DRM_DEBUG_DRIVER("Manually setting uncore sharing to %llu\n", val);
with_intel_runtime_pm(dev_priv, wakeref) {
u32 snpcr;
/* Update the cache sharing policy here as well */
snpcr = I915_READ(GEN6_MBCUNIT_SNPCR);
snpcr &= ~GEN6_MBC_SNPCR_MASK;
snpcr |= val << GEN6_MBC_SNPCR_SHIFT;
I915_WRITE(GEN6_MBCUNIT_SNPCR, snpcr);
}
/* Update the cache sharing policy here as well */
snpcr = I915_READ(GEN6_MBCUNIT_SNPCR);
snpcr &= ~GEN6_MBC_SNPCR_MASK;
snpcr |= (val << GEN6_MBC_SNPCR_SHIFT);
I915_WRITE(GEN6_MBCUNIT_SNPCR, snpcr);
intel_runtime_pm_put(dev_priv, wakeref);
return 0; return 0;
} }
...@@ -4405,20 +4388,17 @@ static int i915_sseu_status(struct seq_file *m, void *unused) ...@@ -4405,20 +4388,17 @@ static int i915_sseu_status(struct seq_file *m, void *unused)
sseu.max_eus_per_subslice = sseu.max_eus_per_subslice =
RUNTIME_INFO(dev_priv)->sseu.max_eus_per_subslice; RUNTIME_INFO(dev_priv)->sseu.max_eus_per_subslice;
wakeref = intel_runtime_pm_get(dev_priv); with_intel_runtime_pm(dev_priv, wakeref) {
if (IS_CHERRYVIEW(dev_priv))
if (IS_CHERRYVIEW(dev_priv)) { cherryview_sseu_device_status(dev_priv, &sseu);
cherryview_sseu_device_status(dev_priv, &sseu); else if (IS_BROADWELL(dev_priv))
} else if (IS_BROADWELL(dev_priv)) { broadwell_sseu_device_status(dev_priv, &sseu);
broadwell_sseu_device_status(dev_priv, &sseu); else if (IS_GEN(dev_priv, 9))
} else if (IS_GEN(dev_priv, 9)) { gen9_sseu_device_status(dev_priv, &sseu);
gen9_sseu_device_status(dev_priv, &sseu); else if (INTEL_GEN(dev_priv) >= 10)
} else if (INTEL_GEN(dev_priv) >= 10) { gen10_sseu_device_status(dev_priv, &sseu);
gen10_sseu_device_status(dev_priv, &sseu);
} }
intel_runtime_pm_put(dev_priv, wakeref);
i915_print_sseu_info(m, false, &sseu); i915_print_sseu_info(m, false, &sseu);
return 0; return 0;
......
...@@ -813,13 +813,13 @@ void i915_gem_flush_ggtt_writes(struct drm_i915_private *dev_priv) ...@@ -813,13 +813,13 @@ void i915_gem_flush_ggtt_writes(struct drm_i915_private *dev_priv)
i915_gem_chipset_flush(dev_priv); i915_gem_chipset_flush(dev_priv);
wakeref = intel_runtime_pm_get(dev_priv); with_intel_runtime_pm(dev_priv, wakeref) {
spin_lock_irq(&dev_priv->uncore.lock); spin_lock_irq(&dev_priv->uncore.lock);
POSTING_READ_FW(RING_HEAD(RENDER_RING_BASE)); POSTING_READ_FW(RING_HEAD(RENDER_RING_BASE));
spin_unlock_irq(&dev_priv->uncore.lock); spin_unlock_irq(&dev_priv->uncore.lock);
intel_runtime_pm_put(dev_priv, wakeref); }
} }
static void static void
......
...@@ -2535,9 +2535,8 @@ static int ggtt_bind_vma(struct i915_vma *vma, ...@@ -2535,9 +2535,8 @@ static int ggtt_bind_vma(struct i915_vma *vma,
if (i915_gem_object_is_readonly(obj)) if (i915_gem_object_is_readonly(obj))
pte_flags |= PTE_READ_ONLY; pte_flags |= PTE_READ_ONLY;
wakeref = intel_runtime_pm_get(i915); with_intel_runtime_pm(i915, wakeref)
vma->vm->insert_entries(vma->vm, vma, cache_level, pte_flags); vma->vm->insert_entries(vma->vm, vma, cache_level, pte_flags);
intel_runtime_pm_put(i915, wakeref);
vma->page_sizes.gtt = I915_GTT_PAGE_SIZE; vma->page_sizes.gtt = I915_GTT_PAGE_SIZE;
...@@ -2556,9 +2555,8 @@ static void ggtt_unbind_vma(struct i915_vma *vma) ...@@ -2556,9 +2555,8 @@ static void ggtt_unbind_vma(struct i915_vma *vma)
struct drm_i915_private *i915 = vma->vm->i915; struct drm_i915_private *i915 = vma->vm->i915;
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
wakeref = intel_runtime_pm_get(i915); with_intel_runtime_pm(i915, wakeref)
vma->vm->clear_range(vma->vm, vma->node.start, vma->size); vma->vm->clear_range(vma->vm, vma->node.start, vma->size);
intel_runtime_pm_put(i915, wakeref);
} }
static int aliasing_gtt_bind_vma(struct i915_vma *vma, static int aliasing_gtt_bind_vma(struct i915_vma *vma,
...@@ -2592,9 +2590,10 @@ static int aliasing_gtt_bind_vma(struct i915_vma *vma, ...@@ -2592,9 +2590,10 @@ static int aliasing_gtt_bind_vma(struct i915_vma *vma,
if (flags & I915_VMA_GLOBAL_BIND) { if (flags & I915_VMA_GLOBAL_BIND) {
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
wakeref = intel_runtime_pm_get(i915); with_intel_runtime_pm(i915, wakeref) {
vma->vm->insert_entries(vma->vm, vma, cache_level, pte_flags); vma->vm->insert_entries(vma->vm, vma,
intel_runtime_pm_put(i915, wakeref); cache_level, pte_flags);
}
} }
return 0; return 0;
...@@ -2605,11 +2604,11 @@ static void aliasing_gtt_unbind_vma(struct i915_vma *vma) ...@@ -2605,11 +2604,11 @@ static void aliasing_gtt_unbind_vma(struct i915_vma *vma)
struct drm_i915_private *i915 = vma->vm->i915; struct drm_i915_private *i915 = vma->vm->i915;
if (vma->flags & I915_VMA_GLOBAL_BIND) { if (vma->flags & I915_VMA_GLOBAL_BIND) {
struct i915_address_space *vm = vma->vm;
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
wakeref = intel_runtime_pm_get(i915); with_intel_runtime_pm(i915, wakeref)
vma->vm->clear_range(vma->vm, vma->node.start, vma->size); vm->clear_range(vm, vma->node.start, vma->size);
intel_runtime_pm_put(i915, wakeref);
} }
if (vma->flags & I915_VMA_LOCAL_BIND) { if (vma->flags & I915_VMA_LOCAL_BIND) {
......
...@@ -296,14 +296,14 @@ i915_gem_shrink(struct drm_i915_private *i915, ...@@ -296,14 +296,14 @@ i915_gem_shrink(struct drm_i915_private *i915,
unsigned long i915_gem_shrink_all(struct drm_i915_private *i915) unsigned long i915_gem_shrink_all(struct drm_i915_private *i915)
{ {
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
unsigned long freed; unsigned long freed = 0;
wakeref = intel_runtime_pm_get(i915); with_intel_runtime_pm(i915, wakeref) {
freed = i915_gem_shrink(i915, -1UL, NULL, freed = i915_gem_shrink(i915, -1UL, NULL,
I915_SHRINK_BOUND | I915_SHRINK_BOUND |
I915_SHRINK_UNBOUND | I915_SHRINK_UNBOUND |
I915_SHRINK_ACTIVE); I915_SHRINK_ACTIVE);
intel_runtime_pm_put(i915, wakeref); }
return freed; return freed;
} }
...@@ -376,14 +376,14 @@ i915_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc) ...@@ -376,14 +376,14 @@ i915_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc)
if (sc->nr_scanned < sc->nr_to_scan && current_is_kswapd()) { if (sc->nr_scanned < sc->nr_to_scan && current_is_kswapd()) {
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
wakeref = intel_runtime_pm_get(i915); with_intel_runtime_pm(i915, wakeref) {
freed += i915_gem_shrink(i915, freed += i915_gem_shrink(i915,
sc->nr_to_scan - sc->nr_scanned, sc->nr_to_scan - sc->nr_scanned,
&sc->nr_scanned, &sc->nr_scanned,
I915_SHRINK_ACTIVE | I915_SHRINK_ACTIVE |
I915_SHRINK_BOUND | I915_SHRINK_BOUND |
I915_SHRINK_UNBOUND); I915_SHRINK_UNBOUND);
intel_runtime_pm_put(i915, wakeref); }
} }
shrinker_unlock(i915, unlock); shrinker_unlock(i915, unlock);
...@@ -400,11 +400,11 @@ i915_gem_shrinker_oom(struct notifier_block *nb, unsigned long event, void *ptr) ...@@ -400,11 +400,11 @@ i915_gem_shrinker_oom(struct notifier_block *nb, unsigned long event, void *ptr)
unsigned long unevictable, bound, unbound, freed_pages; unsigned long unevictable, bound, unbound, freed_pages;
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
wakeref = intel_runtime_pm_get(i915); freed_pages = 0;
freed_pages = i915_gem_shrink(i915, -1UL, NULL, with_intel_runtime_pm(i915, wakeref)
I915_SHRINK_BOUND | freed_pages += i915_gem_shrink(i915, -1UL, NULL,
I915_SHRINK_UNBOUND); I915_SHRINK_BOUND |
intel_runtime_pm_put(i915, wakeref); I915_SHRINK_UNBOUND);
/* Because we may be allocating inside our own driver, we cannot /* Because we may be allocating inside our own driver, we cannot
* assert that there are no objects with pinned pages that are not * assert that there are no objects with pinned pages that are not
...@@ -454,12 +454,11 @@ i915_gem_shrinker_vmap(struct notifier_block *nb, unsigned long event, void *ptr ...@@ -454,12 +454,11 @@ i915_gem_shrinker_vmap(struct notifier_block *nb, unsigned long event, void *ptr
MAX_SCHEDULE_TIMEOUT)) MAX_SCHEDULE_TIMEOUT))
goto out; goto out;
wakeref = intel_runtime_pm_get(i915); with_intel_runtime_pm(i915, wakeref)
freed_pages += i915_gem_shrink(i915, -1UL, NULL, freed_pages += i915_gem_shrink(i915, -1UL, NULL,
I915_SHRINK_BOUND | I915_SHRINK_BOUND |
I915_SHRINK_UNBOUND | I915_SHRINK_UNBOUND |
I915_SHRINK_VMAPS); I915_SHRINK_VMAPS);
intel_runtime_pm_put(i915, wakeref);
/* We also want to clear any cached iomaps as they wrap vmap */ /* We also want to clear any cached iomaps as they wrap vmap */
list_for_each_entry_safe(vma, next, list_for_each_entry_safe(vma, next,
......
...@@ -230,14 +230,11 @@ frequency_sample(struct drm_i915_private *dev_priv, unsigned int period_ns) ...@@ -230,14 +230,11 @@ frequency_sample(struct drm_i915_private *dev_priv, unsigned int period_ns)
val = dev_priv->gt_pm.rps.cur_freq; val = dev_priv->gt_pm.rps.cur_freq;
if (dev_priv->gt.awake) { if (dev_priv->gt.awake) {
intel_wakeref_t wakeref = intel_wakeref_t wakeref;
intel_runtime_pm_get_if_in_use(dev_priv);
if (wakeref) { with_intel_runtime_pm_if_in_use(dev_priv, wakeref)
val = intel_get_cagf(dev_priv, val = intel_get_cagf(dev_priv,
I915_READ_NOTRACE(GEN6_RPSTAT1)); I915_READ_NOTRACE(GEN6_RPSTAT1));
intel_runtime_pm_put(dev_priv, wakeref);
}
} }
add_sample_mult(&dev_priv->pmu.sample[__I915_SAMPLE_FREQ_ACT], add_sample_mult(&dev_priv->pmu.sample[__I915_SAMPLE_FREQ_ACT],
......
...@@ -43,11 +43,10 @@ static u32 calc_residency(struct drm_i915_private *dev_priv, ...@@ -43,11 +43,10 @@ static u32 calc_residency(struct drm_i915_private *dev_priv,
i915_reg_t reg) i915_reg_t reg)
{ {
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
u64 res; u64 res = 0;
wakeref = intel_runtime_pm_get(dev_priv); with_intel_runtime_pm(dev_priv, wakeref)
res = intel_rc6_residency_us(dev_priv, reg); res = intel_rc6_residency_us(dev_priv, reg);
intel_runtime_pm_put(dev_priv, wakeref);
return DIV_ROUND_CLOSEST_ULL(res, 1000); return DIV_ROUND_CLOSEST_ULL(res, 1000);
} }
......
...@@ -2187,6 +2187,14 @@ intel_wakeref_t intel_runtime_pm_get(struct drm_i915_private *i915); ...@@ -2187,6 +2187,14 @@ intel_wakeref_t intel_runtime_pm_get(struct drm_i915_private *i915);
intel_wakeref_t intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915); intel_wakeref_t intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915);
intel_wakeref_t intel_runtime_pm_get_noresume(struct drm_i915_private *i915); intel_wakeref_t intel_runtime_pm_get_noresume(struct drm_i915_private *i915);
#define with_intel_runtime_pm(i915, wf) \
for ((wf) = intel_runtime_pm_get(i915); (wf); \
intel_runtime_pm_put((i915), (wf)), (wf) = 0)
#define with_intel_runtime_pm_if_in_use(i915, wf) \
for ((wf) = intel_runtime_pm_get_if_in_use(i915); (wf); \
intel_runtime_pm_put((i915), (wf)), (wf) = 0)
void intel_runtime_pm_put_unchecked(struct drm_i915_private *i915); void intel_runtime_pm_put_unchecked(struct drm_i915_private *i915);
#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM) #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
void intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref); void intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref);
......
...@@ -444,9 +444,8 @@ static void guc_log_capture_logs(struct intel_guc_log *log) ...@@ -444,9 +444,8 @@ static void guc_log_capture_logs(struct intel_guc_log *log)
* Generally device is expected to be active only at this * Generally device is expected to be active only at this
* time, so get/put should be really quick. * time, so get/put should be really quick.
*/ */
wakeref = intel_runtime_pm_get(dev_priv); with_intel_runtime_pm(dev_priv, wakeref)
guc_action_flush_log_complete(guc); guc_action_flush_log_complete(guc);
intel_runtime_pm_put(dev_priv, wakeref);
} }
int intel_guc_log_create(struct intel_guc_log *log) int intel_guc_log_create(struct intel_guc_log *log)
...@@ -507,7 +506,7 @@ int intel_guc_log_set_level(struct intel_guc_log *log, u32 level) ...@@ -507,7 +506,7 @@ int intel_guc_log_set_level(struct intel_guc_log *log, u32 level)
struct intel_guc *guc = log_to_guc(log); struct intel_guc *guc = log_to_guc(log);
struct drm_i915_private *dev_priv = guc_to_i915(guc); struct drm_i915_private *dev_priv = guc_to_i915(guc);
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
int ret; int ret = 0;
BUILD_BUG_ON(GUC_LOG_VERBOSITY_MIN != 0); BUILD_BUG_ON(GUC_LOG_VERBOSITY_MIN != 0);
GEM_BUG_ON(!log->vma); GEM_BUG_ON(!log->vma);
...@@ -521,16 +520,14 @@ int intel_guc_log_set_level(struct intel_guc_log *log, u32 level) ...@@ -521,16 +520,14 @@ int intel_guc_log_set_level(struct intel_guc_log *log, u32 level)
mutex_lock(&dev_priv->drm.struct_mutex); mutex_lock(&dev_priv->drm.struct_mutex);
if (log->level == level) { if (log->level == level)
ret = 0;
goto out_unlock; goto out_unlock;
}
wakeref = intel_runtime_pm_get(dev_priv); with_intel_runtime_pm(dev_priv, wakeref)
ret = guc_action_control_log(guc, GUC_LOG_LEVEL_IS_VERBOSE(level), ret = guc_action_control_log(guc,
GUC_LOG_LEVEL_IS_ENABLED(level), GUC_LOG_LEVEL_IS_VERBOSE(level),
GUC_LOG_LEVEL_TO_VERBOSITY(level)); GUC_LOG_LEVEL_IS_ENABLED(level),
intel_runtime_pm_put(dev_priv, wakeref); GUC_LOG_LEVEL_TO_VERBOSITY(level));
if (ret) { if (ret) {
DRM_DEBUG_DRIVER("guc_log_control action failed %d\n", ret); DRM_DEBUG_DRIVER("guc_log_control action failed %d\n", ret);
goto out_unlock; goto out_unlock;
...@@ -611,9 +608,8 @@ void intel_guc_log_relay_flush(struct intel_guc_log *log) ...@@ -611,9 +608,8 @@ void intel_guc_log_relay_flush(struct intel_guc_log *log)
*/ */
flush_work(&log->relay.flush_work); flush_work(&log->relay.flush_work);
wakeref = intel_runtime_pm_get(i915); with_intel_runtime_pm(i915, wakeref)
guc_action_flush_log(guc); guc_action_flush_log(guc);
intel_runtime_pm_put(i915, wakeref);
/* GuC would have updated log buffer by now, so capture it */ /* GuC would have updated log buffer by now, so capture it */
guc_log_capture_logs(log); guc_log_capture_logs(log);
......
...@@ -116,14 +116,13 @@ int intel_huc_check_status(struct intel_huc *huc) ...@@ -116,14 +116,13 @@ int intel_huc_check_status(struct intel_huc *huc)
{ {
struct drm_i915_private *dev_priv = huc_to_i915(huc); struct drm_i915_private *dev_priv = huc_to_i915(huc);
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
bool status; bool status = false;
if (!HAS_HUC(dev_priv)) if (!HAS_HUC(dev_priv))
return -ENODEV; return -ENODEV;
wakeref = intel_runtime_pm_get(dev_priv); with_intel_runtime_pm(dev_priv, wakeref)
status = I915_READ(HUC_STATUS2) & HUC_FW_VERIFIED; status = I915_READ(HUC_STATUS2) & HUC_FW_VERIFIED;
intel_runtime_pm_put(dev_priv, wakeref);
return status; return status;
} }
...@@ -1204,17 +1204,19 @@ static int intel_backlight_device_get_brightness(struct backlight_device *bd) ...@@ -1204,17 +1204,19 @@ static int intel_backlight_device_get_brightness(struct backlight_device *bd)
struct drm_device *dev = connector->base.dev; struct drm_device *dev = connector->base.dev;
struct drm_i915_private *dev_priv = to_i915(dev); struct drm_i915_private *dev_priv = to_i915(dev);
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
u32 hw_level; int ret = 0;
int ret;
wakeref = intel_runtime_pm_get(dev_priv); with_intel_runtime_pm(dev_priv, wakeref) {
drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); u32 hw_level;
hw_level = intel_panel_get_backlight(connector); drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
ret = scale_hw_to_user(connector, hw_level, bd->props.max_brightness);
drm_modeset_unlock(&dev->mode_config.connection_mutex); hw_level = intel_panel_get_backlight(connector);
intel_runtime_pm_put(dev_priv, wakeref); ret = scale_hw_to_user(connector,
hw_level, bd->props.max_brightness);
drm_modeset_unlock(&dev->mode_config.connection_mutex);
}
return ret; return ret;
} }
......
...@@ -1696,21 +1696,21 @@ int i915_reg_read_ioctl(struct drm_device *dev, ...@@ -1696,21 +1696,21 @@ int i915_reg_read_ioctl(struct drm_device *dev,
flags = reg->offset & (entry->size - 1); flags = reg->offset & (entry->size - 1);
wakeref = intel_runtime_pm_get(dev_priv); with_intel_runtime_pm(dev_priv, wakeref) {
if (entry->size == 8 && flags == I915_REG_READ_8B_WA) if (entry->size == 8 && flags == I915_REG_READ_8B_WA)
reg->val = I915_READ64_2x32(entry->offset_ldw, reg->val = I915_READ64_2x32(entry->offset_ldw,
entry->offset_udw); entry->offset_udw);
else if (entry->size == 8 && flags == 0) else if (entry->size == 8 && flags == 0)
reg->val = I915_READ64(entry->offset_ldw); reg->val = I915_READ64(entry->offset_ldw);
else if (entry->size == 4 && flags == 0) else if (entry->size == 4 && flags == 0)
reg->val = I915_READ(entry->offset_ldw); reg->val = I915_READ(entry->offset_ldw);
else if (entry->size == 2 && flags == 0) else if (entry->size == 2 && flags == 0)
reg->val = I915_READ16(entry->offset_ldw); reg->val = I915_READ16(entry->offset_ldw);
else if (entry->size == 1 && flags == 0) else if (entry->size == 1 && flags == 0)
reg->val = I915_READ8(entry->offset_ldw); reg->val = I915_READ8(entry->offset_ldw);
else else
ret = -EINVAL; ret = -EINVAL;
intel_runtime_pm_put(dev_priv, wakeref); }
return ret; return ret;
} }
......
...@@ -98,26 +98,22 @@ static void pm_suspend(struct drm_i915_private *i915) ...@@ -98,26 +98,22 @@ static void pm_suspend(struct drm_i915_private *i915)
{ {
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
wakeref = intel_runtime_pm_get(i915); with_intel_runtime_pm(i915, wakeref) {
i915_gem_suspend_gtt_mappings(i915);
i915_gem_suspend_gtt_mappings(i915); i915_gem_suspend_late(i915);
i915_gem_suspend_late(i915); }
intel_runtime_pm_put(i915, wakeref);
} }
static void pm_hibernate(struct drm_i915_private *i915) static void pm_hibernate(struct drm_i915_private *i915)
{ {
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
wakeref = intel_runtime_pm_get(i915); with_intel_runtime_pm(i915, wakeref) {
i915_gem_suspend_gtt_mappings(i915);
i915_gem_suspend_gtt_mappings(i915);
i915_gem_freeze(i915);
i915_gem_freeze_late(i915);
intel_runtime_pm_put(i915, wakeref); i915_gem_freeze(i915);
i915_gem_freeze_late(i915);
}
} }
static void pm_resume(struct drm_i915_private *i915) static void pm_resume(struct drm_i915_private *i915)
...@@ -128,13 +124,11 @@ static void pm_resume(struct drm_i915_private *i915) ...@@ -128,13 +124,11 @@ static void pm_resume(struct drm_i915_private *i915)
* Both suspend and hibernate follow the same wakeup path and assume * Both suspend and hibernate follow the same wakeup path and assume
* that runtime-pm just works. * that runtime-pm just works.
*/ */
wakeref = intel_runtime_pm_get(i915); with_intel_runtime_pm(i915, wakeref) {
intel_engines_sanitize(i915, false);
intel_engines_sanitize(i915, false); i915_gem_sanitize(i915);
i915_gem_sanitize(i915); i915_gem_resume(i915);
i915_gem_resume(i915); }
intel_runtime_pm_put(i915, wakeref);
} }
static int igt_gem_suspend(void *arg) static int igt_gem_suspend(void *arg)
......
...@@ -610,9 +610,9 @@ static int igt_ctx_exec(void *arg) ...@@ -610,9 +610,9 @@ static int igt_ctx_exec(void *arg)
} }
} }
wakeref = intel_runtime_pm_get(i915); err = 0;
err = gpu_fill(obj, ctx, engine, dw); with_intel_runtime_pm(i915, wakeref)
intel_runtime_pm_put(i915, wakeref); err = gpu_fill(obj, ctx, engine, dw);
if (err) { if (err) {
pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) in ctx %u [full-ppgtt? %s], err=%d\n", pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) in ctx %u [full-ppgtt? %s], err=%d\n",
ndwords, dw, max_dwords(obj), ndwords, dw, max_dwords(obj),
...@@ -718,9 +718,9 @@ static int igt_ctx_readonly(void *arg) ...@@ -718,9 +718,9 @@ static int igt_ctx_readonly(void *arg)
i915_gem_object_set_readonly(obj); i915_gem_object_set_readonly(obj);
} }
wakeref = intel_runtime_pm_get(i915); err = 0;
err = gpu_fill(obj, ctx, engine, dw); with_intel_runtime_pm(i915, wakeref)
intel_runtime_pm_put(i915, wakeref); err = gpu_fill(obj, ctx, engine, dw);
if (err) { if (err) {
pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) in ctx %u [full-ppgtt? %s], err=%d\n", pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) in ctx %u [full-ppgtt? %s], err=%d\n",
ndwords, dw, max_dwords(obj), ndwords, dw, max_dwords(obj),
......
...@@ -484,18 +484,16 @@ int i915_gem_evict_mock_selftests(void) ...@@ -484,18 +484,16 @@ int i915_gem_evict_mock_selftests(void)
}; };
struct drm_i915_private *i915; struct drm_i915_private *i915;
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
int err; int err = 0;
i915 = mock_gem_device(); i915 = mock_gem_device();
if (!i915) if (!i915)
return -ENOMEM; return -ENOMEM;
mutex_lock(&i915->drm.struct_mutex); mutex_lock(&i915->drm.struct_mutex);
wakeref = intel_runtime_pm_get(i915); with_intel_runtime_pm(i915, wakeref)
err = i915_subtests(tests, i915);
err = i915_subtests(tests, i915);
intel_runtime_pm_put(i915, wakeref);
mutex_unlock(&i915->drm.struct_mutex); mutex_unlock(&i915->drm.struct_mutex);
drm_dev_put(&i915->drm); drm_dev_put(&i915->drm);
......
...@@ -509,9 +509,8 @@ static void disable_retire_worker(struct drm_i915_private *i915) ...@@ -509,9 +509,8 @@ static void disable_retire_worker(struct drm_i915_private *i915)
if (!i915->gt.active_requests++) { if (!i915->gt.active_requests++) {
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
wakeref = intel_runtime_pm_get(i915); with_intel_runtime_pm(i915, wakeref)
i915_gem_unpark(i915); i915_gem_unpark(i915);
intel_runtime_pm_put(i915, wakeref);
} }
mutex_unlock(&i915->drm.struct_mutex); mutex_unlock(&i915->drm.struct_mutex);
...@@ -593,10 +592,10 @@ static int igt_mmap_offset_exhaustion(void *arg) ...@@ -593,10 +592,10 @@ static int igt_mmap_offset_exhaustion(void *arg)
goto out; goto out;
} }
err = 0;
mutex_lock(&i915->drm.struct_mutex); mutex_lock(&i915->drm.struct_mutex);
wakeref = intel_runtime_pm_get(i915); with_intel_runtime_pm(i915, wakeref)
err = make_obj_busy(obj); err = make_obj_busy(obj);
intel_runtime_pm_put(i915, wakeref);
mutex_unlock(&i915->drm.struct_mutex); mutex_unlock(&i915->drm.struct_mutex);
if (err) { if (err) {
pr_err("[loop %d] Failed to busy the object\n", loop); pr_err("[loop %d] Failed to busy the object\n", loop);
......
...@@ -256,17 +256,15 @@ int i915_request_mock_selftests(void) ...@@ -256,17 +256,15 @@ int i915_request_mock_selftests(void)
}; };
struct drm_i915_private *i915; struct drm_i915_private *i915;
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
int err; int err = 0;
i915 = mock_gem_device(); i915 = mock_gem_device();
if (!i915) if (!i915)
return -ENOMEM; return -ENOMEM;
wakeref = intel_runtime_pm_get(i915); with_intel_runtime_pm(i915, wakeref)
err = i915_subtests(tests, i915);
err = i915_subtests(tests, i915);
intel_runtime_pm_put(i915, wakeref);
drm_dev_put(&i915->drm); drm_dev_put(&i915->drm);
return err; return err;
......
...@@ -93,9 +93,9 @@ read_nonprivs(struct i915_gem_context *ctx, struct intel_engine_cs *engine) ...@@ -93,9 +93,9 @@ read_nonprivs(struct i915_gem_context *ctx, struct intel_engine_cs *engine)
if (err) if (err)
goto err_obj; goto err_obj;
wakeref = intel_runtime_pm_get(engine->i915); rq = ERR_PTR(-ENODEV);
rq = i915_request_alloc(engine, ctx); with_intel_runtime_pm(engine->i915, wakeref)
intel_runtime_pm_put(engine->i915, wakeref); rq = i915_request_alloc(engine, ctx);
if (IS_ERR(rq)) { if (IS_ERR(rq)) {
err = PTR_ERR(rq); err = PTR_ERR(rq);
goto err_pin; goto err_pin;
...@@ -236,14 +236,15 @@ switch_to_scratch_context(struct intel_engine_cs *engine, ...@@ -236,14 +236,15 @@ switch_to_scratch_context(struct intel_engine_cs *engine,
if (IS_ERR(ctx)) if (IS_ERR(ctx))
return PTR_ERR(ctx); return PTR_ERR(ctx);
wakeref = intel_runtime_pm_get(engine->i915); rq = ERR_PTR(-ENODEV);
with_intel_runtime_pm(engine->i915, wakeref) {
if (spin) if (spin)
rq = igt_spinner_create_request(spin, ctx, engine, MI_NOOP); rq = igt_spinner_create_request(spin,
else ctx, engine,
rq = i915_request_alloc(engine, ctx); MI_NOOP);
else
intel_runtime_pm_put(engine->i915, wakeref); rq = i915_request_alloc(engine, ctx);
}
kernel_context_close(ctx); kernel_context_close(ctx);
...@@ -301,9 +302,8 @@ static int check_whitelist_across_reset(struct intel_engine_cs *engine, ...@@ -301,9 +302,8 @@ static int check_whitelist_across_reset(struct intel_engine_cs *engine,
if (err) if (err)
goto out; goto out;
wakeref = intel_runtime_pm_get(i915); with_intel_runtime_pm(i915, wakeref)
err = reset(engine); err = reset(engine);
intel_runtime_pm_put(i915, wakeref);
if (want_spin) { if (want_spin) {
igt_spinner_end(&spin); igt_spinner_end(&spin);
......
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