Commit e0886e1f authored by Tony Tascioglu's avatar Tony Tascioglu Committed by Alex Deucher
Browse files

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: 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 40774ad1
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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(
+6 −6
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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,
+6 −3
Original line number Diff line number Diff line
@@ -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);
Loading