Commit bb5dfe2f authored by Timur Kristóf's avatar Timur Kristóf Committed by Alex Deucher
Browse files

drm/amd/display: Add missing encoder setup to DACnEncoderControl



Apparently the DAC encoder needs to be set up before use.
The BIOS parser in DC did not support this so I assumed it was
not necessary, but the DAC doesn't work without it on some GPUs.

Fixes: 69b29b89 ("drm/amd/display: Hook up DAC to bios_parser_encoder_control")
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarTimur Kristóf <timur.kristof@gmail.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent cdf6e4c0
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -763,14 +763,14 @@ static enum bp_result bios_parser_encoder_control(
			return BP_RESULT_FAILURE;

		return bp->cmd_tbl.dac1_encoder_control(
			bp, cntl->action == ENCODER_CONTROL_ENABLE,
			bp, cntl->action,
			cntl->pixel_clock, ATOM_DAC1_PS2);
	} else if (cntl->engine_id == ENGINE_ID_DACB) {
		if (!bp->cmd_tbl.dac2_encoder_control)
			return BP_RESULT_FAILURE;

		return bp->cmd_tbl.dac2_encoder_control(
			bp, cntl->action == ENCODER_CONTROL_ENABLE,
			bp, cntl->action,
			cntl->pixel_clock, ATOM_DAC1_PS2);
	}

+11 −8
Original line number Diff line number Diff line
@@ -1838,12 +1838,12 @@ static enum bp_result select_crtc_source_v3(

static enum bp_result dac1_encoder_control_v1(
	struct bios_parser *bp,
	bool enable,
	enum bp_encoder_control_action action,
	uint32_t pixel_clock,
	uint8_t dac_standard);
static enum bp_result dac2_encoder_control_v1(
	struct bios_parser *bp,
	bool enable,
	enum bp_encoder_control_action action,
	uint32_t pixel_clock,
	uint8_t dac_standard);

@@ -1869,12 +1869,15 @@ static void init_dac_encoder_control(struct bios_parser *bp)

static void dac_encoder_control_prepare_params(
	DAC_ENCODER_CONTROL_PS_ALLOCATION *params,
	bool enable,
	enum bp_encoder_control_action action,
	uint32_t pixel_clock,
	uint8_t dac_standard)
{
	params->ucDacStandard = dac_standard;
	if (enable)
	if (action == ENCODER_CONTROL_SETUP ||
	    action == ENCODER_CONTROL_INIT)
		params->ucAction = ATOM_ENCODER_INIT;
	else if (action == ENCODER_CONTROL_ENABLE)
		params->ucAction = ATOM_ENABLE;
	else
		params->ucAction = ATOM_DISABLE;
@@ -1887,7 +1890,7 @@ static void dac_encoder_control_prepare_params(

static enum bp_result dac1_encoder_control_v1(
	struct bios_parser *bp,
	bool enable,
	enum bp_encoder_control_action action,
	uint32_t pixel_clock,
	uint8_t dac_standard)
{
@@ -1896,7 +1899,7 @@ static enum bp_result dac1_encoder_control_v1(

	dac_encoder_control_prepare_params(
		&params,
		enable,
		action,
		pixel_clock,
		dac_standard);

@@ -1908,7 +1911,7 @@ static enum bp_result dac1_encoder_control_v1(

static enum bp_result dac2_encoder_control_v1(
	struct bios_parser *bp,
	bool enable,
	enum bp_encoder_control_action action,
	uint32_t pixel_clock,
	uint8_t dac_standard)
{
@@ -1917,7 +1920,7 @@ static enum bp_result dac2_encoder_control_v1(

	dac_encoder_control_prepare_params(
		&params,
		enable,
		action,
		pixel_clock,
		dac_standard);

+2 −2
Original line number Diff line number Diff line
@@ -57,12 +57,12 @@ struct cmd_tbl {
		struct bp_crtc_source_select *bp_params);
	enum bp_result (*dac1_encoder_control)(
		struct bios_parser *bp,
		bool enable,
		enum bp_encoder_control_action action,
		uint32_t pixel_clock,
		uint8_t dac_standard);
	enum bp_result (*dac2_encoder_control)(
		struct bios_parser *bp,
		bool enable,
		enum bp_encoder_control_action action,
		uint32_t pixel_clock,
		uint8_t dac_standard);
	enum bp_result (*dac1_output_control)(