]> git.itanic.dy.fi Git - linux-stable/commitdiff
drm/amd/display: fix access hdcp_workqueue assert
authorHersen Wu <hersenxs.wu@amd.com>
Tue, 28 Mar 2023 14:45:24 +0000 (10:45 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 May 2023 12:02:01 +0000 (14:02 +0200)
commit 3cf7cd3f770a0b89dc5f06e19edb52e65b93b214 upstream.

[Why] hdcp are enabled for asics from raven. for old asics
which hdcp are not enabled, hdcp_workqueue are null. some
access to hdcp work queue are not guarded with pointer check.

[How] add hdcp_workqueue pointer check before access workqueue.

Fixes: 82986fd631fa ("drm/amd/display: save restore hdcp state when display is unplugged from mst hub")
Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2444
Reported-by: Niklāvs Koļesņikovs <89q1r14hd@relay.firefox.com>
Reviewed-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Acked-by: Qingqing Zhuo <qingqing.zhuo@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>
Cc: stable@vger.kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c

index d486670e48c3e4e2e299922fa509839e30724da8..78d35c73dfbeaee849fae56a8e5c88bb796fae11 100644 (file)
@@ -8533,6 +8533,9 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
                struct amdgpu_crtc *acrtc = to_amdgpu_crtc(dm_new_con_state->base.crtc);
                struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
 
+               if (!adev->dm.hdcp_workqueue)
+                       continue;
+
                pr_debug("[HDCP_DM] -------------- i : %x ----------\n", i);
 
                if (!connector)
@@ -8581,6 +8584,9 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
                struct amdgpu_crtc *acrtc = to_amdgpu_crtc(dm_new_con_state->base.crtc);
                struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
 
+               if (!adev->dm.hdcp_workqueue)
+                       continue;
+
                new_crtc_state = NULL;
                old_crtc_state = NULL;
 
index d9191dd9d3cb27a33decc33ca3a73e440a9a6dce..3da519957f6c8f59eb4c03c7847dce574a2aa13d 100644 (file)
@@ -385,13 +385,17 @@ static int dm_dp_mst_get_modes(struct drm_connector *connector)
                if (aconnector->dc_sink && connector->state) {
                        struct drm_device *dev = connector->dev;
                        struct amdgpu_device *adev = drm_to_adev(dev);
-                       struct hdcp_workqueue *hdcp_work = adev->dm.hdcp_workqueue;
-                       struct hdcp_workqueue *hdcp_w = &hdcp_work[aconnector->dc_link->link_index];
 
-                       connector->state->hdcp_content_type =
-                       hdcp_w->hdcp_content_type[connector->index];
-                       connector->state->content_protection =
-                       hdcp_w->content_protection[connector->index];
+                       if (adev->dm.hdcp_workqueue) {
+                               struct hdcp_workqueue *hdcp_work = adev->dm.hdcp_workqueue;
+                               struct hdcp_workqueue *hdcp_w =
+                                       &hdcp_work[aconnector->dc_link->link_index];
+
+                               connector->state->hdcp_content_type =
+                               hdcp_w->hdcp_content_type[connector->index];
+                               connector->state->content_protection =
+                               hdcp_w->content_protection[connector->index];
+                       }
                }
 #endif