Skip to content

Commit de014e5

Browse files
melissawenmehmetb0
authored andcommitted
drm/amd/display: fix page fault due to max surface definition mismatch
BugLink: https://bugs.launchpad.net/bugs/2106770 commit 7de8d5c90be9ad9f6575e818a674801db2ada794 upstream. DC driver is using two different values to define the maximum number of surfaces: MAX_SURFACES and MAX_SURFACE_NUM. Consolidate MAX_SURFACES as the unique definition for surface updates across DC. It fixes page fault faced by Cosmic users on AMD display versions that support two overlay planes, since the introduction of cursor overlay mode. [Nov26 21:33] BUG: unable to handle page fault for address: 0000000051d0f08b [ +0.000015] #PF: supervisor read access in kernel mode [ +0.000006] #PF: error_code(0x0000) - not-present page [ +0.000005] PGD 0 P4D 0 [ +0.000007] Oops: Oops: 0000 [#1] PREEMPT SMP NOPTI [ +0.000006] CPU: 4 PID: 71 Comm: kworker/u32:6 Not tainted 6.10.0+ #300 [ +0.000006] Hardware name: Valve Jupiter/Jupiter, BIOS F7A0131 01/30/2024 [ +0.000007] Workqueue: events_unbound commit_work [drm_kms_helper] [ +0.000040] RIP: 0010:copy_stream_update_to_stream.isra.0+0x30d/0x750 [amdgpu] [ +0.000847] Code: 8b 10 49 89 94 24 f8 00 00 00 48 8b 50 08 49 89 94 24 00 01 00 00 8b 40 10 41 89 84 24 08 01 00 00 49 8b 45 78 48 85 c0 74 0b <0f> b6 00 41 88 84 24 90 64 00 00 49 8b 45 60 48 85 c0 74 3b 48 8b [ +0.000010] RSP: 0018:ffffc203802f79a0 EFLAGS: 00010206 [ +0.000009] RAX: 0000000051d0f08b RBX: 0000000000000004 RCX: ffff9f964f0a8070 [ +0.000004] RDX: ffff9f9710f90e40 RSI: ffff9f96600c8000 RDI: ffff9f964f000000 [ +0.000004] RBP: ffffc203802f79f8 R08: 0000000000000000 R09: 0000000000000000 [ +0.000005] R10: 0000000000000000 R11: 0000000000000000 R12: ffff9f96600c8000 [ +0.000004] R13: ffff9f9710f90e40 R14: ffff9f964f000000 R15: ffff9f96600c8000 [ +0.000004] FS: 0000000000000000(0000) GS:ffff9f9970000000(0000) knlGS:0000000000000000 [ +0.000005] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ +0.000005] CR2: 0000000051d0f08b CR3: 00000002e6a20000 CR4: 0000000000350ef0 [ +0.000005] Call Trace: [ +0.000011] <TASK> [ +0.000010] ? __die_body.cold+0x19/0x27 [ +0.000012] ? page_fault_oops+0x15a/0x2d0 [ +0.000014] ? exc_page_fault+0x7e/0x180 [ +0.000009] ? asm_exc_page_fault+0x26/0x30 [ +0.000013] ? copy_stream_update_to_stream.isra.0+0x30d/0x750 [amdgpu] [ +0.000739] ? dc_commit_state_no_check+0xd6c/0xe70 [amdgpu] [ +0.000470] update_planes_and_stream_state+0x49b/0x4f0 [amdgpu] [ +0.000450] ? srso_return_thunk+0x5/0x5f [ +0.000009] ? commit_minimal_transition_state+0x239/0x3d0 [amdgpu] [ +0.000446] update_planes_and_stream_v2+0x24a/0x590 [amdgpu] [ +0.000464] ? srso_return_thunk+0x5/0x5f [ +0.000009] ? sort+0x31/0x50 [ +0.000007] ? amdgpu_dm_atomic_commit_tail+0x159f/0x3a30 [amdgpu] [ +0.000508] ? srso_return_thunk+0x5/0x5f [ +0.000009] ? amdgpu_crtc_get_scanout_position+0x28/0x40 [amdgpu] [ +0.000377] ? srso_return_thunk+0x5/0x5f [ +0.000009] ? drm_crtc_vblank_helper_get_vblank_timestamp_internal+0x160/0x390 [drm] [ +0.000058] ? srso_return_thunk+0x5/0x5f [ +0.000005] ? dma_fence_default_wait+0x8c/0x260 [ +0.000010] ? srso_return_thunk+0x5/0x5f [ +0.000005] ? wait_for_completion_timeout+0x13b/0x170 [ +0.000006] ? srso_return_thunk+0x5/0x5f [ +0.000005] ? dma_fence_wait_timeout+0x108/0x140 [ +0.000010] ? commit_tail+0x94/0x130 [drm_kms_helper] [ +0.000024] ? process_one_work+0x177/0x330 [ +0.000008] ? worker_thread+0x266/0x3a0 [ +0.000006] ? __pfx_worker_thread+0x10/0x10 [ +0.000004] ? kthread+0xd2/0x100 [ +0.000006] ? __pfx_kthread+0x10/0x10 [ +0.000006] ? ret_from_fork+0x34/0x50 [ +0.000004] ? __pfx_kthread+0x10/0x10 [ +0.000005] ? ret_from_fork_asm+0x1a/0x30 [ +0.000011] </TASK> Fixes: 1b04dcca4fb1 ("drm/amd/display: Introduce overlay cursor mode") Suggested-by: Leo Li <[email protected]> Link: https://gitlab.freedesktop.org/drm/amd/-/issues/3693 Signed-off-by: Melissa Wen <[email protected]> Reviewed-by: Rodrigo Siqueira <[email protected]> Signed-off-by: Rodrigo Siqueira <[email protected]> Signed-off-by: Alex Deucher <[email protected]> (cherry picked from commit 1c86c81a86c60f9b15d3e3f43af0363cf56063e7) Cc: [email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]> Signed-off-by: Manuel Diewald <[email protected]> Signed-off-by: Mehmet Basaran <[email protected]>
1 parent 31f9f9d commit de014e5

File tree

6 files changed

+9
-10
lines changed

6 files changed

+9
-10
lines changed

drivers/gpu/drm/amd/display/dc/core/dc.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3003,7 +3003,7 @@ static void copy_stream_update_to_stream(struct dc *dc,
30033003
}
30043004

30053005
static void backup_plane_states_for_stream(
3006-
struct dc_plane_state plane_states[MAX_SURFACE_NUM],
3006+
struct dc_plane_state plane_states[MAX_SURFACES],
30073007
struct dc_stream_state *stream)
30083008
{
30093009
int i;
@@ -3017,7 +3017,7 @@ static void backup_plane_states_for_stream(
30173017
}
30183018

30193019
static void restore_plane_states_for_stream(
3020-
struct dc_plane_state plane_states[MAX_SURFACE_NUM],
3020+
struct dc_plane_state plane_states[MAX_SURFACES],
30213021
struct dc_stream_state *stream)
30223022
{
30233023
int i;

drivers/gpu/drm/amd/display/dc/core/dc_state.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -453,9 +453,9 @@ bool dc_state_add_plane(
453453
if (stream_status == NULL) {
454454
dm_error("Existing stream not found; failed to attach surface!\n");
455455
goto out;
456-
} else if (stream_status->plane_count == MAX_SURFACE_NUM) {
456+
} else if (stream_status->plane_count == MAX_SURFACES) {
457457
dm_error("Surface: can not attach plane_state %p! Maximum is: %d\n",
458-
plane_state, MAX_SURFACE_NUM);
458+
plane_state, MAX_SURFACES);
459459
goto out;
460460
} else if (!otg_master_pipe) {
461461
goto out;
@@ -570,7 +570,7 @@ bool dc_state_rem_all_planes_for_stream(
570570
{
571571
int i, old_plane_count;
572572
struct dc_stream_status *stream_status = NULL;
573-
struct dc_plane_state *del_planes[MAX_SURFACE_NUM] = { 0 };
573+
struct dc_plane_state *del_planes[MAX_SURFACES] = { 0 };
574574

575575
for (i = 0; i < state->stream_count; i++)
576576
if (state->streams[i] == stream) {
@@ -837,7 +837,7 @@ bool dc_state_rem_all_phantom_planes_for_stream(
837837
{
838838
int i, old_plane_count;
839839
struct dc_stream_status *stream_status = NULL;
840-
struct dc_plane_state *del_planes[MAX_SURFACE_NUM] = { 0 };
840+
struct dc_plane_state *del_planes[MAX_SURFACES] = { 0 };
841841

842842
for (i = 0; i < state->stream_count; i++)
843843
if (state->streams[i] == phantom_stream) {

drivers/gpu/drm/amd/display/dc/dc_stream.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ struct dc_stream_status {
5656
int plane_count;
5757
int audio_inst;
5858
struct timing_sync_info timing_sync_info;
59-
struct dc_plane_state *plane_states[MAX_SURFACE_NUM];
59+
struct dc_plane_state *plane_states[MAX_SURFACES];
6060
bool is_abm_supported;
6161
struct mall_stream_config mall_stream_config;
6262
};

drivers/gpu/drm/amd/display/dc/dc_types.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ struct dc_perf_trace {
7676
unsigned long last_entry_write;
7777
};
7878

79-
#define MAX_SURFACE_NUM 6
8079
#define NUM_PIXEL_FORMATS 10
8180

8281
enum tiling_mode {

drivers/gpu/drm/amd/display/dc/dml2/dml2_mall_phantom.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -813,7 +813,7 @@ static bool remove_all_phantom_planes_for_stream(struct dml2_context *ctx, struc
813813
{
814814
int i, old_plane_count;
815815
struct dc_stream_status *stream_status = NULL;
816-
struct dc_plane_state *del_planes[MAX_SURFACE_NUM] = { 0 };
816+
struct dc_plane_state *del_planes[MAX_SURFACES] = { 0 };
817817

818818
for (i = 0; i < context->stream_count; i++)
819819
if (context->streams[i] == stream) {

drivers/gpu/drm/amd/display/dc/inc/core_types.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,7 @@ struct dc_state {
613613
* store current value in plane states so we can still recover
614614
* a valid current state during dc update.
615615
*/
616-
struct dc_plane_state plane_states[MAX_SURFACE_NUM];
616+
struct dc_plane_state plane_states[MAX_SURFACES];
617617
} scratch;
618618
};
619619

0 commit comments

Comments
 (0)