mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
drm/i915/psr: Compute Panel Replay/Adaptive Sync coexistence behavior
Currently we are checking Panel Replay capability DPCD register in intel_alpm.c and writing PR_ALPM_CTL_ALLOW_LINK_OFF_BETWEEN_AS_SDP_AND_SU and PR_ALPM_CTL_AS_SDP_TRANSMISSION_IN_ACTIVE_DISABLE in PR_ALPM_CTL register base on the informaion. Instead of directly accessing intel_dp->pr_dpcd compute the behavior during psr_compute_config and store it in intel_crtc_state. v2: - inline added helpers - use intel_dp_attached_dp instead of passing as a parameter Signed-off-by: Jouni Högander <jouni.hogander@intel.com> Reviewed-by: Imre Deak <imre.deak@intel.com> Link: https://patch.msgid.link/20251204104733.1106145-4-jouni.hogander@intel.com
This commit is contained in:
@@ -326,11 +326,9 @@ static void lnl_alpm_configure(struct intel_dp *intel_dp,
|
||||
if (intel_dp->as_sdp_supported) {
|
||||
u32 pr_alpm_ctl = PR_ALPM_CTL_ADAPTIVE_SYNC_SDP_POSITION_T1;
|
||||
|
||||
if (intel_dp->pr_dpcd[INTEL_PR_DPCD_INDEX(DP_PANEL_REPLAY_CAP_CAPABILITY)] &
|
||||
DP_PANEL_REPLAY_LINK_OFF_SUPPORTED_IN_PR_AFTER_ADAPTIVE_SYNC_SDP)
|
||||
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 (!(intel_dp->pr_dpcd[INTEL_PR_DPCD_INDEX(DP_PANEL_REPLAY_CAP_CAPABILITY)] &
|
||||
DP_PANEL_REPLAY_ASYNC_VIDEO_TIMING_NOT_SUPPORTED_IN_PR))
|
||||
if (crtc_state->disable_as_sdp_when_pr_active)
|
||||
pr_alpm_ctl |= PR_ALPM_CTL_AS_SDP_TRANSMISSION_IN_ACTIVE_DISABLE;
|
||||
|
||||
intel_de_write(display, PR_ALPM_CTL(display, cpu_transcoder),
|
||||
|
||||
@@ -1162,6 +1162,8 @@ struct intel_crtc_state {
|
||||
bool enable_psr2_su_region_et;
|
||||
bool req_psr2_sdp_prior_scanline;
|
||||
bool has_panel_replay;
|
||||
bool link_off_after_as_sdp_when_pr_active;
|
||||
bool disable_as_sdp_when_pr_active;
|
||||
bool wm_level_disabled;
|
||||
bool pkg_c_latency_used;
|
||||
/* Only used for state verification. */
|
||||
|
||||
@@ -1708,14 +1708,25 @@ static bool _psr_compute_config(struct intel_dp *intel_dp,
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
_panel_replay_compute_config(struct intel_dp *intel_dp,
|
||||
struct intel_crtc_state *crtc_state,
|
||||
const struct drm_connector_state *conn_state)
|
||||
static inline bool compute_link_off_after_as_sdp_when_pr_active(struct intel_dp *intel_dp)
|
||||
{
|
||||
return (intel_dp->pr_dpcd[INTEL_PR_DPCD_INDEX(DP_PANEL_REPLAY_CAP_CAPABILITY)] &
|
||||
DP_PANEL_REPLAY_LINK_OFF_SUPPORTED_IN_PR_AFTER_ADAPTIVE_SYNC_SDP);
|
||||
}
|
||||
|
||||
static inline bool compute_disable_as_sdp_when_pr_active(struct intel_dp *intel_dp)
|
||||
{
|
||||
return !(intel_dp->pr_dpcd[INTEL_PR_DPCD_INDEX(DP_PANEL_REPLAY_CAP_CAPABILITY)] &
|
||||
DP_PANEL_REPLAY_ASYNC_VIDEO_TIMING_NOT_SUPPORTED_IN_PR);
|
||||
}
|
||||
|
||||
static bool _panel_replay_compute_config(struct intel_crtc_state *crtc_state,
|
||||
const struct drm_connector_state *conn_state)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct intel_connector *connector =
|
||||
to_intel_connector(conn_state->connector);
|
||||
struct intel_dp *intel_dp = intel_attached_dp(connector);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct intel_hdcp *hdcp = &connector->hdcp;
|
||||
|
||||
if (!CAN_PANEL_REPLAY(intel_dp))
|
||||
@@ -1740,6 +1751,9 @@ _panel_replay_compute_config(struct intel_dp *intel_dp,
|
||||
return false;
|
||||
}
|
||||
|
||||
crtc_state->link_off_after_as_sdp_when_pr_active = compute_link_off_after_as_sdp_when_pr_active(intel_dp);
|
||||
crtc_state->disable_as_sdp_when_pr_active = compute_disable_as_sdp_when_pr_active(intel_dp);
|
||||
|
||||
if (!intel_dp_is_edp(intel_dp))
|
||||
return true;
|
||||
|
||||
@@ -1847,8 +1861,7 @@ void intel_psr_compute_config(struct intel_dp *intel_dp,
|
||||
|
||||
/* Only used for state verification. */
|
||||
crtc_state->panel_replay_dsc_support = intel_dp->psr.sink_panel_replay_dsc_support;
|
||||
crtc_state->has_panel_replay = _panel_replay_compute_config(intel_dp,
|
||||
crtc_state,
|
||||
crtc_state->has_panel_replay = _panel_replay_compute_config(crtc_state,
|
||||
conn_state);
|
||||
|
||||
crtc_state->has_psr = crtc_state->has_panel_replay ? true :
|
||||
|
||||
Reference in New Issue
Block a user