]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/vc4: hdmi: Take our lock to reset the link
authormaxime@cerno.tech <maxime@cerno.tech>
Mon, 24 Oct 2022 09:36:33 +0000 (11:36 +0200)
committerMaxime Ripard <maxime@cerno.tech>
Thu, 3 Nov 2022 08:26:41 +0000 (09:26 +0100)
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: 6bed2ea3cb38 ("drm/vc4: hdmi: Reset link on hotplug")
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Link: https://lore.kernel.org/r/20221024093634.118190-1-maxime@cerno.tech
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
drivers/gpu/drm/vc4/vc4_hdmi.c

index 596e311d6e58eaf7c2c914b531643f7d34979052..9e549fa074676e7b64058f1d24d7232cd82042fc 100644 (file)
@@ -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