Skip to content

Commit 804f468

Browse files
hogandertursulin
authored andcommitted
drm/i915/psr: Set "SF Partial Frame Enable" also on full update
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 <[email protected]> Fixes: 7f6002e ("drm/i915/display: Enable PSR2 selective fetch by default") Reported-by: Lyude Paul <[email protected]> Cc: Mihai Harpau <[email protected]> Cc: José Roberto de Souza <[email protected]> Cc: Ville Syrjälä <[email protected]> Bugzilla: https://gitlab.freedesktop.org/drm/intel/-/issues/5077 Signed-off-by: Jouni Högander <[email protected]> Reviewed-by: José Roberto de Souza <[email protected]> Signed-off-by: José Roberto de Souza <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] (cherry picked from commit 8d5516d) Signed-off-by: Tvrtko Ursulin <[email protected]>
1 parent ffb217a commit 804f468

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

drivers/gpu/drm/i915/display/intel_psr.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1406,6 +1406,13 @@ static inline u32 man_trk_ctl_single_full_frame_bit_get(struct drm_i915_private
14061406
PSR2_MAN_TRK_CTL_SF_SINGLE_FULL_FRAME;
14071407
}
14081408

1409+
static inline u32 man_trk_ctl_partial_frame_bit_get(struct drm_i915_private *dev_priv)
1410+
{
1411+
return IS_ALDERLAKE_P(dev_priv) ?
1412+
ADLP_PSR2_MAN_TRK_CTL_SF_PARTIAL_FRAME_UPDATE :
1413+
PSR2_MAN_TRK_CTL_SF_PARTIAL_FRAME_UPDATE;
1414+
}
1415+
14091416
static void psr_force_hw_tracking_exit(struct intel_dp *intel_dp)
14101417
{
14111418
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
@@ -1510,7 +1517,13 @@ static void psr2_man_trk_ctl_calc(struct intel_crtc_state *crtc_state,
15101517
{
15111518
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
15121519
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1513-
u32 val = PSR2_MAN_TRK_CTL_ENABLE;
1520+
u32 val = 0;
1521+
1522+
if (!IS_ALDERLAKE_P(dev_priv))
1523+
val = PSR2_MAN_TRK_CTL_ENABLE;
1524+
1525+
/* SF partial frame enable has to be set even on full update */
1526+
val |= man_trk_ctl_partial_frame_bit_get(dev_priv);
15141527

15151528
if (full_update) {
15161529
/*
@@ -1530,7 +1543,6 @@ static void psr2_man_trk_ctl_calc(struct intel_crtc_state *crtc_state,
15301543
} else {
15311544
drm_WARN_ON(crtc_state->uapi.crtc->dev, clip->y1 % 4 || clip->y2 % 4);
15321545

1533-
val |= PSR2_MAN_TRK_CTL_SF_PARTIAL_FRAME_UPDATE;
15341546
val |= PSR2_MAN_TRK_CTL_SU_REGION_START_ADDR(clip->y1 / 4 + 1);
15351547
val |= PSR2_MAN_TRK_CTL_SU_REGION_END_ADDR(clip->y2 / 4 + 1);
15361548
}

drivers/gpu/drm/i915/i915_reg.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4829,6 +4829,7 @@ enum {
48294829
#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)
48304830
#define ADLP_PSR2_MAN_TRK_CTL_SU_REGION_END_ADDR_MASK REG_GENMASK(12, 0)
48314831
#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)
4832+
#define ADLP_PSR2_MAN_TRK_CTL_SF_PARTIAL_FRAME_UPDATE REG_BIT(31)
48324833
#define ADLP_PSR2_MAN_TRK_CTL_SF_SINGLE_FULL_FRAME REG_BIT(14)
48334834
#define ADLP_PSR2_MAN_TRK_CTL_SF_CONTINUOS_FULL_FRAME REG_BIT(13)
48344835

0 commit comments

Comments
 (0)