Unverified Commit 682f99b8 authored by maxime@cerno.tech's avatar maxime@cerno.tech Committed by Maxime Ripard
Browse files

drm/vc4: hdmi: Take our lock to reset the link



We access some fields protected by our internal mutex in
vc4_hdmi_reset_link() (saved_adjusted_mode, output_bpc, output_format)
and are calling functions that need to have that lock taken
(vc4_hdmi_supports_scrambling()).

However, the current code doesn't lock that mutex. Let's make sure it
does.

Fixes: 6bed2ea3 ("drm/vc4: hdmi: Reset link on hotplug")
Reviewed-by: default avatarJavier Martinez Canillas <javierm@redhat.com>
Link: https://lore.kernel.org/r/20221024093634.118190-1-maxime@cerno.tech


Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
parent fc007fb8
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -349,27 +349,40 @@ static int vc4_hdmi_reset_link(struct drm_connector *connector,
	if (!crtc_state->active)
		return 0;

	if (!vc4_hdmi_supports_scrambling(encoder))
	mutex_lock(&vc4_hdmi->mutex);

	if (!vc4_hdmi_supports_scrambling(encoder)) {
		mutex_unlock(&vc4_hdmi->mutex);
		return 0;
	}

	scrambling_needed = vc4_hdmi_mode_needs_scrambling(&vc4_hdmi->saved_adjusted_mode,
							   vc4_hdmi->output_bpc,
							   vc4_hdmi->output_format);
	if (!scrambling_needed)
	if (!scrambling_needed) {
		mutex_unlock(&vc4_hdmi->mutex);
		return 0;
	}

	if (conn_state->commit &&
	    !try_wait_for_completion(&conn_state->commit->hw_done))
	    !try_wait_for_completion(&conn_state->commit->hw_done)) {
		mutex_unlock(&vc4_hdmi->mutex);
		return 0;
	}

	ret = drm_scdc_readb(connector->ddc, SCDC_TMDS_CONFIG, &config);
	if (ret < 0) {
		drm_err(drm, "Failed to read TMDS config: %d\n", ret);
		mutex_unlock(&vc4_hdmi->mutex);
		return 0;
	}

	if (!!(config & SCDC_SCRAMBLING_ENABLE) == scrambling_needed)
	if (!!(config & SCDC_SCRAMBLING_ENABLE) == scrambling_needed) {
		mutex_unlock(&vc4_hdmi->mutex);
		return 0;
	}

	mutex_unlock(&vc4_hdmi->mutex);

	/*
	 * HDMI 2.0 says that one should not send scrambled data