Skip to content

Commit bb08c04

Browse files
plbossartjnikula
authored andcommitted
drm/dp/mst: fix kernel oops when turning off secondary monitor
100% reproducible issue found on SKL SkullCanyon NUC with two external DP daisy-chained monitors in DP/MST mode. When turning off or changing the input of the second monitor the machine stops with a kernel oops. This issue happened with 4.8.8 as well as drm/drm-intel-nightly. This issue is traced to an inconsistent control flow in drm_dp_update_payload_part1(): the 'port' pointer is set to NULL at the same time as 'req_payload.num_slots' is set to zero, but the pointer is dereferenced even when req_payload.num_slot is zero. The problematic dereference was introduced in commit dfda0df ("drm/mst: rework payload table allocation to conform better") and may impact all versions since v3.18 The fix suggested by Chris Wilson removes the kernel oops and was found to work well after 10mn of monkey-testing with the second monitor power and input buttons Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98990 Fixes: dfda0df ("drm/mst: rework payload table allocation to conform better.") Cc: Dave Airlie <[email protected]> Cc: Chris Wilson <[email protected]> Cc: Nathan D Ciobanu <[email protected]> Cc: Dhinakaran Pandiyan <[email protected]> Cc: Sean Paul <[email protected]> Cc: <[email protected]> # v3.18+ Tested-by: Nathan D Ciobanu <[email protected]> Reviewed-by: Dhinakaran Pandiyan <[email protected]> Signed-off-by: Pierre-Louis Bossart <[email protected]> Signed-off-by: Jani Nikula <[email protected]> Link: http://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 7089db8 commit bb08c04

1 file changed

Lines changed: 1 addition & 1 deletion

File tree

drivers/gpu/drm/drm_dp_mst_topology.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1817,7 +1817,7 @@ int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr)
18171817
mgr->payloads[i].vcpi = req_payload.vcpi;
18181818
} else if (mgr->payloads[i].num_slots) {
18191819
mgr->payloads[i].num_slots = 0;
1820-
drm_dp_destroy_payload_step1(mgr, port, port->vcpi.vcpi, &mgr->payloads[i]);
1820+
drm_dp_destroy_payload_step1(mgr, port, mgr->payloads[i].vcpi, &mgr->payloads[i]);
18211821
req_payload.payload_state = mgr->payloads[i].payload_state;
18221822
mgr->payloads[i].start_slot = 0;
18231823
}

0 commit comments

Comments
 (0)