drm/amd/display: Optimize cursor position updates
commit 024771f3fb75dc817e9429d5763f1a6eb84b6f21 upstream. [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. Cc: Mario Limonciello <mario.limonciello@amd.com> Cc: Alex Deucher <alexander.deucher@amd.com> Cc: stable@vger.kernel.org Reviewed-by: Sung Lee <sung.lee@amd.com> Signed-off-by: Aric Cyr <Aric.Cyr@amd.com> Signed-off-by: Wayne Lin <wayne.lin@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
b4b9027377
commit
3ec8e3dab6
@@ -483,10 +483,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(
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -1044,11 +1044,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,
|
||||
|
||||
@@ -718,11 +718,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,
|
||||
|
||||
Reference in New Issue
Block a user