drm/i915: Fix up skl_program_plane() pxp stuff
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 6 Oct 2021 23:57:02 +0000 (02:57 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Mon, 18 Oct 2021 09:25:02 +0000 (12:25 +0300)
There's lots of expensive stuff inserted between the PLANE_CTL
and  PLANE_SURF writes even though the comment before the PLANE_CTL
write says not to put stuff there. Move it all to a more apporiate
place.

There's also a weird PLANE_COLOR_CTL RMW in there. I guess because
force_black was computed way too late originally, but that is now
sorted.

Cc: Anshuman Gupta <anshuman.gupta@intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Juston Li <juston.li@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Uma Shankar <uma.shankar@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211006235704.28894-3-ville.syrjala@linux.intel.com
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/i915/display/skl_universal_plane.c

index 3ee403e..87e94e4 100644 (file)
@@ -985,6 +985,9 @@ static u32 glk_plane_color_ctl(const struct intel_crtc_state *crtc_state,
                        plane_color_ctl |= PLANE_COLOR_YUV_RANGE_CORRECTION_DISABLE;
        }
 
+       if (plane_state->force_black)
+               plane_color_ctl |= PLANE_COLOR_PLANE_CSC_ENABLE;
+
        return plane_color_ctl;
 }
 
@@ -1090,8 +1093,19 @@ skl_program_plane(struct intel_plane *plane,
                        aux_dist |= skl_plane_stride(plane_state, aux_plane);
        }
 
+       plane_surf = intel_plane_ggtt_offset(plane_state) + surf_addr;
+       if (plane_state->decrypt)
+               plane_surf |= PLANE_SURF_DECRYPT;
+
        spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
 
+       /*
+        * FIXME: pxp session invalidation can hit any time even at time of commit
+        * or after the commit, display content will be garbage.
+        */
+       if (plane_state->force_black)
+               intel_load_plane_csc_black(plane);
+
        intel_de_write_fw(dev_priv, PLANE_STRIDE(pipe, plane_id), stride);
        intel_de_write_fw(dev_priv, PLANE_POS(pipe, plane_id),
                          (crtc_y << 16) | crtc_x);
@@ -1146,22 +1160,6 @@ skl_program_plane(struct intel_plane *plane,
         * the control register just before the surface register.
         */
        intel_de_write_fw(dev_priv, PLANE_CTL(pipe, plane_id), plane_ctl);
-       plane_surf = intel_plane_ggtt_offset(plane_state) + surf_addr;
-       plane_color_ctl = intel_de_read_fw(dev_priv, PLANE_COLOR_CTL(pipe, plane_id));
-
-       /*
-        * FIXME: pxp session invalidation can hit any time even at time of commit
-        * or after the commit, display content will be garbage.
-        */
-       if (plane_state->decrypt) {
-               plane_surf |= PLANE_SURF_DECRYPT;
-       } else if (plane_state->force_black) {
-               intel_load_plane_csc_black(plane);
-               plane_color_ctl |= PLANE_COLOR_PLANE_CSC_ENABLE;
-       }
-
-       intel_de_write_fw(dev_priv, PLANE_COLOR_CTL(pipe, plane_id),
-                         plane_color_ctl);
        intel_de_write_fw(dev_priv, PLANE_SURF(pipe, plane_id), plane_surf);
 
        spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);