]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/amd/display: Program OTG vtotal min/max selectors unconditionally for DCN1+
authorAurabindo Pillai <aurabindo.pillai@amd.com>
Thu, 1 Jun 2023 17:09:44 +0000 (13:09 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 9 Jun 2023 16:39:32 +0000 (12:39 -0400)
For FPO/FAMS, DMCUB will try to change the output timings by writing to
the OTG registers. However, the timings written directly to the OTG
registers will not be honoured unless VMIN/VMAX selector registers are
programmed with the right bits and trigger source is selected correctly.
Proper solution needs to go into DMCUB but will require additional state
tracking to ensure that the selectors are set and reset correctly as per
driver state. Until fix is merged into firmware, apply the workaround in
driver to unconditionally write OTG vmin/vmax selectors.

Reviewed-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Aurabindo Pillai <aurabindo.pillai@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c

index e1975991e075d8cca9c159ea0bee0a50d08a36e9..633989fd2514db19bf148513f2c8de7879bec526 100644 (file)
@@ -930,19 +930,10 @@ void optc1_set_drr(
                                OTG_FORCE_LOCK_ON_EVENT, 0,
                                OTG_SET_V_TOTAL_MIN_MASK_EN, 0,
                                OTG_SET_V_TOTAL_MIN_MASK, 0);
-
-               // Setup manual flow control for EOF via TRIG_A
-               optc->funcs->setup_manual_trigger(optc);
-
-       } else {
-               REG_UPDATE_4(OTG_V_TOTAL_CONTROL,
-                               OTG_SET_V_TOTAL_MIN_MASK, 0,
-                               OTG_V_TOTAL_MIN_SEL, 0,
-                               OTG_V_TOTAL_MAX_SEL, 0,
-                               OTG_FORCE_LOCK_ON_EVENT, 0);
-
-               optc->funcs->set_vtotal_min_max(optc, 0, 0);
        }
+
+       // Setup manual flow control for EOF via TRIG_A
+       optc->funcs->setup_manual_trigger(optc);
 }
 
 void optc1_set_vtotal_min_max(struct timing_generator *optc, int vtotal_min, int vtotal_max)
index d6f095b4555dca6ecb0f0aac5d9c48cecc473ece..58bdbd859bf9b0d4c95e992a355a434944deac78 100644 (file)
@@ -462,6 +462,16 @@ void optc2_setup_manual_trigger(struct timing_generator *optc)
 {
        struct optc *optc1 = DCN10TG_FROM_TG(optc);
 
+       /* Set the min/max selectors unconditionally so that
+        * DMCUB fw may change OTG timings when necessary
+        * TODO: Remove the w/a after fixing the issue in DMCUB firmware
+        */
+       REG_UPDATE_4(OTG_V_TOTAL_CONTROL,
+                                OTG_V_TOTAL_MIN_SEL, 1,
+                                OTG_V_TOTAL_MAX_SEL, 1,
+                                OTG_FORCE_LOCK_ON_EVENT, 0,
+                                OTG_SET_V_TOTAL_MIN_MASK, (1 << 1)); /* TRIGA */
+
        REG_SET_8(OTG_TRIGA_CNTL, 0,
                        OTG_TRIGA_SOURCE_SELECT, 21,
                        OTG_TRIGA_SOURCE_PIPE_SELECT, optc->inst,