[Intel-gfx] [PATCH 05/22] drm/i915/selftests: Take GEM runtime wakeref

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Mon Apr 1 15:34:11 UTC 2019


On 25/03/2019 09:03, Chris Wilson wrote:
> Transition from calling the lower level intel_runtime_pm functions to
> using the GEM runtime_pm functions (i915_gem_unpark, i915_gem_park) now
> that they are decoupled from struct_mutex. This has the small advantage
> of reducing our overhead for request emission and ensuring that GEM
> state is locked awake during the tests (to reduce interference).

Too tedious to read in detail. Actually not purely tedious, but 
inversion of get and unpark (positive and negative) is just constantly 
hard to read.

Otherwise there are some aspect of this I like - like more explicitly 
controlling the GEM/GT readiness, and some which I don't, like: a) 
churn, b) changing the direction from the recommendation insofar to grab 
rpm over the smallest section, to now reversing that, and c) 
i915_gem_unpark as a name was okay in the old world, but if this is now 
a central API to wake up the device I am not so crazy about the unpark name.

Regards,

Tvrtko


> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>   drivers/gpu/drm/i915/selftests/huge_pages.c   |  5 +-
>   drivers/gpu/drm/i915/selftests/i915_active.c  | 11 ++---
>   drivers/gpu/drm/i915/selftests/i915_gem.c     |  5 +-
>   .../drm/i915/selftests/i915_gem_coherency.c   |  6 +--
>   .../gpu/drm/i915/selftests/i915_gem_context.c | 49 ++++++++-----------
>   .../gpu/drm/i915/selftests/i915_gem_evict.c   |  6 +--
>   .../gpu/drm/i915/selftests/i915_gem_object.c  |  8 ++-
>   drivers/gpu/drm/i915/selftests/i915_request.c | 33 ++++++-------
>   .../gpu/drm/i915/selftests/i915_timeline.c    | 21 ++++----
>   drivers/gpu/drm/i915/selftests/intel_guc.c    |  9 ++--
>   .../gpu/drm/i915/selftests/intel_hangcheck.c  | 19 ++++---
>   drivers/gpu/drm/i915/selftests/intel_lrc.c    | 41 +++++++---------
>   .../drm/i915/selftests/intel_workarounds.c    | 23 ++++-----
>   13 files changed, 105 insertions(+), 131 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/selftests/huge_pages.c b/drivers/gpu/drm/i915/selftests/huge_pages.c
> index 90721b54e7ae..1597a6e1f364 100644
> --- a/drivers/gpu/drm/i915/selftests/huge_pages.c
> +++ b/drivers/gpu/drm/i915/selftests/huge_pages.c
> @@ -1753,7 +1753,6 @@ int i915_gem_huge_page_live_selftests(struct drm_i915_private *dev_priv)
>   	};
>   	struct drm_file *file;
>   	struct i915_gem_context *ctx;
> -	intel_wakeref_t wakeref;
>   	int err;
>   
>   	if (!HAS_PPGTT(dev_priv)) {
> @@ -1769,7 +1768,7 @@ int i915_gem_huge_page_live_selftests(struct drm_i915_private *dev_priv)
>   		return PTR_ERR(file);
>   
>   	mutex_lock(&dev_priv->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(dev_priv);
> +	i915_gem_unpark(dev_priv);
>   
>   	ctx = live_context(dev_priv, file);
>   	if (IS_ERR(ctx)) {
> @@ -1783,7 +1782,7 @@ int i915_gem_huge_page_live_selftests(struct drm_i915_private *dev_priv)
>   	err = i915_subtests(tests, ctx);
>   
>   out_unlock:
> -	intel_runtime_pm_put(dev_priv, wakeref);
> +	i915_gem_park(dev_priv);
>   	mutex_unlock(&dev_priv->drm.struct_mutex);
>   
>   	mock_file_free(dev_priv, file);
> diff --git a/drivers/gpu/drm/i915/selftests/i915_active.c b/drivers/gpu/drm/i915/selftests/i915_active.c
> index 27d8f853111b..42bcceba175c 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_active.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_active.c
> @@ -5,6 +5,7 @@
>    */
>   
>   #include "../i915_selftest.h"
> +#include "../i915_gem_pm.h"
>   
>   #include "igt_flush_test.h"
>   #include "lib_sw_fence.h"
> @@ -89,13 +90,12 @@ static int live_active_wait(void *arg)
>   {
>   	struct drm_i915_private *i915 = arg;
>   	struct live_active active;
> -	intel_wakeref_t wakeref;
>   	int err;
>   
>   	/* Check that we get a callback when requests retire upon waiting */
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	err = __live_active_setup(i915, &active);
>   
> @@ -109,8 +109,8 @@ static int live_active_wait(void *arg)
>   	if (igt_flush_test(i915, I915_WAIT_LOCKED))
>   		err = -EIO;
>   
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   	return err;
>   }
>   
> @@ -118,13 +118,12 @@ static int live_active_retire(void *arg)
>   {
>   	struct drm_i915_private *i915 = arg;
>   	struct live_active active;
> -	intel_wakeref_t wakeref;
>   	int err;
>   
>   	/* Check that we get a callback when requests are indirectly retired */
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	err = __live_active_setup(i915, &active);
>   
> @@ -138,8 +137,8 @@ static int live_active_retire(void *arg)
>   	}
>   
>   	i915_active_fini(&active.base);
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   	return err;
>   }
>   
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem.c b/drivers/gpu/drm/i915/selftests/i915_gem.c
> index 50bb7bbd26d3..7d79f1fe6bbd 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem.c
> @@ -16,10 +16,9 @@ static int switch_to_context(struct drm_i915_private *i915,
>   {
>   	struct intel_engine_cs *engine;
>   	enum intel_engine_id id;
> -	intel_wakeref_t wakeref;
>   	int err = 0;
>   
> -	wakeref = intel_runtime_pm_get(i915);
> +	i915_gem_unpark(i915);
>   
>   	for_each_engine(engine, i915, id) {
>   		struct i915_request *rq;
> @@ -33,7 +32,7 @@ static int switch_to_context(struct drm_i915_private *i915,
>   		i915_request_add(rq);
>   	}
>   
> -	intel_runtime_pm_put(i915, wakeref);
> +	i915_gem_park(i915);
>   
>   	return err;
>   }
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c b/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
> index e43630b40fce..497929238f02 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
> @@ -279,7 +279,6 @@ static int igt_gem_coherency(void *arg)
>   	struct drm_i915_private *i915 = arg;
>   	const struct igt_coherency_mode *read, *write, *over;
>   	struct drm_i915_gem_object *obj;
> -	intel_wakeref_t wakeref;
>   	unsigned long count, n;
>   	u32 *offsets, *values;
>   	int err = 0;
> @@ -298,8 +297,9 @@ static int igt_gem_coherency(void *arg)
>   
>   	values = offsets + ncachelines;
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
> +
>   	for (over = igt_coherency_mode; over->name; over++) {
>   		if (!over->set)
>   			continue;
> @@ -377,8 +377,8 @@ static int igt_gem_coherency(void *arg)
>   		}
>   	}
>   unlock:
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   	kfree(offsets);
>   	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 6ce366091e0b..b4039df633ec 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
> @@ -24,6 +24,7 @@
>   
>   #include <linux/prime_numbers.h>
>   
> +#include "../i915_gem_pm.h"
>   #include "../i915_reset.h"
>   #include "../i915_selftest.h"
>   #include "i915_random.h"
> @@ -45,7 +46,6 @@ static int live_nop_switch(void *arg)
>   	struct intel_engine_cs *engine;
>   	struct i915_gem_context **ctx;
>   	enum intel_engine_id id;
> -	intel_wakeref_t wakeref;
>   	struct igt_live_test t;
>   	struct drm_file *file;
>   	unsigned long n;
> @@ -66,8 +66,8 @@ static int live_nop_switch(void *arg)
>   	if (IS_ERR(file))
>   		return PTR_ERR(file);
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	ctx = kcalloc(nctx, sizeof(*ctx), GFP_KERNEL);
>   	if (!ctx) {
> @@ -170,8 +170,8 @@ static int live_nop_switch(void *arg)
>   	}
>   
>   out_unlock:
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   	mock_file_free(i915, file);
>   	return err;
>   }
> @@ -514,6 +514,7 @@ static int igt_ctx_exec(void *arg)
>   		if (IS_ERR(file))
>   			return PTR_ERR(file);
>   
> +		i915_gem_unpark(i915);
>   		mutex_lock(&i915->drm.struct_mutex);
>   
>   		err = igt_live_test_begin(&t, i915, __func__, engine->name);
> @@ -525,7 +526,6 @@ static int igt_ctx_exec(void *arg)
>   		dw = 0;
>   		while (!time_after(jiffies, end_time)) {
>   			struct i915_gem_context *ctx;
> -			intel_wakeref_t wakeref;
>   
>   			ctx = live_context(i915, file);
>   			if (IS_ERR(ctx)) {
> @@ -541,8 +541,7 @@ static int igt_ctx_exec(void *arg)
>   				}
>   			}
>   
> -			with_intel_runtime_pm(i915, wakeref)
> -				err = gpu_fill(obj, ctx, engine, dw);
> +			err = gpu_fill(obj, ctx, engine, dw);
>   			if (err) {
>   				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),
> @@ -579,6 +578,7 @@ static int igt_ctx_exec(void *arg)
>   		if (igt_live_test_end(&t))
>   			err = -EIO;
>   		mutex_unlock(&i915->drm.struct_mutex);
> +		i915_gem_park(i915);
>   
>   		mock_file_free(i915, file);
>   		if (err)
> @@ -610,6 +610,7 @@ static int igt_shared_ctx_exec(void *arg)
>   	if (IS_ERR(file))
>   		return PTR_ERR(file);
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
>   
>   	parent = live_context(i915, file);
> @@ -641,7 +642,6 @@ static int igt_shared_ctx_exec(void *arg)
>   		ncontexts = 0;
>   		while (!time_after(jiffies, end_time)) {
>   			struct i915_gem_context *ctx;
> -			intel_wakeref_t wakeref;
>   
>   			ctx = kernel_context(i915);
>   			if (IS_ERR(ctx)) {
> @@ -660,9 +660,7 @@ static int igt_shared_ctx_exec(void *arg)
>   				}
>   			}
>   
> -			err = 0;
> -			with_intel_runtime_pm(i915, wakeref)
> -				err = gpu_fill(obj, ctx, engine, dw);
> +			err = gpu_fill(obj, ctx, engine, dw);
>   			if (err) {
>   				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),
> @@ -702,6 +700,7 @@ static int igt_shared_ctx_exec(void *arg)
>   		err = -EIO;
>   out_unlock:
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   
>   	mock_file_free(i915, file);
>   	return err;
> @@ -1052,7 +1051,6 @@ __igt_ctx_sseu(struct drm_i915_private *i915,
>   	struct drm_i915_gem_object *obj;
>   	struct i915_gem_context *ctx;
>   	struct intel_sseu pg_sseu;
> -	intel_wakeref_t wakeref;
>   	struct drm_file *file;
>   	int ret;
>   
> @@ -1100,7 +1098,7 @@ __igt_ctx_sseu(struct drm_i915_private *i915,
>   		goto out_unlock;
>   	}
>   
> -	wakeref = intel_runtime_pm_get(i915);
> +	i915_gem_unpark(i915);
>   
>   	/* First set the default mask. */
>   	ret = __sseu_test(i915, name, flags, ctx, engine, obj, default_sseu);
> @@ -1128,7 +1126,7 @@ __igt_ctx_sseu(struct drm_i915_private *i915,
>   
>   	i915_gem_object_put(obj);
>   
> -	intel_runtime_pm_put(i915, wakeref);
> +	i915_gem_park(i915);
>   
>   out_unlock:
>   	mutex_unlock(&i915->drm.struct_mutex);
> @@ -1191,6 +1189,7 @@ static int igt_ctx_readonly(void *arg)
>   	if (IS_ERR(file))
>   		return PTR_ERR(file);
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
>   
>   	err = igt_live_test_begin(&t, i915, __func__, "");
> @@ -1216,8 +1215,6 @@ static int igt_ctx_readonly(void *arg)
>   		unsigned int id;
>   
>   		for_each_engine(engine, i915, id) {
> -			intel_wakeref_t wakeref;
> -
>   			if (!intel_engine_can_store_dword(engine))
>   				continue;
>   
> @@ -1232,9 +1229,7 @@ static int igt_ctx_readonly(void *arg)
>   					i915_gem_object_set_readonly(obj);
>   			}
>   
> -			err = 0;
> -			with_intel_runtime_pm(i915, wakeref)
> -				err = gpu_fill(obj, ctx, engine, dw);
> +			err = gpu_fill(obj, ctx, engine, dw);
>   			if (err) {
>   				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),
> @@ -1275,6 +1270,7 @@ static int igt_ctx_readonly(void *arg)
>   	if (igt_live_test_end(&t))
>   		err = -EIO;
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   
>   	mock_file_free(i915, file);
>   	return err;
> @@ -1491,7 +1487,6 @@ static int igt_vm_isolation(void *arg)
>   	struct drm_i915_private *i915 = arg;
>   	struct i915_gem_context *ctx_a, *ctx_b;
>   	struct intel_engine_cs *engine;
> -	intel_wakeref_t wakeref;
>   	struct igt_live_test t;
>   	struct drm_file *file;
>   	I915_RND_STATE(prng);
> @@ -1538,7 +1533,7 @@ static int igt_vm_isolation(void *arg)
>   	GEM_BUG_ON(ctx_b->ppgtt->vm.total != vm_total);
>   	vm_total -= I915_GTT_PAGE_SIZE;
>   
> -	wakeref = intel_runtime_pm_get(i915);
> +	i915_gem_unpark(i915);
>   
>   	count = 0;
>   	for_each_engine(engine, i915, id) {
> @@ -1583,7 +1578,7 @@ static int igt_vm_isolation(void *arg)
>   		count, RUNTIME_INFO(i915)->num_engines);
>   
>   out_rpm:
> -	intel_runtime_pm_put(i915, wakeref);
> +	i915_gem_park(i915);
>   out_unlock:
>   	if (igt_live_test_end(&t))
>   		err = -EIO;
> @@ -1622,6 +1617,7 @@ static int __igt_switch_to_kernel_context(struct drm_i915_private *i915,
>   		int err;
>   
>   		if (!from_idle) {
> +			i915_gem_unpark(i915);
>   			for_each_engine_masked(engine, i915, engines, tmp) {
>   				struct i915_request *rq;
>   
> @@ -1631,6 +1627,7 @@ static int __igt_switch_to_kernel_context(struct drm_i915_private *i915,
>   
>   				i915_request_add(rq);
>   			}
> +			i915_gem_park(i915);
>   		}
>   
>   		err = i915_gem_switch_to_kernel_context(i915,
> @@ -1674,7 +1671,6 @@ static int igt_switch_to_kernel_context(void *arg)
>   	struct intel_engine_cs *engine;
>   	struct i915_gem_context *ctx;
>   	enum intel_engine_id id;
> -	intel_wakeref_t wakeref;
>   	int err;
>   
>   	/*
> @@ -1685,7 +1681,6 @@ static int igt_switch_to_kernel_context(void *arg)
>   	 */
>   
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	ctx = kernel_context(i915);
>   	if (IS_ERR(ctx)) {
> @@ -1708,7 +1703,6 @@ static int igt_switch_to_kernel_context(void *arg)
>   out_unlock:
>   	GEM_TRACE_DUMP_ON(err);
>   
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
>   
>   	kernel_context_close(ctx);
> @@ -1729,7 +1723,6 @@ static int mock_context_barrier(void *arg)
>   	struct drm_i915_private *i915 = arg;
>   	struct i915_gem_context *ctx;
>   	struct i915_request *rq;
> -	intel_wakeref_t wakeref;
>   	unsigned int counter;
>   	int err;
>   
> @@ -1738,6 +1731,7 @@ static int mock_context_barrier(void *arg)
>   	 * a request; useful for retiring old state after loading new.
>   	 */
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
>   
>   	ctx = mock_context(i915, "mock");
> @@ -1772,9 +1766,7 @@ static int mock_context_barrier(void *arg)
>   		goto out;
>   	}
>   
> -	rq = ERR_PTR(-ENODEV);
> -	with_intel_runtime_pm(i915, wakeref)
> -		rq = i915_request_alloc(i915->engine[RCS0], ctx);
> +	rq = i915_request_alloc(i915->engine[RCS0], ctx);
>   	if (IS_ERR(rq)) {
>   		pr_err("Request allocation failed!\n");
>   		goto out;
> @@ -1816,6 +1808,7 @@ static int mock_context_barrier(void *arg)
>   	mock_context_close(ctx);
>   unlock:
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   	return err;
>   #undef pr_fmt
>   #define pr_fmt(x) x
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
> index 9a9451846b33..c0cf26507915 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
> @@ -23,6 +23,7 @@
>    */
>   
>   #include "../i915_selftest.h"
> +#include "../i915_gem_pm.h"
>   
>   #include "lib_sw_fence.h"
>   #include "mock_context.h"
> @@ -377,7 +378,6 @@ static int igt_evict_contexts(void *arg)
>   		struct drm_mm_node node;
>   		struct reserved *next;
>   	} *reserved = NULL;
> -	intel_wakeref_t wakeref;
>   	struct drm_mm_node hole;
>   	unsigned long count;
>   	int err;
> @@ -396,8 +396,8 @@ static int igt_evict_contexts(void *arg)
>   	if (!HAS_FULL_PPGTT(i915))
>   		return 0;
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	/* Reserve a block so that we know we have enough to fit a few rq */
>   	memset(&hole, 0, sizeof(hole));
> @@ -508,8 +508,8 @@ static int igt_evict_contexts(void *arg)
>   	}
>   	if (drm_mm_node_allocated(&hole))
>   		drm_mm_remove_node(&hole);
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   
>   	return err;
>   }
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_object.c b/drivers/gpu/drm/i915/selftests/i915_gem_object.c
> index c2b08fdf23cf..cd6590e01dec 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_object.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_object.c
> @@ -576,8 +576,6 @@ static int igt_mmap_offset_exhaustion(void *arg)
>   
>   	/* Now fill with busy dead objects that we expect to reap */
>   	for (loop = 0; loop < 3; loop++) {
> -		intel_wakeref_t wakeref;
> -
>   		if (i915_terminally_wedged(i915))
>   			break;
>   
> @@ -587,11 +585,11 @@ static int igt_mmap_offset_exhaustion(void *arg)
>   			goto out;
>   		}
>   
> -		err = 0;
> +		i915_gem_unpark(i915);
>   		mutex_lock(&i915->drm.struct_mutex);
> -		with_intel_runtime_pm(i915, wakeref)
> -			err = make_obj_busy(obj);
> +		err = make_obj_busy(obj);
>   		mutex_unlock(&i915->drm.struct_mutex);
> +		i915_gem_park(i915);
>   		if (err) {
>   			pr_err("[loop %d] Failed to busy the object\n", loop);
>   			goto err_obj;
> diff --git a/drivers/gpu/drm/i915/selftests/i915_request.c b/drivers/gpu/drm/i915/selftests/i915_request.c
> index e6ffe2240126..665cafa82390 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_request.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_request.c
> @@ -505,15 +505,15 @@ int i915_request_mock_selftests(void)
>   		SUBTEST(mock_breadcrumbs_smoketest),
>   	};
>   	struct drm_i915_private *i915;
> -	intel_wakeref_t wakeref;
> -	int err = 0;
> +	int err;
>   
>   	i915 = mock_gem_device();
>   	if (!i915)
>   		return -ENOMEM;
>   
> -	with_intel_runtime_pm(i915, wakeref)
> -		err = i915_subtests(tests, i915);
> +	i915_gem_unpark(i915);
> +	err = i915_subtests(tests, i915);
> +	i915_gem_park(i915);
>   
>   	drm_dev_put(&i915->drm);
>   
> @@ -524,7 +524,6 @@ static int live_nop_request(void *arg)
>   {
>   	struct drm_i915_private *i915 = arg;
>   	struct intel_engine_cs *engine;
> -	intel_wakeref_t wakeref;
>   	struct igt_live_test t;
>   	unsigned int id;
>   	int err = -ENODEV;
> @@ -534,8 +533,8 @@ static int live_nop_request(void *arg)
>   	 * the overhead of submitting requests to the hardware.
>   	 */
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	for_each_engine(engine, i915, id) {
>   		struct i915_request *request = NULL;
> @@ -596,8 +595,8 @@ static int live_nop_request(void *arg)
>   	}
>   
>   out_unlock:
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   	return err;
>   }
>   
> @@ -669,7 +668,6 @@ static int live_empty_request(void *arg)
>   {
>   	struct drm_i915_private *i915 = arg;
>   	struct intel_engine_cs *engine;
> -	intel_wakeref_t wakeref;
>   	struct igt_live_test t;
>   	struct i915_vma *batch;
>   	unsigned int id;
> @@ -680,8 +678,8 @@ static int live_empty_request(void *arg)
>   	 * the overhead of submitting requests to the hardware.
>   	 */
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	batch = empty_batch(i915);
>   	if (IS_ERR(batch)) {
> @@ -745,8 +743,8 @@ static int live_empty_request(void *arg)
>   	i915_vma_unpin(batch);
>   	i915_vma_put(batch);
>   out_unlock:
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   	return err;
>   }
>   
> @@ -827,7 +825,6 @@ static int live_all_engines(void *arg)
>   	struct drm_i915_private *i915 = arg;
>   	struct intel_engine_cs *engine;
>   	struct i915_request *request[I915_NUM_ENGINES];
> -	intel_wakeref_t wakeref;
>   	struct igt_live_test t;
>   	struct i915_vma *batch;
>   	unsigned int id;
> @@ -838,8 +835,8 @@ static int live_all_engines(void *arg)
>   	 * block doing so, and that they don't complete too soon.
>   	 */
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	err = igt_live_test_begin(&t, i915, __func__, "");
>   	if (err)
> @@ -922,8 +919,8 @@ static int live_all_engines(void *arg)
>   	i915_vma_unpin(batch);
>   	i915_vma_put(batch);
>   out_unlock:
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   	return err;
>   }
>   
> @@ -933,7 +930,6 @@ static int live_sequential_engines(void *arg)
>   	struct i915_request *request[I915_NUM_ENGINES] = {};
>   	struct i915_request *prev = NULL;
>   	struct intel_engine_cs *engine;
> -	intel_wakeref_t wakeref;
>   	struct igt_live_test t;
>   	unsigned int id;
>   	int err;
> @@ -944,8 +940,8 @@ static int live_sequential_engines(void *arg)
>   	 * they are running on independent engines.
>   	 */
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	err = igt_live_test_begin(&t, i915, __func__, "");
>   	if (err)
> @@ -1052,8 +1048,8 @@ static int live_sequential_engines(void *arg)
>   		i915_request_put(request[id]);
>   	}
>   out_unlock:
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   	return err;
>   }
>   
> @@ -1104,7 +1100,6 @@ static int live_breadcrumbs_smoketest(void *arg)
>   	struct task_struct **threads;
>   	struct igt_live_test live;
>   	enum intel_engine_id id;
> -	intel_wakeref_t wakeref;
>   	struct drm_file *file;
>   	unsigned int n;
>   	int ret = 0;
> @@ -1117,7 +1112,7 @@ static int live_breadcrumbs_smoketest(void *arg)
>   	 * On real hardware this time.
>   	 */
>   
> -	wakeref = intel_runtime_pm_get(i915);
> +	i915_gem_unpark(i915);
>   
>   	file = mock_file(i915);
>   	if (IS_ERR(file)) {
> @@ -1224,7 +1219,7 @@ static int live_breadcrumbs_smoketest(void *arg)
>   out_file:
>   	mock_file_free(i915, file);
>   out_rpm:
> -	intel_runtime_pm_put(i915, wakeref);
> +	i915_gem_park(i915);
>   
>   	return ret;
>   }
> diff --git a/drivers/gpu/drm/i915/selftests/i915_timeline.c b/drivers/gpu/drm/i915/selftests/i915_timeline.c
> index 8e7bcaa1eb66..b04969ea74d3 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_timeline.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_timeline.c
> @@ -7,6 +7,7 @@
>   #include <linux/prime_numbers.h>
>   
>   #include "../i915_selftest.h"
> +#include "../i915_gem_pm.h"
>   #include "i915_random.h"
>   
>   #include "igt_flush_test.h"
> @@ -497,7 +498,6 @@ static int live_hwsp_engine(void *arg)
>   	struct i915_timeline **timelines;
>   	struct intel_engine_cs *engine;
>   	enum intel_engine_id id;
> -	intel_wakeref_t wakeref;
>   	unsigned long count, n;
>   	int err = 0;
>   
> @@ -512,8 +512,8 @@ static int live_hwsp_engine(void *arg)
>   	if (!timelines)
>   		return -ENOMEM;
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	count = 0;
>   	for_each_engine(engine, i915, id) {
> @@ -556,8 +556,8 @@ static int live_hwsp_engine(void *arg)
>   		i915_timeline_put(tl);
>   	}
>   
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   
>   	kvfree(timelines);
>   
> @@ -572,7 +572,6 @@ static int live_hwsp_alternate(void *arg)
>   	struct i915_timeline **timelines;
>   	struct intel_engine_cs *engine;
>   	enum intel_engine_id id;
> -	intel_wakeref_t wakeref;
>   	unsigned long count, n;
>   	int err = 0;
>   
> @@ -588,8 +587,8 @@ static int live_hwsp_alternate(void *arg)
>   	if (!timelines)
>   		return -ENOMEM;
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	count = 0;
>   	for (n = 0; n < NUM_TIMELINES; n++) {
> @@ -632,8 +631,8 @@ static int live_hwsp_alternate(void *arg)
>   		i915_timeline_put(tl);
>   	}
>   
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   
>   	kvfree(timelines);
>   
> @@ -647,7 +646,6 @@ static int live_hwsp_wrap(void *arg)
>   	struct intel_engine_cs *engine;
>   	struct i915_timeline *tl;
>   	enum intel_engine_id id;
> -	intel_wakeref_t wakeref;
>   	int err = 0;
>   
>   	/*
> @@ -655,8 +653,8 @@ static int live_hwsp_wrap(void *arg)
>   	 * foreign GPU references.
>   	 */
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	tl = i915_timeline_create(i915, NULL);
>   	if (IS_ERR(tl)) {
> @@ -747,8 +745,8 @@ static int live_hwsp_wrap(void *arg)
>   out_free:
>   	i915_timeline_put(tl);
>   out_rpm:
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   
>   	return err;
>   }
> @@ -758,7 +756,6 @@ static int live_hwsp_recycle(void *arg)
>   	struct drm_i915_private *i915 = arg;
>   	struct intel_engine_cs *engine;
>   	enum intel_engine_id id;
> -	intel_wakeref_t wakeref;
>   	unsigned long count;
>   	int err = 0;
>   
> @@ -768,8 +765,8 @@ static int live_hwsp_recycle(void *arg)
>   	 * want to confuse ourselves or the GPU.
>   	 */
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	count = 0;
>   	for_each_engine(engine, i915, id) {
> @@ -823,8 +820,8 @@ static int live_hwsp_recycle(void *arg)
>   out:
>   	if (igt_flush_test(i915, I915_WAIT_LOCKED))
>   		err = -EIO;
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   
>   	return err;
>   }
> diff --git a/drivers/gpu/drm/i915/selftests/intel_guc.c b/drivers/gpu/drm/i915/selftests/intel_guc.c
> index b05a21eaa8f4..e62073af4728 100644
> --- a/drivers/gpu/drm/i915/selftests/intel_guc.c
> +++ b/drivers/gpu/drm/i915/selftests/intel_guc.c
> @@ -22,6 +22,7 @@
>    *
>    */
>   
> +#include "../i915_gem_pm.h"
>   #include "../i915_selftest.h"
>   
>   /* max doorbell number + negative test for each client type */
> @@ -137,13 +138,11 @@ static bool client_doorbell_in_sync(struct intel_guc_client *client)
>   static int igt_guc_clients(void *args)
>   {
>   	struct drm_i915_private *dev_priv = args;
> -	intel_wakeref_t wakeref;
>   	struct intel_guc *guc;
>   	int err = 0;
>   
>   	GEM_BUG_ON(!HAS_GUC(dev_priv));
>   	mutex_lock(&dev_priv->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(dev_priv);
>   
>   	guc = &dev_priv->guc;
>   	if (!guc) {
> @@ -226,7 +225,6 @@ static int igt_guc_clients(void *args)
>   	guc_clients_create(guc);
>   	guc_clients_enable(guc);
>   unlock:
> -	intel_runtime_pm_put(dev_priv, wakeref);
>   	mutex_unlock(&dev_priv->drm.struct_mutex);
>   	return err;
>   }
> @@ -239,14 +237,13 @@ static int igt_guc_clients(void *args)
>   static int igt_guc_doorbells(void *arg)
>   {
>   	struct drm_i915_private *dev_priv = arg;
> -	intel_wakeref_t wakeref;
>   	struct intel_guc *guc;
>   	int i, err = 0;
>   	u16 db_id;
>   
>   	GEM_BUG_ON(!HAS_GUC(dev_priv));
> +	i915_gem_unpark(dev_priv);
>   	mutex_lock(&dev_priv->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(dev_priv);
>   
>   	guc = &dev_priv->guc;
>   	if (!guc) {
> @@ -339,8 +336,8 @@ static int igt_guc_doorbells(void *arg)
>   			guc_client_free(clients[i]);
>   		}
>   unlock:
> -	intel_runtime_pm_put(dev_priv, wakeref);
>   	mutex_unlock(&dev_priv->drm.struct_mutex);
> +	i915_gem_park(dev_priv);
>   	return err;
>   }
>   
> diff --git a/drivers/gpu/drm/i915/selftests/intel_hangcheck.c b/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
> index 76b4fa150f2e..f6f417386b9f 100644
> --- a/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
> +++ b/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
> @@ -24,6 +24,7 @@
>   
>   #include <linux/kthread.h>
>   
> +#include "../i915_gem_pm.h"
>   #include "../i915_selftest.h"
>   #include "i915_random.h"
>   #include "igt_flush_test.h"
> @@ -86,6 +87,7 @@ static int hang_init(struct hang *h, struct drm_i915_private *i915)
>   	}
>   	h->batch = vaddr;
>   
> +	i915_gem_unpark(i915);
>   	return 0;
>   
>   err_unpin_hws:
> @@ -287,6 +289,7 @@ static void hang_fini(struct hang *h)
>   	kernel_context_close(h->ctx);
>   
>   	igt_flush_test(h->i915, I915_WAIT_LOCKED);
> +	i915_gem_park(h->i915);
>   }
>   
>   static bool wait_until_running(struct hang *h, struct i915_request *rq)
> @@ -422,7 +425,6 @@ static int igt_reset_nop(void *arg)
>   	struct i915_gem_context *ctx;
>   	unsigned int reset_count, count;
>   	enum intel_engine_id id;
> -	intel_wakeref_t wakeref;
>   	struct drm_file *file;
>   	IGT_TIMEOUT(end_time);
>   	int err = 0;
> @@ -442,7 +444,7 @@ static int igt_reset_nop(void *arg)
>   	}
>   
>   	i915_gem_context_clear_bannable(ctx);
> -	wakeref = intel_runtime_pm_get(i915);
> +	i915_gem_unpark(i915);
>   	reset_count = i915_reset_count(&i915->gpu_error);
>   	count = 0;
>   	do {
> @@ -502,7 +504,7 @@ static int igt_reset_nop(void *arg)
>   	err = igt_flush_test(i915, I915_WAIT_LOCKED);
>   	mutex_unlock(&i915->drm.struct_mutex);
>   
> -	intel_runtime_pm_put(i915, wakeref);
> +	i915_gem_park(i915);
>   
>   out:
>   	mock_file_free(i915, file);
> @@ -517,7 +519,6 @@ static int igt_reset_nop_engine(void *arg)
>   	struct intel_engine_cs *engine;
>   	struct i915_gem_context *ctx;
>   	enum intel_engine_id id;
> -	intel_wakeref_t wakeref;
>   	struct drm_file *file;
>   	int err = 0;
>   
> @@ -539,7 +540,7 @@ static int igt_reset_nop_engine(void *arg)
>   	}
>   
>   	i915_gem_context_clear_bannable(ctx);
> -	wakeref = intel_runtime_pm_get(i915);
> +	i915_gem_unpark(i915);
>   	for_each_engine(engine, i915, id) {
>   		unsigned int reset_count, reset_engine_count;
>   		unsigned int count;
> @@ -623,7 +624,7 @@ static int igt_reset_nop_engine(void *arg)
>   	err = igt_flush_test(i915, I915_WAIT_LOCKED);
>   	mutex_unlock(&i915->drm.struct_mutex);
>   
> -	intel_runtime_pm_put(i915, wakeref);
> +	i915_gem_park(i915);
>   out:
>   	mock_file_free(i915, file);
>   	if (i915_reset_failed(i915))
> @@ -651,6 +652,7 @@ static int __igt_reset_engine(struct drm_i915_private *i915, bool active)
>   			return err;
>   	}
>   
> +	i915_gem_unpark(i915);
>   	for_each_engine(engine, i915, id) {
>   		unsigned int reset_count, reset_engine_count;
>   		IGT_TIMEOUT(end_time);
> @@ -744,6 +746,7 @@ static int __igt_reset_engine(struct drm_i915_private *i915, bool active)
>   		if (err)
>   			break;
>   	}
> +	i915_gem_park(i915);
>   
>   	if (i915_reset_failed(i915))
>   		err = -EIO;
> @@ -829,6 +832,7 @@ static int active_engine(void *data)
>   		}
>   	}
>   
> +	i915_gem_unpark(engine->i915);
>   	while (!kthread_should_stop()) {
>   		unsigned int idx = count++ & (ARRAY_SIZE(rq) - 1);
>   		struct i915_request *old = rq[idx];
> @@ -856,6 +860,7 @@ static int active_engine(void *data)
>   
>   		cond_resched();
>   	}
> +	i915_gem_park(engine->i915);
>   
>   	for (count = 0; count < ARRAY_SIZE(rq); count++) {
>   		int err__ = active_request_put(rq[count]);
> @@ -897,6 +902,7 @@ static int __igt_reset_engines(struct drm_i915_private *i915,
>   			h.ctx->sched.priority = 1024;
>   	}
>   
> +	i915_gem_unpark(i915);
>   	for_each_engine(engine, i915, id) {
>   		struct active_engine threads[I915_NUM_ENGINES] = {};
>   		unsigned long global = i915_reset_count(&i915->gpu_error);
> @@ -1073,6 +1079,7 @@ static int __igt_reset_engines(struct drm_i915_private *i915,
>   		if (err)
>   			break;
>   	}
> +	i915_gem_park(i915);
>   
>   	if (i915_reset_failed(i915))
>   		err = -EIO;
> diff --git a/drivers/gpu/drm/i915/selftests/intel_lrc.c b/drivers/gpu/drm/i915/selftests/intel_lrc.c
> index 0d3cae564db8..45370922d965 100644
> --- a/drivers/gpu/drm/i915/selftests/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/selftests/intel_lrc.c
> @@ -6,6 +6,7 @@
>   
>   #include <linux/prime_numbers.h>
>   
> +#include "../i915_gem_pm.h"
>   #include "../i915_reset.h"
>   
>   #include "../i915_selftest.h"
> @@ -23,14 +24,13 @@ static int live_sanitycheck(void *arg)
>   	struct i915_gem_context *ctx;
>   	enum intel_engine_id id;
>   	struct igt_spinner spin;
> -	intel_wakeref_t wakeref;
>   	int err = -ENOMEM;
>   
>   	if (!HAS_LOGICAL_RING_CONTEXTS(i915))
>   		return 0;
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	if (igt_spinner_init(&spin, i915))
>   		goto err_unlock;
> @@ -71,8 +71,8 @@ static int live_sanitycheck(void *arg)
>   	igt_spinner_fini(&spin);
>   err_unlock:
>   	igt_flush_test(i915, I915_WAIT_LOCKED);
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   	return err;
>   }
>   
> @@ -83,7 +83,6 @@ static int live_preempt(void *arg)
>   	struct igt_spinner spin_hi, spin_lo;
>   	struct intel_engine_cs *engine;
>   	enum intel_engine_id id;
> -	intel_wakeref_t wakeref;
>   	int err = -ENOMEM;
>   
>   	if (!HAS_LOGICAL_RING_PREEMPTION(i915))
> @@ -92,8 +91,8 @@ static int live_preempt(void *arg)
>   	if (!(i915->caps.scheduler & I915_SCHEDULER_CAP_PREEMPTION))
>   		pr_err("Logical preemption supported, but not exposed\n");
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	if (igt_spinner_init(&spin_hi, i915))
>   		goto err_unlock;
> @@ -178,8 +177,8 @@ static int live_preempt(void *arg)
>   	igt_spinner_fini(&spin_hi);
>   err_unlock:
>   	igt_flush_test(i915, I915_WAIT_LOCKED);
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   	return err;
>   }
>   
> @@ -191,14 +190,13 @@ static int live_late_preempt(void *arg)
>   	struct intel_engine_cs *engine;
>   	struct i915_sched_attr attr = {};
>   	enum intel_engine_id id;
> -	intel_wakeref_t wakeref;
>   	int err = -ENOMEM;
>   
>   	if (!HAS_LOGICAL_RING_PREEMPTION(i915))
>   		return 0;
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	if (igt_spinner_init(&spin_hi, i915))
>   		goto err_unlock;
> @@ -282,8 +280,8 @@ static int live_late_preempt(void *arg)
>   	igt_spinner_fini(&spin_hi);
>   err_unlock:
>   	igt_flush_test(i915, I915_WAIT_LOCKED);
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   	return err;
>   
>   err_wedged:
> @@ -331,7 +329,6 @@ static int live_suppress_self_preempt(void *arg)
>   	};
>   	struct preempt_client a, b;
>   	enum intel_engine_id id;
> -	intel_wakeref_t wakeref;
>   	int err = -ENOMEM;
>   
>   	/*
> @@ -347,8 +344,8 @@ static int live_suppress_self_preempt(void *arg)
>   	if (USES_GUC_SUBMISSION(i915))
>   		return 0; /* presume black blox */
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	if (preempt_client_init(i915, &a))
>   		goto err_unlock;
> @@ -422,8 +419,8 @@ static int live_suppress_self_preempt(void *arg)
>   err_unlock:
>   	if (igt_flush_test(i915, I915_WAIT_LOCKED))
>   		err = -EIO;
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   	return err;
>   
>   err_wedged:
> @@ -480,7 +477,6 @@ static int live_suppress_wait_preempt(void *arg)
>   	struct preempt_client client[4];
>   	struct intel_engine_cs *engine;
>   	enum intel_engine_id id;
> -	intel_wakeref_t wakeref;
>   	int err = -ENOMEM;
>   	int i;
>   
> @@ -493,8 +489,8 @@ static int live_suppress_wait_preempt(void *arg)
>   	if (!HAS_LOGICAL_RING_PREEMPTION(i915))
>   		return 0;
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	if (preempt_client_init(i915, &client[0])) /* ELSP[0] */
>   		goto err_unlock;
> @@ -587,8 +583,8 @@ static int live_suppress_wait_preempt(void *arg)
>   err_unlock:
>   	if (igt_flush_test(i915, I915_WAIT_LOCKED))
>   		err = -EIO;
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   	return err;
>   
>   err_wedged:
> @@ -605,7 +601,6 @@ static int live_chain_preempt(void *arg)
>   	struct intel_engine_cs *engine;
>   	struct preempt_client hi, lo;
>   	enum intel_engine_id id;
> -	intel_wakeref_t wakeref;
>   	int err = -ENOMEM;
>   
>   	/*
> @@ -617,8 +612,8 @@ static int live_chain_preempt(void *arg)
>   	if (!HAS_LOGICAL_RING_PREEMPTION(i915))
>   		return 0;
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	if (preempt_client_init(i915, &hi))
>   		goto err_unlock;
> @@ -735,8 +730,8 @@ static int live_chain_preempt(void *arg)
>   err_unlock:
>   	if (igt_flush_test(i915, I915_WAIT_LOCKED))
>   		err = -EIO;
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   	return err;
>   
>   err_wedged:
> @@ -754,7 +749,6 @@ static int live_preempt_hang(void *arg)
>   	struct igt_spinner spin_hi, spin_lo;
>   	struct intel_engine_cs *engine;
>   	enum intel_engine_id id;
> -	intel_wakeref_t wakeref;
>   	int err = -ENOMEM;
>   
>   	if (!HAS_LOGICAL_RING_PREEMPTION(i915))
> @@ -763,8 +757,8 @@ static int live_preempt_hang(void *arg)
>   	if (!intel_has_reset_engine(i915))
>   		return 0;
>   
> +	i915_gem_unpark(i915);
>   	mutex_lock(&i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	if (igt_spinner_init(&spin_hi, i915))
>   		goto err_unlock;
> @@ -859,8 +853,8 @@ static int live_preempt_hang(void *arg)
>   	igt_spinner_fini(&spin_hi);
>   err_unlock:
>   	igt_flush_test(i915, I915_WAIT_LOCKED);
> -	intel_runtime_pm_put(i915, wakeref);
>   	mutex_unlock(&i915->drm.struct_mutex);
> +	i915_gem_park(i915);
>   	return err;
>   }
>   
> @@ -1047,7 +1041,6 @@ static int live_preempt_smoke(void *arg)
>   		.ncontext = 1024,
>   	};
>   	const unsigned int phase[] = { 0, BATCH };
> -	intel_wakeref_t wakeref;
>   	struct igt_live_test t;
>   	int err = -ENOMEM;
>   	u32 *cs;
> @@ -1062,8 +1055,8 @@ static int live_preempt_smoke(void *arg)
>   	if (!smoke.contexts)
>   		return -ENOMEM;
>   
> +	i915_gem_unpark(smoke.i915);
>   	mutex_lock(&smoke.i915->drm.struct_mutex);
> -	wakeref = intel_runtime_pm_get(smoke.i915);
>   
>   	smoke.batch = i915_gem_object_create_internal(smoke.i915, PAGE_SIZE);
>   	if (IS_ERR(smoke.batch)) {
> @@ -1116,8 +1109,8 @@ static int live_preempt_smoke(void *arg)
>   err_batch:
>   	i915_gem_object_put(smoke.batch);
>   err_unlock:
> -	intel_runtime_pm_put(smoke.i915, wakeref);
>   	mutex_unlock(&smoke.i915->drm.struct_mutex);
> +	i915_gem_park(smoke.i915);
>   	kfree(smoke.contexts);
>   
>   	return err;
> diff --git a/drivers/gpu/drm/i915/selftests/intel_workarounds.c b/drivers/gpu/drm/i915/selftests/intel_workarounds.c
> index 3baed59008d7..0e42e1a0b46c 100644
> --- a/drivers/gpu/drm/i915/selftests/intel_workarounds.c
> +++ b/drivers/gpu/drm/i915/selftests/intel_workarounds.c
> @@ -5,6 +5,7 @@
>    */
>   
>   #include "../i915_selftest.h"
> +#include "../i915_gem_pm.h"
>   #include "../i915_reset.h"
>   
>   #include "igt_flush_test.h"
> @@ -238,7 +239,6 @@ switch_to_scratch_context(struct intel_engine_cs *engine,
>   {
>   	struct i915_gem_context *ctx;
>   	struct i915_request *rq;
> -	intel_wakeref_t wakeref;
>   	int err = 0;
>   
>   	ctx = kernel_context(engine->i915);
> @@ -247,9 +247,9 @@ switch_to_scratch_context(struct intel_engine_cs *engine,
>   
>   	GEM_BUG_ON(i915_gem_context_is_bannable(ctx));
>   
> -	rq = ERR_PTR(-ENODEV);
> -	with_intel_runtime_pm(engine->i915, wakeref)
> -		rq = igt_spinner_create_request(spin, ctx, engine, MI_NOOP);
> +	i915_gem_unpark(engine->i915);
> +	rq = igt_spinner_create_request(spin, ctx, engine, MI_NOOP);
> +	i915_gem_park(engine->i915);
>   
>   	kernel_context_close(ctx);
>   
> @@ -666,7 +666,6 @@ static int live_dirty_whitelist(void *arg)
>   	struct intel_engine_cs *engine;
>   	struct i915_gem_context *ctx;
>   	enum intel_engine_id id;
> -	intel_wakeref_t wakeref;
>   	struct drm_file *file;
>   	int err = 0;
>   
> @@ -675,7 +674,7 @@ static int live_dirty_whitelist(void *arg)
>   	if (INTEL_GEN(i915) < 7) /* minimum requirement for LRI, SRM, LRM */
>   		return 0;
>   
> -	wakeref = intel_runtime_pm_get(i915);
> +	i915_gem_unpark(i915);
>   
>   	mutex_unlock(&i915->drm.struct_mutex);
>   	file = mock_file(i915);
> @@ -705,7 +704,7 @@ static int live_dirty_whitelist(void *arg)
>   	mock_file_free(i915, file);
>   	mutex_lock(&i915->drm.struct_mutex);
>   out_rpm:
> -	intel_runtime_pm_put(i915, wakeref);
> +	i915_gem_park(i915);
>   	return err;
>   }
>   
> @@ -762,7 +761,6 @@ static int
>   live_gpu_reset_gt_engine_workarounds(void *arg)
>   {
>   	struct drm_i915_private *i915 = arg;
> -	intel_wakeref_t wakeref;
>   	struct wa_lists lists;
>   	bool ok;
>   
> @@ -771,8 +769,8 @@ live_gpu_reset_gt_engine_workarounds(void *arg)
>   
>   	pr_info("Verifying after GPU reset...\n");
>   
> +	i915_gem_unpark(i915);
>   	igt_global_reset_lock(i915);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	reference_lists_init(i915, &lists);
>   
> @@ -786,8 +784,8 @@ live_gpu_reset_gt_engine_workarounds(void *arg)
>   
>   out:
>   	reference_lists_fini(i915, &lists);
> -	intel_runtime_pm_put(i915, wakeref);
>   	igt_global_reset_unlock(i915);
> +	i915_gem_park(i915);
>   
>   	return ok ? 0 : -ESRCH;
>   }
> @@ -801,7 +799,6 @@ live_engine_reset_gt_engine_workarounds(void *arg)
>   	struct igt_spinner spin;
>   	enum intel_engine_id id;
>   	struct i915_request *rq;
> -	intel_wakeref_t wakeref;
>   	struct wa_lists lists;
>   	int ret = 0;
>   
> @@ -812,8 +809,8 @@ live_engine_reset_gt_engine_workarounds(void *arg)
>   	if (IS_ERR(ctx))
>   		return PTR_ERR(ctx);
>   
> +	i915_gem_unpark(i915);
>   	igt_global_reset_lock(i915);
> -	wakeref = intel_runtime_pm_get(i915);
>   
>   	reference_lists_init(i915, &lists);
>   
> @@ -870,8 +867,8 @@ live_engine_reset_gt_engine_workarounds(void *arg)
>   
>   err:
>   	reference_lists_fini(i915, &lists);
> -	intel_runtime_pm_put(i915, wakeref);
>   	igt_global_reset_unlock(i915);
> +	i915_gem_park(i915);
>   	kernel_context_close(ctx);
>   
>   	igt_flush_test(i915, I915_WAIT_LOCKED);
> 


More information about the Intel-gfx mailing list