From: Dave Airlie <airl...@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

Reply via email to