Commit 7e4b042b authored by Srinivasan Shanmugam's avatar Srinivasan Shanmugam Committed by Zeng Heng
Browse files

drm/amd/display: Add NULL check for clk_mgr and clk_mgr->funcs in dcn30_init_hw

mainline inclusion
from mainline-v6.12-rc1
commit cba7fec864172dadd953daefdd26e01742b71a6a
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/IAYR9I
CVE: CVE-2024-49917

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cba7fec864172dadd953daefdd26e01742b71a6a



--------------------------------

This commit addresses a potential null pointer dereference issue in the
`dcn30_init_hw` function. The issue could occur when `dc->clk_mgr` or
`dc->clk_mgr->funcs` is null.

The fix adds a check to ensure `dc->clk_mgr` and `dc->clk_mgr->funcs` is
not null before accessing its functions. This prevents a potential null
pointer dereference.

Reported by smatch:
drivers/gpu/drm/amd/amdgpu/../display/dc/hwss/dcn30/dcn30_hwseq.c:789 dcn30_init_hw() error: we previously assumed 'dc->clk_mgr' could be null (see line 628)

Cc: Tom Chung <chiahsuan.chung@amd.com>
Cc: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Cc: Roman Li <roman.li@amd.com>
Cc: Alex Hung <alex.hung@amd.com>
Cc: Aurabindo Pillai <aurabindo.pillai@amd.com>
Cc: Harry Wentland <harry.wentland@amd.com>
Cc: Hamza Mahfooz <hamza.mahfooz@amd.com>
Signed-off-by: default avatarSrinivasan Shanmugam <srinivasan.shanmugam@amd.com>
Reviewed-by: default avatarAlex Hung <alex.hung@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Conflicts:
	drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
	drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.c
[The target file path has changed, and necessary adaptations should be
made based on the context.]
Signed-off-by: default avatarZeng Heng <zengheng4@huawei.com>
parent cc5e1415
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -442,7 +442,7 @@ void dcn30_init_hw(struct dc *dc)
	struct resource_pool *res_pool = dc->res_pool;
	uint32_t backlight = MAX_BACKLIGHT_LEVEL;

	if (dc->clk_mgr && dc->clk_mgr->funcs->init_clocks)
	if (dc->clk_mgr && dc->clk_mgr->funcs && dc->clk_mgr->funcs->init_clocks)
		dc->clk_mgr->funcs->init_clocks(dc->clk_mgr);

	// Initialize the dccg
@@ -633,10 +633,10 @@ void dcn30_init_hw(struct dc *dc)
	if (hws->funcs.enable_power_gating_plane)
		hws->funcs.enable_power_gating_plane(dc->hwseq, true);

	if (dc->clk_mgr->funcs->notify_wm_ranges)
	if (dc->clk_mgr && dc->clk_mgr->funcs && dc->clk_mgr->funcs->notify_wm_ranges)
		dc->clk_mgr->funcs->notify_wm_ranges(dc->clk_mgr);

	if (dc->clk_mgr->funcs->set_hard_max_memclk)
	if (dc->clk_mgr && dc->clk_mgr->funcs && dc->clk_mgr->funcs->set_hard_max_memclk)
		dc->clk_mgr->funcs->set_hard_max_memclk(dc->clk_mgr);
}