diff options
Diffstat (limited to 'drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c')
| -rw-r--r-- | drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c | 18 | 
1 files changed, 18 insertions, 0 deletions
| diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c index 42619fc05de4..090724fa766c 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c @@ -255,6 +255,7 @@ struct i915_execbuffer {  	struct intel_context *context; /* logical state for the request */  	struct i915_gem_context *gem_context; /** caller's context */  	intel_wakeref_t wakeref; +	intel_wakeref_t wakeref_gt0;  	/** our requests to build */  	struct i915_request *requests[MAX_ENGINE_INSTANCE + 1]; @@ -2685,6 +2686,7 @@ static int  eb_select_engine(struct i915_execbuffer *eb)  {  	struct intel_context *ce, *child; +	struct intel_gt *gt;  	unsigned int idx;  	int err; @@ -2708,10 +2710,17 @@ eb_select_engine(struct i915_execbuffer *eb)  		}  	}  	eb->num_batches = ce->parallel.number_children + 1; +	gt = ce->engine->gt;  	for_each_child(ce, child)  		intel_context_get(child);  	eb->wakeref = intel_gt_pm_get(ce->engine->gt); +	/* +	 * Keep GT0 active on MTL so that i915_vma_parked() doesn't +	 * free VMAs while execbuf ioctl is validating VMAs. +	 */ +	if (gt->info.id) +		eb->wakeref_gt0 = intel_gt_pm_get(to_gt(gt->i915));  	if (!test_bit(CONTEXT_ALLOC_BIT, &ce->flags)) {  		err = intel_context_alloc_state(ce); @@ -2750,6 +2759,9 @@ eb_select_engine(struct i915_execbuffer *eb)  	return err;  err: +	if (gt->info.id) +		intel_gt_pm_put(to_gt(gt->i915), eb->wakeref_gt0); +  	intel_gt_pm_put(ce->engine->gt, eb->wakeref);  	for_each_child(ce, child)  		intel_context_put(child); @@ -2763,6 +2775,12 @@ eb_put_engine(struct i915_execbuffer *eb)  	struct intel_context *child;  	i915_vm_put(eb->context->vm); +	/* +	 * This works in conjunction with eb_select_engine() to prevent +	 * i915_vma_parked() from interfering while execbuf validates vmas. +	 */ +	if (eb->gt->info.id) +		intel_gt_pm_put(to_gt(eb->gt->i915), eb->wakeref_gt0);  	intel_gt_pm_put(eb->context->engine->gt, eb->wakeref);  	for_each_child(eb->context, child)  		intel_context_put(child); | 
