drm/amd/display: Add extra T3 delay
authorLewis Huang <Lewis.Huang@amd.com>
Thu, 30 Jul 2020 10:00:23 +0000 (18:00 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 17 Aug 2020 18:08:45 +0000 (14:08 -0400)
[Why]
For some special panel, it will have an invalid HPD high cause driver
DPCD read/write fail.

[How]
Add extra T3 delay as a monitor patch in dce110_edp_wait_for_hpd_ready

Signed-off-by: Lewis Huang <Lewis.Huang@amd.com>
Reviewed-by: Anthony Koo <Anthony.Koo@amd.com>
Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dc_types.h
drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c

index 946ba92..aa8e095 100644 (file)
@@ -233,6 +233,7 @@ struct dc_panel_patch {
        unsigned int skip_scdc_overwrite;
        unsigned int delay_ignore_msa;
        unsigned int disable_fec;
+       unsigned int extra_t3_ms;
 };
 
 struct dc_edid_caps {
index 45c9e90..0603ddc 100644 (file)
@@ -720,6 +720,7 @@ void dce110_edp_wait_for_hpd_ready(
        struct dc_context *ctx = link->ctx;
        struct graphics_object_id connector = link->link_enc->connector;
        struct gpio *hpd;
+       struct dc_sink *sink = link->local_sink;
        bool edp_hpd_high = false;
        uint32_t time_elapsed = 0;
        uint32_t timeout = power_up ?
@@ -752,6 +753,14 @@ void dce110_edp_wait_for_hpd_ready(
                return;
        }
 
+       if (sink != NULL) {
+               if (sink->edid_caps.panel_patch.extra_t3_ms > 0) {
+                       int extra_t3_in_ms = sink->edid_caps.panel_patch.extra_t3_ms;
+
+                       msleep(extra_t3_in_ms);
+               }
+       }
+
        dal_gpio_open(hpd, GPIO_MODE_INTERRUPT);
 
        /* wait until timeout or panel detected */