The kernel context does not need to be updated for the oa config, since
it is *never* used for anything but idling the device; it should never
be required to emit OA samples. As such we can forgo tweaking the
context image, and just do a plain switch to enforce the GPU barrier so
that we can then update all other context images.

Signed-off-by: Chris Wilson <[email protected]>
Cc: Mika Kuoppala <[email protected]>
Cc: Joonas Lahtinen <[email protected]>
Cc: Lionel Landwerlin <[email protected]>
Cc: Matthew Auld <[email protected]> \o/
---
 drivers/gpu/drm/i915/i915_perf.c | 113 +--------------------------------------
 1 file changed, 1 insertion(+), 112 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index 94185d610673..b44199726897 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -1623,112 +1623,6 @@ static void gen8_update_reg_state_unlocked(struct 
i915_gem_context *ctx,
        }
 }
 
-/*
- * Same as gen8_update_reg_state_unlocked only through the batchbuffer. This
- * is only used by the kernel context.
- */
-static int gen8_emit_oa_config(struct drm_i915_gem_request *req,
-                              const struct i915_oa_config *oa_config)
-{
-       struct drm_i915_private *dev_priv = req->i915;
-       /* The MMIO offsets for Flex EU registers aren't contiguous */
-       u32 flex_mmio[] = {
-               i915_mmio_reg_offset(EU_PERF_CNTL0),
-               i915_mmio_reg_offset(EU_PERF_CNTL1),
-               i915_mmio_reg_offset(EU_PERF_CNTL2),
-               i915_mmio_reg_offset(EU_PERF_CNTL3),
-               i915_mmio_reg_offset(EU_PERF_CNTL4),
-               i915_mmio_reg_offset(EU_PERF_CNTL5),
-               i915_mmio_reg_offset(EU_PERF_CNTL6),
-       };
-       u32 *cs;
-       int i;
-
-       cs = intel_ring_begin(req, ARRAY_SIZE(flex_mmio) * 2 + 4);
-       if (IS_ERR(cs))
-               return PTR_ERR(cs);
-
-       *cs++ = MI_LOAD_REGISTER_IMM(ARRAY_SIZE(flex_mmio) + 1);
-
-       *cs++ = i915_mmio_reg_offset(GEN8_OACTXCONTROL);
-       *cs++ = (dev_priv->perf.oa.period_exponent << 
GEN8_OA_TIMER_PERIOD_SHIFT) |
-               (dev_priv->perf.oa.periodic ? GEN8_OA_TIMER_ENABLE : 0) |
-               GEN8_OA_COUNTER_RESUME;
-
-       for (i = 0; i < ARRAY_SIZE(flex_mmio); i++) {
-               u32 mmio = flex_mmio[i];
-
-               /*
-                * This arbitrary default will select the 'EU FPU0 Pipeline
-                * Active' event. In the future it's anticipated that there
-                * will be an explicit 'No Event' we can select, but not
-                * yet...
-                */
-               u32 value = 0;
-
-               if (oa_config) {
-                       u32 j;
-
-                       for (j = 0; j < oa_config->flex_regs_len; j++) {
-                               if 
(i915_mmio_reg_offset(oa_config->flex_regs[j].addr) == mmio) {
-                                       value = oa_config->flex_regs[j].value;
-                                       break;
-                               }
-                       }
-               }
-
-               *cs++ = mmio;
-               *cs++ = value;
-       }
-
-       *cs++ = MI_NOOP;
-       intel_ring_advance(req, cs);
-
-       return 0;
-}
-
-static int gen8_switch_to_updated_kernel_context(struct drm_i915_private 
*dev_priv,
-                                                const struct i915_oa_config 
*oa_config)
-{
-       struct intel_engine_cs *engine = dev_priv->engine[RCS];
-       struct i915_gem_timeline *timeline;
-       struct drm_i915_gem_request *req;
-       int ret;
-
-       lockdep_assert_held(&dev_priv->drm.struct_mutex);
-
-       i915_gem_retire_requests(dev_priv);
-
-       req = i915_gem_request_alloc(engine, dev_priv->kernel_context);
-       if (IS_ERR(req))
-               return PTR_ERR(req);
-
-       ret = gen8_emit_oa_config(req, oa_config);
-       if (ret) {
-               i915_add_request(req);
-               return ret;
-       }
-
-       /* Queue this switch after all other activity */
-       list_for_each_entry(timeline, &dev_priv->gt.timelines, link) {
-               struct drm_i915_gem_request *prev;
-               struct intel_timeline *tl;
-
-               tl = &timeline->engine[engine->id];
-               prev = i915_gem_active_raw(&tl->last_request,
-                                          &dev_priv->drm.struct_mutex);
-               if (prev)
-                       i915_sw_fence_await_sw_fence_gfp(&req->submit,
-                                                        &prev->submit,
-                                                        GFP_KERNEL);
-       }
-
-       ret = i915_switch_context(req);
-       i915_add_request(req);
-
-       return ret;
-}
-
 /*
  * Manages updating the per-context aspects of the OA stream
  * configuration across all contexts.
@@ -1771,11 +1665,6 @@ static int gen8_configure_all_contexts(struct 
drm_i915_private *dev_priv,
                mutex_lock(&dev_priv->drm.struct_mutex);
        }
 
-       /* Switch away from any user context. */
-       ret = gen8_switch_to_updated_kernel_context(dev_priv, oa_config);
-       if (ret)
-               goto out;
-
        /*
         * The OA register config is setup through the context image. This image
         * might be written to by the GPU on context switch (in particular on
@@ -1789,7 +1678,7 @@ static int gen8_configure_all_contexts(struct 
drm_i915_private *dev_priv,
         * So far the best way to work around this issue seems to be draining
         * the GPU from any submitted work.
         */
-       ret = i915_gem_wait_for_idle(dev_priv, wait_flags);
+       ret = i915_gem_switch_to_kernel_context(dev_priv);
        if (ret)
                goto out;
 
-- 
2.14.1

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to