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

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
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -1697,14 +1697,15 @@ static enum bp_result bios_parser_enable_disp_power_gating(
static enum bp_result bios_parser_enable_lvtma_control(
	struct dc_bios *dcb,
	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);

	if (!bp->cmd_tbl.enable_lvtma_control)
		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(
+10 −4
Original line number Diff line number Diff line
@@ -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(
	struct bios_parser *bp,
	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)
{
@@ -998,7 +999,8 @@ static void init_enable_lvtma_control(struct bios_parser *bp)
static void enable_lvtma_control_dmcub(
	struct dc_dmub_srv *dmcub,
	uint8_t uc_pwr_on,
	uint8_t panel_instance)
	uint8_t panel_instance,
	uint8_t bypass_powerdown_wait)
{

	union dmub_rb_cmd cmd;
@@ -1012,6 +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;
	dc_dmub_srv_cmd_queue(dmcub, &cmd);
	dc_dmub_srv_cmd_execute(dmcub);
	dc_dmub_srv_wait_idle(dmcub);
@@ -1021,7 +1025,8 @@ static void enable_lvtma_control_dmcub(
static enum bp_result enable_lvtma_control(
	struct bios_parser *bp,
	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;

@@ -1029,7 +1034,8 @@ static enum bp_result enable_lvtma_control(
	    bp->base.ctx->dc->debug.dmub_command_table) {
		enable_lvtma_control_dmcub(bp->base.ctx->dmub_srv,
				uc_pwr_on,
				panel_instance);
				panel_instance,
				bypass_powerdown_wait);
		return BP_RESULT_OK;
	}
	return result;
+2 −1
Original line number Diff line number Diff line
@@ -96,7 +96,8 @@ struct cmd_tbl {
			struct bios_parser *bp, uint8_t id);
	enum bp_result (*enable_lvtma_control)(struct bios_parser *bp,
			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);
+2 −1
Original line number Diff line number Diff line
@@ -140,7 +140,8 @@ struct dc_vbios_funcs {
	enum bp_result (*enable_lvtma_control)(
		struct dc_bios *bios,
		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)(
		struct dc_bios *dcb,
+2 −0
Original line number Diff line number Diff line
@@ -294,6 +294,8 @@ struct dc_link {

	struct gpio *hpd_gpio;
	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 phy_state phy_state;
};
Loading