drm/amd/display: Skip backlight control delay on external powered links
[Why] When an eDP panel is powered externally from a different GPU, we can avoid waiting for hardware sequencing delays when switching the backlight on/off as the display backlight is no longer powered by the original source. [How] This commit extends the 'link_powered_externally' variable to allow bypassing hardware delays for additional backlight commands and force the backlight on/off when a link is powered by another GPU. Tested-by: Daniel Wheeler <Daniel.Wheeler@amd.com> Reviewed-by: Felipe Clark <felipe.clark@amd.com> Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com> Signed-off-by: Tony Tascioglu <tony.tascioglu@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
40774ad1c4
commit
e0886e1fa5
@ -1698,14 +1698,14 @@ static enum bp_result bios_parser_enable_lvtma_control(
|
||||
struct dc_bios *dcb,
|
||||
uint8_t uc_pwr_on,
|
||||
uint8_t panel_instance,
|
||||
uint8_t bypass_powerdown_wait)
|
||||
uint8_t bypass_panel_control_wait)
|
||||
{
|
||||
struct bios_parser *bp = BP_FROM_DCB(dcb);
|
||||
|
||||
if (!bp->cmd_tbl.enable_lvtma_control)
|
||||
return BP_RESULT_FAILURE;
|
||||
|
||||
return bp->cmd_tbl.enable_lvtma_control(bp, uc_pwr_on, panel_instance, bypass_powerdown_wait);
|
||||
return bp->cmd_tbl.enable_lvtma_control(bp, uc_pwr_on, panel_instance, bypass_panel_control_wait);
|
||||
}
|
||||
|
||||
static bool bios_parser_is_accelerated_mode(
|
||||
|
@ -987,7 +987,7 @@ static enum bp_result enable_lvtma_control(
|
||||
struct bios_parser *bp,
|
||||
uint8_t uc_pwr_on,
|
||||
uint8_t panel_instance,
|
||||
uint8_t bypass_powerdown_wait);
|
||||
uint8_t bypass_panel_control_wait);
|
||||
|
||||
static void init_enable_lvtma_control(struct bios_parser *bp)
|
||||
{
|
||||
@ -1000,7 +1000,7 @@ static void enable_lvtma_control_dmcub(
|
||||
struct dc_dmub_srv *dmcub,
|
||||
uint8_t uc_pwr_on,
|
||||
uint8_t panel_instance,
|
||||
uint8_t bypass_powerdown_wait)
|
||||
uint8_t bypass_panel_control_wait)
|
||||
{
|
||||
|
||||
union dmub_rb_cmd cmd;
|
||||
@ -1014,8 +1014,8 @@ static void enable_lvtma_control_dmcub(
|
||||
uc_pwr_on;
|
||||
cmd.lvtma_control.data.panel_inst =
|
||||
panel_instance;
|
||||
cmd.lvtma_control.data.bypass_powerdown_wait =
|
||||
bypass_powerdown_wait;
|
||||
cmd.lvtma_control.data.bypass_panel_control_wait =
|
||||
bypass_panel_control_wait;
|
||||
dc_dmub_srv_cmd_queue(dmcub, &cmd);
|
||||
dc_dmub_srv_cmd_execute(dmcub);
|
||||
dc_dmub_srv_wait_idle(dmcub);
|
||||
@ -1026,7 +1026,7 @@ static enum bp_result enable_lvtma_control(
|
||||
struct bios_parser *bp,
|
||||
uint8_t uc_pwr_on,
|
||||
uint8_t panel_instance,
|
||||
uint8_t bypass_powerdown_wait)
|
||||
uint8_t bypass_panel_control_wait)
|
||||
{
|
||||
enum bp_result result = BP_RESULT_FAILURE;
|
||||
|
||||
@ -1035,7 +1035,7 @@ static enum bp_result enable_lvtma_control(
|
||||
enable_lvtma_control_dmcub(bp->base.ctx->dmub_srv,
|
||||
uc_pwr_on,
|
||||
panel_instance,
|
||||
bypass_powerdown_wait);
|
||||
bypass_panel_control_wait);
|
||||
return BP_RESULT_OK;
|
||||
}
|
||||
return result;
|
||||
|
@ -97,7 +97,7 @@ struct cmd_tbl {
|
||||
enum bp_result (*enable_lvtma_control)(struct bios_parser *bp,
|
||||
uint8_t uc_pwr_on,
|
||||
uint8_t panel_instance,
|
||||
uint8_t bypass_powerdown_wait);
|
||||
uint8_t bypass_panel_control_wait);
|
||||
};
|
||||
|
||||
void dal_firmware_parser_init_cmd_tbl(struct bios_parser *bp);
|
||||
|
@ -141,7 +141,7 @@ struct dc_vbios_funcs {
|
||||
struct dc_bios *bios,
|
||||
uint8_t uc_pwr_on,
|
||||
uint8_t panel_instance,
|
||||
uint8_t bypass_powerdown_wait);
|
||||
uint8_t bypass_panel_control_wait);
|
||||
|
||||
enum bp_result (*get_soc_bb_info)(
|
||||
struct dc_bios *dcb,
|
||||
|
@ -943,7 +943,6 @@ void dce110_edp_wait_for_T12(
|
||||
msleep(t12_duration - time_since_edp_poweroff_ms);
|
||||
}
|
||||
}
|
||||
|
||||
/*todo: cloned in stream enc, fix*/
|
||||
/*
|
||||
* @brief
|
||||
@ -1022,16 +1021,20 @@ void dce110_edp_backlight_control(
|
||||
DC_LOG_DC("edp_receiver_ready_T7 skipped\n");
|
||||
}
|
||||
|
||||
/* Setting link_powered_externally will bypass delays in the backlight
|
||||
* as they are not required if the link is being powered by a different
|
||||
* source.
|
||||
*/
|
||||
if (ctx->dc->ctx->dmub_srv &&
|
||||
ctx->dc->debug.dmub_command_table) {
|
||||
if (cntl.action == TRANSMITTER_CONTROL_BACKLIGHT_ON)
|
||||
ctx->dc_bios->funcs->enable_lvtma_control(ctx->dc_bios,
|
||||
LVTMA_CONTROL_LCD_BLON,
|
||||
panel_instance, 0);
|
||||
panel_instance, link->link_powered_externally);
|
||||
else
|
||||
ctx->dc_bios->funcs->enable_lvtma_control(ctx->dc_bios,
|
||||
LVTMA_CONTROL_LCD_BLOFF,
|
||||
panel_instance, 0);
|
||||
panel_instance, link->link_powered_externally);
|
||||
}
|
||||
|
||||
link_transmitter_control(ctx->dc_bios, &cntl);
|
||||
|
@ -3111,7 +3111,7 @@ struct dmub_rb_cmd_panel_cntl {
|
||||
*/
|
||||
struct dmub_cmd_lvtma_control_data {
|
||||
uint8_t uc_pwr_action; /**< LVTMA_ACTION */
|
||||
uint8_t bypass_powerdown_wait;
|
||||
uint8_t bypass_panel_control_wait;
|
||||
uint8_t reserved_0[2];
|
||||
uint8_t panel_inst; /**< LVTMA control instance */
|
||||
uint8_t reserved_1[3]; /**< For future use */
|
||||
|
Loading…
x
Reference in New Issue
Block a user