I was thinking this patch should be more like

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 3201495..ab9b5f7 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2060,7 +2060,7 @@ struct i915_params {
        bool reset;
        bool disable_display;
        bool disable_vtd_wa;
-       bool use_mmio_flip;
+       int use_mmio_flip;
 };
 extern struct i915_params i915 __read_mostly;
 
diff --git a/drivers/gpu/drm/i915/i915_params.c 
b/drivers/gpu/drm/i915/i915_params.c
index e0d44df..6d7c580 100644
--- a/drivers/gpu/drm/i915/i915_params.c
+++ b/drivers/gpu/drm/i915/i915_params.c
@@ -158,5 +158,5 @@ module_param_named(enable_cmd_parser, 
i915.enable_cmd_parser, int, 0600);
 MODULE_PARM_DESC(enable_cmd_parser,
                 "Enable command parsing (1=enabled [default], 0=disabled)");
 
-module_param_named(use_mmio_flip, i915.use_mmio_flip, bool, 0600);
-MODULE_PARM_DESC(use_mmio_flip, "use MMIO flips (default: false)");
+module_param_named(use_mmio_flip, i915.use_mmio_flip, int, 0600);
+MODULE_PARM_DESC(use_mmio_flip, "use MMIO flips (-1=never, 0=driver discretion 
[default], 1=always)");
diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index ac93ae4..b6c8fce 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -9207,24 +9207,24 @@ static int intel_gen7_queue_flip(struct drm_device *dev,
        return 0;
 }
 
-static bool intel_use_mmio_flip(struct drm_device *dev)
+static bool use_mmio_flip(struct intel_engine_cs *ring,
+                         struct drm_i915_gem_object *obj)
 {
-       /* If module parameter is disabled, use CS flips.
-        * Otherwise, use MMIO flips starting from Gen5.
-        * This is not being used for older platforms, because
+       /* This is not being used for older platforms, because
         * non-availability of flip done interrupt forces us to use
         * CS flips. Older platforms derive flip done using some clever
         * tricks involving the flip_pending status bits and vblank irqs.
         * So using MMIO flips there would disrupt this mechanism.
         */
-
-       if (i915.use_mmio_flip == 0)
+       if (INTEL_INFO(dev)->gen < 5)
                return false;
 
-       if (INTEL_INFO(dev)->gen >= 5)
+       if (i915.use_mmio_flip < 0)
+               return false;
+       else if (i915.use_mmio_flip > 0)
                return true;
        else
-               return false;
+               return ring != obj->ring;
 }
 
 static void intel_do_mmio_flip(struct intel_crtc *intel_crtc)
@@ -9290,9 +9290,9 @@ void intel_notify_mmio_flip(struct intel_engine_cs *ring)
                struct intel_mmio_flip *mmio_flip;
 
                mmio_flip = &intel_crtc->mmio_flip;
-
                if (mmio_flip->seqno == 0)
                        continue;
+
                if (ring->id != mmio_flip->ring_id)
                        continue;
 
@@ -9306,26 +9306,25 @@ void intel_notify_mmio_flip(struct intel_engine_cs 
*ring)
 }
 
 static int intel_queue_mmio_flip(struct drm_device *dev,
-                       struct drm_crtc *crtc,
-                       struct drm_framebuffer *fb,
-                       struct drm_i915_gem_object *obj,
-                       struct intel_engine_cs *ring,
-                       uint32_t flags)
+                                struct drm_crtc *crtc,
+                                struct drm_framebuffer *fb,
+                                struct drm_i915_gem_object *obj,
+                                struct intel_engine_cs *ring,
+                                uint32_t flags)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        unsigned long irq_flags;
        int ret;
 
-       if (WARN_ON(intel_crtc->mmio_flip.seqno)) {
-               ret = -EBUSY;
-               goto err;
-       }
+       if (WARN_ON(intel_crtc->mmio_flip.seqno))
+               return -EBUSY;
 
        ret = intel_postpone_flip(obj);
-       if (ret < 0) {
-               goto err;
-       } else if (ret == 0) {
+       if (ret < 0)
+               return ret;
+
+       if (ret == 0) {
                intel_do_mmio_flip(intel_crtc);
                return 0;
        }
@@ -9340,8 +9339,6 @@ static int intel_queue_mmio_flip(struct drm_device *dev,
         */
        intel_notify_mmio_flip(obj->ring);
        return 0;
-err:
-       return ret;
 }
 
 static int intel_default_queue_flip(struct drm_device *dev,
@@ -9529,7 +9526,10 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
                i915_gem_obj_ggtt_offset(obj) + intel_crtc->dspaddr_offset;
        work->enable_stall_check = true;
 
-       ret = dev_priv->display.queue_flip(dev, crtc, fb, obj, ring, 
page_flip_flags);
+       if (use_mmio_flip(ring, obj))
+               ret = intel_queue_mmio_flip(ring, obj)(dev, crtc, fb, obj, 
ring, page_flip_flags);
+       else
+               ret = dev_priv->display.queue_flip(dev, crtc, fb, obj, ring, 
page_flip_flags);
        if (ret)
                goto cleanup_unpin;
 
@@ -11775,9 +11775,6 @@ static void intel_init_display(struct drm_device *dev)
                break;
        }
 
-       if (intel_use_mmio_flip(dev))
-               dev_priv->display.queue_flip = intel_queue_mmio_flip;
-
        intel_panel_init_backlight_funcs(dev);
 }
 
and squashed into the first. You can have a reviewed-by after that and 
I'll try and get a t-b.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to