From: Matthew Stewart <[email protected]>

[why]

Rounding errors were causing mode validation to fail in some cases when
it should not. (IE. Increasing fclk from a lower value could lead to
validation failure, which should not happen.)

Reviewed-by: Dillon Varone <[email protected]>
Signed-off-by: Matthew Stewart <[email protected]>
Tested-by: Dan Wheeler <[email protected]>
---
 .../dc/dml2_0/dml21/src/dml2_core/dml2_core_dcn4_calcs.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git 
a/drivers/gpu/drm/amd/display/dc/dml2_0/dml21/src/dml2_core/dml2_core_dcn4_calcs.c
 
b/drivers/gpu/drm/amd/display/dc/dml2_0/dml21/src/dml2_core/dml2_core_dcn4_calcs.c
index da9a1c4e2bdc..4ca6a4521f11 100644
--- 
a/drivers/gpu/drm/amd/display/dc/dml2_0/dml21/src/dml2_core/dml2_core_dcn4_calcs.c
+++ 
b/drivers/gpu/drm/amd/display/dc/dml2_0/dml21/src/dml2_core/dml2_core_dcn4_calcs.c
@@ -5622,7 +5622,8 @@ static bool CalculatePrefetchSchedule(struct 
dml2_core_internal_scratch *scratch
                                + 2 * (p->PixelPTEBytesPerRow * 
p->HostVMInefficiencyFactor + p->meta_row_bytes + tdlut_row_bytes)
                                + *p->prefetch_sw_bytes)
                                / (*p->Tpre_rounded - *p->Tno_bw);
-                       s->Tsw_est1 = *p->prefetch_sw_bytes / s->prefetch_bw1;
+                       /* due to rounding, VM can clamp to +1/4, Row can clamp 
to +2/4, giving SW less time */
+                       s->Tsw_est1 = *p->prefetch_sw_bytes / s->prefetch_bw1 - 
3.0 * s->LineTime / 4.0;
                } else
                        s->prefetch_bw1 = 0;
 
@@ -5646,7 +5647,8 @@ static bool CalculatePrefetchSchedule(struct 
dml2_core_internal_scratch *scratch
                if (*p->Tpre_rounded - *p->Tno_bw - 2.0 * s->Tr0_trips_rounded 
> 0) {
                        s->prefetch_bw2 = (vm_bytes * 
p->HostVMInefficiencyFactor + *p->prefetch_sw_bytes) /
                        (*p->Tpre_rounded - *p->Tno_bw - 2.0 * 
s->Tr0_trips_rounded);
-                       s->Tsw_est2 = *p->prefetch_sw_bytes / s->prefetch_bw2;
+                       /* due to rounding, VM can clamp to +1/4  */
+                       s->Tsw_est2 = *p->prefetch_sw_bytes / s->prefetch_bw2 - 
1.0 * s->LineTime / 4.0;
                } else
                        s->prefetch_bw2 = 0;
 
@@ -5660,7 +5662,8 @@ static bool CalculatePrefetchSchedule(struct 
dml2_core_internal_scratch *scratch
                if (*p->Tpre_rounded - s->Tvm_trips_rounded > 0) {
                        s->prefetch_bw3 = (2 * (p->PixelPTEBytesPerRow * 
p->HostVMInefficiencyFactor + p->meta_row_bytes + tdlut_row_bytes) + 
*p->prefetch_sw_bytes) /
                                (*p->Tpre_rounded - s->Tvm_trips_rounded);
-                       s->Tsw_est3 = *p->prefetch_sw_bytes / s->prefetch_bw3;
+                       /* due to rounding, Row can clamp to +2/4  */
+                       s->Tsw_est3 = *p->prefetch_sw_bytes / s->prefetch_bw3 - 
2.0 * s->LineTime / 4.0;
                } else
                        s->prefetch_bw3 = 0;
 
-- 
2.53.0

Reply via email to