[PATCH 2/2] drm/amdgpu: start using engine_id for encoders.

Dave Airlie airlied at gmail.com
Thu Apr 14 04:41:19 UTC 2016


From: Dave Airlie <airlied at redhat.com>

This moves dig_encoder up a level and starts consistently using
engine_id in its place for all the digital and dac engines.

Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 .../drm/amd/amdgpu/amdgpu_grph_object_id_helpers.c |  37 +++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h           |   3 +-
 drivers/gpu/drm/amd/amdgpu/atombios_encoders.c     | 108 +++------------------
 drivers/gpu/drm/amd/amdgpu/dce_v10_0.c             |  30 +++---
 drivers/gpu/drm/amd/amdgpu/dce_v11_0.c             |  30 +++---
 drivers/gpu/drm/amd/amdgpu/dce_v8_0.c              |  31 +++---
 6 files changed, 107 insertions(+), 132 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_grph_object_id_helpers.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_grph_object_id_helpers.c
index 122dfdb..32f0e3f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_grph_object_id_helpers.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_grph_object_id_helpers.c
@@ -310,3 +310,40 @@ uint8_t amdgpu_encoder_object_to_atom(struct graphics_object_id object_id)
 	enum encoder_id enc_id = display_graphics_object_id_get_encoder_id(object_id);
 	return amdgpu_encoder_id_to_atom(enc_id);
 }
+
+bool amdgpu_engine_id_to_atom_encoder(enum engine_id engine, uint8_t *atom_encoder_id)
+{
+	uint8_t encoder_id = 0;
+	switch (engine) {
+	case ENGINE_ID_DIGA:
+		encoder_id = ASIC_INT_DIG1_ENCODER_ID;
+		break;
+	case ENGINE_ID_DIGB:
+		encoder_id = ASIC_INT_DIG2_ENCODER_ID;
+		break;
+	case ENGINE_ID_DIGC:
+		encoder_id = ASIC_INT_DIG3_ENCODER_ID;
+		break;
+	case ENGINE_ID_DIGD:
+		encoder_id = ASIC_INT_DIG4_ENCODER_ID;
+		break;
+	case ENGINE_ID_DIGE:
+		encoder_id = ASIC_INT_DIG5_ENCODER_ID;
+		break;
+	case ENGINE_ID_DIGF:
+		encoder_id = ASIC_INT_DIG6_ENCODER_ID;
+		break;
+	case ENGINE_ID_DIGG:
+		encoder_id = ASIC_INT_DIG7_ENCODER_ID;
+		break;
+	case ENCODER_ID_INTERNAL_KLDSCP_DAC1:
+		encoder_id = ASIC_INT_DAC1_ENCODER_ID;
+		break;
+	case ENCODER_ID_INTERNAL_KLDSCP_DAC2:
+		encoder_id = ASIC_INT_DAC2_ENCODER_ID;
+	default:
+		return false;
+	}
+	*atom_encoder_id = encoder_id;
+	return true;
+}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
index 5624c81..cb7a4f9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
@@ -416,7 +416,6 @@ struct amdgpu_encoder_atom_dig {
 	bool linkb;
 	/* atom dig */
 	bool coherent_mode;
-	int dig_encoder; /* -1 disabled, 0 DIGA, 1 DIGB, etc. */
 	/* atom lvds/edp */
 	uint32_t lcd_misc;
 	uint16_t panel_pwr_delay;
@@ -446,6 +445,7 @@ struct amdgpu_encoder {
 	int audio_polling_active;
 	bool is_ext_encoder;
 	u16 caps;
+	enum engine_id engine_id; /* -1 disabled, 0 DIGA, 1 DIGB, etc. */
 };
 
 struct amdgpu_connector_atom_dig {
@@ -596,4 +596,5 @@ extern const struct drm_mode_config_funcs amdgpu_mode_funcs;
 struct graphics_object_id amdgpu_object_id_from_bios_object_id(uint32_t bios_object_id);
 uint8_t amdgpu_encoder_object_to_atom(struct graphics_object_id object_id);
 uint8_t amdgpu_encoder_id_to_atom(enum encoder_id id);
+bool amdgpu_engine_id_to_atom_encoder(enum engine_id engine, uint8_t *atom_encoder_id);
 #endif
diff --git a/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c b/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c
index 37c498b..ff24826 100644
--- a/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c
+++ b/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c
@@ -520,7 +520,7 @@ amdgpu_atombios_encoder_setup_dig_encoder(struct drm_encoder *encoder,
 	}
 
 	/* no dig encoder assigned */
-	if (dig->dig_encoder == -1)
+	if (amdgpu_encoder->engine_id == ENGINE_ID_UNKNOWN)
 		return;
 
 	memset(&args, 0, sizeof(args));
@@ -585,7 +585,7 @@ amdgpu_atombios_encoder_setup_dig_encoder(struct drm_encoder *encoder,
 
 			if (ENCODER_MODE_IS_DP(args.v3.ucEncoderMode) && (dp_clock == 270000))
 				args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ;
-			args.v3.acConfig.ucDigSel = dig->dig_encoder;
+			args.v3.acConfig.ucDigSel = amdgpu_encoder->engine_id;
 			args.v3.ucBitPerColor = amdgpu_atombios_encoder_get_bpc(encoder);
 			break;
 		case 4:
@@ -613,7 +613,7 @@ amdgpu_atombios_encoder_setup_dig_encoder(struct drm_encoder *encoder,
 				else
 					args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_1_62GHZ;
 			}
-			args.v4.acConfig.ucDigSel = dig->dig_encoder;
+			args.v4.acConfig.ucDigSel = amdgpu_encoder->engine_id;
 			args.v4.ucBitPerColor = amdgpu_atombios_encoder_get_bpc(encoder);
 			if (hpd_id == AMDGPU_HPD_NONE)
 				args.v4.ucHPD_ID = 0;
@@ -660,7 +660,7 @@ amdgpu_atombios_encoder_setup_dig_transmitter(struct drm_encoder *encoder, int a
 	int dp_lane_count = 0;
 	int connector_object_id = 0;
 	int igp_lane_info = 0;
-	int dig_encoder = dig->dig_encoder;
+	enum engine_id engine = amdgpu_encoder->engine_id;
 	int hpd_id = AMDGPU_HPD_NONE;
 	enum encoder_id enc_id = display_graphics_object_id_get_encoder_id(amdgpu_encoder->encoder_object_id);
 
@@ -669,7 +669,7 @@ amdgpu_atombios_encoder_setup_dig_transmitter(struct drm_encoder *encoder, int a
 		/* just needed to avoid bailing in the encoder check.  the encoder
 		 * isn't used for init
 		 */
-		dig_encoder = 0;
+		engine = ENGINE_ID_DIGA;
 	} else
 		connector = amdgpu_get_connector_for_encoder(encoder);
 
@@ -690,7 +690,7 @@ amdgpu_atombios_encoder_setup_dig_transmitter(struct drm_encoder *encoder, int a
 	}
 
 	/* no dig encoder assigned */
-	if (dig_encoder == -1)
+	if (engine == ENGINE_ID_UNKNOWN)
 		return;
 
 	if (ENCODER_MODE_IS_DP(amdgpu_atombios_encoder_get_encoder_mode(encoder)))
@@ -736,7 +736,7 @@ amdgpu_atombios_encoder_setup_dig_transmitter(struct drm_encoder *encoder, int a
 
 			args.v1.ucConfig = ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL;
 
-			if (dig_encoder)
+			if (engine)
 				args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER;
 			else
 				args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG1_ENCODER;
@@ -791,7 +791,7 @@ amdgpu_atombios_encoder_setup_dig_transmitter(struct drm_encoder *encoder, int a
 					args.v2.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 			}
 
-			args.v2.acConfig.ucEncoderSel = dig_encoder;
+			args.v2.acConfig.ucEncoderSel = engine;
 			if (dig->linkb)
 				args.v2.acConfig.ucLinkSel = 1;
 
@@ -844,7 +844,7 @@ amdgpu_atombios_encoder_setup_dig_transmitter(struct drm_encoder *encoder, int a
 
 			if (dig->linkb)
 				args.v3.acConfig.ucLinkSel = 1;
-			if (dig_encoder & 1)
+			if (engine & 1)
 				args.v3.acConfig.ucEncoderSel = 1;
 
 			/* Select the PLL for the PHY
@@ -905,7 +905,7 @@ amdgpu_atombios_encoder_setup_dig_transmitter(struct drm_encoder *encoder, int a
 
 			if (dig->linkb)
 				args.v4.acConfig.ucLinkSel = 1;
-			if (dig_encoder & 1)
+			if (engine & 1)
 				args.v4.acConfig.ucEncoderSel = 1;
 
 			/* Select the PLL for the PHY
@@ -1000,7 +1000,7 @@ amdgpu_atombios_encoder_setup_dig_transmitter(struct drm_encoder *encoder, int a
 				args.v5.asConfig.ucHPDSel = 0;
 			else
 				args.v5.asConfig.ucHPDSel = hpd_id + 1;
-			args.v5.ucDigEncoderSel = 1 << dig_encoder;
+			args.v5.ucDigEncoderSel = 1 << engine;
 			args.v5.ucDPLaneSet = lane_set;
 			break;
 		default:
@@ -1305,7 +1305,6 @@ amdgpu_atombios_encoder_set_crtc_source(struct drm_encoder *encoder)
 	union crtc_source_param args;
 	int index = GetIndexIntoMasterTable(COMMAND, SelectCRTC_Source);
 	uint8_t frev, crev;
-	struct amdgpu_encoder_atom_dig *dig;
 	enum encoder_id enc_id = display_graphics_object_id_get_encoder_id(amdgpu_encoder->encoder_object_id);
 	enum controller_id controller_id = display_graphics_object_id_get_controller_id(amdgpu_crtc->crtc_object_id);
 	memset(&args, 0, sizeof(args));
@@ -1362,46 +1361,9 @@ amdgpu_atombios_encoder_set_crtc_source(struct drm_encoder *encoder)
 			} else {
 				args.v2.ucEncodeMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
 			}
-			switch (enc_id) {
-			case ENCODER_ID_INTERNAL_UNIPHY:
-			case ENCODER_ID_INTERNAL_UNIPHY1:
-			case ENCODER_ID_INTERNAL_UNIPHY2:
-			case ENCODER_ID_INTERNAL_UNIPHY3:
-			case ENCODER_ID_INTERNAL_KLDSCP_LVTMA:
-				dig = amdgpu_encoder->enc_priv;
-				switch (dig->dig_encoder) {
-				case 0:
-					args.v2.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID;
-					break;
-				case 1:
-					args.v2.ucEncoderID = ASIC_INT_DIG2_ENCODER_ID;
-					break;
-				case 2:
-					args.v2.ucEncoderID = ASIC_INT_DIG3_ENCODER_ID;
-					break;
-				case 3:
-					args.v2.ucEncoderID = ASIC_INT_DIG4_ENCODER_ID;
-					break;
-				case 4:
-					args.v2.ucEncoderID = ASIC_INT_DIG5_ENCODER_ID;
-					break;
-				case 5:
-					args.v2.ucEncoderID = ASIC_INT_DIG6_ENCODER_ID;
-					break;
-				case 6:
-					args.v2.ucEncoderID = ASIC_INT_DIG7_ENCODER_ID;
-					break;
-				}
-				break;
-			case ENCODER_ID_INTERNAL_KLDSCP_DAC1:
-				args.v2.ucEncoderID = ASIC_INT_DAC1_ENCODER_ID;
-				break;
-			case ENCODER_ID_INTERNAL_KLDSCP_DAC2:
-				args.v2.ucEncoderID = ASIC_INT_DAC2_ENCODER_ID;
-				break;
-			default:
+
+			if (!amdgpu_engine_id_to_atom_encoder(amdgpu_encoder->engine_id, &args.v2.ucEncoderID))
 				return;
-			}
 			break;
 		case 3:
 			args.v3.ucCRTC = controller_id;
@@ -1420,46 +1382,9 @@ amdgpu_atombios_encoder_set_crtc_source(struct drm_encoder *encoder)
 				args.v2.ucEncodeMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
 			}
 			args.v3.ucDstBpc = amdgpu_atombios_encoder_get_bpc(encoder);
-			switch (enc_id) {
-			case ENCODER_ID_INTERNAL_UNIPHY:
-			case ENCODER_ID_INTERNAL_UNIPHY1:
-			case ENCODER_ID_INTERNAL_UNIPHY2:
-			case ENCODER_ID_INTERNAL_UNIPHY3:
-			case ENCODER_ID_INTERNAL_KLDSCP_LVTMA:
-				dig = amdgpu_encoder->enc_priv;
-				switch (dig->dig_encoder) {
-				case 0:
-					args.v3.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID;
-					break;
-				case 1:
-					args.v3.ucEncoderID = ASIC_INT_DIG2_ENCODER_ID;
-					break;
-				case 2:
-					args.v3.ucEncoderID = ASIC_INT_DIG3_ENCODER_ID;
-					break;
-				case 3:
-					args.v3.ucEncoderID = ASIC_INT_DIG4_ENCODER_ID;
-					break;
-				case 4:
-					args.v3.ucEncoderID = ASIC_INT_DIG5_ENCODER_ID;
-					break;
-				case 5:
-					args.v3.ucEncoderID = ASIC_INT_DIG6_ENCODER_ID;
-					break;
-				case 6:
-					args.v3.ucEncoderID = ASIC_INT_DIG7_ENCODER_ID;
-					break;
-				}
-				break;
-			case ENCODER_ID_INTERNAL_KLDSCP_DAC1:
-				args.v3.ucEncoderID = ASIC_INT_DAC1_ENCODER_ID;
-				break;
-			case ENCODER_ID_INTERNAL_KLDSCP_DAC2:
-				args.v3.ucEncoderID = ASIC_INT_DAC2_ENCODER_ID;
-				break;
-			default:
-				break;
-			}
+
+			if (!amdgpu_engine_id_to_atom_encoder(amdgpu_encoder->engine_id, &args.v3.ucEncoderID))
+				return;
 			break;
 		}
 		break;
@@ -1951,7 +1876,6 @@ amdgpu_atombios_encoder_get_dig_info(struct amdgpu_encoder *amdgpu_encoder)
 
 	/* coherent mode by default */
 	dig->coherent_mode = true;
-	dig->dig_encoder = -1;
 
 	if (encoder_enum == ENUM_ID_2)
 		dig->linkb = true;
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
index e2b22bf..71b30b5 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
@@ -2385,7 +2385,7 @@ static void dce_v10_0_crtc_load_lut(struct drm_crtc *crtc)
 	WREG32(mmALPHA_CONTROL + amdgpu_crtc->crtc_offset, tmp);
 }
 
-static int dce_v10_0_pick_dig_encoder(struct drm_encoder *encoder)
+static enum engine_id dce_v10_0_pick_engine(struct drm_encoder *encoder)
 {
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
@@ -2394,24 +2394,29 @@ static int dce_v10_0_pick_dig_encoder(struct drm_encoder *encoder)
 	switch (enc_id) {
 	case ENCODER_ID_INTERNAL_UNIPHY:
 		if (dig->linkb)
-			return 1;
+			return ENGINE_ID_DIGB;
 		else
-			return 0;
+			return ENGINE_ID_DIGA;
 		break;
 	case ENCODER_ID_INTERNAL_UNIPHY1:
 		if (dig->linkb)
-			return 3;
+			return ENGINE_ID_DIGD;
 		else
-			return 2; break;
+			return ENGINE_ID_DIGC;
+		break;
 	case ENCODER_ID_INTERNAL_UNIPHY2:
 		if (dig->linkb)
-			return 5;
+			return ENGINE_ID_DIGF;
 		else
-			return 4;
+			return ENGINE_ID_DIGE;
 		break;
 	case ENCODER_ID_INTERNAL_UNIPHY3:
-		return 6;
+		return ENGINE_ID_DIGG;
 		break;
+	case ENCODER_ID_INTERNAL_KLDSCP_DAC1:
+		return ENGINE_ID_DACA;
+	case ENCODER_ID_INTERNAL_KLDSCP_DAC2:
+		return ENGINE_ID_DACB;
 	default:
 		DRM_ERROR("invalid encoder_id: 0x%x\n", amdgpu_encoder->encoder_object_id.id);
 		return 0;
@@ -3546,15 +3551,15 @@ static void dce_v10_0_encoder_prepare(struct drm_encoder *encoder)
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 	struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder);
 
+	amdgpu_encoder->engine_id = dce_v10_0_pick_engine(encoder);
 	if ((amdgpu_encoder->active_device &
 	     (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) ||
 	    (amdgpu_encoder_get_dp_bridge_encoder_id(encoder) !=
 	     ENCODER_ID_UNKNOWN)) {
 		struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 		if (dig) {
-			dig->dig_encoder = dce_v10_0_pick_dig_encoder(encoder);
 			if (amdgpu_encoder->active_device & ATOM_DEVICE_DFP_SUPPORT)
-				dig->afmt = adev->mode_info.afmt[dig->dig_encoder];
+				dig->afmt = adev->mode_info.afmt[amdgpu_encoder->engine_id];
 		}
 	}
 
@@ -3592,16 +3597,14 @@ static void dce_v10_0_encoder_commit(struct drm_encoder *encoder)
 static void dce_v10_0_encoder_disable(struct drm_encoder *encoder)
 {
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
-	struct amdgpu_encoder_atom_dig *dig;
 
 	amdgpu_atombios_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
 
 	if (amdgpu_atombios_encoder_is_digital(encoder)) {
 		if (amdgpu_atombios_encoder_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI)
 			dce_v10_0_afmt_enable(encoder, false);
-		dig = amdgpu_encoder->enc_priv;
-		dig->dig_encoder = -1;
 	}
+	amdgpu_encoder->engine_id = ENGINE_ID_UNKNOWN;
 	amdgpu_encoder->active_device = 0;
 }
 
@@ -3727,6 +3730,7 @@ static void dce_v10_0_encoder_add(struct amdgpu_device *adev,
 	amdgpu_encoder->underscan_type = UNDERSCAN_OFF;
 	amdgpu_encoder->is_ext_encoder = false;
 	amdgpu_encoder->caps = caps;
+	amdgpu_encoder->engine_id = ENGINE_ID_UNKNOWN;
 
 	switch (encoder_object_id.id) {
 	case ENCODER_ID_INTERNAL_KLDSCP_DAC1:
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
index a231679..20db7a3 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
@@ -2311,7 +2311,7 @@ static void dce_v11_0_crtc_load_lut(struct drm_crtc *crtc)
 	WREG32(mmALPHA_CONTROL + amdgpu_crtc->crtc_offset, tmp);
 }
 
-static int dce_v11_0_pick_dig_encoder(struct drm_encoder *encoder)
+static enum engine_id dce_v11_0_pick_engine(struct drm_encoder *encoder)
 {
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
@@ -2320,25 +2320,29 @@ static int dce_v11_0_pick_dig_encoder(struct drm_encoder *encoder)
 	switch (enc_id) {
 	case ENCODER_ID_INTERNAL_UNIPHY:
 		if (dig->linkb)
-			return 1;
+			return ENGINE_ID_DIGB;
 		else
-			return 0;
+			return ENGINE_ID_DIGA;
 		break;
 	case ENCODER_ID_INTERNAL_UNIPHY1:
 		if (dig->linkb)
-			return 3;
+			return ENGINE_ID_DIGD;
 		else
-			return 2;
+			return ENGINE_ID_DIGC;
 		break;
 	case ENCODER_ID_INTERNAL_UNIPHY2:
 		if (dig->linkb)
-			return 5;
+			return ENGINE_ID_DIGF;
 		else
-			return 4;
+			return ENGINE_ID_DIGE;
 		break;
 	case ENCODER_ID_INTERNAL_UNIPHY3:
-		return 6;
+		return ENGINE_ID_DIGG;
 		break;
+	case ENCODER_ID_INTERNAL_KLDSCP_DAC1:
+		return ENGINE_ID_DACA;
+	case ENCODER_ID_INTERNAL_KLDSCP_DAC2:
+		return ENGINE_ID_DACB;
 	default:
 		DRM_ERROR("invalid encoder_id: 0x%x\n", amdgpu_encoder->encoder_object_id.id);
 		return 0;
@@ -3488,15 +3492,16 @@ static void dce_v11_0_encoder_prepare(struct drm_encoder *encoder)
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 	struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder);
 
+	amdgpu_encoder->engine_id = dce_v11_0_pick_engine(encoder);
+
 	if ((amdgpu_encoder->active_device &
 	     (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) ||
 	    (amdgpu_encoder_get_dp_bridge_encoder_id(encoder) !=
 	     ENCODER_ID_UNKNOWN)) {
 		struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 		if (dig) {
-			dig->dig_encoder = dce_v11_0_pick_dig_encoder(encoder);
 			if (amdgpu_encoder->active_device & ATOM_DEVICE_DFP_SUPPORT)
-				dig->afmt = adev->mode_info.afmt[dig->dig_encoder];
+				dig->afmt = adev->mode_info.afmt[amdgpu_encoder->engine_id];
 		}
 	}
 
@@ -3534,16 +3539,14 @@ static void dce_v11_0_encoder_commit(struct drm_encoder *encoder)
 static void dce_v11_0_encoder_disable(struct drm_encoder *encoder)
 {
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
-	struct amdgpu_encoder_atom_dig *dig;
 
 	amdgpu_atombios_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
 
 	if (amdgpu_atombios_encoder_is_digital(encoder)) {
 		if (amdgpu_atombios_encoder_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI)
 			dce_v11_0_afmt_enable(encoder, false);
-		dig = amdgpu_encoder->enc_priv;
-		dig->dig_encoder = -1;
 	}
+	amdgpu_encoder->engine_id = ENGINE_ID_UNKNOWN;
 	amdgpu_encoder->active_device = 0;
 }
 
@@ -3669,6 +3672,7 @@ static void dce_v11_0_encoder_add(struct amdgpu_device *adev,
 	amdgpu_encoder->underscan_type = UNDERSCAN_OFF;
 	amdgpu_encoder->is_ext_encoder = false;
 	amdgpu_encoder->caps = caps;
+	amdgpu_encoder->engine_id = ENGINE_ID_UNKNOWN;
 
 	switch (encoder_object_id.id) {
 	case ENCODER_ID_INTERNAL_KLDSCP_DAC1:
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
index 6a53cde..9e48a7a 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
@@ -2286,33 +2286,38 @@ static void dce_v8_0_crtc_load_lut(struct drm_crtc *crtc)
 	       ALPHA_CONTROL__CURSOR_ALPHA_BLND_ENA_MASK);
 }
 
-static int dce_v8_0_pick_dig_encoder(struct drm_encoder *encoder)
+static enum engine_id dce_v8_0_pick_engine(struct drm_encoder *encoder)
 {
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 	enum encoder_id enc_id = display_graphics_object_id_get_encoder_id(amdgpu_encoder->encoder_object_id);
+
 	switch (enc_id) {
 	case ENCODER_ID_INTERNAL_UNIPHY:
 		if (dig->linkb)
-			return 1;
+			return ENGINE_ID_DIGB;
 		else
-			return 0;
+			return ENGINE_ID_DIGA;
 		break;
 	case ENCODER_ID_INTERNAL_UNIPHY1:
 		if (dig->linkb)
-			return 3;
+			return ENGINE_ID_DIGD;
 		else
-			return 2;
+			return ENGINE_ID_DIGC;
 		break;
 	case ENCODER_ID_INTERNAL_UNIPHY2:
 		if (dig->linkb)
-			return 5;
+			return ENGINE_ID_DIGF;
 		else
-			return 4;
+			return ENGINE_ID_DIGE;
 		break;
 	case ENCODER_ID_INTERNAL_UNIPHY3:
-		return 6;
+		return ENGINE_ID_DIGG;
 		break;
+	case ENCODER_ID_INTERNAL_KLDSCP_DAC1:
+		return ENGINE_ID_DACA;
+	case ENCODER_ID_INTERNAL_KLDSCP_DAC2:
+		return ENGINE_ID_DACB;
 	default:
 		DRM_ERROR("invalid encoder_id: 0x%x\n", enc_id);
 		return 0;
@@ -3476,15 +3481,16 @@ static void dce_v8_0_encoder_prepare(struct drm_encoder *encoder)
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 	struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder);
 
+	amdgpu_encoder->engine_id = dce_v8_0_pick_engine(encoder);
+
 	if ((amdgpu_encoder->active_device &
 	     (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) ||
 	    (amdgpu_encoder_get_dp_bridge_encoder_id(encoder) !=
 	     ENCODER_ID_UNKNOWN)) {
 		struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 		if (dig) {
-			dig->dig_encoder = dce_v8_0_pick_dig_encoder(encoder);
 			if (amdgpu_encoder->active_device & ATOM_DEVICE_DFP_SUPPORT)
-				dig->afmt = adev->mode_info.afmt[dig->dig_encoder];
+				dig->afmt = adev->mode_info.afmt[amdgpu_encoder->engine_id];
 		}
 	}
 
@@ -3522,16 +3528,14 @@ static void dce_v8_0_encoder_commit(struct drm_encoder *encoder)
 static void dce_v8_0_encoder_disable(struct drm_encoder *encoder)
 {
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
-	struct amdgpu_encoder_atom_dig *dig;
 
 	amdgpu_atombios_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
 
 	if (amdgpu_atombios_encoder_is_digital(encoder)) {
 		if (amdgpu_atombios_encoder_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI)
 			dce_v8_0_afmt_enable(encoder, false);
-		dig = amdgpu_encoder->enc_priv;
-		dig->dig_encoder = -1;
 	}
+	amdgpu_encoder->engine_id = ENGINE_ID_UNKNOWN;
 	amdgpu_encoder->active_device = 0;
 }
 
@@ -3656,6 +3660,7 @@ static void dce_v8_0_encoder_add(struct amdgpu_device *adev,
 	amdgpu_encoder->underscan_type = UNDERSCAN_OFF;
 	amdgpu_encoder->is_ext_encoder = false;
 	amdgpu_encoder->caps = caps;
+	amdgpu_encoder->engine_id = ENGINE_ID_UNKNOWN;
 
 	switch (encoder_object_id.id) {
 	case ENCODER_ID_INTERNAL_KLDSCP_DAC1:
-- 
2.5.5



More information about the dri-devel mailing list