In some cases the sink can reset itself after it was configured into MST mode, without the driver noticing the disconnected state. For instance the reset may happen in the middle of a modeset, or the (long) HPD pulse generated may be not long enough for the encoder detect handler to observe the HPD's deasserted state. In this case the sink's DPCD register programmed to enable MST will be reset, while the driver still assumes MST is still enabled. Detect this condition, which will tear down and recreate/re-enable the MST topology. v2: - Add a code comment about adjusting the expected DP_MSTM_CTRL register value for SST + SideBand. (Suraj, Jani) - Print a debug message about detecting the link reset. (Jani) - Verify the DPCD MST state only if it wasn't already determined that the sink is disconnected. Cc: stable@vger.kernel.org Cc: Jani Nikula <jani.nikula@intel.com> Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11195 Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com> (v1) Signed-off-by: Imre Deak <imre.deak@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20240823162918.1211875-1-imre.deak@intel.com
33 lines
1.2 KiB
C
33 lines
1.2 KiB
C
/* SPDX-License-Identifier: MIT */
|
|
/*
|
|
* Copyright © 2019 Intel Corporation
|
|
*/
|
|
|
|
#ifndef __INTEL_DP_MST_H__
|
|
#define __INTEL_DP_MST_H__
|
|
|
|
#include <linux/types.h>
|
|
|
|
struct intel_atomic_state;
|
|
struct intel_crtc;
|
|
struct intel_crtc_state;
|
|
struct intel_digital_port;
|
|
struct intel_dp;
|
|
struct intel_link_bw_limits;
|
|
|
|
int intel_dp_mst_encoder_init(struct intel_digital_port *dig_port, int conn_id);
|
|
void intel_dp_mst_encoder_cleanup(struct intel_digital_port *dig_port);
|
|
int intel_dp_mst_encoder_active_links(struct intel_digital_port *dig_port);
|
|
bool intel_dp_mst_is_master_trans(const struct intel_crtc_state *crtc_state);
|
|
bool intel_dp_mst_is_slave_trans(const struct intel_crtc_state *crtc_state);
|
|
bool intel_dp_mst_source_support(struct intel_dp *intel_dp);
|
|
int intel_dp_mst_add_topology_state_for_crtc(struct intel_atomic_state *state,
|
|
struct intel_crtc *crtc);
|
|
int intel_dp_mst_atomic_check_link(struct intel_atomic_state *state,
|
|
struct intel_link_bw_limits *limits);
|
|
bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
|
|
struct intel_crtc *crtc);
|
|
void intel_dp_mst_prepare_probe(struct intel_dp *intel_dp);
|
|
bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp);
|
|
|
|
#endif /* __INTEL_DP_MST_H__ */
|