drm/amd/display: set av_mute in hw_init for HDMI
authorCharlene Liu <charlene.liu@amd.com>
Wed, 7 Aug 2019 21:25:49 +0000 (17:25 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 23 Aug 2019 16:43:22 +0000 (11:43 -0500)
[Description]
OS will reserve HW state in UEFI mode.
Driver init_hw reset to RGB which caused HDMI green in YCbCr mode.
read HW blank_color based on acc_mode.

Signed-off-by: Charlene Liu <charlene.liu@amd.com>
Reviewed-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.c
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_link_encoder.c
drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h

index 5c19661ffc8e970e7f114a9e9722e15d733e4e91..1a37c90e9d432fa48f88835708d8ccd6f14563d6 100644 (file)
@@ -89,6 +89,7 @@ static const struct link_encoder_funcs dcn10_lnk_enc_funcs = {
        .disable_hpd = dcn10_link_encoder_disable_hpd,
        .is_dig_enabled = dcn10_is_dig_enabled,
        .get_dig_frontend = dcn10_get_dig_frontend,
+       .get_dig_mode = dcn10_get_dig_mode,
        .destroy = dcn10_link_encoder_destroy
 };
 
@@ -1397,3 +1398,25 @@ void dcn10_aux_initialize(struct dcn10_link_encoder *enc10)
        AUX_REG_UPDATE(AUX_DPHY_RX_CONTROL0,
                        AUX_RX_RECEIVE_WINDOW, 0);
 }
+
+enum signal_type dcn10_get_dig_mode(
+       struct link_encoder *enc)
+{
+       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
+       uint32_t value;
+       REG_GET(DIG_BE_CNTL, DIG_MODE, &value);
+       switch (value) {
+       case 1:
+               return SIGNAL_TYPE_DISPLAY_PORT;
+       case 2:
+               return SIGNAL_TYPE_DVI_SINGLE_LINK;
+       case 3:
+               return SIGNAL_TYPE_HDMI_TYPE_A;
+       case 5:
+               return SIGNAL_TYPE_DISPLAY_PORT_MST;
+       default:
+               return SIGNAL_TYPE_NONE;
+       }
+       return SIGNAL_TYPE_NONE;
+}
+
index f3e57343417c7917af5a906929d2b3e37658620c..8bf5f0f2301d2a7f579e70ebab60d4526e5dfe90 100644 (file)
@@ -515,4 +515,6 @@ unsigned int dcn10_get_dig_frontend(struct link_encoder *enc);
 
 void dcn10_aux_initialize(struct dcn10_link_encoder *enc10);
 
+enum signal_type dcn10_get_dig_mode(
+       struct link_encoder *enc);
 #endif /* __DC_LINK_ENCODER__DCN10_H__ */
index f495582e9e8774ba3e5e7e746b09a9da81dab111..e476f27aa3a9a917a8f9b665e6ec5e05f4a95705 100644 (file)
@@ -341,6 +341,7 @@ static const struct link_encoder_funcs dcn20_link_enc_funcs = {
        .fec_set_enable = enc2_fec_set_enable,
        .fec_set_ready = enc2_fec_set_ready,
        .fec_is_active = enc2_fec_is_active,
+       .get_dig_mode = dcn10_get_dig_mode,
        .get_dig_frontend = dcn10_get_dig_frontend,
 };
 
index 7001bfbd668187b9251f2469b5b131efa038084e..abb4e4237fb6a731013514a3887d37eb791ed026 100644 (file)
@@ -184,6 +184,8 @@ struct link_encoder_funcs {
        bool (*fec_is_active)(struct link_encoder *enc);
 #endif
        bool (*is_in_alt_mode) (struct link_encoder *enc);
+       enum signal_type (*get_dig_mode)(
+               struct link_encoder *enc);
 };
 
 #endif /* LINK_ENCODER_H_ */