drm/i915: Extract intel_wm_plane_visible()
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 14 Mar 2017 15:10:49 +0000 (17:10 +0200)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 22 Mar 2017 20:04:50 +0000 (22:04 +0200)
All platforms that lack double buffered watermarks will need to
handle the legacy cursor updates in the same way. So let's extract the
logic to determine the plane visibility into a small helper. For
simplicity we'll make the function DTRT for any plane, but only apply
the special sauce for cursor planes.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170314151050.12194-1-ville.syrjala@linux.intel.com
Tested-by: Dorota Czaplejewicz <dorota.czaplejewicz@collabora.co.uk>
Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
drivers/gpu/drm/i915/intel_pm.c

index aece0ff88a5d9834b6fe21998da87ef4e2a646c2..735ebd53c9d0d44fab00db70fc7959daba4bbf71 100644 (file)
@@ -655,6 +655,29 @@ static unsigned long intel_calculate_wm(unsigned long clock_in_khz,
        return wm_size;
 }
 
+static bool intel_wm_plane_visible(const struct intel_crtc_state *crtc_state,
+                                  const struct intel_plane_state *plane_state)
+{
+       struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
+
+       /* FIXME check the 'enable' instead */
+       if (!crtc_state->base.active)
+               return false;
+
+       /*
+        * Treat cursor with fb as always visible since cursor updates
+        * can happen faster than the vrefresh rate, and the current
+        * watermark code doesn't handle that correctly. Cursor updates
+        * which set/clear the fb or change the cursor size are going
+        * to get throttled by intel_legacy_cursor_update() to work
+        * around this problem with the watermark code.
+        */
+       if (plane->id == PLANE_CURSOR)
+               return plane_state->base.fb != NULL;
+       else
+               return plane_state->base.visible;
+}
+
 static struct intel_crtc *single_enabled_crtc(struct drm_i915_private *dev_priv)
 {
        struct intel_crtc *crtc, *enabled = NULL;
@@ -1961,7 +1984,7 @@ static uint32_t ilk_compute_pri_wm(const struct intel_crtc_state *cstate,
        uint32_t method1, method2;
        int cpp;
 
-       if (!cstate->base.active || !pstate->base.visible)
+       if (!intel_wm_plane_visible(cstate, pstate))
                return 0;
 
        cpp = pstate->base.fb->format->cpp[0];
@@ -1990,7 +2013,7 @@ static uint32_t ilk_compute_spr_wm(const struct intel_crtc_state *cstate,
        uint32_t method1, method2;
        int cpp;
 
-       if (!cstate->base.active || !pstate->base.visible)
+       if (!intel_wm_plane_visible(cstate, pstate))
                return 0;
 
        cpp = pstate->base.fb->format->cpp[0];
@@ -2013,15 +2036,7 @@ static uint32_t ilk_compute_cur_wm(const struct intel_crtc_state *cstate,
 {
        int cpp;
 
-       /*
-        * Treat cursor with fb as always visible since cursor updates
-        * can happen faster than the vrefresh rate, and the current
-        * watermark code doesn't handle that correctly. Cursor updates
-        * which set/clear the fb or change the cursor size are going
-        * to get throttled by intel_legacy_cursor_update() to work
-        * around this problem with the watermark code.
-        */
-       if (!cstate->base.active || !pstate->base.fb)
+       if (!intel_wm_plane_visible(cstate, pstate))
                return 0;
 
        cpp = pstate->base.fb->format->cpp[0];
@@ -2038,7 +2053,7 @@ static uint32_t ilk_compute_fbc_wm(const struct intel_crtc_state *cstate,
 {
        int cpp;
 
-       if (!cstate->base.active || !pstate->base.visible)
+       if (!intel_wm_plane_visible(cstate, pstate))
                return 0;
 
        cpp = pstate->base.fb->format->cpp[0];