Patch "drm/i915/psr: Set "SF Partial Frame Enable" also on full update" has been added to the 5.16-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    drm/i915/psr: Set "SF Partial Frame Enable" also on full update

to the 5.16-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     drm-i915-psr-set-sf-partial-frame-enable-also-on-ful.patch
and it can be found in the queue-5.16 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 0264f762270c6f87e929c3bb2d7a58ae9e155ab4
Author: Jouni Högander <jouni.hogander@xxxxxxxxx>
Date:   Fri Feb 25 09:02:28 2022 +0200

    drm/i915/psr: Set "SF Partial Frame Enable" also on full update
    
    [ Upstream commit 804f468853179b9b58af05c153c411931aa5b310 ]
    
    Currently we are observing occasional screen flickering when
    PSR2 selective fetch is enabled. More specifically glitch seems
    to happen on full frame update when cursor moves to coords
    x = -1 or y = -1.
    
    According to Bspec SF Single full frame should not be set if
    SF Partial Frame Enable is not set. This happened to be true for
    ADLP as PSR2_MAN_TRK_CTL_ENABLE is always set and for ADL_P it's
    actually "SF Partial Frame Enable" (Bit 31).
    
    Setting "SF Partial Frame Enable" bit also on full update seems to
    fix screen flickering.
    
    Also make code more clear by setting PSR2_MAN_TRK_CTL_ENABLE
    only if not on ADL_P. Bit 31 has different meaning in ADL_P.
    
    Bspec: 49274
    
    v2: Fix Mihai Harpau email address
    v3: Modify commit message and remove unnecessary comment
    
    Tested-by: Lyude Paul <lyude@xxxxxxxxxx>
    Fixes: 7f6002e58025 ("drm/i915/display: Enable PSR2 selective fetch by default")
    Reported-by: Lyude Paul <lyude@xxxxxxxxxx>
    Cc: Mihai Harpau <mharpau@xxxxxxxxx>
    Cc: José Roberto de Souza <jose.souza@xxxxxxxxx>
    Cc: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx>
    Bugzilla: https://gitlab.freedesktop.org/drm/intel/-/issues/5077
    Signed-off-by: Jouni Högander <jouni.hogander@xxxxxxxxx>
    Reviewed-by: José Roberto de Souza <jose.souza@xxxxxxxxx>
    Signed-off-by: José Roberto de Souza <jose.souza@xxxxxxxxx>
    Link: https://patchwork.freedesktop.org/patch/msgid/20220225070228.855138-1-jouni.hogander@xxxxxxxxx
    (cherry picked from commit 8d5516d18b323cf7274d1cf5fe76f4a691f879c6)
    Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/gpu/drm/i915/display/intel_psr.c b/drivers/gpu/drm/i915/display/intel_psr.c
index 7a205fd5023b..3ba8b717e176 100644
--- a/drivers/gpu/drm/i915/display/intel_psr.c
+++ b/drivers/gpu/drm/i915/display/intel_psr.c
@@ -1400,6 +1400,13 @@ static inline u32 man_trk_ctl_single_full_frame_bit_get(struct drm_i915_private
 	       PSR2_MAN_TRK_CTL_SF_SINGLE_FULL_FRAME;
 }
 
+static inline u32 man_trk_ctl_partial_frame_bit_get(struct drm_i915_private *dev_priv)
+{
+	return IS_ALDERLAKE_P(dev_priv) ?
+	       ADLP_PSR2_MAN_TRK_CTL_SF_PARTIAL_FRAME_UPDATE :
+	       PSR2_MAN_TRK_CTL_SF_PARTIAL_FRAME_UPDATE;
+}
+
 static void psr_force_hw_tracking_exit(struct intel_dp *intel_dp)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
@@ -1495,7 +1502,13 @@ static void psr2_man_trk_ctl_calc(struct intel_crtc_state *crtc_state,
 {
 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
-	u32 val = PSR2_MAN_TRK_CTL_ENABLE;
+	u32 val = 0;
+
+	if (!IS_ALDERLAKE_P(dev_priv))
+		val = PSR2_MAN_TRK_CTL_ENABLE;
+
+	/* SF partial frame enable has to be set even on full update */
+	val |= man_trk_ctl_partial_frame_bit_get(dev_priv);
 
 	if (full_update) {
 		/*
@@ -1515,7 +1528,6 @@ static void psr2_man_trk_ctl_calc(struct intel_crtc_state *crtc_state,
 	} else {
 		drm_WARN_ON(crtc_state->uapi.crtc->dev, clip->y1 % 4 || clip->y2 % 4);
 
-		val |= PSR2_MAN_TRK_CTL_SF_PARTIAL_FRAME_UPDATE;
 		val |= PSR2_MAN_TRK_CTL_SU_REGION_START_ADDR(clip->y1 / 4 + 1);
 		val |= PSR2_MAN_TRK_CTL_SU_REGION_END_ADDR(clip->y2 / 4 + 1);
 	}
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 14ce8809efdd..e927776ae183 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -4738,6 +4738,7 @@ enum {
 #define  ADLP_PSR2_MAN_TRK_CTL_SU_REGION_START_ADDR(val)	REG_FIELD_PREP(ADLP_PSR2_MAN_TRK_CTL_SU_REGION_START_ADDR_MASK, val)
 #define  ADLP_PSR2_MAN_TRK_CTL_SU_REGION_END_ADDR_MASK		REG_GENMASK(12, 0)
 #define  ADLP_PSR2_MAN_TRK_CTL_SU_REGION_END_ADDR(val)		REG_FIELD_PREP(ADLP_PSR2_MAN_TRK_CTL_SU_REGION_END_ADDR_MASK, val)
+#define  ADLP_PSR2_MAN_TRK_CTL_SF_PARTIAL_FRAME_UPDATE		REG_BIT(31)
 #define  ADLP_PSR2_MAN_TRK_CTL_SF_SINGLE_FULL_FRAME		REG_BIT(14)
 #define  ADLP_PSR2_MAN_TRK_CTL_SF_CONTINUOS_FULL_FRAME		REG_BIT(13)
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux