mirror of
https://github.com/torvalds/linux.git
synced 2024-11-15 08:31:55 +00:00
drm/amd/display: fix access hdcp_workqueue assert
[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: 82986fd631
("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
This commit is contained in:
parent
0c0463ff01
commit
3cf7cd3f77
@ -8559,6 +8559,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_crtc *acrtc = to_amdgpu_crtc(dm_new_con_state->base.crtc);
|
||||||
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
|
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
|
||||||
|
|
||||||
|
if (!adev->dm.hdcp_workqueue)
|
||||||
|
continue;
|
||||||
|
|
||||||
pr_debug("[HDCP_DM] -------------- i : %x ----------\n", i);
|
pr_debug("[HDCP_DM] -------------- i : %x ----------\n", i);
|
||||||
|
|
||||||
if (!connector)
|
if (!connector)
|
||||||
@ -8607,6 +8610,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_crtc *acrtc = to_amdgpu_crtc(dm_new_con_state->base.crtc);
|
||||||
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
|
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
|
||||||
|
|
||||||
|
if (!adev->dm.hdcp_workqueue)
|
||||||
|
continue;
|
||||||
|
|
||||||
new_crtc_state = NULL;
|
new_crtc_state = NULL;
|
||||||
old_crtc_state = NULL;
|
old_crtc_state = NULL;
|
||||||
|
|
||||||
|
@ -379,13 +379,17 @@ static int dm_dp_mst_get_modes(struct drm_connector *connector)
|
|||||||
if (aconnector->dc_sink && connector->state) {
|
if (aconnector->dc_sink && connector->state) {
|
||||||
struct drm_device *dev = connector->dev;
|
struct drm_device *dev = connector->dev;
|
||||||
struct amdgpu_device *adev = drm_to_adev(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 =
|
if (adev->dm.hdcp_workqueue) {
|
||||||
hdcp_w->hdcp_content_type[connector->index];
|
struct hdcp_workqueue *hdcp_work = adev->dm.hdcp_workqueue;
|
||||||
connector->state->content_protection =
|
struct hdcp_workqueue *hdcp_w =
|
||||||
hdcp_w->content_protection[connector->index];
|
&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 (aconnector->dc_sink) {
|
if (aconnector->dc_sink) {
|
||||||
|
Loading…
Reference in New Issue
Block a user