From: Nicholas Kazlauskas nicholas.kazlauskas@amd.com
commit ad76744b041d8c87ef1c9adbb04fb7eaa20a179e upstream.
[Why] A deadlock in the kernel occurs when we fallback from the V3 to V2 add_topology_to_display or remove_topology_to_display because they both try to acquire the dtm_mutex but recursive locking isn't supported on mutex_lock().
[How] Make the mutex_lock/unlock more fine grained and move them up such that they're only required for the psp invocation itself.
Fixes: bf62221e9d0e ("drm/amd/display: Add DCN3.1 HDCP support")
Signed-off-by: Nicholas Kazlauskas nicholas.kazlauskas@amd.com Reviewed-by: Aric Cyr aric.cyr@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/modules/hdcp/hdcp_psp.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
--- a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_psp.c +++ b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp_psp.c @@ -105,6 +105,7 @@ static enum mod_hdcp_status mod_hdcp_rem dtm_cmd->dtm_status = TA_DTM_STATUS__GENERIC_FAILURE;
psp_dtm_invoke(psp, dtm_cmd->cmd_id); + mutex_unlock(&psp->dtm_context.mutex);
if (dtm_cmd->dtm_status != TA_DTM_STATUS__SUCCESS) { status = mod_hdcp_remove_display_from_topology_v2(hdcp, index); @@ -115,8 +116,6 @@ static enum mod_hdcp_status mod_hdcp_rem HDCP_TOP_REMOVE_DISPLAY_TRACE(hdcp, display->index); }
- mutex_unlock(&psp->dtm_context.mutex); - return status; }
@@ -218,6 +217,7 @@ static enum mod_hdcp_status mod_hdcp_add dtm_cmd->dtm_in_message.topology_update_v3.link_hdcp_cap = link->hdcp_supported_informational;
psp_dtm_invoke(psp, dtm_cmd->cmd_id); + mutex_unlock(&psp->dtm_context.mutex);
if (dtm_cmd->dtm_status != TA_DTM_STATUS__SUCCESS) { status = mod_hdcp_add_display_to_topology_v2(hdcp, display); @@ -227,8 +227,6 @@ static enum mod_hdcp_status mod_hdcp_add HDCP_TOP_ADD_DISPLAY_TRACE(hdcp, display->index); }
- mutex_unlock(&psp->dtm_context.mutex); - return status; }