diff options
| author | Mark Brown <broonie@kernel.org> | 2020-12-28 17:20:00 +0300 | 
|---|---|---|
| committer | Mark Brown <broonie@kernel.org> | 2020-12-28 17:20:00 +0300 | 
| commit | 2ae6f64ce1ce304b502461fdfe0b96c8171ae2cc (patch) | |
| tree | 88e987c447daf2c29e2d4c15e58d1029b0cc78c2 /drivers/gpu/drm/i915/gt/intel_engine_pm.c | |
| parent | 3b66e4a8e58a85af3212c7117d7a29c9ef6679a2 (diff) | |
| parent | 5c8fe583cce542aa0b84adc939ce85293de36e5e (diff) | |
| download | linux-2ae6f64ce1ce304b502461fdfe0b96c8171ae2cc.tar.xz | |
Merge tag 'v5.11-rc1' into regulator-5.11
Linux 5.11-rc1
Diffstat (limited to 'drivers/gpu/drm/i915/gt/intel_engine_pm.c')
| -rw-r--r-- | drivers/gpu/drm/i915/gt/intel_engine_pm.c | 37 | 
1 files changed, 25 insertions, 12 deletions
diff --git a/drivers/gpu/drm/i915/gt/intel_engine_pm.c b/drivers/gpu/drm/i915/gt/intel_engine_pm.c index f7b2e07e2229..499b09cb4acf 100644 --- a/drivers/gpu/drm/i915/gt/intel_engine_pm.c +++ b/drivers/gpu/drm/i915/gt/intel_engine_pm.c @@ -17,6 +17,25 @@  #include "intel_ring.h"  #include "shmem_utils.h" +static void dbg_poison_ce(struct intel_context *ce) +{ +	if (!IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM)) +		return; + +	if (ce->state) { +		struct drm_i915_gem_object *obj = ce->state->obj; +		int type = i915_coherent_map_type(ce->engine->i915); +		void *map; + +		map = i915_gem_object_pin_map(obj, type); +		if (!IS_ERR(map)) { +			memset(map, CONTEXT_REDZONE, obj->base.size); +			i915_gem_object_flush_map(obj); +			i915_gem_object_unpin_map(obj); +		} +	} +} +  static int __engine_unpark(struct intel_wakeref *wf)  {  	struct intel_engine_cs *engine = @@ -32,20 +51,14 @@ static int __engine_unpark(struct intel_wakeref *wf)  	if (ce) {  		GEM_BUG_ON(test_bit(CONTEXT_VALID_BIT, &ce->flags)); +		/* Flush all pending HW writes before we touch the context */ +		while (unlikely(intel_context_inflight(ce))) +			intel_engine_flush_submission(engine); +  		/* First poison the image to verify we never fully trust it */ -		if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM) && ce->state) { -			struct drm_i915_gem_object *obj = ce->state->obj; -			int type = i915_coherent_map_type(engine->i915); -			void *map; - -			map = i915_gem_object_pin_map(obj, type); -			if (!IS_ERR(map)) { -				memset(map, CONTEXT_REDZONE, obj->base.size); -				i915_gem_object_flush_map(obj); -				i915_gem_object_unpin_map(obj); -			} -		} +		dbg_poison_ce(ce); +		/* Scrub the context image after our loss of control */  		ce->ops->reset(ce);  	}  | 
