drm/amd/display: populate subvp cmd info only for the top pipe
authorAyush Gupta <ayush.gupta@amd.com>
Fri, 10 Feb 2023 18:02:09 +0000 (13:02 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 24 May 2023 16:32:34 +0000 (17:32 +0100)
[ Upstream commit 9bb10b7aaec3b6278f9cc410c17dcaa129bbbbf0 ]

[Why]
System restart observed while changing the display resolution
to 8k with extended mode. Sytem restart was caused by a page fault.

[How]
When the driver populates subvp info it did it for both the pipes using
vblank which caused an outof bounds array access causing the page fault.
added checks to allow the top pipe only to fix this issue.

Co-authored-by: Ayush Gupta <ayush.gupta@amd.com>
Reviewed-by: Alvin Lee <Alvin.Lee2@amd.com>
Acked-by: Qingqing Zhuo <qingqing.zhuo@amd.com>
Signed-off-by: Ayush Gupta <ayush.gupta@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c

index 0541e87e4f38954dd9728e8767b4b8a140174698..a461e9463534be85b0d66f11d9b227900d6744fe 100644 (file)
@@ -764,7 +764,8 @@ void dc_dmub_setup_subvp_dmub_command(struct dc *dc,
                                        !pipe->top_pipe && !pipe->prev_odm_pipe &&
                                        pipe->stream->mall_stream_config.type == SUBVP_MAIN) {
                                populate_subvp_cmd_pipe_info(dc, context, &cmd, pipe, cmd_pipe_index++);
-                       } else if (pipe->plane_state && pipe->stream->mall_stream_config.type == SUBVP_NONE) {
+                       } else if (pipe->plane_state && pipe->stream->mall_stream_config.type == SUBVP_NONE &&
+                                   !pipe->top_pipe && !pipe->prev_odm_pipe) {
                                // Don't need to check for ActiveDRAMClockChangeMargin < 0, not valid in cases where
                                // we run through DML without calculating "natural" P-state support
                                populate_subvp_cmd_vblank_pipe_info(dc, context, &cmd, pipe, cmd_pipe_index++);