Commit 06ddcee4 authored by Jake Wang's avatar Jake Wang Committed by Alex Deucher
Browse files

drm/amd/display: Added multi instance support for panel control



[Why]
Panel control always programs instance 0. With multi eDP we need to
support multiple instances.

[How]
Use link index to set different instances for panel control.
Refactored LVTMA control to support multiple instances.

Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarJake Wang <haonan.wang2@amd.com>
Reviewed-by: default avatarAric Cyr <Aric.Cyr@amd.com>
Acked-by: default avatarEryk Brol <eryk.brol@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 1a595f28
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -1180,14 +1180,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 uc_pwr_on,
	uint8_t panel_instance)
{
	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);
	return bp->cmd_tbl.enable_lvtma_control(bp, uc_pwr_on, panel_instance);
}

static bool bios_parser_is_accelerated_mode(
+13 −8
Original line number Diff line number Diff line
@@ -981,7 +981,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 uc_pwr_on,
	uint8_t panel_instance);

static void init_enable_lvtma_control(struct bios_parser *bp)
{
@@ -992,19 +993,21 @@ 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 uc_pwr_on,
	uint8_t panel_instance)
{

	union dmub_rb_cmd cmd;

	memset(&cmd, 0, sizeof(cmd));

	cmd.cmd_common.header.type = DMUB_CMD__VBIOS;
	cmd.cmd_common.header.sub_type =
	cmd.lvtma_control.header.type = DMUB_CMD__VBIOS;
	cmd.lvtma_control.header.sub_type =
			DMUB_CMD__VBIOS_LVTMA_CONTROL;
	cmd.cmd_common.cmd_buffer[0] =
	cmd.lvtma_control.data.uc_pwr_action =
			uc_pwr_on;

	cmd.lvtma_control.data.panel_inst =
			panel_instance;
	dc_dmub_srv_cmd_queue(dmcub, &cmd);
	dc_dmub_srv_cmd_execute(dmcub);
	dc_dmub_srv_wait_idle(dmcub);
@@ -1013,14 +1016,16 @@ static void enable_lvtma_control_dmcub(

static enum bp_result enable_lvtma_control(
	struct bios_parser *bp,
	uint8_t uc_pwr_on)
	uint8_t uc_pwr_on,
	uint8_t panel_instance)
{
	enum bp_result result = BP_RESULT_FAILURE;

	if (bp->base.ctx->dc->ctx->dmub_srv &&
	    bp->base.ctx->dc->debug.dmub_command_table) {
		enable_lvtma_control_dmcub(bp->base.ctx->dmub_srv,
				uc_pwr_on);
				uc_pwr_on,
				panel_instance);
		return BP_RESULT_OK;
	}
	return result;
+2 −1
Original line number Diff line number Diff line
@@ -95,7 +95,8 @@ struct cmd_tbl {
	unsigned int (*get_smu_clock_info)(
			struct bios_parser *bp, uint8_t id);
	enum bp_result (*enable_lvtma_control)(struct bios_parser *bp,
			uint8_t uc_pwr_on);
			uint8_t uc_pwr_on,
			uint8_t panel_instance);
};

void dal_firmware_parser_init_cmd_tbl(struct bios_parser *bp);
+1 −1
Original line number Diff line number Diff line
@@ -1506,7 +1506,7 @@ static bool dc_link_construct(struct dc_link *link,
		(link->link_id.id == CONNECTOR_ID_EDP ||
			link->link_id.id == CONNECTOR_ID_LVDS)) {
		panel_cntl_init_data.ctx = dc_ctx;
		panel_cntl_init_data.inst = 0;
		panel_cntl_init_data.inst = link->link_index;
		link->panel_cntl =
			link->dc->res_pool->funcs->panel_cntl_create(
								&panel_cntl_init_data);
+2 −1
Original line number Diff line number Diff line
@@ -139,7 +139,8 @@ struct dc_vbios_funcs {

	enum bp_result (*enable_lvtma_control)(
		struct dc_bios *bios,
		uint8_t uc_pwr_on);
		uint8_t uc_pwr_on,
		uint8_t panel_instance);

	enum bp_result (*get_soc_bb_info)(
		struct dc_bios *dcb,
Loading