diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_request.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_request.c | 25 | 
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c index 62fad16a55e8..7503dcb9043b 100644 --- a/drivers/gpu/drm/i915/i915_request.c +++ b/drivers/gpu/drm/i915/i915_request.c @@ -43,6 +43,7 @@  #include "gt/intel_rps.h"  #include "i915_active.h" +#include "i915_config.h"  #include "i915_deps.h"  #include "i915_driver.h"  #include "i915_drv.h" @@ -1621,6 +1622,20 @@ i915_request_await_object(struct i915_request *to,  	return ret;  } +static void i915_request_await_huc(struct i915_request *rq) +{ +	struct intel_huc *huc = &rq->context->engine->gt->uc.huc; + +	/* don't stall kernel submissions! */ +	if (!rcu_access_pointer(rq->context->gem_context)) +		return; + +	if (intel_huc_wait_required(huc)) +		i915_sw_fence_await_sw_fence(&rq->submit, +					     &huc->delayed_load.fence, +					     &rq->hucq); +} +  static struct i915_request *  __i915_request_ensure_parallel_ordering(struct i915_request *rq,  					struct intel_timeline *timeline) @@ -1703,6 +1718,16 @@ __i915_request_add_to_timeline(struct i915_request *rq)  	struct i915_request *prev;  	/* +	 * Media workloads may require HuC, so stall them until HuC loading is +	 * complete. Note that HuC not being loaded when a user submission +	 * arrives can only happen when HuC is loaded via GSC and in that case +	 * we still expect the window between us starting to accept submissions +	 * and HuC loading completion to be small (a few hundred ms). +	 */ +	if (rq->engine->class == VIDEO_DECODE_CLASS) +		i915_request_await_huc(rq); + +	/*  	 * Dependency tracking and request ordering along the timeline  	 * is special cased so that we can eliminate redundant ordering  	 * operations while building the request (we know that the timeline  |