drm/amd/display: Set fec register init value
authorJingwen Zhu <Jingwen.Zhu@amd.com>
Tue, 15 Mar 2022 05:15:27 +0000 (13:15 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 1 Apr 2022 03:05:16 +0000 (23:05 -0400)
[Why]
We don't include this eDP FEC init on fastboot.

[How]
Set the fec to init value when stopping driver &get the fec register value to check should enable FEC.

Co-authored-by: Jingwen Zhu <Jingwen.Zhu@amd.com>
Reviewed-by: Wenjing Liu <Wenjing.Liu@amd.com>
Acked-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Jingwen Zhu <Jingwen.Zhu@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc_link.c
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c

index bbaa5ab..c7c4d98 100644 (file)
@@ -4683,22 +4683,20 @@ bool dc_link_is_fec_supported(const struct dc_link *link)
 
 bool dc_link_should_enable_fec(const struct dc_link *link)
 {
-       bool is_fec_disable = false;
-       bool ret = false;
+       bool force_disable = false;
 
-       if ((link->connector_signal != SIGNAL_TYPE_DISPLAY_PORT_MST &&
+       if (link->fec_state == dc_link_fec_enabled)
+               force_disable = false;
+       else if (link->connector_signal != SIGNAL_TYPE_DISPLAY_PORT_MST &&
                        link->local_sink &&
-                       link->local_sink->edid_caps.panel_patch.disable_fec) ||
-                       (link->connector_signal == SIGNAL_TYPE_EDP
-                               // enable FEC for EDP if DSC is supported
-                               && link->dpcd_caps.dsc_caps.dsc_basic_caps.fields.dsc_support.DSC_SUPPORT == false
-                               ))
-               is_fec_disable = true;
-
-       if (dc_link_is_fec_supported(link) && !link->dc->debug.disable_fec && !is_fec_disable)
-               ret = true;
-
-       return ret;
+                       link->local_sink->edid_caps.panel_patch.disable_fec)
+               force_disable = true;
+       else if (link->connector_signal == SIGNAL_TYPE_EDP
+                       && link->dpcd_caps.dsc_caps.dsc_basic_caps.fields.
+                        dsc_support.DSC_SUPPORT == false)
+               force_disable = true;
+
+       return !force_disable && dc_link_is_fec_supported(link);
 }
 
 uint32_t dc_bandwidth_in_kbps_from_timing(
index ad757b5..911c5d1 100644 (file)
@@ -1493,8 +1493,12 @@ void dcn10_init_hw(struct dc *dc)
 
                /* Check for enabled DIG to identify enabled display */
                if (link->link_enc->funcs->is_dig_enabled &&
-                       link->link_enc->funcs->is_dig_enabled(link->link_enc))
+                       link->link_enc->funcs->is_dig_enabled(link->link_enc)) {
                        link->link_status.link_active = true;
+                       if (link->link_enc->funcs->fec_is_active &&
+                                       link->link_enc->funcs->fec_is_active(link->link_enc))
+                               link->fec_state = dc_link_fec_enabled;
+               }
        }
 
        /* Power gate DSCs */
index 4be2286..b57f657 100644 (file)
@@ -188,8 +188,12 @@ void dcn31_init_hw(struct dc *dc)
 
                /* Check for enabled DIG to identify enabled display */
                if (link->link_enc->funcs->is_dig_enabled &&
-                       link->link_enc->funcs->is_dig_enabled(link->link_enc))
+                       link->link_enc->funcs->is_dig_enabled(link->link_enc)) {
                        link->link_status.link_active = true;
+                       if (link->link_enc->funcs->fec_is_active &&
+                                       link->link_enc->funcs->fec_is_active(link->link_enc))
+                               link->fec_state = dc_link_fec_enabled;
+               }
        }
 
        /* Enables outbox notifications for usb4 dpia */