Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/amd/display: Add cursor offload abort to the new HWSS path

[HOW]
If cursor attributes or position are passed into DC via a stream update
and we take the newer HWSS paths then it's possible that the update
races with cursor offloading if it's enabled.

This can cause the cursor to remain on the screen if no further updates
come in if it results in HW cursor support being disabled.

[HOW]
Add the abort into the HWSS path so that cursor offloading doesn't
attempt to reprogram the cursor with outdated params.

Cc: Mario Limonciello <mario.limonciello@amd.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Dillon Varone <dillon.varone@amd.com>
Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Signed-off-by: Alex Hung <alex.hung@amd.com>
Tested-by: Dan Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Nicholas Kazlauskas and committed by
Alex Deucher
f7352d10 a76d6f2c

+39
+24
drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
··· 1293 1293 case HUBP_MEM_PROGRAM_VIEWPORT: 1294 1294 hwss_hubp_mem_program_viewport(params); 1295 1295 break; 1296 + case ABORT_CURSOR_OFFLOAD_UPDATE: 1297 + hwss_abort_cursor_offload_update(params); 1298 + break; 1296 1299 case SET_CURSOR_ATTRIBUTE: 1297 1300 hwss_set_cursor_attribute(params); 1298 1301 break; ··· 3079 3076 hubp->funcs->mem_program_viewport(hubp, viewport, viewport_c); 3080 3077 } 3081 3078 3079 + void hwss_abort_cursor_offload_update(union block_sequence_params *params) 3080 + { 3081 + struct dc *dc = params->abort_cursor_offload_update_params.dc; 3082 + struct pipe_ctx *pipe_ctx = params->abort_cursor_offload_update_params.pipe_ctx; 3083 + 3084 + if (dc && dc->hwss.abort_cursor_offload_update) 3085 + dc->hwss.abort_cursor_offload_update(dc, pipe_ctx); 3086 + } 3087 + 3082 3088 void hwss_set_cursor_attribute(union block_sequence_params *params) 3083 3089 { 3084 3090 struct dc *dc = params->set_cursor_attribute_params.dc; ··· 3942 3930 seq_state->steps[*seq_state->num_steps].params.hubp_mem_program_viewport_params.hubp = hubp; 3943 3931 seq_state->steps[*seq_state->num_steps].params.hubp_mem_program_viewport_params.viewport = viewport; 3944 3932 seq_state->steps[*seq_state->num_steps].params.hubp_mem_program_viewport_params.viewport_c = viewport_c; 3933 + (*seq_state->num_steps)++; 3934 + } 3935 + } 3936 + 3937 + void hwss_add_abort_cursor_offload_update(struct block_sequence_state *seq_state, 3938 + struct dc *dc, 3939 + struct pipe_ctx *pipe_ctx) 3940 + { 3941 + if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) { 3942 + seq_state->steps[*seq_state->num_steps].func = ABORT_CURSOR_OFFLOAD_UPDATE; 3943 + seq_state->steps[*seq_state->num_steps].params.abort_cursor_offload_update_params.dc = dc; 3944 + seq_state->steps[*seq_state->num_steps].params.abort_cursor_offload_update_params.pipe_ctx = pipe_ctx; 3945 3945 (*seq_state->num_steps)++; 3946 3946 } 3947 3947 }
+2
drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c
··· 3673 3673 pipe_ctx->update_flags.bits.scaler || viewport_changed == true) && 3674 3674 pipe_ctx->stream->cursor_attributes.address.quad_part != 0) { 3675 3675 3676 + hwss_add_abort_cursor_offload_update(seq_state, dc, pipe_ctx); 3677 + 3676 3678 hwss_add_set_cursor_attribute(seq_state, dc, pipe_ctx); 3677 3679 3678 3680 /* Step 15: Cursor position setup */
+13
drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h
··· 696 696 struct mcache_regs_struct *mcache_regs; 697 697 }; 698 698 699 + struct abort_cursor_offload_update_params { 700 + struct dc *dc; 701 + struct pipe_ctx *pipe_ctx; 702 + }; 703 + 699 704 struct set_cursor_attribute_params { 700 705 struct dc *dc; 701 706 struct pipe_ctx *pipe_ctx; ··· 847 842 struct mpc_insert_plane_params mpc_insert_plane_params; 848 843 struct dpp_set_scaler_params dpp_set_scaler_params; 849 844 struct hubp_mem_program_viewport_params hubp_mem_program_viewport_params; 845 + struct abort_cursor_offload_update_params abort_cursor_offload_update_params; 850 846 struct set_cursor_attribute_params set_cursor_attribute_params; 851 847 struct set_cursor_position_params set_cursor_position_params; 852 848 struct set_cursor_sdr_white_level_params set_cursor_sdr_white_level_params; ··· 966 960 MPC_INSERT_PLANE, 967 961 DPP_SET_SCALER, 968 962 HUBP_MEM_PROGRAM_VIEWPORT, 963 + ABORT_CURSOR_OFFLOAD_UPDATE, 969 964 SET_CURSOR_ATTRIBUTE, 970 965 SET_CURSOR_POSITION, 971 966 SET_CURSOR_SDR_WHITE_LEVEL, ··· 1572 1565 1573 1566 void hwss_hubp_mem_program_viewport(union block_sequence_params *params); 1574 1567 1568 + void hwss_abort_cursor_offload_update(union block_sequence_params *params); 1569 + 1575 1570 void hwss_set_cursor_attribute(union block_sequence_params *params); 1576 1571 1577 1572 void hwss_set_cursor_position(union block_sequence_params *params); ··· 1969 1960 struct hubp *hubp, 1970 1961 const struct rect *viewport, 1971 1962 const struct rect *viewport_c); 1963 + 1964 + void hwss_add_abort_cursor_offload_update(struct block_sequence_state *seq_state, 1965 + struct dc *dc, 1966 + struct pipe_ctx *pipe_ctx); 1972 1967 1973 1968 void hwss_add_set_cursor_attribute(struct block_sequence_state *seq_state, 1974 1969 struct dc *dc,