Commit 3351ce5d authored by Tony Tascioglu's avatar Tony Tascioglu Committed by Alex Deucher

drm/amd/display: Optimize link power-down when link powered externally

[Why]
When an eDP panel is powered externally by a different GPU, we don't need
to wait for hardware sequencing delays when powering down a link, as the
display is not dependent on the GPU being powered down.

[How]
This commit adds a variable 'link_powered_externally' to indicate when a
link is being powered by another GPU.
Tested-by: default avatarDaniel Wheeler <Daniel.Wheeler@amd.com>
Reviewed-by: default avatarFelipe Clark <felipe.clark@amd.com>
Acked-by: default avatarRodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: default avatarTony Tascioglu <tony.tascioglu@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 762e8feb
...@@ -1697,14 +1697,15 @@ static enum bp_result bios_parser_enable_disp_power_gating( ...@@ -1697,14 +1697,15 @@ static enum bp_result bios_parser_enable_disp_power_gating(
static enum bp_result bios_parser_enable_lvtma_control( static enum bp_result bios_parser_enable_lvtma_control(
struct dc_bios *dcb, struct dc_bios *dcb,
uint8_t uc_pwr_on, uint8_t uc_pwr_on,
uint8_t panel_instance) uint8_t panel_instance,
uint8_t bypass_powerdown_wait)
{ {
struct bios_parser *bp = BP_FROM_DCB(dcb); struct bios_parser *bp = BP_FROM_DCB(dcb);
if (!bp->cmd_tbl.enable_lvtma_control) if (!bp->cmd_tbl.enable_lvtma_control)
return BP_RESULT_FAILURE; return BP_RESULT_FAILURE;
return bp->cmd_tbl.enable_lvtma_control(bp, uc_pwr_on, panel_instance); return bp->cmd_tbl.enable_lvtma_control(bp, uc_pwr_on, panel_instance, bypass_powerdown_wait);
} }
static bool bios_parser_is_accelerated_mode( static bool bios_parser_is_accelerated_mode(
......
...@@ -986,7 +986,8 @@ static unsigned int get_smu_clock_info_v3_1(struct bios_parser *bp, uint8_t id) ...@@ -986,7 +986,8 @@ static unsigned int get_smu_clock_info_v3_1(struct bios_parser *bp, uint8_t id)
static enum bp_result enable_lvtma_control( static enum bp_result enable_lvtma_control(
struct bios_parser *bp, struct bios_parser *bp,
uint8_t uc_pwr_on, uint8_t uc_pwr_on,
uint8_t panel_instance); uint8_t panel_instance,
uint8_t bypass_powerdown_wait);
static void init_enable_lvtma_control(struct bios_parser *bp) static void init_enable_lvtma_control(struct bios_parser *bp)
{ {
...@@ -998,7 +999,8 @@ static void init_enable_lvtma_control(struct bios_parser *bp) ...@@ -998,7 +999,8 @@ static void init_enable_lvtma_control(struct bios_parser *bp)
static void enable_lvtma_control_dmcub( static void enable_lvtma_control_dmcub(
struct dc_dmub_srv *dmcub, struct dc_dmub_srv *dmcub,
uint8_t uc_pwr_on, uint8_t uc_pwr_on,
uint8_t panel_instance) uint8_t panel_instance,
uint8_t bypass_powerdown_wait)
{ {
union dmub_rb_cmd cmd; union dmub_rb_cmd cmd;
...@@ -1012,6 +1014,8 @@ static void enable_lvtma_control_dmcub( ...@@ -1012,6 +1014,8 @@ static void enable_lvtma_control_dmcub(
uc_pwr_on; uc_pwr_on;
cmd.lvtma_control.data.panel_inst = cmd.lvtma_control.data.panel_inst =
panel_instance; panel_instance;
cmd.lvtma_control.data.bypass_powerdown_wait =
bypass_powerdown_wait;
dc_dmub_srv_cmd_queue(dmcub, &cmd); dc_dmub_srv_cmd_queue(dmcub, &cmd);
dc_dmub_srv_cmd_execute(dmcub); dc_dmub_srv_cmd_execute(dmcub);
dc_dmub_srv_wait_idle(dmcub); dc_dmub_srv_wait_idle(dmcub);
...@@ -1021,7 +1025,8 @@ static void enable_lvtma_control_dmcub( ...@@ -1021,7 +1025,8 @@ static void enable_lvtma_control_dmcub(
static enum bp_result enable_lvtma_control( static enum bp_result enable_lvtma_control(
struct bios_parser *bp, struct bios_parser *bp,
uint8_t uc_pwr_on, uint8_t uc_pwr_on,
uint8_t panel_instance) uint8_t panel_instance,
uint8_t bypass_powerdown_wait)
{ {
enum bp_result result = BP_RESULT_FAILURE; enum bp_result result = BP_RESULT_FAILURE;
...@@ -1029,7 +1034,8 @@ static enum bp_result enable_lvtma_control( ...@@ -1029,7 +1034,8 @@ static enum bp_result enable_lvtma_control(
bp->base.ctx->dc->debug.dmub_command_table) { bp->base.ctx->dc->debug.dmub_command_table) {
enable_lvtma_control_dmcub(bp->base.ctx->dmub_srv, enable_lvtma_control_dmcub(bp->base.ctx->dmub_srv,
uc_pwr_on, uc_pwr_on,
panel_instance); panel_instance,
bypass_powerdown_wait);
return BP_RESULT_OK; return BP_RESULT_OK;
} }
return result; return result;
......
...@@ -96,7 +96,8 @@ struct cmd_tbl { ...@@ -96,7 +96,8 @@ struct cmd_tbl {
struct bios_parser *bp, uint8_t id); struct bios_parser *bp, uint8_t id);
enum bp_result (*enable_lvtma_control)(struct bios_parser *bp, enum bp_result (*enable_lvtma_control)(struct bios_parser *bp,
uint8_t uc_pwr_on, uint8_t uc_pwr_on,
uint8_t panel_instance); uint8_t panel_instance,
uint8_t bypass_powerdown_wait);
}; };
void dal_firmware_parser_init_cmd_tbl(struct bios_parser *bp); void dal_firmware_parser_init_cmd_tbl(struct bios_parser *bp);
......
...@@ -140,7 +140,8 @@ struct dc_vbios_funcs { ...@@ -140,7 +140,8 @@ struct dc_vbios_funcs {
enum bp_result (*enable_lvtma_control)( enum bp_result (*enable_lvtma_control)(
struct dc_bios *bios, struct dc_bios *bios,
uint8_t uc_pwr_on, uint8_t uc_pwr_on,
uint8_t panel_instance); uint8_t panel_instance,
uint8_t bypass_powerdown_wait);
enum bp_result (*get_soc_bb_info)( enum bp_result (*get_soc_bb_info)(
struct dc_bios *dcb, struct dc_bios *dcb,
......
...@@ -294,6 +294,8 @@ struct dc_link { ...@@ -294,6 +294,8 @@ struct dc_link {
struct gpio *hpd_gpio; struct gpio *hpd_gpio;
enum dc_link_fec_state fec_state; enum dc_link_fec_state fec_state;
bool link_powered_externally; // Used to bypass hardware sequencing delays when panel is powered down forcibly
struct dc_panel_config panel_config; struct dc_panel_config panel_config;
struct phy_state phy_state; struct phy_state phy_state;
}; };
......
...@@ -875,14 +875,16 @@ void dce110_edp_power_control( ...@@ -875,14 +875,16 @@ void dce110_edp_power_control(
if (ctx->dc->ctx->dmub_srv && if (ctx->dc->ctx->dmub_srv &&
ctx->dc->debug.dmub_command_table) { ctx->dc->debug.dmub_command_table) {
if (cntl.action == TRANSMITTER_CONTROL_POWER_ON)
if (cntl.action == TRANSMITTER_CONTROL_POWER_ON) {
bp_result = ctx->dc_bios->funcs->enable_lvtma_control(ctx->dc_bios, bp_result = ctx->dc_bios->funcs->enable_lvtma_control(ctx->dc_bios,
LVTMA_CONTROL_POWER_ON, LVTMA_CONTROL_POWER_ON,
panel_instance); panel_instance, link->link_powered_externally);
else } else {
bp_result = ctx->dc_bios->funcs->enable_lvtma_control(ctx->dc_bios, bp_result = ctx->dc_bios->funcs->enable_lvtma_control(ctx->dc_bios,
LVTMA_CONTROL_POWER_OFF, LVTMA_CONTROL_POWER_OFF,
panel_instance); panel_instance, link->link_powered_externally);
}
} }
bp_result = link_transmitter_control(ctx->dc_bios, &cntl); bp_result = link_transmitter_control(ctx->dc_bios, &cntl);
...@@ -1025,11 +1027,11 @@ void dce110_edp_backlight_control( ...@@ -1025,11 +1027,11 @@ void dce110_edp_backlight_control(
if (cntl.action == TRANSMITTER_CONTROL_BACKLIGHT_ON) if (cntl.action == TRANSMITTER_CONTROL_BACKLIGHT_ON)
ctx->dc_bios->funcs->enable_lvtma_control(ctx->dc_bios, ctx->dc_bios->funcs->enable_lvtma_control(ctx->dc_bios,
LVTMA_CONTROL_LCD_BLON, LVTMA_CONTROL_LCD_BLON,
panel_instance); panel_instance, 0);
else else
ctx->dc_bios->funcs->enable_lvtma_control(ctx->dc_bios, ctx->dc_bios->funcs->enable_lvtma_control(ctx->dc_bios,
LVTMA_CONTROL_LCD_BLOFF, LVTMA_CONTROL_LCD_BLOFF,
panel_instance); panel_instance, 0);
} }
link_transmitter_control(ctx->dc_bios, &cntl); link_transmitter_control(ctx->dc_bios, &cntl);
......
...@@ -3111,7 +3111,8 @@ struct dmub_rb_cmd_panel_cntl { ...@@ -3111,7 +3111,8 @@ struct dmub_rb_cmd_panel_cntl {
*/ */
struct dmub_cmd_lvtma_control_data { struct dmub_cmd_lvtma_control_data {
uint8_t uc_pwr_action; /**< LVTMA_ACTION */ uint8_t uc_pwr_action; /**< LVTMA_ACTION */
uint8_t reserved_0[3]; /**< For future use */ uint8_t bypass_powerdown_wait;
uint8_t reserved_0[2];
uint8_t panel_inst; /**< LVTMA control instance */ uint8_t panel_inst; /**< LVTMA control instance */
uint8_t reserved_1[3]; /**< For future use */ uint8_t reserved_1[3]; /**< For future use */
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment