mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 16:44:58 +02:00
drm/amd/display: Fix NULL pointer dereference for DTN log in DCN401
When users run the command: cat /sys/kernel/debug/dri/0/amdgpu_dm_dtn_log The following NULL pointer dereference happens: [ +0.000003] BUG: kernel NULL pointer dereference, address: NULL [ +0.000005] #PF: supervisor instruction fetch in kernel mode [ +0.000002] #PF: error_code(0x0010) - not-present page [ +0.000002] PGD 0 P4D 0 [ +0.000004] Oops: 0010 [#1] PREEMPT SMP NOPTI [ +0.000003] RIP: 0010:0x0 [ +0.000008] Code: Unable to access opcode bytes at 0xffffffffffffffd6. [...] [ +0.000002] PKRU: 55555554 [ +0.000002] Call Trace: [ +0.000002] <TASK> [ +0.000003] ? show_regs+0x65/0x70 [ +0.000006] ? __die+0x24/0x70 [ +0.000004] ? page_fault_oops+0x160/0x470 [ +0.000006] ? do_user_addr_fault+0x2b5/0x690 [ +0.000003] ? prb_read_valid+0x1c/0x30 [ +0.000005] ? exc_page_fault+0x8c/0x1a0 [ +0.000005] ? asm_exc_page_fault+0x27/0x30 [ +0.000012] dcn10_log_color_state+0xf9/0x510 [amdgpu] [ +0.000306] ? srso_alias_return_thunk+0x5/0xfbef5 [ +0.000003] ? vsnprintf+0x2fb/0x600 [ +0.000009] dcn10_log_hw_state+0xfd0/0xfe0 [amdgpu] [ +0.000218] ? __mod_memcg_lruvec_state+0xe8/0x170 [ +0.000008] ? srso_alias_return_thunk+0x5/0xfbef5 [ +0.000002] ? debug_smp_processor_id+0x17/0x20 [ +0.000003] ? srso_alias_return_thunk+0x5/0xfbef5 [ +0.000002] ? srso_alias_return_thunk+0x5/0xfbef5 [ +0.000002] ? set_ptes.isra.0+0x2b/0x90 [ +0.000004] ? srso_alias_return_thunk+0x5/0xfbef5 [ +0.000002] ? _raw_spin_unlock+0x19/0x40 [ +0.000004] ? srso_alias_return_thunk+0x5/0xfbef5 [ +0.000002] ? do_anonymous_page+0x337/0x700 [ +0.000004] dtn_log_read+0x82/0x120 [amdgpu] [ +0.000207] full_proxy_read+0x66/0x90 [ +0.000007] vfs_read+0xb0/0x340 [ +0.000005] ? __count_memcg_events+0x79/0xe0 [ +0.000002] ? srso_alias_return_thunk+0x5/0xfbef5 [ +0.000003] ? count_memcg_events.constprop.0+0x1e/0x40 [ +0.000003] ? handle_mm_fault+0xb2/0x370 [ +0.000003] ksys_read+0x6b/0xf0 [ +0.000004] __x64_sys_read+0x19/0x20 [ +0.000003] do_syscall_64+0x60/0x130 [ +0.000004] entry_SYSCALL_64_after_hwframe+0x6e/0x76 [ +0.000003] RIP: 0033:0x7fdf32f147e2 [...] This error happens when the color log tries to read the gamut remap information from DCN401 which is not initialized in the dcn401_dpp_funcs which leads to a null pointer dereference. This commit addresses this issue by adding a proper guard to access the gamut_remap callback in case the specific ASIC did not implement this function. Reviewed-by: Aurabindo Pillai <aurabindo.pillai@amd.com> Acked-by: Hamza Mahfooz <hamza.mahfooz@amd.com> Signed-off-by: Rodrigo Siqueira <rodrigo.siqueira@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
319d461551
commit
5af7571247
|
|
@ -289,6 +289,7 @@ static void dcn10_log_color_state(struct dc *dc,
|
|||
{
|
||||
struct dc_context *dc_ctx = dc->ctx;
|
||||
struct resource_pool *pool = dc->res_pool;
|
||||
bool is_gamut_remap_available = false;
|
||||
int i;
|
||||
|
||||
DTN_INFO("DPP: IGAM format IGAM mode DGAM mode RGAM mode"
|
||||
|
|
@ -301,16 +302,15 @@ static void dcn10_log_color_state(struct dc *dc,
|
|||
struct dcn_dpp_state s = {0};
|
||||
|
||||
dpp->funcs->dpp_read_state(dpp, &s);
|
||||
dpp->funcs->dpp_get_gamut_remap(dpp, &s.gamut_remap);
|
||||
if (dpp->funcs->dpp_get_gamut_remap) {
|
||||
dpp->funcs->dpp_get_gamut_remap(dpp, &s.gamut_remap);
|
||||
is_gamut_remap_available = true;
|
||||
}
|
||||
|
||||
if (!s.is_enabled)
|
||||
continue;
|
||||
|
||||
DTN_INFO("[%2d]: %11xh %11s %9s %9s"
|
||||
" %12s "
|
||||
"%010lld %010lld %010lld %010lld "
|
||||
"%010lld %010lld %010lld %010lld "
|
||||
"%010lld %010lld %010lld %010lld",
|
||||
DTN_INFO("[%2d]: %11xh %11s %9s %9s",
|
||||
dpp->inst,
|
||||
s.igam_input_format,
|
||||
(s.igam_lut_mode == 0) ? "BypassFixed" :
|
||||
|
|
@ -329,22 +329,27 @@ static void dcn10_log_color_state(struct dc *dc,
|
|||
((s.rgam_lut_mode == 2) ? "Ycc" :
|
||||
((s.rgam_lut_mode == 3) ? "RAM" :
|
||||
((s.rgam_lut_mode == 4) ? "RAM" :
|
||||
"Unknown")))),
|
||||
(s.gamut_remap.gamut_adjust_type == 0) ? "Bypass" :
|
||||
((s.gamut_remap.gamut_adjust_type == 1) ? "HW" :
|
||||
"SW"),
|
||||
s.gamut_remap.temperature_matrix[0].value,
|
||||
s.gamut_remap.temperature_matrix[1].value,
|
||||
s.gamut_remap.temperature_matrix[2].value,
|
||||
s.gamut_remap.temperature_matrix[3].value,
|
||||
s.gamut_remap.temperature_matrix[4].value,
|
||||
s.gamut_remap.temperature_matrix[5].value,
|
||||
s.gamut_remap.temperature_matrix[6].value,
|
||||
s.gamut_remap.temperature_matrix[7].value,
|
||||
s.gamut_remap.temperature_matrix[8].value,
|
||||
s.gamut_remap.temperature_matrix[9].value,
|
||||
s.gamut_remap.temperature_matrix[10].value,
|
||||
s.gamut_remap.temperature_matrix[11].value);
|
||||
"Unknown")))));
|
||||
if (is_gamut_remap_available)
|
||||
DTN_INFO(" %12s "
|
||||
"%010lld %010lld %010lld %010lld "
|
||||
"%010lld %010lld %010lld %010lld "
|
||||
"%010lld %010lld %010lld %010lld",
|
||||
(s.gamut_remap.gamut_adjust_type == 0) ? "Bypass" :
|
||||
((s.gamut_remap.gamut_adjust_type == 1) ? "HW" : "SW"),
|
||||
s.gamut_remap.temperature_matrix[0].value,
|
||||
s.gamut_remap.temperature_matrix[1].value,
|
||||
s.gamut_remap.temperature_matrix[2].value,
|
||||
s.gamut_remap.temperature_matrix[3].value,
|
||||
s.gamut_remap.temperature_matrix[4].value,
|
||||
s.gamut_remap.temperature_matrix[5].value,
|
||||
s.gamut_remap.temperature_matrix[6].value,
|
||||
s.gamut_remap.temperature_matrix[7].value,
|
||||
s.gamut_remap.temperature_matrix[8].value,
|
||||
s.gamut_remap.temperature_matrix[9].value,
|
||||
s.gamut_remap.temperature_matrix[10].value,
|
||||
s.gamut_remap.temperature_matrix[11].value);
|
||||
|
||||
DTN_INFO("\n");
|
||||
}
|
||||
DTN_INFO("\n");
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user