|
@@ -204,6 +204,18 @@ static inline bool need_preempt(const struct intel_engine_cs *engine,
|
|
* bits 32-52: ctx ID, a globally unique tag
|
|
* bits 32-52: ctx ID, a globally unique tag
|
|
* bits 53-54: mbz, reserved for use by hardware
|
|
* bits 53-54: mbz, reserved for use by hardware
|
|
* bits 55-63: group ID, currently unused and set to 0
|
|
* bits 55-63: group ID, currently unused and set to 0
|
|
|
|
+ *
|
|
|
|
+ * Starting from Gen11, the upper dword of the descriptor has a new format:
|
|
|
|
+ *
|
|
|
|
+ * bits 32-36: reserved
|
|
|
|
+ * bits 37-47: SW context ID
|
|
|
|
+ * bits 48:53: engine instance
|
|
|
|
+ * bit 54: mbz, reserved for use by hardware
|
|
|
|
+ * bits 55-60: SW counter
|
|
|
|
+ * bits 61-63: engine class
|
|
|
|
+ *
|
|
|
|
+ * engine info, SW context ID and SW counter need to form a unique number
|
|
|
|
+ * (Context ID) per lrc.
|
|
*/
|
|
*/
|
|
static void
|
|
static void
|
|
intel_lr_context_descriptor_update(struct i915_gem_context *ctx,
|
|
intel_lr_context_descriptor_update(struct i915_gem_context *ctx,
|
|
@@ -212,12 +224,32 @@ intel_lr_context_descriptor_update(struct i915_gem_context *ctx,
|
|
struct intel_context *ce = &ctx->engine[engine->id];
|
|
struct intel_context *ce = &ctx->engine[engine->id];
|
|
u64 desc;
|
|
u64 desc;
|
|
|
|
|
|
- BUILD_BUG_ON(MAX_CONTEXT_HW_ID > (1<<GEN8_CTX_ID_WIDTH));
|
|
|
|
|
|
+ BUILD_BUG_ON(MAX_CONTEXT_HW_ID > (BIT(GEN8_CTX_ID_WIDTH)));
|
|
|
|
+ BUILD_BUG_ON(GEN11_MAX_CONTEXT_HW_ID > (BIT(GEN11_SW_CTX_ID_WIDTH)));
|
|
|
|
|
|
desc = ctx->desc_template; /* bits 0-11 */
|
|
desc = ctx->desc_template; /* bits 0-11 */
|
|
|
|
+ GEM_BUG_ON(desc & GENMASK_ULL(63, 12));
|
|
|
|
+
|
|
desc |= i915_ggtt_offset(ce->state) + LRC_HEADER_PAGES * PAGE_SIZE;
|
|
desc |= i915_ggtt_offset(ce->state) + LRC_HEADER_PAGES * PAGE_SIZE;
|
|
/* bits 12-31 */
|
|
/* bits 12-31 */
|
|
- desc |= (u64)ctx->hw_id << GEN8_CTX_ID_SHIFT; /* bits 32-52 */
|
|
|
|
|
|
+ GEM_BUG_ON(desc & GENMASK_ULL(63, 32));
|
|
|
|
+
|
|
|
|
+ if (INTEL_GEN(ctx->i915) >= 11) {
|
|
|
|
+ GEM_BUG_ON(ctx->hw_id >= BIT(GEN11_SW_CTX_ID_WIDTH));
|
|
|
|
+ desc |= (u64)ctx->hw_id << GEN11_SW_CTX_ID_SHIFT;
|
|
|
|
+ /* bits 37-47 */
|
|
|
|
+
|
|
|
|
+ desc |= (u64)engine->instance << GEN11_ENGINE_INSTANCE_SHIFT;
|
|
|
|
+ /* bits 48-53 */
|
|
|
|
+
|
|
|
|
+ /* TODO: decide what to do with SW counter (bits 55-60) */
|
|
|
|
+
|
|
|
|
+ desc |= (u64)engine->class << GEN11_ENGINE_CLASS_SHIFT;
|
|
|
|
+ /* bits 61-63 */
|
|
|
|
+ } else {
|
|
|
|
+ GEM_BUG_ON(ctx->hw_id >= BIT(GEN8_CTX_ID_WIDTH));
|
|
|
|
+ desc |= (u64)ctx->hw_id << GEN8_CTX_ID_SHIFT; /* bits 32-52 */
|
|
|
|
+ }
|
|
|
|
|
|
ce->lrc_desc = desc;
|
|
ce->lrc_desc = desc;
|
|
}
|
|
}
|