Commit 5af75712 authored by Rodrigo Siqueira's avatar Rodrigo Siqueira Committed by Alex Deucher

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: default avatarAurabindo Pillai <aurabindo.pillai@amd.com>
Acked-by: default avatarHamza Mahfooz <hamza.mahfooz@amd.com>
Signed-off-by: default avatarRodrigo Siqueira <rodrigo.siqueira@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 319d4615
...@@ -289,6 +289,7 @@ static void dcn10_log_color_state(struct dc *dc, ...@@ -289,6 +289,7 @@ static void dcn10_log_color_state(struct dc *dc,
{ {
struct dc_context *dc_ctx = dc->ctx; struct dc_context *dc_ctx = dc->ctx;
struct resource_pool *pool = dc->res_pool; struct resource_pool *pool = dc->res_pool;
bool is_gamut_remap_available = false;
int i; int i;
DTN_INFO("DPP: IGAM format IGAM mode DGAM mode RGAM mode" DTN_INFO("DPP: IGAM format IGAM mode DGAM mode RGAM mode"
...@@ -301,16 +302,15 @@ static void dcn10_log_color_state(struct dc *dc, ...@@ -301,16 +302,15 @@ static void dcn10_log_color_state(struct dc *dc,
struct dcn_dpp_state s = {0}; struct dcn_dpp_state s = {0};
dpp->funcs->dpp_read_state(dpp, &s); 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) if (!s.is_enabled)
continue; continue;
DTN_INFO("[%2d]: %11xh %11s %9s %9s" DTN_INFO("[%2d]: %11xh %11s %9s %9s",
" %12s "
"%010lld %010lld %010lld %010lld "
"%010lld %010lld %010lld %010lld "
"%010lld %010lld %010lld %010lld",
dpp->inst, dpp->inst,
s.igam_input_format, s.igam_input_format,
(s.igam_lut_mode == 0) ? "BypassFixed" : (s.igam_lut_mode == 0) ? "BypassFixed" :
...@@ -329,22 +329,27 @@ static void dcn10_log_color_state(struct dc *dc, ...@@ -329,22 +329,27 @@ static void dcn10_log_color_state(struct dc *dc,
((s.rgam_lut_mode == 2) ? "Ycc" : ((s.rgam_lut_mode == 2) ? "Ycc" :
((s.rgam_lut_mode == 3) ? "RAM" : ((s.rgam_lut_mode == 3) ? "RAM" :
((s.rgam_lut_mode == 4) ? "RAM" : ((s.rgam_lut_mode == 4) ? "RAM" :
"Unknown")))), "Unknown")))));
(s.gamut_remap.gamut_adjust_type == 0) ? "Bypass" : if (is_gamut_remap_available)
((s.gamut_remap.gamut_adjust_type == 1) ? "HW" : DTN_INFO(" %12s "
"SW"), "%010lld %010lld %010lld %010lld "
s.gamut_remap.temperature_matrix[0].value, "%010lld %010lld %010lld %010lld "
s.gamut_remap.temperature_matrix[1].value, "%010lld %010lld %010lld %010lld",
s.gamut_remap.temperature_matrix[2].value, (s.gamut_remap.gamut_adjust_type == 0) ? "Bypass" :
s.gamut_remap.temperature_matrix[3].value, ((s.gamut_remap.gamut_adjust_type == 1) ? "HW" : "SW"),
s.gamut_remap.temperature_matrix[4].value, s.gamut_remap.temperature_matrix[0].value,
s.gamut_remap.temperature_matrix[5].value, s.gamut_remap.temperature_matrix[1].value,
s.gamut_remap.temperature_matrix[6].value, s.gamut_remap.temperature_matrix[2].value,
s.gamut_remap.temperature_matrix[7].value, s.gamut_remap.temperature_matrix[3].value,
s.gamut_remap.temperature_matrix[8].value, s.gamut_remap.temperature_matrix[4].value,
s.gamut_remap.temperature_matrix[9].value, s.gamut_remap.temperature_matrix[5].value,
s.gamut_remap.temperature_matrix[10].value, s.gamut_remap.temperature_matrix[6].value,
s.gamut_remap.temperature_matrix[11].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");
} }
DTN_INFO("\n"); DTN_INFO("\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment