Commit c674c5b9 authored by Matt Roper's avatar Matt Roper

drm/i915/xehp: CCS should use RCS setup functions

The compute engine handles the same commands the render engine can
(except 3D pipeline), so it makes sense that CCS is more similar to RCS
than non-render engines.

The CCS context state (lrc) is also similar to the render one, so reuse
it. Note that the compute engine has its own CTX_R_PWR_CLK_STATE
register.

In order to avoid having multiple RCS && CCS checks, add the following
engine flag:
 - I915_ENGINE_HAS_RCS_REG_STATE - use the render (larger) reg state ctx.

BSpec: 46260
Original-author: Michel Thierry
Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Signed-off-by: default avatarAravind Iddamsetty <aravind.iddamsetty@intel.com>
Signed-off-by: default avatarMatt Roper <matthew.d.roper@intel.com>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220301231549.1817978-6-matthew.d.roper@intel.com
parent 803efd29
...@@ -885,7 +885,9 @@ static int igt_shared_ctx_exec(void *arg) ...@@ -885,7 +885,9 @@ static int igt_shared_ctx_exec(void *arg)
return err; return err;
} }
static int rpcs_query_batch(struct drm_i915_gem_object *rpcs, struct i915_vma *vma) static int rpcs_query_batch(struct drm_i915_gem_object *rpcs,
struct i915_vma *vma,
struct intel_engine_cs *engine)
{ {
u32 *cmd; u32 *cmd;
...@@ -896,7 +898,7 @@ static int rpcs_query_batch(struct drm_i915_gem_object *rpcs, struct i915_vma *v ...@@ -896,7 +898,7 @@ static int rpcs_query_batch(struct drm_i915_gem_object *rpcs, struct i915_vma *v
return PTR_ERR(cmd); return PTR_ERR(cmd);
*cmd++ = MI_STORE_REGISTER_MEM_GEN8; *cmd++ = MI_STORE_REGISTER_MEM_GEN8;
*cmd++ = i915_mmio_reg_offset(GEN8_R_PWR_CLK_STATE(RENDER_RING_BASE)); *cmd++ = i915_mmio_reg_offset(GEN8_R_PWR_CLK_STATE(engine->mmio_base));
*cmd++ = lower_32_bits(vma->node.start); *cmd++ = lower_32_bits(vma->node.start);
*cmd++ = upper_32_bits(vma->node.start); *cmd++ = upper_32_bits(vma->node.start);
*cmd = MI_BATCH_BUFFER_END; *cmd = MI_BATCH_BUFFER_END;
...@@ -957,7 +959,7 @@ emit_rpcs_query(struct drm_i915_gem_object *obj, ...@@ -957,7 +959,7 @@ emit_rpcs_query(struct drm_i915_gem_object *obj,
if (err) if (err)
goto err_vma; goto err_vma;
err = rpcs_query_batch(rpcs, vma); err = rpcs_query_batch(rpcs, vma, ce->engine);
if (err) if (err)
goto err_batch; goto err_batch;
......
...@@ -208,6 +208,8 @@ u32 intel_engine_context_size(struct intel_gt *gt, u8 class) ...@@ -208,6 +208,8 @@ u32 intel_engine_context_size(struct intel_gt *gt, u8 class)
BUILD_BUG_ON(I915_GTT_PAGE_SIZE != PAGE_SIZE); BUILD_BUG_ON(I915_GTT_PAGE_SIZE != PAGE_SIZE);
switch (class) { switch (class) {
case COMPUTE_CLASS:
fallthrough;
case RENDER_CLASS: case RENDER_CLASS:
switch (GRAPHICS_VER(gt->i915)) { switch (GRAPHICS_VER(gt->i915)) {
default: default:
...@@ -431,6 +433,10 @@ static int intel_engine_setup(struct intel_gt *gt, enum intel_engine_id id, ...@@ -431,6 +433,10 @@ static int intel_engine_setup(struct intel_gt *gt, enum intel_engine_id id,
if (GRAPHICS_VER(i915) == 12 && engine->class == RENDER_CLASS) if (GRAPHICS_VER(i915) == 12 && engine->class == RENDER_CLASS)
engine->props.preempt_timeout_ms = 0; engine->props.preempt_timeout_ms = 0;
/* features common between engines sharing EUs */
if (engine->class == RENDER_CLASS || engine->class == COMPUTE_CLASS)
engine->flags |= I915_ENGINE_HAS_RCS_REG_STATE;
engine->defaults = engine->props; /* never to change again */ engine->defaults = engine->props; /* never to change again */
engine->context_size = intel_engine_context_size(gt, engine->class); engine->context_size = intel_engine_context_size(gt, engine->class);
......
...@@ -524,6 +524,7 @@ struct intel_engine_cs { ...@@ -524,6 +524,7 @@ struct intel_engine_cs {
#define I915_ENGINE_HAS_RELATIVE_MMIO BIT(6) #define I915_ENGINE_HAS_RELATIVE_MMIO BIT(6)
#define I915_ENGINE_REQUIRES_CMD_PARSER BIT(7) #define I915_ENGINE_REQUIRES_CMD_PARSER BIT(7)
#define I915_ENGINE_WANT_FORCED_PREEMPTION BIT(8) #define I915_ENGINE_WANT_FORCED_PREEMPTION BIT(8)
#define I915_ENGINE_HAS_RCS_REG_STATE BIT(9)
unsigned int flags; unsigned int flags;
/* /*
......
...@@ -3480,7 +3480,7 @@ int intel_execlists_submission_setup(struct intel_engine_cs *engine) ...@@ -3480,7 +3480,7 @@ int intel_execlists_submission_setup(struct intel_engine_cs *engine)
logical_ring_default_vfuncs(engine); logical_ring_default_vfuncs(engine);
logical_ring_default_irqs(engine); logical_ring_default_irqs(engine);
if (engine->class == RENDER_CLASS) if (engine->flags & I915_ENGINE_HAS_RCS_REG_STATE)
rcs_submission_override(engine); rcs_submission_override(engine);
lrc_init_wa_ctx(engine); lrc_init_wa_ctx(engine);
......
...@@ -623,7 +623,7 @@ static const u8 *reg_offsets(const struct intel_engine_cs *engine) ...@@ -623,7 +623,7 @@ static const u8 *reg_offsets(const struct intel_engine_cs *engine)
GEM_BUG_ON(GRAPHICS_VER(engine->i915) >= 12 && GEM_BUG_ON(GRAPHICS_VER(engine->i915) >= 12 &&
!intel_engine_has_relative_mmio(engine)); !intel_engine_has_relative_mmio(engine));
if (engine->class == RENDER_CLASS) { if (engine->flags & I915_ENGINE_HAS_RCS_REG_STATE) {
if (GRAPHICS_VER_FULL(engine->i915) >= IP_VER(12, 55)) if (GRAPHICS_VER_FULL(engine->i915) >= IP_VER(12, 55))
return dg2_rcs_offsets; return dg2_rcs_offsets;
else if (GRAPHICS_VER_FULL(engine->i915) >= IP_VER(12, 50)) else if (GRAPHICS_VER_FULL(engine->i915) >= IP_VER(12, 50))
...@@ -1619,7 +1619,7 @@ void lrc_init_wa_ctx(struct intel_engine_cs *engine) ...@@ -1619,7 +1619,7 @@ void lrc_init_wa_ctx(struct intel_engine_cs *engine)
unsigned int i; unsigned int i;
int err; int err;
if (engine->class != RENDER_CLASS) if (!(engine->flags & I915_ENGINE_HAS_RCS_REG_STATE))
return; return;
switch (GRAPHICS_VER(engine->i915)) { switch (GRAPHICS_VER(engine->i915)) {
......
...@@ -3776,7 +3776,7 @@ int intel_guc_submission_setup(struct intel_engine_cs *engine) ...@@ -3776,7 +3776,7 @@ int intel_guc_submission_setup(struct intel_engine_cs *engine)
guc_default_irqs(engine); guc_default_irqs(engine);
guc_init_breadcrumbs(engine); guc_init_breadcrumbs(engine);
if (engine->class == RENDER_CLASS) if (engine->flags & I915_ENGINE_HAS_RCS_REG_STATE)
rcs_submission_override(engine); rcs_submission_override(engine);
lrc_init_wa_ctx(engine); lrc_init_wa_ctx(engine);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment