]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
drm/amd/display: Fix in disabling secure display
authorAlan Liu <HaoPing.Liu@amd.com>
Wed, 22 Mar 2023 05:43:28 +0000 (13:43 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 18 Apr 2023 20:28:52 +0000 (16:28 -0400)
[Why]
Currently we don't check if secure display is enabled before we send
command to disable secure display in dmub. It will accidentally cause
some other igt tests to fail, eg, crtc-linear-degamma.

[How]
Refactor the code we reset the secure display state to check secure
display was enabled or not before stopping it in dmub.

Reviewed-by: Wayne Lin <Wayne.Lin@amd.com>
Acked-by: Qingqing Zhuo <qingqing.zhuo@amd.com>
Signed-off-by: Alan Liu <HaoPing.Liu@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_crc.c

index 27711743c22ce6d7cfe1576d3a6e2903cf798920..0802f8e8fac5f07f1f53d9fc85986154e499a45a 100644 (file)
@@ -83,12 +83,15 @@ const char *const *amdgpu_dm_crtc_get_crc_sources(struct drm_crtc *crtc,
 }
 
 #ifdef CONFIG_DRM_AMD_SECURE_DISPLAY
-static void amdgpu_dm_set_crc_window_default(struct drm_crtc *crtc)
+static void amdgpu_dm_set_crc_window_default(struct drm_crtc *crtc, struct dc_stream_state *stream)
 {
        struct drm_device *drm_dev = crtc->dev;
+       struct amdgpu_display_manager *dm = &drm_to_adev(drm_dev)->dm;
        struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
+       bool was_activated;
 
        spin_lock_irq(&drm_dev->event_lock);
+       was_activated = acrtc->dm_irq_params.window_param.activated;
        acrtc->dm_irq_params.window_param.x_start = 0;
        acrtc->dm_irq_params.window_param.y_start = 0;
        acrtc->dm_irq_params.window_param.x_end = 0;
@@ -97,6 +100,14 @@ static void amdgpu_dm_set_crc_window_default(struct drm_crtc *crtc)
        acrtc->dm_irq_params.window_param.update_win = false;
        acrtc->dm_irq_params.window_param.skip_frame_cnt = 0;
        spin_unlock_irq(&drm_dev->event_lock);
+
+       /* Disable secure_display if it was enabled */
+       if (was_activated) {
+               /* stop ROI update on this crtc */
+               flush_work(&dm->secure_display_ctxs[crtc->index].notify_ta_work);
+               flush_work(&dm->secure_display_ctxs[crtc->index].forward_roi_work);
+               dc_stream_forward_crc_window(stream, NULL, true);
+       }
 }
 
 static void amdgpu_dm_crtc_notify_ta_to_read(struct work_struct *work)
@@ -204,9 +215,6 @@ int amdgpu_dm_crtc_configure_crc_source(struct drm_crtc *crtc,
                                        struct dm_crtc_state *dm_crtc_state,
                                        enum amdgpu_dm_pipe_crc_source source)
 {
-#if defined(CONFIG_DRM_AMD_SECURE_DISPLAY)
-       int i;
-#endif
        struct amdgpu_device *adev = drm_to_adev(crtc->dev);
        struct dc_stream_state *stream_state = dm_crtc_state->stream;
        bool enable = amdgpu_dm_is_valid_crc_source(source);
@@ -220,19 +228,6 @@ int amdgpu_dm_crtc_configure_crc_source(struct drm_crtc *crtc,
 
        /* Enable or disable CRTC CRC generation */
        if (dm_is_crc_source_crtc(source) || source == AMDGPU_DM_PIPE_CRC_SOURCE_NONE) {
-#if defined(CONFIG_DRM_AMD_SECURE_DISPLAY)
-               /* Disable secure_display if it was enabled */
-               if (!enable) {
-                       for (i = 0; i < adev->mode_info.num_crtc; i++) {
-                               if (adev->dm.secure_display_ctxs[i].crtc == crtc) {
-                                       /* stop ROI update on this crtc */
-                                       flush_work(&adev->dm.secure_display_ctxs[i].notify_ta_work);
-                                       flush_work(&adev->dm.secure_display_ctxs[i].forward_roi_work);
-                                       dc_stream_forward_crc_window(stream_state, NULL, true);
-                               }
-                       }
-               }
-#endif
                if (!dc_stream_configure_crc(stream_state->ctx->dc,
                                             stream_state, NULL, enable, enable)) {
                        ret = -EINVAL;
@@ -363,7 +358,7 @@ int amdgpu_dm_crtc_set_crc_source(struct drm_crtc *crtc, const char *src_name)
 
 #if defined(CONFIG_DRM_AMD_SECURE_DISPLAY)
        /* Reset secure_display when we change crc source from debugfs */
-       amdgpu_dm_set_crc_window_default(crtc);
+       amdgpu_dm_set_crc_window_default(crtc, crtc_state->stream);
 #endif
 
        if (amdgpu_dm_crtc_configure_crc_source(crtc, crtc_state, source)) {