Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915/alpm: Stop writing ALPM registers when PSR is enabled

Currently we are seeing these on PTL:

xe 0000:00:02.0: [drm] *ERROR* Timeout waiting for DDI BUF A to get active

These seem to be caused by writing ALPM registers while Panel Replay is
enabled.

Fix this by writing ALPM registers only when Panel Replay is about to be
enabled.

v4: improve comment on intel_psr_panel_replay_enable_sink call
v3: enable/disable ALPM from PSR code

Fixes: 172757acd6f6 ("drm/i915/lobf: Add lobf enablement in post plane update")
Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Link: https://lore.kernel.org/r/20250513054814.3702977-3-jouni.hogander@intel.com

+12 -5
+2 -2
drivers/gpu/drm/i915/display/intel_alpm.c
··· 453 453 intel_atomic_get_old_crtc_state(state, crtc); 454 454 struct intel_encoder *encoder; 455 455 456 - if ((!crtc_state->has_lobf || 457 - crtc_state->has_lobf == old_crtc_state->has_lobf) && !crtc_state->has_psr) 456 + if (crtc_state->has_psr || !crtc_state->has_lobf || 457 + crtc_state->has_lobf == old_crtc_state->has_lobf) 458 458 return; 459 459 460 460 for_each_intel_encoder_mask(display->drm, encoder,
+10 -3
drivers/gpu/drm/i915/display/intel_psr.c
··· 800 800 static void intel_psr_enable_sink(struct intel_dp *intel_dp, 801 801 const struct intel_crtc_state *crtc_state) 802 802 { 803 + intel_alpm_enable_sink(intel_dp, crtc_state); 804 + 803 805 crtc_state->has_panel_replay ? 804 806 _panel_replay_enable_sink(intel_dp, crtc_state) : 805 807 _psr_enable_sink(intel_dp, crtc_state); ··· 1964 1962 IS_DISPLAY_VERx100_STEP(display, 3000, STEP_A0, STEP_B0)) && 1965 1963 !intel_dp->psr.panel_replay_enabled) 1966 1964 intel_dmc_block_pkgc(display, intel_dp->psr.pipe, true); 1965 + 1966 + intel_alpm_configure(intel_dp, crtc_state); 1967 1967 } 1968 1968 1969 1969 static bool psr_interrupt_error_check(struct intel_dp *intel_dp) ··· 2033 2029 intel_dp->psr.sel_update_enabled ? "2" : "1"); 2034 2030 2035 2031 /* 2036 - * Enabling here only for PSR. Panel Replay enable bit is already 2037 - * written at this point. See 2032 + * Enabling sink PSR/Panel Replay here only for PSR. Panel Replay enable 2033 + * bit is already written at this point. Sink ALPM is enabled here for 2034 + * PSR and Panel Replay. See 2038 2035 * intel_psr_panel_replay_enable_sink. Modifiers/options: 2039 2036 * - Selective Update 2040 2037 * - Region Early Transport ··· 2176 2171 2177 2172 if (intel_dp_is_edp(intel_dp)) 2178 2173 intel_snps_phy_update_psr_power_state(&dp_to_dig_port(intel_dp)->base, false); 2174 + 2175 + if (intel_dp->psr.panel_replay_enabled && intel_dp_is_edp(intel_dp)) 2176 + intel_alpm_disable(intel_dp); 2179 2177 2180 2178 /* Disable PSR on Sink */ 2181 2179 if (!intel_dp->psr.panel_replay_enabled) { ··· 3506 3498 if (intel_alpm_get_error(intel_dp)) { 3507 3499 intel_psr_disable_locked(intel_dp); 3508 3500 psr->sink_not_reliable = true; 3509 - intel_alpm_disable(intel_dp); 3510 3501 } 3511 3502 } 3512 3503