drm/i915/perf: Fix OA context id overlap with idle context id
authorUmesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Fri, 24 Jan 2020 01:37:01 +0000 (17:37 -0800)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 27 Jan 2020 21:11:59 +0000 (21:11 +0000)
Engine context pinned in perf OA was set to same context id as
the idle context. Set the context id to an unused value.

Clear the sw context id field in lrc descriptor before ORing with
ce->tag (Chris)

Closes: https://gitlab.freedesktop.org/drm/intel/issues/756
Signed-off-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20200124013701.40609-1-umesh.nerlige.ramappa@intel.com
drivers/gpu/drm/i915/gt/intel_lrc.c
drivers/gpu/drm/i915/i915_perf.c

index 3d1b990b556d41d838ec7620e79e024f4d82ab9b..f1ea2138cbba297350dce2652858a27e8117ded9 100644 (file)
@@ -1211,12 +1211,12 @@ __execlists_schedule_in(struct i915_request *rq)
        if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM))
                execlists_check_context(ce, engine);
 
+       ce->lrc_desc &= ~GENMASK_ULL(47, 37);
        if (ce->tag) {
                /* Use a fixed tag for OA and friends */
                ce->lrc_desc |= (u64)ce->tag << 32;
        } else {
                /* We don't need a strict matching tag, just different values */
-               ce->lrc_desc &= ~GENMASK_ULL(47, 37);
                ce->lrc_desc |=
                        (u64)(++engine->context_tag % NUM_CONTEXT_TAG) <<
                        GEN11_SW_CTX_ID_SHIFT;
index 3c4647054557c5aa92468523d75a57de7c24becb..535a12520dbabdc11be0f99c5321a4334a4095a2 100644 (file)
@@ -1323,7 +1323,13 @@ static int oa_get_render_ctx_id(struct i915_perf_stream *stream)
        case 12: {
                stream->specific_ctx_id_mask =
                        ((1U << GEN11_SW_CTX_ID_WIDTH) - 1) << (GEN11_SW_CTX_ID_SHIFT - 32);
-               stream->specific_ctx_id = stream->specific_ctx_id_mask;
+               /*
+                * Pick an unused context id
+                * 0 - (NUM_CONTEXT_TAG - 1) are used by other contexts
+                * GEN12_MAX_CONTEXT_HW_ID (0x7ff) is used by idle context
+                */
+               stream->specific_ctx_id = (GEN12_MAX_CONTEXT_HW_ID - 1) << (GEN11_SW_CTX_ID_SHIFT - 32);
+               BUILD_BUG_ON((GEN12_MAX_CONTEXT_HW_ID - 1) < NUM_CONTEXT_TAG);
                break;
        }
 
@@ -1331,7 +1337,7 @@ static int oa_get_render_ctx_id(struct i915_perf_stream *stream)
                MISSING_CASE(INTEL_GEN(ce->engine->i915));
        }
 
-       ce->tag = stream->specific_ctx_id_mask;
+       ce->tag = stream->specific_ctx_id;
 
        DRM_DEBUG_DRIVER("filtering on ctx_id=0x%x ctx_id_mask=0x%x\n",
                         stream->specific_ctx_id,