Skip to content

Commit

Permalink
drm/amd/display: Optimize cursor position updates
Browse files Browse the repository at this point in the history
[why]
Updating the cursor enablement register can be a slow operation and accumulates
when high polling rate cursors cause frequent updates asynchronously to the
cursor position.

[how]
Since the cursor enable bit is cached there is no need to update the
enablement register if there is no change to it.  This removes the
read-modify-write from the cursor position programming path in HUBP and
DPP, leaving only the register writes.

Reviewed-by: Josip Pavic <josip.pavic@amd.com>
Signed-off-by: Aric Cyr <Aric.Cyr@amd.com>
Signed-off-by: Roman Li <roman.li@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
  • Loading branch information
Aric Cyr authored and Alex Deucher committed Jan 6, 2025
1 parent de5d7a8 commit 787e7be
Showing 4 changed files with 19 additions and 12 deletions.
7 changes: 4 additions & 3 deletions drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp.c
Original file line number Diff line number Diff line change
@@ -480,10 +480,11 @@ void dpp1_set_cursor_position(
if (src_y_offset + cursor_height <= 0)
cur_en = 0; /* not visible beyond top edge*/

REG_UPDATE(CURSOR0_CONTROL,
CUR0_ENABLE, cur_en);
if (dpp_base->pos.cur0_ctl.bits.cur0_enable != cur_en) {
REG_UPDATE(CURSOR0_CONTROL, CUR0_ENABLE, cur_en);

dpp_base->pos.cur0_ctl.bits.cur0_enable = cur_en;
dpp_base->pos.cur0_ctl.bits.cur0_enable = cur_en;
}
}

void dpp1_cnv_set_optional_cursor_attributes(
6 changes: 4 additions & 2 deletions drivers/gpu/drm/amd/display/dc/dpp/dcn401/dcn401_dpp_cm.c
Original file line number Diff line number Diff line change
@@ -154,9 +154,11 @@ void dpp401_set_cursor_position(
struct dcn401_dpp *dpp = TO_DCN401_DPP(dpp_base);
uint32_t cur_en = pos->enable ? 1 : 0;

REG_UPDATE(CURSOR0_CONTROL, CUR0_ENABLE, cur_en);
if (dpp_base->pos.cur0_ctl.bits.cur0_enable != cur_en) {
REG_UPDATE(CURSOR0_CONTROL, CUR0_ENABLE, cur_en);

dpp_base->pos.cur0_ctl.bits.cur0_enable = cur_en;
dpp_base->pos.cur0_ctl.bits.cur0_enable = cur_en;
}
}

void dpp401_set_optional_cursor_attributes(
8 changes: 5 additions & 3 deletions drivers/gpu/drm/amd/display/dc/hubp/dcn20/dcn20_hubp.c
Original file line number Diff line number Diff line change
@@ -1058,11 +1058,13 @@ void hubp2_cursor_set_position(
if (src_y_offset + cursor_height <= 0)
cur_en = 0; /* not visible beyond top edge*/

if (cur_en && REG_READ(CURSOR_SURFACE_ADDRESS) == 0)
hubp->funcs->set_cursor_attributes(hubp, &hubp->curs_attr);
if (hubp->pos.cur_ctl.bits.cur_enable != cur_en) {
if (cur_en && REG_READ(CURSOR_SURFACE_ADDRESS) == 0)
hubp->funcs->set_cursor_attributes(hubp, &hubp->curs_attr);

REG_UPDATE(CURSOR_CONTROL,
REG_UPDATE(CURSOR_CONTROL,
CURSOR_ENABLE, cur_en);
}

REG_SET_2(CURSOR_POSITION, 0,
CURSOR_X_POSITION, pos->x,
10 changes: 6 additions & 4 deletions drivers/gpu/drm/amd/display/dc/hubp/dcn401/dcn401_hubp.c
Original file line number Diff line number Diff line change
@@ -730,11 +730,13 @@ void hubp401_cursor_set_position(
dc_fixpt_from_int(dst_x_offset),
param->h_scale_ratio));

if (cur_en && REG_READ(CURSOR_SURFACE_ADDRESS) == 0)
hubp->funcs->set_cursor_attributes(hubp, &hubp->curs_attr);
if (hubp->pos.cur_ctl.bits.cur_enable != cur_en) {
if (cur_en && REG_READ(CURSOR_SURFACE_ADDRESS) == 0)
hubp->funcs->set_cursor_attributes(hubp, &hubp->curs_attr);

REG_UPDATE(CURSOR_CONTROL,
CURSOR_ENABLE, cur_en);
REG_UPDATE(CURSOR_CONTROL,
CURSOR_ENABLE, cur_en);
}

REG_SET_2(CURSOR_POSITION, 0,
CURSOR_X_POSITION, x_pos,

0 comments on commit 787e7be

Please sign in to comment.