Skip to content

Commit bfe28ce

Browse files
akorudgregkh
authored andcommitted
drm/amd/display: dce100: skip non-DP stream encoders for DP MST
commit d340cba upstream. On DCE8-class ASICs (e.g. Bonaire), the resource pool contains digital DIG stream encoders plus one analog DAC encoder. When assigning a stream encoder for a second DisplayPort MST stream, if the preferred digital encoder is already acquired, dce100_find_first_free_match_stream_enc_for_link() falls back to the first free pool entry. That entry may be the analog encoder, whose funcs table lacks DP hooks such as dp_set_stream_attribute. The subsequent atomic commit then dereferences NULL function pointers in link_set_dpms_on() and crashes. Skip encoders without dp_set_stream_attribute when the stream uses a DP signal (including MST). Use dc_is_dp_signal(stream->signal) for the MST fallback path instead of checking only the link connector signal. Tested on: - GPU: AMD Radeon R7 260X (Bonaire / DCE8) - Board: Supermicro C9X299-PG300 - Setup: DP MST daisy chain, hotplug second monitor or have it connected on boot - Kernel: 7.1.3 (issue observed since 6.19) - Result: kernel oops without patch; dual monitors stable with patch Signed-off-by: Andriy Korud <a.korud@gmail.com> Closes: https://gitlab.freedesktop.org/drm/amd/-/work_items/5162 Signed-off-by: Alex Deucher <alexander.deucher@amd.com> (cherry picked from commit 28ec649) Cc: stable@vger.kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 5182e44 commit bfe28ce

1 file changed

Lines changed: 6 additions & 1 deletion

File tree

drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -939,6 +939,11 @@ struct stream_encoder *dce100_find_first_free_match_stream_enc_for_link(
939939
for (i = 0; i < pool->stream_enc_count; i++) {
940940
if (!res_ctx->is_stream_enc_acquired[i] &&
941941
pool->stream_enc[i]) {
942+
/* DP/MST needs a digital encoder; skip analog/no-DP encoders */
943+
if (dc_is_dp_signal(stream->signal) &&
944+
(!pool->stream_enc[i]->funcs ||
945+
!pool->stream_enc[i]->funcs->dp_set_stream_attribute))
946+
continue;
942947
/* Store first available for MST second display
943948
* in daisy chain use case
944949
*/
@@ -962,7 +967,7 @@ struct stream_encoder *dce100_find_first_free_match_stream_enc_for_link(
962967
* required for non DP connectors.
963968
*/
964969

965-
if (j >= 0 && link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT)
970+
if (j >= 0 && dc_is_dp_signal(stream->signal))
966971
return pool->stream_enc[j];
967972

968973
return NULL;

0 commit comments

Comments
 (0)