drm/i915: Support LRC context single submission
authorZhi Wang <zhi.a.wang@intel.com>
Thu, 16 Jun 2016 12:07:04 +0000 (08:07 -0400)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 17 Jun 2016 19:36:37 +0000 (20:36 +0100)
This patch introduces the support of LRC context single submission.
As GVT context may come from different guests, which require different
configuration of render registers. It can't be combined into a dual ELSP
submission combo.

Only GVT-g will create this kinds of GEM context currently.

v8:

- Rename the data member in struct i915_gem_context. (Chris)

v7:

- Fix typos in commit message. (Joonas)

v6:
- Make GVT code as dead code when !CONFIG_DRM_I915_GVT. (Chris)

v5:

- Only compile this feature when CONFIG_DRM_I915_GVT=y. (Tvrtko)

Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Signed-off-by: Zhi Wang <zhi.a.wang@intel.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/1466078825-6662-9-git-send-email-zhi.a.wang@intel.com
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/intel_lrc.c

index 85b92b2..34a1c18 100644 (file)
@@ -883,6 +883,7 @@ struct i915_gem_context {
        u32 ring_size;
        u32 desc_template;
        struct atomic_notifier_head status_notifier;
+       bool execlists_force_single_submission;
 
        struct list_head link;
 
index 67d19bd..debed01 100644 (file)
@@ -444,6 +444,20 @@ static void execlists_context_unqueue(struct intel_engine_cs *engine)
                        i915_gem_request_unreference(req0);
                        req0 = cursor;
                } else {
+                       if (IS_ENABLED(CONFIG_DRM_I915_GVT)) {
+                               /*
+                                * req0 (after merged) ctx requires single
+                                * submission, stop picking
+                                */
+                               if (req0->ctx->execlists_force_single_submission)
+                                       break;
+                               /*
+                                * req0 ctx doesn't require single submission,
+                                * but next req ctx requires, stop picking
+                                */
+                               if (cursor->ctx->execlists_force_single_submission)
+                                       break;
+                       }
                        req1 = cursor;
                        WARN_ON(req1->elsp_submitted);
                        break;