return;
 }
 
-static void dm_set_dpms_off(struct dc_link *link)
+static void dm_set_dpms_off(struct dc_link *link, struct dm_crtc_state *acrtc_state)
 {
        struct dc_stream_state *stream_state;
        struct amdgpu_dm_connector *aconnector = link->priv;
        }
 
        stream_update.stream = stream_state;
+       acrtc_state->force_dpms_off = true;
        dc_commit_updates_for_stream(stream_state->ctx->dc, NULL, 0,
                                     stream_state, &stream_update,
                                     stream_state->ctx->dc->current_state);
        struct drm_device *dev = connector->dev;
        enum dc_connection_type new_connection_type = dc_connection_none;
        struct amdgpu_device *adev = drm_to_adev(dev);
-#ifdef CONFIG_DRM_AMD_DC_HDCP
        struct dm_connector_state *dm_con_state = to_dm_connector_state(connector->state);
-#endif
+       struct dm_crtc_state *dm_crtc_state = NULL;
 
        if (adev->dm.disable_hpd_irq)
                return;
 
+       if (dm_con_state->base.state && dm_con_state->base.crtc)
+               dm_crtc_state = to_dm_crtc_state(drm_atomic_get_crtc_state(
+                                       dm_con_state->base.state,
+                                       dm_con_state->base.crtc));
        /*
         * In case of failure or MST no need to update connector status or notify the OS
         * since (for MST case) MST does this in its own context.
 
        } else if (dc_link_detect(aconnector->dc_link, DETECT_REASON_HPD)) {
                if (new_connection_type == dc_connection_none &&
-                   aconnector->dc_link->type == dc_connection_none)
-                       dm_set_dpms_off(aconnector->dc_link);
+                   aconnector->dc_link->type == dc_connection_none &&
+                   dm_crtc_state)
+                       dm_set_dpms_off(aconnector->dc_link, dm_crtc_state);
 
                amdgpu_dm_update_connector_after_detect(aconnector);
 
        state->freesync_config = cur->freesync_config;
        state->cm_has_degamma = cur->cm_has_degamma;
        state->cm_is_degamma_srgb = cur->cm_is_degamma_srgb;
+       state->force_dpms_off = cur->force_dpms_off;
        /* TODO Duplicate dc_stream after objects are stream object is flattened */
 
        return &state->base;
                 * and rely on sending it from software.
                 */
                if (acrtc_attach->base.state->event &&
-                   acrtc_state->active_planes > 0) {
+                   acrtc_state->active_planes > 0 &&
+                   !acrtc_state->force_dpms_off) {
                        drm_crtc_vblank_get(pcrtc);
 
                        spin_lock_irqsave(&pcrtc->dev->event_lock, flags);
 
        struct mod_hdcp_display *display = &hdcp_work[link_index].display;
        struct mod_hdcp_link *link = &hdcp_work[link_index].link;
        struct drm_connector_state *conn_state;
+       struct dc_sink *sink = NULL;
+#if defined(CONFIG_DRM_AMD_DC_DCN3_1)
+       bool link_is_hdcp14 = false;
+#endif
 
        if (config->dpms_off) {
                hdcp_remove_display(hdcp_work, link_index, aconnector);
        display->index = aconnector->base.index;
        display->state = MOD_HDCP_DISPLAY_ACTIVE;
 
-       if (aconnector->dc_sink != NULL)
-               link->mode = mod_hdcp_signal_type_to_operation_mode(aconnector->dc_sink->sink_signal);
+       if (aconnector->dc_sink)
+               sink = aconnector->dc_sink;
+       else if (aconnector->dc_em_sink)
+               sink = aconnector->dc_em_sink;
+
+       if (sink != NULL)
+               link->mode = mod_hdcp_signal_type_to_operation_mode(sink->sink_signal);
 
        display->controller = CONTROLLER_ID_D0 + config->otg_inst;
        display->dig_fe = config->dig_fe;
        display->stream_enc_idx = config->stream_enc_idx;
        link->link_enc_idx = config->link_enc_idx;
        link->phy_idx = config->phy_idx;
-       link->hdcp_supported_informational = dc_link_is_hdcp14(aconnector->dc_link,
-                       aconnector->dc_sink->sink_signal) ? 1 : 0;
+       if (sink)
+               link_is_hdcp14 = dc_link_is_hdcp14(aconnector->dc_link, sink->sink_signal);
+       link->hdcp_supported_informational = link_is_hdcp14;
        link->dp.rev = aconnector->dc_link->dpcd_caps.dpcd_rev.raw;
        link->dp.assr_enabled = config->assr_enabled;
        link->dp.mst_enabled = config->mst_enabled;