@@ -266,9 +266,12 @@ context_get_vm_rcu(struct i915_gem_context *ctx)
266266 } while (1 );
267267}
268268
269- static void intel_context_set_gem (struct intel_context * ce ,
270- struct i915_gem_context * ctx )
269+ static int intel_context_set_gem (struct intel_context * ce ,
270+ struct i915_gem_context * ctx ,
271+ struct intel_sseu sseu )
271272{
273+ int ret = 0 ;
274+
272275 GEM_BUG_ON (rcu_access_pointer (ce -> gem_context ));
273276 RCU_INIT_POINTER (ce -> gem_context , ctx );
274277
@@ -295,6 +298,12 @@ static void intel_context_set_gem(struct intel_context *ce,
295298
296299 intel_context_set_watchdog_us (ce , (u64 )timeout_ms * 1000 );
297300 }
301+
302+ /* A valid SSEU has no zero fields */
303+ if (sseu .slice_mask && !WARN_ON (ce -> engine -> class != RENDER_CLASS ))
304+ ret = intel_context_reconfigure_sseu (ce , sseu );
305+
306+ return ret ;
298307}
299308
300309static void __free_engines (struct i915_gem_engines * e , unsigned int count )
@@ -362,7 +371,8 @@ static struct i915_gem_engines *alloc_engines(unsigned int count)
362371 return e ;
363372}
364373
365- static struct i915_gem_engines * default_engines (struct i915_gem_context * ctx )
374+ static struct i915_gem_engines * default_engines (struct i915_gem_context * ctx ,
375+ struct intel_sseu rcs_sseu )
366376{
367377 const struct intel_gt * gt = & ctx -> i915 -> gt ;
368378 struct intel_engine_cs * engine ;
@@ -375,6 +385,8 @@ static struct i915_gem_engines *default_engines(struct i915_gem_context *ctx)
375385
376386 for_each_engine (engine , gt , id ) {
377387 struct intel_context * ce ;
388+ struct intel_sseu sseu = {};
389+ int ret ;
378390
379391 if (engine -> legacy_idx == INVALID_ENGINE )
380392 continue ;
@@ -388,10 +400,18 @@ static struct i915_gem_engines *default_engines(struct i915_gem_context *ctx)
388400 goto free_engines ;
389401 }
390402
391- intel_context_set_gem (ce , ctx );
392-
393403 e -> engines [engine -> legacy_idx ] = ce ;
394404 e -> num_engines = max (e -> num_engines , engine -> legacy_idx + 1 );
405+
406+ if (engine -> class == RENDER_CLASS )
407+ sseu = rcs_sseu ;
408+
409+ ret = intel_context_set_gem (ce , ctx , sseu );
410+ if (ret ) {
411+ err = ERR_PTR (ret );
412+ goto free_engines ;
413+ }
414+
395415 }
396416
397417 return e ;
@@ -705,6 +725,7 @@ __create_context(struct drm_i915_private *i915,
705725{
706726 struct i915_gem_context * ctx ;
707727 struct i915_gem_engines * e ;
728+ struct intel_sseu null_sseu = {};
708729 int err ;
709730 int i ;
710731
@@ -722,7 +743,7 @@ __create_context(struct drm_i915_private *i915,
722743 INIT_LIST_HEAD (& ctx -> stale .engines );
723744
724745 mutex_init (& ctx -> engines_mutex );
725- e = default_engines (ctx );
746+ e = default_engines (ctx , null_sseu );
726747 if (IS_ERR (e )) {
727748 err = PTR_ERR (e );
728749 goto err_free ;
@@ -1508,6 +1529,7 @@ set_engines__load_balance(struct i915_user_extension __user *base, void *data)
15081529 struct intel_engine_cs * stack [16 ];
15091530 struct intel_engine_cs * * siblings ;
15101531 struct intel_context * ce ;
1532+ struct intel_sseu null_sseu = {};
15111533 u16 num_siblings , idx ;
15121534 unsigned int n ;
15131535 int err ;
@@ -1580,7 +1602,7 @@ set_engines__load_balance(struct i915_user_extension __user *base, void *data)
15801602 goto out_siblings ;
15811603 }
15821604
1583- intel_context_set_gem (ce , set -> ctx );
1605+ intel_context_set_gem (ce , set -> ctx , null_sseu );
15841606
15851607 if (cmpxchg (& set -> engines -> engines [idx ], NULL , ce )) {
15861608 intel_context_put (ce );
@@ -1688,6 +1710,7 @@ set_engines(struct i915_gem_context *ctx,
16881710 struct drm_i915_private * i915 = ctx -> i915 ;
16891711 struct i915_context_param_engines __user * user =
16901712 u64_to_user_ptr (args -> value );
1713+ struct intel_sseu null_sseu = {};
16911714 struct set_engines set = { .ctx = ctx };
16921715 unsigned int num_engines , n ;
16931716 u64 extensions ;
@@ -1697,7 +1720,7 @@ set_engines(struct i915_gem_context *ctx,
16971720 if (!i915_gem_context_user_engines (ctx ))
16981721 return 0 ;
16991722
1700- set .engines = default_engines (ctx );
1723+ set .engines = default_engines (ctx , null_sseu );
17011724 if (IS_ERR (set .engines ))
17021725 return PTR_ERR (set .engines );
17031726
@@ -1754,7 +1777,7 @@ set_engines(struct i915_gem_context *ctx,
17541777 return PTR_ERR (ce );
17551778 }
17561779
1757- intel_context_set_gem (ce , ctx );
1780+ intel_context_set_gem (ce , ctx , null_sseu );
17581781
17591782 set .engines -> engines [n ] = ce ;
17601783 }
0 commit comments