drm/1915/fbc: Replace plane->has_fbc with a pointer to the fbc instance
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 4 Nov 2021 14:45:20 +0000 (16:45 +0200)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 11 Nov 2021 13:18:12 +0000 (15:18 +0200)
With multiple fbc instances we need to find the right one for each
plane. Rather than going looking for the right instance every time
let's just replace the has_fbc boolean with a pointer that gets us
there straight away.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211104144520.22605-18-ville.syrjala@linux.intel.com
Acked-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Mika Kahola <mika.kahola@intel.com>
drivers/gpu/drm/i915/display/i9xx_plane.c
drivers/gpu/drm/i915/display/intel_display.c
drivers/gpu/drm/i915/display/intel_display_types.h
drivers/gpu/drm/i915/display/intel_fbc.c
drivers/gpu/drm/i915/display/skl_universal_plane.c

index ba276e8..2194f74 100644 (file)
@@ -807,12 +807,10 @@ intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe)
        plane->id = PLANE_PRIMARY;
        plane->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, plane->id);
 
-       plane->has_fbc = i9xx_plane_has_fbc(dev_priv, plane->i9xx_plane);
-       if (plane->has_fbc) {
-               struct intel_fbc *fbc = &dev_priv->fbc;
-
-               fbc->possible_framebuffer_bits |= plane->frontbuffer_bit;
-       }
+       if (i9xx_plane_has_fbc(dev_priv, plane->i9xx_plane))
+               plane->fbc = &dev_priv->fbc;
+       if (plane->fbc)
+               plane->fbc->possible_framebuffer_bits |= plane->frontbuffer_bit;
 
        if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
                formats = vlv_primary_formats;
index d6ff4ae..0ceee8a 100644 (file)
@@ -645,7 +645,7 @@ bool intel_plane_uses_fence(const struct intel_plane_state *plane_state)
        struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
 
        return DISPLAY_VER(dev_priv) < 4 ||
-               (plane->has_fbc &&
+               (plane->fbc &&
                 plane_state->view.gtt.type == I915_GGTT_VIEW_NORMAL);
 }
 
index 7771716..ea1e8a6 100644 (file)
@@ -51,6 +51,7 @@
 struct drm_printer;
 struct __intel_global_objs_state;
 struct intel_ddi_buf_trans;
+struct intel_fbc;
 
 /*
  * Display related stuff
@@ -1339,7 +1340,6 @@ struct intel_plane {
        enum i9xx_plane_id i9xx_plane;
        enum plane_id id;
        enum pipe pipe;
-       bool has_fbc;
        bool need_async_flip_disable_wa;
        u32 frontbuffer_bit;
 
@@ -1347,6 +1347,8 @@ struct intel_plane {
                u32 base, cntl, size;
        } cursor;
 
+       struct intel_fbc *fbc;
+
        /*
         * NOTE: Do not place new plane state fields here (e.g., when adding
         * new plane properties).  New runtime state should now be placed in
index e8235d5..a7e0f79 100644 (file)
@@ -1217,11 +1217,11 @@ bool intel_fbc_pre_update(struct intel_atomic_state *state,
        const struct intel_plane_state *plane_state =
                intel_atomic_get_new_plane_state(state, plane);
        struct drm_i915_private *i915 = to_i915(crtc->base.dev);
-       struct intel_fbc *fbc = &i915->fbc;
+       struct intel_fbc *fbc = plane->fbc;
        const char *reason = "update pending";
        bool need_vblank_wait = false;
 
-       if (!plane->has_fbc || !plane_state)
+       if (!fbc || !plane_state)
                return need_vblank_wait;
 
        mutex_lock(&fbc->lock);
@@ -1309,13 +1309,12 @@ static void __intel_fbc_post_update(struct intel_crtc *crtc)
 void intel_fbc_post_update(struct intel_atomic_state *state,
                           struct intel_crtc *crtc)
 {
-       struct drm_i915_private *i915 = to_i915(crtc->base.dev);
        struct intel_plane *plane = to_intel_plane(crtc->base.primary);
        const struct intel_plane_state *plane_state =
                intel_atomic_get_new_plane_state(state, plane);
-       struct intel_fbc *fbc = &i915->fbc;
+       struct intel_fbc *fbc = plane->fbc;
 
-       if (!plane->has_fbc || !plane_state)
+       if (!fbc || !plane_state)
                return;
 
        mutex_lock(&fbc->lock);
@@ -1419,7 +1418,7 @@ void intel_fbc_choose_crtc(struct drm_i915_private *i915,
                struct intel_crtc_state *crtc_state;
                struct intel_crtc *crtc = to_intel_crtc(plane_state->hw.crtc);
 
-               if (!plane->has_fbc)
+               if (plane->fbc != fbc)
                        continue;
 
                if (!plane_state->uapi.visible)
@@ -1458,13 +1457,15 @@ static void intel_fbc_enable(struct intel_atomic_state *state,
                intel_atomic_get_new_crtc_state(state, crtc);
        const struct intel_plane_state *plane_state =
                intel_atomic_get_new_plane_state(state, plane);
-       struct intel_fbc *fbc = &i915->fbc;
-       struct intel_fbc_state_cache *cache = &fbc->state_cache;
+       struct intel_fbc *fbc = plane->fbc;
+       struct intel_fbc_state_cache *cache;
        int min_limit;
 
-       if (!plane->has_fbc || !plane_state)
+       if (!fbc || !plane_state)
                return;
 
+       cache = &fbc->state_cache;
+
        min_limit = intel_fbc_min_limit(plane_state->hw.fb ?
                                        plane_state->hw.fb->format->cpp[0] : 0);
 
@@ -1514,11 +1515,10 @@ out:
  */
 void intel_fbc_disable(struct intel_crtc *crtc)
 {
-       struct drm_i915_private *i915 = to_i915(crtc->base.dev);
        struct intel_plane *plane = to_intel_plane(crtc->base.primary);
-       struct intel_fbc *fbc = &i915->fbc;
+       struct intel_fbc *fbc = plane->fbc;
 
-       if (!plane->has_fbc)
+       if (!fbc)
                return;
 
        mutex_lock(&fbc->lock);
index 9eda043..2889087 100644 (file)
@@ -2101,12 +2101,10 @@ skl_universal_plane_create(struct drm_i915_private *dev_priv,
        plane->id = plane_id;
        plane->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, plane_id);
 
-       plane->has_fbc = skl_plane_has_fbc(dev_priv, pipe, plane_id);
-       if (plane->has_fbc) {
-               struct intel_fbc *fbc = &dev_priv->fbc;
-
-               fbc->possible_framebuffer_bits |= plane->frontbuffer_bit;
-       }
+       if (skl_plane_has_fbc(dev_priv, pipe, plane_id))
+               plane->fbc = &dev_priv->fbc;
+       if (plane->fbc)
+               plane->fbc->possible_framebuffer_bits |= plane->frontbuffer_bit;
 
        if (DISPLAY_VER(dev_priv) >= 11) {
                plane->min_width = icl_plane_min_width;