drm/amd/display: Reboot while unplug hdcp enabled dp from mst hub
authorhersen wu <hersenxs.wu@amd.com>
Thu, 14 Jul 2022 14:00:28 +0000 (10:00 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 25 Jul 2022 21:15:50 +0000 (17:15 -0400)
[Why]
event_property_update does not check NULL pointer

[How]
check aconnector->base.state equals NULL

Reviewed-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Acked-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: hersen wu <hersenxs.wu@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c

index fbb252a..6202e31 100644 (file)
@@ -302,7 +302,7 @@ static void event_property_update(struct work_struct *work)
        mutex_lock(&hdcp_work->mutex);
 
 
-       if (aconnector->base.state->commit) {
+       if (aconnector->base.state && aconnector->base.state->commit) {
                ret = wait_for_completion_interruptible_timeout(&aconnector->base.state->commit->hw_done, 10 * HZ);
 
                if (ret == 0) {
@@ -311,18 +311,26 @@ static void event_property_update(struct work_struct *work)
                }
        }
 
-       if (hdcp_work->encryption_status != MOD_HDCP_ENCRYPTION_STATUS_HDCP_OFF) {
-               if (aconnector->base.state->hdcp_content_type == DRM_MODE_HDCP_CONTENT_TYPE0 &&
-                   hdcp_work->encryption_status <= MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE0_ON)
-                       drm_hdcp_update_content_protection(&aconnector->base, DRM_MODE_CONTENT_PROTECTION_ENABLED);
-               else if (aconnector->base.state->hdcp_content_type == DRM_MODE_HDCP_CONTENT_TYPE1 &&
-                        hdcp_work->encryption_status == MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE1_ON)
-                       drm_hdcp_update_content_protection(&aconnector->base, DRM_MODE_CONTENT_PROTECTION_ENABLED);
-       } else {
-               drm_hdcp_update_content_protection(&aconnector->base, DRM_MODE_CONTENT_PROTECTION_DESIRED);
+       if (aconnector->base.state) {
+               if (hdcp_work->encryption_status != MOD_HDCP_ENCRYPTION_STATUS_HDCP_OFF) {
+                       if (aconnector->base.state->hdcp_content_type ==
+                               DRM_MODE_HDCP_CONTENT_TYPE0 &&
+                       hdcp_work->encryption_status <=
+                               MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE0_ON)
+                               drm_hdcp_update_content_protection(&aconnector->base,
+                                       DRM_MODE_CONTENT_PROTECTION_ENABLED);
+                       else if (aconnector->base.state->hdcp_content_type ==
+                                       DRM_MODE_HDCP_CONTENT_TYPE1 &&
+                               hdcp_work->encryption_status ==
+                                       MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE1_ON)
+                               drm_hdcp_update_content_protection(&aconnector->base,
+                                       DRM_MODE_CONTENT_PROTECTION_ENABLED);
+               } else {
+                       drm_hdcp_update_content_protection(&aconnector->base,
+                               DRM_MODE_CONTENT_PROTECTION_DESIRED);
+               }
        }
 
-
        mutex_unlock(&hdcp_work->mutex);
        drm_modeset_unlock(&dev->mode_config.connection_mutex);
 }
@@ -495,7 +503,9 @@ static void update_config(void *handle, struct cp_psp_stream_config *config)
                        (!!aconnector->base.state) ? aconnector->base.state->content_protection : -1,
                        (!!aconnector->base.state) ? aconnector->base.state->hdcp_content_type : -1);
 
-       hdcp_update_display(hdcp_work, link_index, aconnector, conn_state->hdcp_content_type, false);
+       if (conn_state)
+               hdcp_update_display(hdcp_work, link_index, aconnector,
+                       conn_state->hdcp_content_type, false);
 }