Skip to content

Commit 0848814

Browse files
ideakjlahtine-intel
authored andcommitted
drm/i915/dp: Fix connector DSC HW state readout
The DSC HW state of DP connectors is read out during driver loading and system resume in intel_modeset_update_connector_atomic_state(). This function is called for all connectors though and so the state of DSI connectors will also get updated incorrectly, triggering a WARN there wrt. the DSC decompression AUX device. Fix the above by moving the DSC state readout to a new DP connector specific sync_state() hook. This is anyway the logical place to update the connector object's state vs. the connector's atomic state. Fixes: b2608c6 ("drm/i915/dp_mst: Enable MST DSC decompression for all streams") Reported-and-tested-by: Drew Davenport <[email protected]> Closes: https://lore.kernel.org/all/[email protected] Reviewed-by: Ankit Nautiyal <[email protected]> Signed-off-by: Imre Deak <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] (cherry picked from commit a62e145) Signed-off-by: Joonas Lahtinen <[email protected]>
1 parent 26d2b75 commit 0848814

File tree

5 files changed

+29
-7
lines changed

5 files changed

+29
-7
lines changed

drivers/gpu/drm/i915/display/intel_display_types.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,13 @@ struct intel_connector {
609609
* and active (i.e. dpms ON state). */
610610
bool (*get_hw_state)(struct intel_connector *);
611611

612+
/*
613+
* Optional hook called during init/resume to sync any state
614+
* stored in the connector (eg. DSC state) wrt. the HW state.
615+
*/
616+
void (*sync_state)(struct intel_connector *connector,
617+
const struct intel_crtc_state *crtc_state);
618+
612619
/* Panel info for eDP and LVDS */
613620
struct intel_panel panel;
614621

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5859,6 +5859,19 @@ intel_dp_connector_unregister(struct drm_connector *connector)
58595859
intel_connector_unregister(connector);
58605860
}
58615861

5862+
void intel_dp_connector_sync_state(struct intel_connector *connector,
5863+
const struct intel_crtc_state *crtc_state)
5864+
{
5865+
struct drm_i915_private *i915 = to_i915(connector->base.dev);
5866+
5867+
if (crtc_state && crtc_state->dsc.compression_enable) {
5868+
drm_WARN_ON(&i915->drm, !connector->dp.dsc_decompression_aux);
5869+
connector->dp.dsc_decompression_enabled = true;
5870+
} else {
5871+
connector->dp.dsc_decompression_enabled = false;
5872+
}
5873+
}
5874+
58625875
void intel_dp_encoder_flush_work(struct drm_encoder *encoder)
58635876
{
58645877
struct intel_digital_port *dig_port = enc_to_dig_port(to_intel_encoder(encoder));

drivers/gpu/drm/i915/display/intel_dp.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ bool intel_dp_limited_color_range(const struct intel_crtc_state *crtc_state,
4545
int intel_dp_min_bpp(enum intel_output_format output_format);
4646
bool intel_dp_init_connector(struct intel_digital_port *dig_port,
4747
struct intel_connector *intel_connector);
48+
void intel_dp_connector_sync_state(struct intel_connector *connector,
49+
const struct intel_crtc_state *crtc_state);
4850
void intel_dp_set_link_params(struct intel_dp *intel_dp,
4951
int link_rate, int lane_count);
5052
int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1534,6 +1534,7 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo
15341534
return NULL;
15351535

15361536
intel_connector->get_hw_state = intel_dp_mst_get_hw_state;
1537+
intel_connector->sync_state = intel_dp_connector_sync_state;
15371538
intel_connector->mst_port = intel_dp;
15381539
intel_connector->port = port;
15391540
drm_dp_mst_get_port_malloc(port);

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -318,12 +318,6 @@ static void intel_modeset_update_connector_atomic_state(struct drm_i915_private
318318
const struct intel_crtc_state *crtc_state =
319319
to_intel_crtc_state(crtc->base.state);
320320

321-
if (crtc_state->dsc.compression_enable) {
322-
drm_WARN_ON(&i915->drm, !connector->dp.dsc_decompression_aux);
323-
connector->dp.dsc_decompression_enabled = true;
324-
} else {
325-
connector->dp.dsc_decompression_enabled = false;
326-
}
327321
conn_state->max_bpc = (crtc_state->pipe_bpp ?: 24) / 3;
328322
}
329323
}
@@ -775,8 +769,9 @@ static void intel_modeset_readout_hw_state(struct drm_i915_private *i915)
775769

776770
drm_connector_list_iter_begin(&i915->drm, &conn_iter);
777771
for_each_intel_connector_iter(connector, &conn_iter) {
772+
struct intel_crtc_state *crtc_state = NULL;
773+
778774
if (connector->get_hw_state(connector)) {
779-
struct intel_crtc_state *crtc_state;
780775
struct intel_crtc *crtc;
781776

782777
connector->base.dpms = DRM_MODE_DPMS_ON;
@@ -802,6 +797,10 @@ static void intel_modeset_readout_hw_state(struct drm_i915_private *i915)
802797
connector->base.dpms = DRM_MODE_DPMS_OFF;
803798
connector->base.encoder = NULL;
804799
}
800+
801+
if (connector->sync_state)
802+
connector->sync_state(connector, crtc_state);
803+
805804
drm_dbg_kms(&i915->drm,
806805
"[CONNECTOR:%d:%s] hw state readout: %s\n",
807806
connector->base.base.id, connector->base.name,

0 commit comments

Comments
 (0)