Re: [PATCH 2/2] drm/i915/display: Keep AS SDP flowing when skip frames is enabled

Dibin Moolakadan Subrahmanian <[email protected]> Tue, 4 Aug 2026 12:51:32 +0530
Newsgroups org.freedesktop.lists.intel-xe,org.freedesktop.lists.intel-gfx
Message-ID <[email protected]>
On 8/4/2026 12:23 AM, Uma Shankar wrote:
> The AS SDP skip-frame mechanism relies on the AS SDP still being
> transmitted (just less often) while Panel Replay is active, so the source
> must not stop sending it in the PR active state, nor enter the DC3CO idle
> protocol which would suppress it entirely.
>
> When a non-zero skip-frame count is programmed, leave both
> PR_ALPM_CTL_AS_SDP_TRANSMISSION_IN_ACTIVE_DISABLE and
> PR_ALPM_CTL_USE_DC3CO_IDLE_PROTOCOL cleared. The previous behaviour
> (honouring disable_as_sdp_when_pr_active and the DC3CO idle protocol) is
> retained for the non skip-frame case.
>
> Assisted-by: Claude:claude-opus-4-8
> Signed-off-by: Naladala Ramanaidu <[email protected]>
> Signed-off-by: Uma Shankar <[email protected]>
> ---
>   drivers/gpu/drm/i915/display/intel_alpm.c | 28 +++++++++++++++--------
>   1 file changed, 19 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_alpm.c b/drivers/gpu/drm/i915/display/intel_alpm.c
> index 0f98f02a1848..7e2292f93e1e 100644
> --- a/drivers/gpu/drm/i915/display/intel_alpm.c
> +++ b/drivers/gpu/drm/i915/display/intel_alpm.c
> @@ -439,21 +439,31 @@ static void lnl_alpm_configure(struct intel_dp *intel_dp,
>   
>   		if (intel_dp->as_sdp_supported) {
>   			u32 pr_alpm_ctl = get_pr_alpm_as_sdp_transmission_time(crtc_state);
> +			u32 skip_frames = 0;
> +
> +			/* AS SDP skip frames field only exists on Xe3LPD+ */
> +			if (DISPLAY_VER(display) >= 35)
> +				skip_frames = intel_pr_as_sdp_skip_frames(crtc_state);
>   
>   			if (crtc_state->link_off_after_as_sdp_when_pr_active)
>   				pr_alpm_ctl |= PR_ALPM_CTL_ALLOW_LINK_OFF_BETWEEN_AS_SDP_AND_SU;
> -			if (crtc_state->disable_as_sdp_when_pr_active)
> -				pr_alpm_ctl |= PR_ALPM_CTL_AS_SDP_TRANSMISSION_IN_ACTIVE_DISABLE;
>   
> -			if (intel_display_power_dc3co_allowed(display))
> -				pr_alpm_ctl |= PR_ALPM_CTL_USE_DC3CO_IDLE_PROTOCOL;
> -			else
> +			/*
> +			 * Skip frames needs the AS SDP to keep flowing during PR
> +			 * active, so it is mutually exclusive with disabling AS SDP
> +			 * transmission in active and with the DC3CO idle protocol.
> +			 */
> +			if (skip_frames) {
> +				pr_alpm_ctl |= PR_ALPM_CTL_AS_SDP_SKIP_FRAMES(skip_frames);
> +				pr_alpm_ctl &= ~PR_ALPM_CTL_AS_SDP_TRANSMISSION_IN_ACTIVE_DISABLE;
>   				pr_alpm_ctl &= ~PR_ALPM_CTL_USE_DC3CO_IDLE_PROTOCOL;
> +			} else {
> +				if (crtc_state->disable_as_sdp_when_pr_active)
> +					pr_alpm_ctl |= PR_ALPM_CTL_AS_SDP_TRANSMISSION_IN_ACTIVE_DISABLE;
>   
> -			/* AS SDP skip frames field only exists on Xe3LPD+ */
> -			if (DISPLAY_VER(display) >= 35)
> -				pr_alpm_ctl |= PR_ALPM_CTL_AS_SDP_SKIP_FRAMES(
> -					intel_pr_as_sdp_skip_frames(crtc_state));
> +				if (intel_display_power_dc3co_allowed(display))
> +					pr_alpm_ctl |= PR_ALPM_CTL_USE_DC3CO_IDLE_PROTOCOL;
Do we also need to clear the AS SDP skip frame bits here?
Otherwise, LGTM.

Regards,
Dibin

> +			}
>   
>   			intel_de_write(display, PR_ALPM_CTL(display, cpu_transcoder),
>   				       pr_alpm_ctl);