]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/amd/display: For prefetch mode > 0, extend prefetch if possible
authorAlvin Lee <alvin.lee2@amd.com>
Wed, 6 Dec 2023 19:52:31 +0000 (14:52 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 5 Feb 2024 20:14:28 +0000 (20:14 +0000)
[ Upstream commit dd4e4bb28843393065eed279e869fac248d03f0f ]

[Description]
For mode programming we want to extend the prefetch as much as possible
(up to oto, or as long as we can for equ) if we're not already applying
the 60us prefetch requirement. This is to avoid intermittent underflow
issues during prefetch.

The prefetch extension is applied under the following scenarios:
1. We're in prefetch mode 1 (i.e. we don't support MCLK switch in blank)
2. We're using subvp or drr methods of p-state switch, in which case we
   we don't care if prefetch takes up more of the blanking time

Mode programming typically chooses the smallest prefetch time possible
(i.e. highest bandwidth during prefetch) presumably to create margin between
p-states / c-states that happen in vblank and prefetch. Therefore we only
apply this prefetch extension when p-state in vblank is not required (UCLK
p-states take up the most vblank time).

Reviewed-by: Jun Lei <jun.lei@amd.com>
Acked-by: Aurabindo Pillai <aurabindo.pillai@amd.com>
Signed-off-by: Alvin Lee <alvin.lee2@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c
drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.c
drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.h

index cbdfb762c10c58427c70d2e618b38527eafc9878..6c84b0fa40f44d94ea2506e9b9e59a2b54408f10 100644 (file)
@@ -813,6 +813,8 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
                                        (v->DRAMSpeedPerState[mode_lib->vba.VoltageLevel] <= MEM_STROBE_FREQ_MHZ ||
                                                v->DCFCLKPerState[mode_lib->vba.VoltageLevel] <= DCFCLK_FREQ_EXTRA_PREFETCH_REQ_MHZ) ?
                                                        mode_lib->vba.ip.min_prefetch_in_strobe_us : 0,
+                                       mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb] > 0 || mode_lib->vba.DRAMClockChangeRequirementFinal == false,
+
                                        /* Output */
                                        &v->DSTXAfterScaler[k],
                                        &v->DSTYAfterScaler[k],
@@ -3317,6 +3319,7 @@ void dml32_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
                                                        v->SwathHeightCThisState[k], v->TWait,
                                                        (v->DRAMSpeedPerState[i] <= MEM_STROBE_FREQ_MHZ || v->DCFCLKState[i][j] <= DCFCLK_FREQ_EXTRA_PREFETCH_REQ_MHZ) ?
                                                                        mode_lib->vba.ip.min_prefetch_in_strobe_us : 0,
+                                                       mode_lib->vba.PrefetchModePerState[i][j] > 0 || mode_lib->vba.DRAMClockChangeRequirementFinal == false,
 
                                                        /* Output */
                                                        &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.DSTXAfterScaler[k],
index ecea008f19d3aa0d3427e97adb8e33219a22a35f..208b89d13d3f6d0a8497658d6ca883ff5f5901de 100644 (file)
@@ -3423,6 +3423,7 @@ bool dml32_CalculatePrefetchSchedule(
                unsigned int SwathHeightC,
                double TWait,
                double TPreReq,
+               bool ExtendPrefetchIfPossible,
                /* Output */
                double   *DSTXAfterScaler,
                double   *DSTYAfterScaler,
@@ -3892,12 +3893,32 @@ bool dml32_CalculatePrefetchSchedule(
                        /* Clamp to oto for bandwidth calculation */
                        LinesForPrefetchBandwidth = dst_y_prefetch_oto;
                } else {
-                       *DestinationLinesForPrefetch = dst_y_prefetch_equ;
-                       TimeForFetchingMetaPTE = Tvm_equ;
-                       TimeForFetchingRowInVBlank = Tr0_equ;
-                       *PrefetchBandwidth = prefetch_bw_equ;
-                       /* Clamp to equ for bandwidth calculation */
-                       LinesForPrefetchBandwidth = dst_y_prefetch_equ;
+                       /* For mode programming we want to extend the prefetch as much as possible
+                        * (up to oto, or as long as we can for equ) if we're not already applying
+                        * the 60us prefetch requirement. This is to avoid intermittent underflow
+                        * issues during prefetch.
+                        *
+                        * The prefetch extension is applied under the following scenarios:
+                        * 1. We're in prefetch mode > 0 (i.e. we don't support MCLK switch in blank)
+                        * 2. We're using subvp or drr methods of p-state switch, in which case we
+                        *    we don't care if prefetch takes up more of the blanking time
+                        *
+                        * Mode programming typically chooses the smallest prefetch time possible
+                        * (i.e. highest bandwidth during prefetch) presumably to create margin between
+                        * p-states / c-states that happen in vblank and prefetch. Therefore we only
+                        * apply this prefetch extension when p-state in vblank is not required (UCLK
+                        * p-states take up the most vblank time).
+                        */
+                       if (ExtendPrefetchIfPossible && TPreReq == 0 && VStartup < MaxVStartup) {
+                               MyError = true;
+                       } else {
+                               *DestinationLinesForPrefetch = dst_y_prefetch_equ;
+                               TimeForFetchingMetaPTE = Tvm_equ;
+                               TimeForFetchingRowInVBlank = Tr0_equ;
+                               *PrefetchBandwidth = prefetch_bw_equ;
+                               /* Clamp to equ for bandwidth calculation */
+                               LinesForPrefetchBandwidth = dst_y_prefetch_equ;
+                       }
                }
 
                *DestinationLinesToRequestVMInVBlank = dml_ceil(4.0 * TimeForFetchingMetaPTE / LineTime, 1.0) / 4.0;
index 592d174df6c6296f493577dc56eda6c64e1d3dcf..5d34735df83db1befd73d8b7c6c21c41fa48fd86 100644 (file)
@@ -747,6 +747,7 @@ bool dml32_CalculatePrefetchSchedule(
                unsigned int SwathHeightC,
                double TWait,
                double TPreReq,
+               bool ExtendPrefetchIfPossible,
                /* Output */
                double   *DSTXAfterScaler,
                double   *DSTYAfterScaler,