drm/i915: Introduce execlist context status change notification
[deliverable/linux.git] / drivers / gpu / drm / i915 / intel_lrc.c
index 2116f865a8d69b5c08254eaac680ebb6f6acfa47..67d19bd5a48117f7378ce0079a8ecfd8a503af68 100644 (file)
@@ -404,6 +404,20 @@ static void execlists_submit_requests(struct drm_i915_gem_request *rq0,
        spin_unlock_irq(&dev_priv->uncore.lock);
 }
 
+static inline void execlists_context_status_change(
+               struct drm_i915_gem_request *rq,
+               unsigned long status)
+{
+       /*
+        * Only used when GVT-g is enabled now. When GVT-g is disabled,
+        * The compiler should eliminate this function as dead-code.
+        */
+       if (!IS_ENABLED(CONFIG_DRM_I915_GVT))
+               return;
+
+       atomic_notifier_call_chain(&rq->ctx->status_notifier, status, rq);
+}
+
 static void execlists_context_unqueue(struct intel_engine_cs *engine)
 {
        struct drm_i915_gem_request *req0 = NULL, *req1 = NULL;
@@ -439,6 +453,12 @@ static void execlists_context_unqueue(struct intel_engine_cs *engine)
        if (unlikely(!req0))
                return;
 
+       execlists_context_status_change(req0, INTEL_CONTEXT_SCHEDULE_IN);
+
+       if (req1)
+               execlists_context_status_change(req1,
+                                               INTEL_CONTEXT_SCHEDULE_IN);
+
        if (req0->elsp_submitted & engine->idle_lite_restore_wa) {
                /*
                 * WaIdleLiteRestore: make sure we never cause a lite restore
@@ -477,6 +497,8 @@ execlists_check_remove_request(struct intel_engine_cs *engine, u32 ctx_id)
        if (--head_req->elsp_submitted > 0)
                return 0;
 
+       execlists_context_status_change(head_req, INTEL_CONTEXT_SCHEDULE_OUT);
+
        list_del(&head_req->execlist_link);
        i915_gem_request_unreference(head_req);
 
This page took 0.044923 seconds and 5 git commands to generate.