1 /* 2 * Copyright 2022 Advanced Micro Devices, Inc. All rights reserved. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included in 12 * all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 * 22 * Authors: AMD 23 * 24 */ 25 26 #include "dc.h" 27 #include "dc_link.h" 28 #include "../display_mode_lib.h" 29 #include "display_mode_vba_32.h" 30 #include "../dml_inline_defs.h" 31 #include "display_mode_vba_util_32.h" 32 33 void dml32_recalculate(struct display_mode_lib *mode_lib); 34 static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation( 35 struct display_mode_lib *mode_lib); 36 void dml32_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_lib); 37 38 void dml32_recalculate(struct display_mode_lib *mode_lib) 39 { 40 ModeSupportAndSystemConfiguration(mode_lib); 41 42 dml32_CalculateMaxDETAndMinCompressedBufferSize(mode_lib->vba.ConfigReturnBufferSizeInKByte, 43 mode_lib->vba.ROBBufferSizeInKByte, 44 DC__NUM_DPP, 45 false, //mode_lib->vba.override_setting.nomDETInKByteOverrideEnable, 46 0, //mode_lib->vba.override_setting.nomDETInKByteOverrideValue, 47 48 /* Output */ 49 &mode_lib->vba.MaxTotalDETInKByte, &mode_lib->vba.nomDETInKByte, 50 &mode_lib->vba.MinCompressedBufferSizeInKByte); 51 52 PixelClockAdjustmentForProgressiveToInterlaceUnit(mode_lib); 53 #ifdef __DML_VBA_DEBUG__ 54 dml_print("DML::%s: Calling DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation\n", __func__); 55 #endif 56 DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(mode_lib); 57 } 58 59 static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation( 60 struct display_mode_lib *mode_lib) 61 { 62 struct vba_vars_st *v = &mode_lib->vba; 63 unsigned int j, k; 64 bool ImmediateFlipRequirementFinal; 65 int iteration; 66 double MaxTotalRDBandwidth; 67 unsigned int NextPrefetchMode; 68 double MaxTotalRDBandwidthNoUrgentBurst = 0.0; 69 bool DestinationLineTimesForPrefetchLessThan2 = false; 70 bool VRatioPrefetchMoreThanMax = false; 71 double TWait; 72 double TotalWRBandwidth = 0; 73 double WRBandwidth = 0; 74 75 #ifdef __DML_VBA_DEBUG__ 76 dml_print("DML::%s: --- START ---\n", __func__); 77 dml_print("DML::%s: mode_lib->vba.PrefetchMode = %d\n", __func__, mode_lib->vba.PrefetchMode); 78 dml_print("DML::%s: mode_lib->vba.ImmediateFlipSupport = %d\n", __func__, mode_lib->vba.ImmediateFlipSupport); 79 dml_print("DML::%s: mode_lib->vba.VoltageLevel = %d\n", __func__, mode_lib->vba.VoltageLevel); 80 #endif 81 82 v->WritebackDISPCLK = 0.0; 83 v->GlobalDPPCLK = 0.0; 84 85 // DISPCLK and DPPCLK Calculation 86 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 87 if (mode_lib->vba.WritebackEnable[k]) { 88 v->WritebackDISPCLK = dml_max(v->WritebackDISPCLK, 89 dml32_CalculateWriteBackDISPCLK( 90 mode_lib->vba.WritebackPixelFormat[k], 91 mode_lib->vba.PixelClock[k], mode_lib->vba.WritebackHRatio[k], 92 mode_lib->vba.WritebackVRatio[k], 93 mode_lib->vba.WritebackHTaps[k], 94 mode_lib->vba.WritebackVTaps[k], 95 mode_lib->vba.WritebackSourceWidth[k], 96 mode_lib->vba.WritebackDestinationWidth[k], 97 mode_lib->vba.HTotal[k], mode_lib->vba.WritebackLineBufferSize, 98 mode_lib->vba.DISPCLKDPPCLKVCOSpeed)); 99 } 100 } 101 102 v->DISPCLK_calculated = v->WritebackDISPCLK; 103 104 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 105 if (mode_lib->vba.BlendingAndTiming[k] == k) { 106 v->DISPCLK_calculated = dml_max(v->DISPCLK_calculated, 107 dml32_CalculateRequiredDispclk( 108 mode_lib->vba.ODMCombineEnabled[k], 109 mode_lib->vba.PixelClock[k], 110 mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading, 111 mode_lib->vba.DISPCLKRampingMargin, 112 mode_lib->vba.DISPCLKDPPCLKVCOSpeed, 113 mode_lib->vba.MaxDppclk[v->soc.num_states - 1])); 114 } 115 } 116 117 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 118 dml32_CalculateSinglePipeDPPCLKAndSCLThroughput(mode_lib->vba.HRatio[k], 119 mode_lib->vba.HRatioChroma[k], 120 mode_lib->vba.VRatio[k], 121 mode_lib->vba.VRatioChroma[k], 122 mode_lib->vba.MaxDCHUBToPSCLThroughput, 123 mode_lib->vba.MaxPSCLToLBThroughput, 124 mode_lib->vba.PixelClock[k], 125 mode_lib->vba.SourcePixelFormat[k], 126 mode_lib->vba.htaps[k], 127 mode_lib->vba.HTAPsChroma[k], 128 mode_lib->vba.vtaps[k], 129 mode_lib->vba.VTAPsChroma[k], 130 131 /* Output */ 132 &v->PSCL_THROUGHPUT_LUMA[k], &v->PSCL_THROUGHPUT_CHROMA[k], 133 &v->DPPCLKUsingSingleDPP[k]); 134 } 135 136 dml32_CalculateDPPCLK(mode_lib->vba.NumberOfActiveSurfaces, mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading, 137 mode_lib->vba.DISPCLKDPPCLKVCOSpeed, v->DPPCLKUsingSingleDPP, mode_lib->vba.DPPPerPlane, 138 /* Output */ 139 &v->GlobalDPPCLK, v->DPPCLK); 140 141 for (k = 0; k < v->NumberOfActiveSurfaces; ++k) { 142 v->DPPCLK_calculated[k] = v->DPPCLK[k]; 143 } 144 145 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 146 dml32_CalculateBytePerPixelAndBlockSizes( 147 mode_lib->vba.SourcePixelFormat[k], 148 mode_lib->vba.SurfaceTiling[k], 149 150 /* Output */ 151 &v->BytePerPixelY[k], 152 &v->BytePerPixelC[k], 153 &v->BytePerPixelDETY[k], 154 &v->BytePerPixelDETC[k], 155 &v->BlockHeight256BytesY[k], 156 &v->BlockHeight256BytesC[k], 157 &v->BlockWidth256BytesY[k], 158 &v->BlockWidth256BytesC[k], 159 &v->BlockHeightY[k], 160 &v->BlockHeightC[k], 161 &v->BlockWidthY[k], 162 &v->BlockWidthC[k]); 163 } 164 165 #ifdef __DML_VBA_DEBUG__ 166 dml_print("DML::%s: %d\n", __func__, __LINE__); 167 #endif 168 dml32_CalculateSwathWidth( 169 false, // ForceSingleDPP 170 mode_lib->vba.NumberOfActiveSurfaces, 171 mode_lib->vba.SourcePixelFormat, 172 mode_lib->vba.SourceRotation, 173 mode_lib->vba.ViewportStationary, 174 mode_lib->vba.ViewportWidth, 175 mode_lib->vba.ViewportHeight, 176 mode_lib->vba.ViewportXStartY, 177 mode_lib->vba.ViewportYStartY, 178 mode_lib->vba.ViewportXStartC, 179 mode_lib->vba.ViewportYStartC, 180 mode_lib->vba.SurfaceWidthY, 181 mode_lib->vba.SurfaceWidthC, 182 mode_lib->vba.SurfaceHeightY, 183 mode_lib->vba.SurfaceHeightC, 184 mode_lib->vba.ODMCombineEnabled, 185 v->BytePerPixelY, 186 v->BytePerPixelC, 187 v->BlockHeight256BytesY, 188 v->BlockHeight256BytesC, 189 v->BlockWidth256BytesY, 190 v->BlockWidth256BytesC, 191 mode_lib->vba.BlendingAndTiming, 192 mode_lib->vba.HActive, 193 mode_lib->vba.HRatio, 194 mode_lib->vba.DPPPerPlane, 195 196 /* Output */ 197 v->SwathWidthSingleDPPY, v->SwathWidthSingleDPPC, v->SwathWidthY, v->SwathWidthC, 198 v->dummy_vars 199 .DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation 200 .dummy_integer_array[0], // Integer MaximumSwathHeightY[] 201 v->dummy_vars 202 .DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation 203 .dummy_integer_array[1], // Integer MaximumSwathHeightC[] 204 v->swath_width_luma_ub, v->swath_width_chroma_ub); 205 206 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 207 v->ReadBandwidthSurfaceLuma[k] = v->SwathWidthSingleDPPY[k] * v->BytePerPixelY[k] 208 / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * mode_lib->vba.VRatio[k]; 209 v->ReadBandwidthSurfaceChroma[k] = v->SwathWidthSingleDPPC[k] * v->BytePerPixelC[k] 210 / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) 211 * mode_lib->vba.VRatioChroma[k]; 212 #ifdef __DML_VBA_DEBUG__ 213 dml_print("DML::%s: ReadBandwidthSurfaceLuma[%i] = %fBps\n", 214 __func__, k, v->ReadBandwidthSurfaceLuma[k]); 215 dml_print("DML::%s: ReadBandwidthSurfaceChroma[%i] = %fBps\n", 216 __func__, k, v->ReadBandwidthSurfaceChroma[k]); 217 #endif 218 } 219 220 { 221 // VBA_DELTA 222 // Calculate DET size, swath height 223 dml32_CalculateSwathAndDETConfiguration( 224 &v->dummy_vars.dml32_CalculateSwathAndDETConfiguration, 225 mode_lib->vba.DETSizeOverride, 226 mode_lib->vba.UsesMALLForPStateChange, 227 mode_lib->vba.ConfigReturnBufferSizeInKByte, 228 mode_lib->vba.MaxTotalDETInKByte, 229 mode_lib->vba.MinCompressedBufferSizeInKByte, 230 false, /* ForceSingleDPP */ 231 mode_lib->vba.NumberOfActiveSurfaces, 232 mode_lib->vba.nomDETInKByte, 233 mode_lib->vba.UseUnboundedRequesting, 234 mode_lib->vba.DisableUnboundRequestIfCompBufReservedSpaceNeedAdjustment, 235 mode_lib->vba.ip.pixel_chunk_size_kbytes, 236 mode_lib->vba.ip.rob_buffer_size_kbytes, 237 mode_lib->vba.CompressedBufferSegmentSizeInkByteFinal, 238 v->dummy_vars 239 .DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation 240 .dummy_output_encoder_array, /* output_encoder_class Output[] */ 241 v->ReadBandwidthSurfaceLuma, 242 v->ReadBandwidthSurfaceChroma, 243 v->dummy_vars 244 .DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation 245 .dummy_single_array[0], /* Single MaximumSwathWidthLuma[] */ 246 v->dummy_vars 247 .DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation 248 .dummy_single_array[1], /* Single MaximumSwathWidthChroma[] */ 249 mode_lib->vba.SourceRotation, 250 mode_lib->vba.ViewportStationary, 251 mode_lib->vba.SourcePixelFormat, 252 mode_lib->vba.SurfaceTiling, 253 mode_lib->vba.ViewportWidth, 254 mode_lib->vba.ViewportHeight, 255 mode_lib->vba.ViewportXStartY, 256 mode_lib->vba.ViewportYStartY, 257 mode_lib->vba.ViewportXStartC, 258 mode_lib->vba.ViewportYStartC, 259 mode_lib->vba.SurfaceWidthY, 260 mode_lib->vba.SurfaceWidthC, 261 mode_lib->vba.SurfaceHeightY, 262 mode_lib->vba.SurfaceHeightC, 263 v->BlockHeight256BytesY, 264 v->BlockHeight256BytesC, 265 v->BlockWidth256BytesY, 266 v->BlockWidth256BytesC, 267 mode_lib->vba.ODMCombineEnabled, 268 mode_lib->vba.BlendingAndTiming, 269 v->BytePerPixelY, 270 v->BytePerPixelC, 271 v->BytePerPixelDETY, 272 v->BytePerPixelDETC, 273 mode_lib->vba.HActive, 274 mode_lib->vba.HRatio, 275 mode_lib->vba.HRatioChroma, 276 mode_lib->vba.DPPPerPlane, 277 278 /* Output */ 279 v->dummy_vars 280 .DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation 281 .dummy_long_array[0], /* Long swath_width_luma_ub[] */ 282 v->dummy_vars 283 .DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation 284 .dummy_long_array[1], /* Long swath_width_chroma_ub[] */ 285 v->dummy_vars 286 .DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation 287 .dummy_double_array[0], /* Long SwathWidth[] */ 288 v->dummy_vars 289 .DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation 290 .dummy_double_array[1], /* Long SwathWidthChroma[] */ 291 mode_lib->vba.SwathHeightY, 292 mode_lib->vba.SwathHeightC, 293 mode_lib->vba.DETBufferSizeInKByte, 294 mode_lib->vba.DETBufferSizeY, 295 mode_lib->vba.DETBufferSizeC, 296 &v->UnboundedRequestEnabled, 297 &v->CompressedBufferSizeInkByte, 298 &v->CompBufReservedSpaceKBytes, 299 &v->dummy_vars 300 .DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation 301 .dummy_boolean, /* bool *CompBufReservedSpaceNeedAjustment */ 302 v->dummy_vars 303 .DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation 304 .dummy_boolean_array, /* bool ViewportSizeSupportPerSurface[] */ 305 &v->dummy_vars 306 .DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation 307 .dummy_boolean); /* bool *ViewportSizeSupport */ 308 } 309 310 v->CompBufReservedSpaceZs = v->CompBufReservedSpaceKBytes * 1024.0 / 256.0; 311 v->CompBufReservedSpace64B = v->CompBufReservedSpaceKBytes * 1024.0 / 64.0; 312 313 // DCFCLK Deep Sleep 314 dml32_CalculateDCFCLKDeepSleep( 315 mode_lib->vba.NumberOfActiveSurfaces, 316 v->BytePerPixelY, 317 v->BytePerPixelC, 318 mode_lib->vba.VRatio, 319 mode_lib->vba.VRatioChroma, 320 v->SwathWidthY, 321 v->SwathWidthC, 322 mode_lib->vba.DPPPerPlane, 323 mode_lib->vba.HRatio, 324 mode_lib->vba.HRatioChroma, 325 mode_lib->vba.PixelClock, 326 v->PSCL_THROUGHPUT_LUMA, 327 v->PSCL_THROUGHPUT_CHROMA, 328 mode_lib->vba.DPPCLK, 329 v->ReadBandwidthSurfaceLuma, 330 v->ReadBandwidthSurfaceChroma, 331 mode_lib->vba.ReturnBusWidth, 332 333 /* Output */ 334 &v->DCFCLKDeepSleep); 335 336 // DSCCLK 337 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 338 if ((mode_lib->vba.BlendingAndTiming[k] != k) || !mode_lib->vba.DSCEnabled[k]) { 339 v->DSCCLK_calculated[k] = 0.0; 340 } else { 341 if (mode_lib->vba.OutputFormat[k] == dm_420) 342 mode_lib->vba.DSCFormatFactor = 2; 343 else if (mode_lib->vba.OutputFormat[k] == dm_444) 344 mode_lib->vba.DSCFormatFactor = 1; 345 else if (mode_lib->vba.OutputFormat[k] == dm_n422) 346 mode_lib->vba.DSCFormatFactor = 2; 347 else 348 mode_lib->vba.DSCFormatFactor = 1; 349 if (mode_lib->vba.ODMCombineEnabled[k] == dm_odm_combine_mode_4to1) 350 v->DSCCLK_calculated[k] = mode_lib->vba.PixelClockBackEnd[k] / 12 351 / mode_lib->vba.DSCFormatFactor 352 / (1 - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100); 353 else if (mode_lib->vba.ODMCombineEnabled[k] == dm_odm_combine_mode_2to1) 354 v->DSCCLK_calculated[k] = mode_lib->vba.PixelClockBackEnd[k] / 6 355 / mode_lib->vba.DSCFormatFactor 356 / (1 - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100); 357 else 358 v->DSCCLK_calculated[k] = mode_lib->vba.PixelClockBackEnd[k] / 3 359 / mode_lib->vba.DSCFormatFactor 360 / (1 - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100); 361 } 362 } 363 364 // DSC Delay 365 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 366 v->DSCDelay[k] = dml32_DSCDelayRequirement(mode_lib->vba.DSCEnabled[k], 367 mode_lib->vba.ODMCombineEnabled[k], mode_lib->vba.DSCInputBitPerComponent[k], 368 mode_lib->vba.OutputBpp[k], mode_lib->vba.HActive[k], mode_lib->vba.HTotal[k], 369 mode_lib->vba.NumberOfDSCSlices[k], mode_lib->vba.OutputFormat[k], 370 mode_lib->vba.Output[k], mode_lib->vba.PixelClock[k], 371 mode_lib->vba.PixelClockBackEnd[k]); 372 } 373 374 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) 375 for (j = 0; j < mode_lib->vba.NumberOfActiveSurfaces; ++j) // NumberOfSurfaces 376 if (j != k && mode_lib->vba.BlendingAndTiming[k] == j && mode_lib->vba.DSCEnabled[j]) 377 v->DSCDelay[k] = v->DSCDelay[j]; 378 379 //Immediate Flip 380 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 381 v->ImmediateFlipSupportedSurface[k] = mode_lib->vba.ImmediateFlipSupport 382 && (mode_lib->vba.ImmediateFlipRequirement[k] != dm_immediate_flip_not_required); 383 } 384 385 // Prefetch 386 dml32_CalculateSurfaceSizeInMall( 387 mode_lib->vba.NumberOfActiveSurfaces, 388 mode_lib->vba.MALLAllocatedForDCNFinal, 389 mode_lib->vba.UseMALLForStaticScreen, 390 mode_lib->vba.DCCEnable, 391 mode_lib->vba.ViewportStationary, 392 mode_lib->vba.ViewportXStartY, 393 mode_lib->vba.ViewportYStartY, 394 mode_lib->vba.ViewportXStartC, 395 mode_lib->vba.ViewportYStartC, 396 mode_lib->vba.ViewportWidth, 397 mode_lib->vba.ViewportHeight, 398 v->BytePerPixelY, 399 mode_lib->vba.ViewportWidthChroma, 400 mode_lib->vba.ViewportHeightChroma, 401 v->BytePerPixelC, 402 mode_lib->vba.SurfaceWidthY, 403 mode_lib->vba.SurfaceWidthC, 404 mode_lib->vba.SurfaceHeightY, 405 mode_lib->vba.SurfaceHeightC, 406 v->BlockWidth256BytesY, 407 v->BlockWidth256BytesC, 408 v->BlockHeight256BytesY, 409 v->BlockHeight256BytesC, 410 v->BlockWidthY, 411 v->BlockWidthC, 412 v->BlockHeightY, 413 v->BlockHeightC, 414 415 /* Output */ 416 v->SurfaceSizeInMALL, 417 &v->dummy_vars. 418 DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation 419 .dummy_boolean2); /* Boolean *ExceededMALLSize */ 420 421 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 422 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].PixelClock = mode_lib->vba.PixelClock[k]; 423 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].DPPPerSurface = mode_lib->vba.DPPPerPlane[k]; 424 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].SourceRotation = mode_lib->vba.SourceRotation[k]; 425 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportHeight = mode_lib->vba.ViewportHeight[k]; 426 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportHeightChroma = mode_lib->vba.ViewportHeightChroma[k]; 427 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockWidth256BytesY = v->BlockWidth256BytesY[k]; 428 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockHeight256BytesY = v->BlockHeight256BytesY[k]; 429 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockWidth256BytesC = v->BlockWidth256BytesC[k]; 430 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockHeight256BytesC = v->BlockHeight256BytesC[k]; 431 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockWidthY = v->BlockWidthY[k]; 432 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockHeightY = v->BlockHeightY[k]; 433 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockWidthC = v->BlockWidthC[k]; 434 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BlockHeightC = v->BlockHeightC[k]; 435 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].InterlaceEnable = mode_lib->vba.Interlace[k]; 436 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].HTotal = mode_lib->vba.HTotal[k]; 437 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].DCCEnable = mode_lib->vba.DCCEnable[k]; 438 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].SourcePixelFormat = mode_lib->vba.SourcePixelFormat[k]; 439 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].SurfaceTiling = mode_lib->vba.SurfaceTiling[k]; 440 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BytePerPixelY = v->BytePerPixelY[k]; 441 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].BytePerPixelC = v->BytePerPixelC[k]; 442 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ProgressiveToInterlaceUnitInOPP = mode_lib->vba.ProgressiveToInterlaceUnitInOPP; 443 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].VRatio = mode_lib->vba.VRatio[k]; 444 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].VRatioChroma = mode_lib->vba.VRatioChroma[k]; 445 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].VTaps = mode_lib->vba.vtaps[k]; 446 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].VTapsChroma = mode_lib->vba.VTAPsChroma[k]; 447 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].PitchY = mode_lib->vba.PitchY[k]; 448 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].DCCMetaPitchY = mode_lib->vba.DCCMetaPitchY[k]; 449 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].PitchC = mode_lib->vba.PitchC[k]; 450 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].DCCMetaPitchC = mode_lib->vba.DCCMetaPitchC[k]; 451 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportStationary = mode_lib->vba.ViewportStationary[k]; 452 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportXStart = mode_lib->vba.ViewportXStartY[k]; 453 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportYStart = mode_lib->vba.ViewportYStartY[k]; 454 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportXStartC = mode_lib->vba.ViewportXStartC[k]; 455 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].ViewportYStartC = mode_lib->vba.ViewportYStartC[k]; 456 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].FORCE_ONE_ROW_FOR_FRAME = mode_lib->vba.ForceOneRowForFrame[k]; 457 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].SwathHeightY = mode_lib->vba.SwathHeightY[k]; 458 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters[k].SwathHeightC = mode_lib->vba.SwathHeightC[k]; 459 } 460 461 { 462 463 dml32_CalculateVMRowAndSwath( 464 &v->dummy_vars.dml32_CalculateVMRowAndSwath, 465 mode_lib->vba.NumberOfActiveSurfaces, 466 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.SurfaceParameters, 467 v->SurfaceSizeInMALL, 468 mode_lib->vba.PTEBufferSizeInRequestsLuma, 469 mode_lib->vba.PTEBufferSizeInRequestsChroma, 470 mode_lib->vba.DCCMetaBufferSizeBytes, 471 mode_lib->vba.UseMALLForStaticScreen, 472 mode_lib->vba.UsesMALLForPStateChange, 473 mode_lib->vba.MALLAllocatedForDCNFinal, 474 v->SwathWidthY, 475 v->SwathWidthC, 476 mode_lib->vba.GPUVMEnable, 477 mode_lib->vba.HostVMEnable, 478 mode_lib->vba.HostVMMaxNonCachedPageTableLevels, 479 mode_lib->vba.GPUVMMaxPageTableLevels, 480 mode_lib->vba.GPUVMMinPageSizeKBytes, 481 mode_lib->vba.HostVMMinPageSize, 482 483 /* Output */ 484 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_boolean_array2[0], // Boolean PTEBufferSizeNotExceeded[] 485 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_boolean_array2[1], // Boolean DCCMetaBufferSizeNotExceeded[] 486 v->dpte_row_width_luma_ub, 487 v->dpte_row_width_chroma_ub, 488 v->dpte_row_height, 489 v->dpte_row_height_chroma, 490 v->dpte_row_height_linear, 491 v->dpte_row_height_linear_chroma, 492 v->meta_req_width, 493 v->meta_req_width_chroma, 494 v->meta_req_height, 495 v->meta_req_height_chroma, 496 v->meta_row_width, 497 v->meta_row_width_chroma, 498 v->meta_row_height, 499 v->meta_row_height_chroma, 500 v->vm_group_bytes, 501 v->dpte_group_bytes, 502 v->PixelPTEReqWidthY, 503 v->PixelPTEReqHeightY, 504 v->PTERequestSizeY, 505 v->PixelPTEReqWidthC, 506 v->PixelPTEReqHeightC, 507 v->PTERequestSizeC, 508 v->dpde0_bytes_per_frame_ub_l, 509 v->meta_pte_bytes_per_frame_ub_l, 510 v->dpde0_bytes_per_frame_ub_c, 511 v->meta_pte_bytes_per_frame_ub_c, 512 v->PrefetchSourceLinesY, 513 v->PrefetchSourceLinesC, 514 v->VInitPreFillY, v->VInitPreFillC, 515 v->MaxNumSwathY, 516 v->MaxNumSwathC, 517 v->meta_row_bw, 518 v->dpte_row_bw, 519 v->PixelPTEBytesPerRow, 520 v->PDEAndMetaPTEBytesFrame, 521 v->MetaRowByte, 522 v->Use_One_Row_For_Frame, 523 v->Use_One_Row_For_Frame_Flip, 524 v->UsesMALLForStaticScreen, 525 v->PTE_BUFFER_MODE, 526 v->BIGK_FRAGMENT_SIZE); 527 } 528 529 530 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.ReorderBytes = mode_lib->vba.NumberOfChannels 531 * dml_max3(mode_lib->vba.UrgentOutOfOrderReturnPerChannelPixelDataOnly, 532 mode_lib->vba.UrgentOutOfOrderReturnPerChannelPixelMixedWithVMData, 533 mode_lib->vba.UrgentOutOfOrderReturnPerChannelVMDataOnly); 534 535 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.VMDataOnlyReturnBW = dml32_get_return_bw_mbps_vm_only( 536 &mode_lib->vba.soc, 537 mode_lib->vba.VoltageLevel, 538 mode_lib->vba.DCFCLK, 539 mode_lib->vba.FabricClock, 540 mode_lib->vba.DRAMSpeed); 541 542 #ifdef __DML_VBA_DEBUG__ 543 dml_print("DML::%s: mode_lib->vba.ReturnBusWidth = %f\n", __func__, mode_lib->vba.ReturnBusWidth); 544 dml_print("DML::%s: mode_lib->vba.DCFCLK = %f\n", __func__, mode_lib->vba.DCFCLK); 545 dml_print("DML::%s: mode_lib->vba.FabricClock = %f\n", __func__, mode_lib->vba.FabricClock); 546 dml_print("DML::%s: mode_lib->vba.FabricDatapathToDCNDataReturn = %f\n", __func__, 547 mode_lib->vba.FabricDatapathToDCNDataReturn); 548 dml_print("DML::%s: mode_lib->vba.PercentOfIdealSDPPortBWReceivedAfterUrgLatency = %f\n", 549 __func__, mode_lib->vba.PercentOfIdealSDPPortBWReceivedAfterUrgLatency); 550 dml_print("DML::%s: mode_lib->vba.DRAMSpeed = %f\n", __func__, mode_lib->vba.DRAMSpeed); 551 dml_print("DML::%s: mode_lib->vba.NumberOfChannels = %f\n", __func__, mode_lib->vba.NumberOfChannels); 552 dml_print("DML::%s: mode_lib->vba.DRAMChannelWidth = %f\n", __func__, mode_lib->vba.DRAMChannelWidth); 553 dml_print("DML::%s: mode_lib->vba.PercentOfIdealDRAMBWReceivedAfterUrgLatencyVMDataOnly = %f\n", 554 __func__, mode_lib->vba.PercentOfIdealDRAMBWReceivedAfterUrgLatencyVMDataOnly); 555 dml_print("DML::%s: VMDataOnlyReturnBW = %f\n", __func__, VMDataOnlyReturnBW); 556 dml_print("DML::%s: ReturnBW = %f\n", __func__, mode_lib->vba.ReturnBW); 557 #endif 558 559 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.HostVMInefficiencyFactor = 1.0; 560 561 if (mode_lib->vba.GPUVMEnable && mode_lib->vba.HostVMEnable) 562 v->dummy_vars 563 .DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation 564 .HostVMInefficiencyFactor = 565 mode_lib->vba.ReturnBW / v->dummy_vars 566 .DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation 567 .VMDataOnlyReturnBW; 568 569 mode_lib->vba.TotalDCCActiveDPP = 0; 570 mode_lib->vba.TotalActiveDPP = 0; 571 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 572 mode_lib->vba.TotalActiveDPP = mode_lib->vba.TotalActiveDPP + mode_lib->vba.DPPPerPlane[k]; 573 if (mode_lib->vba.DCCEnable[k]) 574 mode_lib->vba.TotalDCCActiveDPP = mode_lib->vba.TotalDCCActiveDPP 575 + mode_lib->vba.DPPPerPlane[k]; 576 } 577 578 v->UrgentExtraLatency = dml32_CalculateExtraLatency( 579 mode_lib->vba.RoundTripPingLatencyCycles, 580 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.ReorderBytes, 581 mode_lib->vba.DCFCLK, 582 mode_lib->vba.TotalActiveDPP, 583 mode_lib->vba.PixelChunkSizeInKByte, 584 mode_lib->vba.TotalDCCActiveDPP, 585 mode_lib->vba.MetaChunkSize, 586 mode_lib->vba.ReturnBW, 587 mode_lib->vba.GPUVMEnable, 588 mode_lib->vba.HostVMEnable, 589 mode_lib->vba.NumberOfActiveSurfaces, 590 mode_lib->vba.DPPPerPlane, 591 v->dpte_group_bytes, 592 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.HostVMInefficiencyFactor, 593 mode_lib->vba.HostVMMinPageSize, 594 mode_lib->vba.HostVMMaxNonCachedPageTableLevels); 595 596 mode_lib->vba.TCalc = 24.0 / v->DCFCLKDeepSleep; 597 598 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 599 if (mode_lib->vba.BlendingAndTiming[k] == k) { 600 if (mode_lib->vba.WritebackEnable[k] == true) { 601 v->WritebackDelay[mode_lib->vba.VoltageLevel][k] = mode_lib->vba.WritebackLatency 602 + dml32_CalculateWriteBackDelay( 603 mode_lib->vba.WritebackPixelFormat[k], 604 mode_lib->vba.WritebackHRatio[k], 605 mode_lib->vba.WritebackVRatio[k], 606 mode_lib->vba.WritebackVTaps[k], 607 mode_lib->vba.WritebackDestinationWidth[k], 608 mode_lib->vba.WritebackDestinationHeight[k], 609 mode_lib->vba.WritebackSourceHeight[k], 610 mode_lib->vba.HTotal[k]) / mode_lib->vba.DISPCLK; 611 } else 612 v->WritebackDelay[mode_lib->vba.VoltageLevel][k] = 0; 613 for (j = 0; j < mode_lib->vba.NumberOfActiveSurfaces; ++j) { 614 if (mode_lib->vba.BlendingAndTiming[j] == k && 615 mode_lib->vba.WritebackEnable[j] == true) { 616 v->WritebackDelay[mode_lib->vba.VoltageLevel][k] = 617 dml_max(v->WritebackDelay[mode_lib->vba.VoltageLevel][k], 618 mode_lib->vba.WritebackLatency + 619 dml32_CalculateWriteBackDelay( 620 mode_lib->vba.WritebackPixelFormat[j], 621 mode_lib->vba.WritebackHRatio[j], 622 mode_lib->vba.WritebackVRatio[j], 623 mode_lib->vba.WritebackVTaps[j], 624 mode_lib->vba.WritebackDestinationWidth[j], 625 mode_lib->vba.WritebackDestinationHeight[j], 626 mode_lib->vba.WritebackSourceHeight[j], 627 mode_lib->vba.HTotal[k]) / mode_lib->vba.DISPCLK); 628 } 629 } 630 } 631 } 632 633 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) 634 for (j = 0; j < mode_lib->vba.NumberOfActiveSurfaces; ++j) 635 if (mode_lib->vba.BlendingAndTiming[k] == j) 636 v->WritebackDelay[mode_lib->vba.VoltageLevel][k] = 637 v->WritebackDelay[mode_lib->vba.VoltageLevel][j]; 638 639 v->UrgentLatency = dml32_CalculateUrgentLatency(mode_lib->vba.UrgentLatencyPixelDataOnly, 640 mode_lib->vba.UrgentLatencyPixelMixedWithVMData, 641 mode_lib->vba.UrgentLatencyVMDataOnly, 642 mode_lib->vba.DoUrgentLatencyAdjustment, 643 mode_lib->vba.UrgentLatencyAdjustmentFabricClockComponent, 644 mode_lib->vba.UrgentLatencyAdjustmentFabricClockReference, 645 mode_lib->vba.FabricClock); 646 647 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 648 dml32_CalculateUrgentBurstFactor(mode_lib->vba.UsesMALLForPStateChange[k], 649 v->swath_width_luma_ub[k], 650 v->swath_width_chroma_ub[k], 651 mode_lib->vba.SwathHeightY[k], 652 mode_lib->vba.SwathHeightC[k], 653 mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k], 654 v->UrgentLatency, 655 mode_lib->vba.CursorBufferSize, 656 mode_lib->vba.CursorWidth[k][0], 657 mode_lib->vba.CursorBPP[k][0], 658 mode_lib->vba.VRatio[k], 659 mode_lib->vba.VRatioChroma[k], 660 v->BytePerPixelDETY[k], 661 v->BytePerPixelDETC[k], 662 mode_lib->vba.DETBufferSizeY[k], 663 mode_lib->vba.DETBufferSizeC[k], 664 665 /* output */ 666 &v->UrgBurstFactorCursor[k], 667 &v->UrgBurstFactorLuma[k], 668 &v->UrgBurstFactorChroma[k], 669 &v->NoUrgentLatencyHiding[k]); 670 671 v->cursor_bw[k] = mode_lib->vba.NumberOfCursors[k] * mode_lib->vba.CursorWidth[k][0] * mode_lib->vba.CursorBPP[k][0] / 8 / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * mode_lib->vba.VRatio[k]; 672 } 673 674 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 675 v->MaxVStartupLines[k] = ((mode_lib->vba.Interlace[k] && 676 !mode_lib->vba.ProgressiveToInterlaceUnitInOPP) ? 677 dml_floor((mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k]) / 2.0, 1.0) : 678 mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k]) - dml_max(1.0, 679 dml_ceil((double) v->WritebackDelay[mode_lib->vba.VoltageLevel][k] 680 / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]), 1)); 681 682 // Clamp to max OTG vstartup register limit 683 if (v->MaxVStartupLines[k] > 1023) 684 v->MaxVStartupLines[k] = 1023; 685 686 #ifdef __DML_VBA_DEBUG__ 687 dml_print("DML::%s: k=%d MaxVStartupLines = %d\n", __func__, k, v->MaxVStartupLines[k]); 688 dml_print("DML::%s: k=%d VoltageLevel = %d\n", __func__, k, mode_lib->vba.VoltageLevel); 689 dml_print("DML::%s: k=%d WritebackDelay = %f\n", __func__, 690 k, v->WritebackDelay[mode_lib->vba.VoltageLevel][k]); 691 #endif 692 } 693 694 v->MaximumMaxVStartupLines = 0; 695 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) 696 v->MaximumMaxVStartupLines = dml_max(v->MaximumMaxVStartupLines, v->MaxVStartupLines[k]); 697 698 ImmediateFlipRequirementFinal = false; 699 700 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 701 ImmediateFlipRequirementFinal = ImmediateFlipRequirementFinal 702 || (mode_lib->vba.ImmediateFlipRequirement[k] == dm_immediate_flip_required); 703 } 704 #ifdef __DML_VBA_DEBUG__ 705 dml_print("DML::%s: ImmediateFlipRequirementFinal = %d\n", __func__, ImmediateFlipRequirementFinal); 706 #endif 707 // ModeProgramming will not repeat the schedule calculation using different prefetch mode, 708 //it is just calcualated once with given prefetch mode 709 dml32_CalculateMinAndMaxPrefetchMode( 710 mode_lib->vba.AllowForPStateChangeOrStutterInVBlankFinal, 711 &mode_lib->vba.MinPrefetchMode, 712 &mode_lib->vba.MaxPrefetchMode); 713 714 v->VStartupLines = __DML_VBA_MIN_VSTARTUP__; 715 716 iteration = 0; 717 MaxTotalRDBandwidth = 0; 718 NextPrefetchMode = mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb]; 719 720 do { 721 MaxTotalRDBandwidth = 0; 722 #ifdef __DML_VBA_DEBUG__ 723 dml_print("DML::%s: Start loop: VStartup = %d\n", __func__, mode_lib->vba.VStartupLines); 724 #endif 725 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 726 /* NOTE PerfetchMode variable is invalid in DAL as per the input received. 727 * Hence the direction is to use PrefetchModePerState. 728 */ 729 TWait = dml32_CalculateTWait( 730 mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb], 731 mode_lib->vba.UsesMALLForPStateChange[k], 732 mode_lib->vba.SynchronizeDRRDisplaysForUCLKPStateChangeFinal, 733 mode_lib->vba.DRRDisplay[k], 734 mode_lib->vba.DRAMClockChangeLatency, 735 mode_lib->vba.FCLKChangeLatency, v->UrgentLatency, 736 mode_lib->vba.SREnterPlusExitTime); 737 738 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.Dppclk = mode_lib->vba.DPPCLK[k]; 739 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.Dispclk = mode_lib->vba.DISPCLK; 740 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.PixelClock = mode_lib->vba.PixelClock[k]; 741 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.DCFClkDeepSleep = v->DCFCLKDeepSleep; 742 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.DPPPerSurface = mode_lib->vba.DPPPerPlane[k]; 743 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.ScalerEnabled = mode_lib->vba.ScalerEnabled[k]; 744 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.SourceRotation = mode_lib->vba.SourceRotation[k]; 745 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BlockWidth256BytesY = v->BlockWidth256BytesY[k]; 746 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BlockHeight256BytesY = v->BlockHeight256BytesY[k]; 747 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BlockWidth256BytesC = v->BlockWidth256BytesC[k]; 748 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BlockHeight256BytesC = v->BlockHeight256BytesC[k]; 749 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.InterlaceEnable = mode_lib->vba.Interlace[k]; 750 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.NumberOfCursors = mode_lib->vba.NumberOfCursors[k]; 751 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.VBlank = mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k]; 752 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.HTotal = mode_lib->vba.HTotal[k]; 753 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.HActive = mode_lib->vba.HActive[k]; 754 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.DCCEnable = mode_lib->vba.DCCEnable[k]; 755 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.ODMMode = mode_lib->vba.ODMCombineEnabled[k]; 756 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.SourcePixelFormat = mode_lib->vba.SourcePixelFormat[k]; 757 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BytePerPixelY = v->BytePerPixelY[k]; 758 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BytePerPixelC = v->BytePerPixelC[k]; 759 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.ProgressiveToInterlaceUnitInOPP = mode_lib->vba.ProgressiveToInterlaceUnitInOPP; 760 v->ErrorResult[k] = dml32_CalculatePrefetchSchedule( 761 &v->dummy_vars.dml32_CalculatePrefetchSchedule, 762 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.HostVMInefficiencyFactor, 763 &v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe, v->DSCDelay[k], 764 mode_lib->vba.DPPCLKDelaySubtotal + mode_lib->vba.DPPCLKDelayCNVCFormater, 765 mode_lib->vba.DPPCLKDelaySCL, 766 mode_lib->vba.DPPCLKDelaySCLLBOnly, 767 mode_lib->vba.DPPCLKDelayCNVCCursor, 768 mode_lib->vba.DISPCLKDelaySubtotal, 769 (unsigned int) (v->SwathWidthY[k] / mode_lib->vba.HRatio[k]), 770 mode_lib->vba.OutputFormat[k], 771 mode_lib->vba.MaxInterDCNTileRepeaters, 772 dml_min(v->VStartupLines, v->MaxVStartupLines[k]), 773 v->MaxVStartupLines[k], 774 mode_lib->vba.GPUVMMaxPageTableLevels, 775 mode_lib->vba.GPUVMEnable, 776 mode_lib->vba.HostVMEnable, 777 mode_lib->vba.HostVMMaxNonCachedPageTableLevels, 778 mode_lib->vba.HostVMMinPageSize, 779 mode_lib->vba.DynamicMetadataEnable[k], 780 mode_lib->vba.DynamicMetadataVMEnabled, 781 mode_lib->vba.DynamicMetadataLinesBeforeActiveRequired[k], 782 mode_lib->vba.DynamicMetadataTransmittedBytes[k], 783 v->UrgentLatency, 784 v->UrgentExtraLatency, 785 mode_lib->vba.TCalc, 786 v->PDEAndMetaPTEBytesFrame[k], 787 v->MetaRowByte[k], 788 v->PixelPTEBytesPerRow[k], 789 v->PrefetchSourceLinesY[k], 790 v->SwathWidthY[k], 791 v->VInitPreFillY[k], 792 v->MaxNumSwathY[k], 793 v->PrefetchSourceLinesC[k], 794 v->SwathWidthC[k], 795 v->VInitPreFillC[k], 796 v->MaxNumSwathC[k], 797 v->swath_width_luma_ub[k], 798 v->swath_width_chroma_ub[k], 799 mode_lib->vba.SwathHeightY[k], 800 mode_lib->vba.SwathHeightC[k], 801 TWait, 802 /* Output */ 803 &v->DSTXAfterScaler[k], 804 &v->DSTYAfterScaler[k], 805 &v->DestinationLinesForPrefetch[k], 806 &v->PrefetchBandwidth[k], 807 &v->DestinationLinesToRequestVMInVBlank[k], 808 &v->DestinationLinesToRequestRowInVBlank[k], 809 &v->VRatioPrefetchY[k], 810 &v->VRatioPrefetchC[k], 811 &v->RequiredPrefetchPixDataBWLuma[k], 812 &v->RequiredPrefetchPixDataBWChroma[k], 813 &v->NotEnoughTimeForDynamicMetadata[k], 814 &v->Tno_bw[k], &v->prefetch_vmrow_bw[k], 815 &v->Tdmdl_vm[k], 816 &v->Tdmdl[k], 817 &v->TSetup[k], 818 &v->VUpdateOffsetPix[k], 819 &v->VUpdateWidthPix[k], 820 &v->VReadyOffsetPix[k]); 821 822 #ifdef __DML_VBA_DEBUG__ 823 dml_print("DML::%s: k=%0d Prefetch calculation errResult=%0d\n", 824 __func__, k, mode_lib->vba.ErrorResult[k]); 825 #endif 826 v->VStartup[k] = dml_min(v->VStartupLines, v->MaxVStartupLines[k]); 827 } 828 829 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 830 dml32_CalculateUrgentBurstFactor(mode_lib->vba.UsesMALLForPStateChange[k], 831 v->swath_width_luma_ub[k], 832 v->swath_width_chroma_ub[k], 833 mode_lib->vba.SwathHeightY[k], 834 mode_lib->vba.SwathHeightC[k], 835 mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k], 836 v->UrgentLatency, 837 mode_lib->vba.CursorBufferSize, 838 mode_lib->vba.CursorWidth[k][0], 839 mode_lib->vba.CursorBPP[k][0], 840 v->VRatioPrefetchY[k], 841 v->VRatioPrefetchC[k], 842 v->BytePerPixelDETY[k], 843 v->BytePerPixelDETC[k], 844 mode_lib->vba.DETBufferSizeY[k], 845 mode_lib->vba.DETBufferSizeC[k], 846 /* Output */ 847 &v->UrgBurstFactorCursorPre[k], 848 &v->UrgBurstFactorLumaPre[k], 849 &v->UrgBurstFactorChromaPre[k], 850 &v->NoUrgentLatencyHidingPre[k]); 851 852 v->cursor_bw_pre[k] = mode_lib->vba.NumberOfCursors[k] * mode_lib->vba.CursorWidth[k][0] * mode_lib->vba.CursorBPP[k][0] / 853 8.0 / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * v->VRatioPrefetchY[k]; 854 855 #ifdef __DML_VBA_DEBUG__ 856 dml_print("DML::%s: k=%0d DPPPerSurface=%d\n", __func__, k, mode_lib->vba.DPPPerPlane[k]); 857 dml_print("DML::%s: k=%0d UrgBurstFactorLuma=%f\n", __func__, k, v->UrgBurstFactorLuma[k]); 858 dml_print("DML::%s: k=%0d UrgBurstFactorChroma=%f\n", __func__, k, v->UrgBurstFactorChroma[k]); 859 dml_print("DML::%s: k=%0d UrgBurstFactorLumaPre=%f\n", __func__, k, 860 v->UrgBurstFactorLumaPre[k]); 861 dml_print("DML::%s: k=%0d UrgBurstFactorChromaPre=%f\n", __func__, k, 862 v->UrgBurstFactorChromaPre[k]); 863 864 dml_print("DML::%s: k=%0d VRatioPrefetchY=%f\n", __func__, k, v->VRatioPrefetchY[k]); 865 dml_print("DML::%s: k=%0d VRatioY=%f\n", __func__, k, mode_lib->vba.VRatio[k]); 866 867 dml_print("DML::%s: k=%0d prefetch_vmrow_bw=%f\n", __func__, k, v->prefetch_vmrow_bw[k]); 868 dml_print("DML::%s: k=%0d ReadBandwidthSurfaceLuma=%f\n", __func__, k, 869 v->ReadBandwidthSurfaceLuma[k]); 870 dml_print("DML::%s: k=%0d ReadBandwidthSurfaceChroma=%f\n", __func__, k, 871 v->ReadBandwidthSurfaceChroma[k]); 872 dml_print("DML::%s: k=%0d cursor_bw=%f\n", __func__, k, v->cursor_bw[k]); 873 dml_print("DML::%s: k=%0d meta_row_bw=%f\n", __func__, k, v->meta_row_bw[k]); 874 dml_print("DML::%s: k=%0d dpte_row_bw=%f\n", __func__, k, v->dpte_row_bw[k]); 875 dml_print("DML::%s: k=%0d RequiredPrefetchPixDataBWLuma=%f\n", __func__, k, 876 v->RequiredPrefetchPixDataBWLuma[k]); 877 dml_print("DML::%s: k=%0d RequiredPrefetchPixDataBWChroma=%f\n", __func__, k, 878 v->RequiredPrefetchPixDataBWChroma[k]); 879 dml_print("DML::%s: k=%0d cursor_bw_pre=%f\n", __func__, k, v->cursor_bw_pre[k]); 880 dml_print("DML::%s: k=%0d MaxTotalRDBandwidthNoUrgentBurst=%f\n", __func__, k, 881 MaxTotalRDBandwidthNoUrgentBurst); 882 #endif 883 if (v->DestinationLinesForPrefetch[k] < 2) 884 DestinationLineTimesForPrefetchLessThan2 = true; 885 886 if (v->VRatioPrefetchY[k] > __DML_MAX_VRATIO_PRE__ 887 || v->VRatioPrefetchC[k] > __DML_MAX_VRATIO_PRE__) 888 VRatioPrefetchMoreThanMax = true; 889 890 //bool DestinationLinesToRequestVMInVBlankEqualOrMoreThan32 = false; 891 //bool DestinationLinesToRequestRowInVBlankEqualOrMoreThan16 = false; 892 //if (v->DestinationLinesToRequestVMInVBlank[k] >= 32) { 893 // DestinationLinesToRequestVMInVBlankEqualOrMoreThan32 = true; 894 //} 895 896 //if (v->DestinationLinesToRequestRowInVBlank[k] >= 16) { 897 // DestinationLinesToRequestRowInVBlankEqualOrMoreThan16 = true; 898 //} 899 } 900 901 v->FractionOfUrgentBandwidth = MaxTotalRDBandwidthNoUrgentBurst / mode_lib->vba.ReturnBW; 902 903 #ifdef __DML_VBA_DEBUG__ 904 dml_print("DML::%s: MaxTotalRDBandwidthNoUrgentBurst=%f\n", 905 __func__, MaxTotalRDBandwidthNoUrgentBurst); 906 dml_print("DML::%s: ReturnBW=%f\n", __func__, mode_lib->vba.ReturnBW); 907 dml_print("DML::%s: FractionOfUrgentBandwidth=%f\n", 908 __func__, mode_lib->vba.FractionOfUrgentBandwidth); 909 #endif 910 911 { 912 dml32_CalculatePrefetchBandwithSupport( 913 mode_lib->vba.NumberOfActiveSurfaces, 914 mode_lib->vba.ReturnBW, 915 v->NoUrgentLatencyHidingPre, 916 v->ReadBandwidthSurfaceLuma, 917 v->ReadBandwidthSurfaceChroma, 918 v->RequiredPrefetchPixDataBWLuma, 919 v->RequiredPrefetchPixDataBWChroma, 920 v->cursor_bw, 921 v->meta_row_bw, 922 v->dpte_row_bw, 923 v->cursor_bw_pre, 924 v->prefetch_vmrow_bw, 925 mode_lib->vba.DPPPerPlane, 926 v->UrgBurstFactorLuma, 927 v->UrgBurstFactorChroma, 928 v->UrgBurstFactorCursor, 929 v->UrgBurstFactorLumaPre, 930 v->UrgBurstFactorChromaPre, 931 v->UrgBurstFactorCursorPre, 932 933 /* output */ 934 &MaxTotalRDBandwidth, 935 &v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_single[0], 936 &v->PrefetchModeSupported); 937 } 938 939 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) 940 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector[k] = 1.0; 941 942 { 943 dml32_CalculatePrefetchBandwithSupport(mode_lib->vba.NumberOfActiveSurfaces, 944 mode_lib->vba.ReturnBW, 945 v->NoUrgentLatencyHidingPre, 946 v->ReadBandwidthSurfaceLuma, 947 v->ReadBandwidthSurfaceChroma, 948 v->RequiredPrefetchPixDataBWLuma, 949 v->RequiredPrefetchPixDataBWChroma, 950 v->cursor_bw, 951 v->meta_row_bw, 952 v->dpte_row_bw, 953 v->cursor_bw_pre, 954 v->prefetch_vmrow_bw, 955 mode_lib->vba.DPPPerPlane, 956 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector, 957 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector, 958 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector, 959 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector, 960 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector, 961 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector, 962 963 /* output */ 964 &v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_single[0], 965 &v->FractionOfUrgentBandwidth, 966 &v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_boolean); 967 } 968 969 if (VRatioPrefetchMoreThanMax != false || DestinationLineTimesForPrefetchLessThan2 != false) { 970 v->PrefetchModeSupported = false; 971 } 972 973 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 974 if (v->ErrorResult[k] == true || v->NotEnoughTimeForDynamicMetadata[k]) { 975 v->PrefetchModeSupported = false; 976 } 977 } 978 979 if (v->PrefetchModeSupported == true && mode_lib->vba.ImmediateFlipSupport == true) { 980 mode_lib->vba.BandwidthAvailableForImmediateFlip = dml32_CalculateBandwidthAvailableForImmediateFlip( 981 mode_lib->vba.NumberOfActiveSurfaces, 982 mode_lib->vba.ReturnBW, 983 v->ReadBandwidthSurfaceLuma, 984 v->ReadBandwidthSurfaceChroma, 985 v->RequiredPrefetchPixDataBWLuma, 986 v->RequiredPrefetchPixDataBWChroma, 987 v->cursor_bw, 988 v->cursor_bw_pre, 989 mode_lib->vba.DPPPerPlane, 990 v->UrgBurstFactorLuma, 991 v->UrgBurstFactorChroma, 992 v->UrgBurstFactorCursor, 993 v->UrgBurstFactorLumaPre, 994 v->UrgBurstFactorChromaPre, 995 v->UrgBurstFactorCursorPre); 996 997 mode_lib->vba.TotImmediateFlipBytes = 0; 998 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 999 if (mode_lib->vba.ImmediateFlipRequirement[k] != dm_immediate_flip_not_required) { 1000 mode_lib->vba.TotImmediateFlipBytes = mode_lib->vba.TotImmediateFlipBytes 1001 + mode_lib->vba.DPPPerPlane[k] 1002 * (v->PDEAndMetaPTEBytesFrame[k] 1003 + v->MetaRowByte[k]); 1004 if (v->use_one_row_for_frame_flip[k][0][0]) { 1005 mode_lib->vba.TotImmediateFlipBytes = 1006 mode_lib->vba.TotImmediateFlipBytes 1007 + 2 * v->PixelPTEBytesPerRow[k]; 1008 } else { 1009 mode_lib->vba.TotImmediateFlipBytes = 1010 mode_lib->vba.TotImmediateFlipBytes 1011 + v->PixelPTEBytesPerRow[k]; 1012 } 1013 } 1014 } 1015 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 1016 dml32_CalculateFlipSchedule(v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.HostVMInefficiencyFactor, 1017 v->UrgentExtraLatency, 1018 v->UrgentLatency, 1019 mode_lib->vba.GPUVMMaxPageTableLevels, 1020 mode_lib->vba.HostVMEnable, 1021 mode_lib->vba.HostVMMaxNonCachedPageTableLevels, 1022 mode_lib->vba.GPUVMEnable, 1023 mode_lib->vba.HostVMMinPageSize, 1024 v->PDEAndMetaPTEBytesFrame[k], 1025 v->MetaRowByte[k], 1026 v->PixelPTEBytesPerRow[k], 1027 mode_lib->vba.BandwidthAvailableForImmediateFlip, 1028 mode_lib->vba.TotImmediateFlipBytes, 1029 mode_lib->vba.SourcePixelFormat[k], 1030 mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k], 1031 mode_lib->vba.VRatio[k], 1032 mode_lib->vba.VRatioChroma[k], 1033 v->Tno_bw[k], 1034 mode_lib->vba.DCCEnable[k], 1035 v->dpte_row_height[k], 1036 v->meta_row_height[k], 1037 v->dpte_row_height_chroma[k], 1038 v->meta_row_height_chroma[k], 1039 v->Use_One_Row_For_Frame_Flip[k], 1040 1041 /* Output */ 1042 &v->DestinationLinesToRequestVMInImmediateFlip[k], 1043 &v->DestinationLinesToRequestRowInImmediateFlip[k], 1044 &v->final_flip_bw[k], 1045 &v->ImmediateFlipSupportedForPipe[k]); 1046 } 1047 1048 { 1049 dml32_CalculateImmediateFlipBandwithSupport(mode_lib->vba.NumberOfActiveSurfaces, 1050 mode_lib->vba.ReturnBW, 1051 mode_lib->vba.ImmediateFlipRequirement, 1052 v->final_flip_bw, 1053 v->ReadBandwidthSurfaceLuma, 1054 v->ReadBandwidthSurfaceChroma, 1055 v->RequiredPrefetchPixDataBWLuma, 1056 v->RequiredPrefetchPixDataBWChroma, 1057 v->cursor_bw, 1058 v->meta_row_bw, 1059 v->dpte_row_bw, 1060 v->cursor_bw_pre, 1061 v->prefetch_vmrow_bw, 1062 mode_lib->vba.DPPPerPlane, 1063 v->UrgBurstFactorLuma, 1064 v->UrgBurstFactorChroma, 1065 v->UrgBurstFactorCursor, 1066 v->UrgBurstFactorLumaPre, 1067 v->UrgBurstFactorChromaPre, 1068 v->UrgBurstFactorCursorPre, 1069 1070 /* output */ 1071 &v->total_dcn_read_bw_with_flip, // Single *TotalBandwidth 1072 &v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_single[0], // Single *FractionOfUrgentBandwidth 1073 &v->ImmediateFlipSupported); // Boolean *ImmediateFlipBandwidthSupport 1074 1075 dml32_CalculateImmediateFlipBandwithSupport(mode_lib->vba.NumberOfActiveSurfaces, 1076 mode_lib->vba.ReturnBW, 1077 mode_lib->vba.ImmediateFlipRequirement, 1078 v->final_flip_bw, 1079 v->ReadBandwidthSurfaceLuma, 1080 v->ReadBandwidthSurfaceChroma, 1081 v->RequiredPrefetchPixDataBWLuma, 1082 v->RequiredPrefetchPixDataBWChroma, 1083 v->cursor_bw, 1084 v->meta_row_bw, 1085 v->dpte_row_bw, 1086 v->cursor_bw_pre, 1087 v->prefetch_vmrow_bw, 1088 mode_lib->vba.DPPPerPlane, 1089 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector, 1090 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector, 1091 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector, 1092 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector, 1093 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector, 1094 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_unit_vector, 1095 1096 /* output */ 1097 &v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_single[1], // Single *TotalBandwidth 1098 &v->FractionOfUrgentBandwidthImmediateFlip, // Single *FractionOfUrgentBandwidth 1099 &v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_boolean); // Boolean *ImmediateFlipBandwidthSupport 1100 } 1101 1102 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 1103 if (mode_lib->vba.ImmediateFlipRequirement[k] != dm_immediate_flip_not_required && v->ImmediateFlipSupportedForPipe[k] == false) { 1104 v->ImmediateFlipSupported = false; 1105 #ifdef __DML_VBA_DEBUG__ 1106 dml_print("DML::%s: Pipe %0d not supporting iflip\n", __func__, k); 1107 #endif 1108 } 1109 } 1110 } else { 1111 v->ImmediateFlipSupported = false; 1112 } 1113 1114 /* consider flip support is okay if the flip bw is ok or (when user does't require a iflip and there is no host vm) */ 1115 v->PrefetchAndImmediateFlipSupported = (v->PrefetchModeSupported == true && 1116 ((!mode_lib->vba.ImmediateFlipSupport && !mode_lib->vba.HostVMEnable && !ImmediateFlipRequirementFinal) || 1117 v->ImmediateFlipSupported)) ? true : false; 1118 1119 #ifdef __DML_VBA_DEBUG__ 1120 dml_print("DML::%s: PrefetchModeSupported = %d\n", __func__, locals->PrefetchModeSupported); 1121 for (uint k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) 1122 dml_print("DML::%s: ImmediateFlipRequirement[%d] = %d\n", __func__, k, mode_lib->vba.ImmediateFlipRequirement[k] == dm_immediate_flip_required); 1123 dml_print("DML::%s: ImmediateFlipSupported = %d\n", __func__, locals->ImmediateFlipSupported); 1124 dml_print("DML::%s: ImmediateFlipSupport = %d\n", __func__, mode_lib->vba.ImmediateFlipSupport); 1125 dml_print("DML::%s: HostVMEnable = %d\n", __func__, mode_lib->vba.HostVMEnable); 1126 dml_print("DML::%s: PrefetchAndImmediateFlipSupported = %d\n", __func__, locals->PrefetchAndImmediateFlipSupported); 1127 dml_print("DML::%s: Done loop: Vstartup=%d, Max Vstartup=%d\n", __func__, locals->VStartupLines, locals->MaximumMaxVStartupLines); 1128 #endif 1129 1130 v->VStartupLines = v->VStartupLines + 1; 1131 1132 if (v->VStartupLines > v->MaximumMaxVStartupLines) { 1133 #ifdef __DML_VBA_DEBUG__ 1134 dml_print("DML::%s: Vstartup exceeds max vstartup, exiting loop\n", __func__); 1135 #endif 1136 break; // VBA_DELTA: Implementation divergence! Gabe is *still* iterating across prefetch modes which we don't care to do 1137 } 1138 iteration++; 1139 if (iteration > 2500) { 1140 #ifdef __DML_VBA_DEBUG__ 1141 dml_print("DML::%s: too many errors, exit now\n", __func__); 1142 assert(0); 1143 #endif 1144 } 1145 } while (!(v->PrefetchAndImmediateFlipSupported || NextPrefetchMode > mode_lib->vba.MaxPrefetchMode)); 1146 1147 1148 if (v->VStartupLines <= v->MaximumMaxVStartupLines) { 1149 #ifdef __DML_VBA_DEBUG__ 1150 dml_print("DML::%s: Good, Prefetch and flip scheduling found solution at VStartupLines=%d\n", __func__, locals->VStartupLines-1); 1151 #endif 1152 } 1153 1154 1155 //Watermarks and NB P-State/DRAM Clock Change Support 1156 { 1157 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.UrgentLatency = v->UrgentLatency; 1158 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.ExtraLatency = v->UrgentExtraLatency; 1159 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.WritebackLatency = mode_lib->vba.WritebackLatency; 1160 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.DRAMClockChangeLatency = mode_lib->vba.DRAMClockChangeLatency; 1161 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.FCLKChangeLatency = mode_lib->vba.FCLKChangeLatency; 1162 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.SRExitTime = mode_lib->vba.SRExitTime; 1163 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.SREnterPlusExitTime = mode_lib->vba.SREnterPlusExitTime; 1164 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.SRExitZ8Time = mode_lib->vba.SRExitZ8Time; 1165 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.SREnterPlusExitZ8Time = mode_lib->vba.SREnterPlusExitZ8Time; 1166 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.USRRetrainingLatency = mode_lib->vba.USRRetrainingLatency; 1167 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters.SMNLatency = mode_lib->vba.SMNLatency; 1168 1169 dml32_CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport( 1170 &v->dummy_vars.dml32_CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport, 1171 mode_lib->vba.USRRetrainingRequiredFinal, 1172 mode_lib->vba.UsesMALLForPStateChange, 1173 mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb], 1174 mode_lib->vba.NumberOfActiveSurfaces, 1175 mode_lib->vba.MaxLineBufferLines, 1176 mode_lib->vba.LineBufferSizeFinal, 1177 mode_lib->vba.WritebackInterfaceBufferSize, 1178 mode_lib->vba.DCFCLK, 1179 mode_lib->vba.ReturnBW, 1180 mode_lib->vba.SynchronizeTimingsFinal, 1181 mode_lib->vba.SynchronizeDRRDisplaysForUCLKPStateChangeFinal, 1182 mode_lib->vba.DRRDisplay, 1183 v->dpte_group_bytes, 1184 v->meta_row_height, 1185 v->meta_row_height_chroma, 1186 v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.mmSOCParameters, 1187 mode_lib->vba.WritebackChunkSize, 1188 mode_lib->vba.SOCCLK, 1189 v->DCFCLKDeepSleep, 1190 mode_lib->vba.DETBufferSizeY, 1191 mode_lib->vba.DETBufferSizeC, 1192 mode_lib->vba.SwathHeightY, 1193 mode_lib->vba.SwathHeightC, 1194 mode_lib->vba.LBBitPerPixel, 1195 v->SwathWidthY, 1196 v->SwathWidthC, 1197 mode_lib->vba.HRatio, 1198 mode_lib->vba.HRatioChroma, 1199 mode_lib->vba.vtaps, 1200 mode_lib->vba.VTAPsChroma, 1201 mode_lib->vba.VRatio, 1202 mode_lib->vba.VRatioChroma, 1203 mode_lib->vba.HTotal, 1204 mode_lib->vba.VTotal, 1205 mode_lib->vba.VActive, 1206 mode_lib->vba.PixelClock, 1207 mode_lib->vba.BlendingAndTiming, 1208 mode_lib->vba.DPPPerPlane, 1209 v->BytePerPixelDETY, 1210 v->BytePerPixelDETC, 1211 v->DSTXAfterScaler, 1212 v->DSTYAfterScaler, 1213 mode_lib->vba.WritebackEnable, 1214 mode_lib->vba.WritebackPixelFormat, 1215 mode_lib->vba.WritebackDestinationWidth, 1216 mode_lib->vba.WritebackDestinationHeight, 1217 mode_lib->vba.WritebackSourceHeight, 1218 v->UnboundedRequestEnabled, 1219 v->CompressedBufferSizeInkByte, 1220 1221 /* Output */ 1222 &v->Watermark, 1223 &v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_dramchange_support, 1224 v->MaxActiveDRAMClockChangeLatencySupported, 1225 v->SubViewportLinesNeededInMALL, 1226 &v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_fclkchange_support, 1227 &v->MinActiveFCLKChangeLatencySupported, 1228 &v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_USRRetrainingSupport, 1229 mode_lib->vba.ActiveDRAMClockChangeLatencyMargin); 1230 1231 /* DCN32 has a new struct Watermarks (typedef) which is used to store 1232 * calculated WM values. Copy over values from struct to vba varaibles 1233 * to ensure that the DCN32 getters return the correct value. 1234 */ 1235 v->UrgentWatermark = v->Watermark.UrgentWatermark; 1236 v->WritebackUrgentWatermark = v->Watermark.WritebackUrgentWatermark; 1237 v->DRAMClockChangeWatermark = v->Watermark.DRAMClockChangeWatermark; 1238 v->WritebackDRAMClockChangeWatermark = v->Watermark.WritebackDRAMClockChangeWatermark; 1239 v->StutterExitWatermark = v->Watermark.StutterExitWatermark; 1240 v->StutterEnterPlusExitWatermark = v->Watermark.StutterEnterPlusExitWatermark; 1241 v->Z8StutterExitWatermark = v->Watermark.Z8StutterExitWatermark; 1242 v->Z8StutterEnterPlusExitWatermark = v->Watermark.Z8StutterEnterPlusExitWatermark; 1243 1244 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 1245 if (mode_lib->vba.WritebackEnable[k] == true) { 1246 v->WritebackAllowDRAMClockChangeEndPosition[k] = dml_max(0, 1247 v->VStartup[k] * mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k] 1248 - v->Watermark.WritebackDRAMClockChangeWatermark); 1249 v->WritebackAllowFCLKChangeEndPosition[k] = dml_max(0, 1250 v->VStartup[k] * mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k] 1251 - v->Watermark.WritebackFCLKChangeWatermark); 1252 } else { 1253 v->WritebackAllowDRAMClockChangeEndPosition[k] = 0; 1254 v->WritebackAllowFCLKChangeEndPosition[k] = 0; 1255 } 1256 } 1257 } 1258 1259 //Display Pipeline Delivery Time in Prefetch, Groups 1260 dml32_CalculatePixelDeliveryTimes( 1261 mode_lib->vba.NumberOfActiveSurfaces, 1262 mode_lib->vba.VRatio, 1263 mode_lib->vba.VRatioChroma, 1264 v->VRatioPrefetchY, 1265 v->VRatioPrefetchC, 1266 v->swath_width_luma_ub, 1267 v->swath_width_chroma_ub, 1268 mode_lib->vba.DPPPerPlane, 1269 mode_lib->vba.HRatio, 1270 mode_lib->vba.HRatioChroma, 1271 mode_lib->vba.PixelClock, 1272 v->PSCL_THROUGHPUT_LUMA, 1273 v->PSCL_THROUGHPUT_CHROMA, 1274 mode_lib->vba.DPPCLK, 1275 v->BytePerPixelC, 1276 mode_lib->vba.SourceRotation, 1277 mode_lib->vba.NumberOfCursors, 1278 mode_lib->vba.CursorWidth, 1279 mode_lib->vba.CursorBPP, 1280 v->BlockWidth256BytesY, 1281 v->BlockHeight256BytesY, 1282 v->BlockWidth256BytesC, 1283 v->BlockHeight256BytesC, 1284 1285 /* Output */ 1286 v->DisplayPipeLineDeliveryTimeLuma, 1287 v->DisplayPipeLineDeliveryTimeChroma, 1288 v->DisplayPipeLineDeliveryTimeLumaPrefetch, 1289 v->DisplayPipeLineDeliveryTimeChromaPrefetch, 1290 v->DisplayPipeRequestDeliveryTimeLuma, 1291 v->DisplayPipeRequestDeliveryTimeChroma, 1292 v->DisplayPipeRequestDeliveryTimeLumaPrefetch, 1293 v->DisplayPipeRequestDeliveryTimeChromaPrefetch, 1294 v->CursorRequestDeliveryTime, 1295 v->CursorRequestDeliveryTimePrefetch); 1296 1297 dml32_CalculateMetaAndPTETimes(v->Use_One_Row_For_Frame, 1298 mode_lib->vba.NumberOfActiveSurfaces, 1299 mode_lib->vba.GPUVMEnable, 1300 mode_lib->vba.MetaChunkSize, 1301 mode_lib->vba.MinMetaChunkSizeBytes, 1302 mode_lib->vba.HTotal, 1303 mode_lib->vba.VRatio, 1304 mode_lib->vba.VRatioChroma, 1305 v->DestinationLinesToRequestRowInVBlank, 1306 v->DestinationLinesToRequestRowInImmediateFlip, 1307 mode_lib->vba.DCCEnable, 1308 mode_lib->vba.PixelClock, 1309 v->BytePerPixelY, 1310 v->BytePerPixelC, 1311 mode_lib->vba.SourceRotation, 1312 v->dpte_row_height, 1313 v->dpte_row_height_chroma, 1314 v->meta_row_width, 1315 v->meta_row_width_chroma, 1316 v->meta_row_height, 1317 v->meta_row_height_chroma, 1318 v->meta_req_width, 1319 v->meta_req_width_chroma, 1320 v->meta_req_height, 1321 v->meta_req_height_chroma, 1322 v->dpte_group_bytes, 1323 v->PTERequestSizeY, 1324 v->PTERequestSizeC, 1325 v->PixelPTEReqWidthY, 1326 v->PixelPTEReqHeightY, 1327 v->PixelPTEReqWidthC, 1328 v->PixelPTEReqHeightC, 1329 v->dpte_row_width_luma_ub, 1330 v->dpte_row_width_chroma_ub, 1331 1332 /* Output */ 1333 v->DST_Y_PER_PTE_ROW_NOM_L, 1334 v->DST_Y_PER_PTE_ROW_NOM_C, 1335 v->DST_Y_PER_META_ROW_NOM_L, 1336 v->DST_Y_PER_META_ROW_NOM_C, 1337 v->TimePerMetaChunkNominal, 1338 v->TimePerChromaMetaChunkNominal, 1339 v->TimePerMetaChunkVBlank, 1340 v->TimePerChromaMetaChunkVBlank, 1341 v->TimePerMetaChunkFlip, 1342 v->TimePerChromaMetaChunkFlip, 1343 v->time_per_pte_group_nom_luma, 1344 v->time_per_pte_group_vblank_luma, 1345 v->time_per_pte_group_flip_luma, 1346 v->time_per_pte_group_nom_chroma, 1347 v->time_per_pte_group_vblank_chroma, 1348 v->time_per_pte_group_flip_chroma); 1349 1350 dml32_CalculateVMGroupAndRequestTimes( 1351 mode_lib->vba.NumberOfActiveSurfaces, 1352 mode_lib->vba.GPUVMEnable, 1353 mode_lib->vba.GPUVMMaxPageTableLevels, 1354 mode_lib->vba.HTotal, 1355 v->BytePerPixelC, 1356 v->DestinationLinesToRequestVMInVBlank, 1357 v->DestinationLinesToRequestVMInImmediateFlip, 1358 mode_lib->vba.DCCEnable, 1359 mode_lib->vba.PixelClock, 1360 v->dpte_row_width_luma_ub, 1361 v->dpte_row_width_chroma_ub, 1362 v->vm_group_bytes, 1363 v->dpde0_bytes_per_frame_ub_l, 1364 v->dpde0_bytes_per_frame_ub_c, 1365 v->meta_pte_bytes_per_frame_ub_l, 1366 v->meta_pte_bytes_per_frame_ub_c, 1367 1368 /* Output */ 1369 v->TimePerVMGroupVBlank, 1370 v->TimePerVMGroupFlip, 1371 v->TimePerVMRequestVBlank, 1372 v->TimePerVMRequestFlip); 1373 1374 // Min TTUVBlank 1375 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 1376 if (mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb] == 0) { 1377 v->MinTTUVBlank[k] = dml_max4(v->Watermark.DRAMClockChangeWatermark, 1378 v->Watermark.FCLKChangeWatermark, v->Watermark.StutterEnterPlusExitWatermark, 1379 v->Watermark.UrgentWatermark); 1380 } else if (mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb] 1381 == 1) { 1382 v->MinTTUVBlank[k] = dml_max3(v->Watermark.FCLKChangeWatermark, 1383 v->Watermark.StutterEnterPlusExitWatermark, v->Watermark.UrgentWatermark); 1384 } else if (mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb] 1385 == 2) { 1386 v->MinTTUVBlank[k] = dml_max(v->Watermark.StutterEnterPlusExitWatermark, 1387 v->Watermark.UrgentWatermark); 1388 } else { 1389 v->MinTTUVBlank[k] = v->Watermark.UrgentWatermark; 1390 } 1391 if (!mode_lib->vba.DynamicMetadataEnable[k]) 1392 v->MinTTUVBlank[k] = mode_lib->vba.TCalc + v->MinTTUVBlank[k]; 1393 } 1394 1395 // DCC Configuration 1396 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 1397 #ifdef __DML_VBA_DEBUG__ 1398 dml_print("DML::%s: Calculate DCC configuration for surface k=%d\n", __func__, k); 1399 #endif 1400 dml32_CalculateDCCConfiguration( 1401 mode_lib->vba.DCCEnable[k], 1402 mode_lib->vba.DCCProgrammingAssumesScanDirectionUnknownFinal, 1403 mode_lib->vba.SourcePixelFormat[k], mode_lib->vba.SurfaceWidthY[k], 1404 mode_lib->vba.SurfaceWidthC[k], 1405 mode_lib->vba.SurfaceHeightY[k], 1406 mode_lib->vba.SurfaceHeightC[k], 1407 mode_lib->vba.nomDETInKByte, 1408 v->BlockHeight256BytesY[k], 1409 v->BlockHeight256BytesC[k], 1410 mode_lib->vba.SurfaceTiling[k], 1411 v->BytePerPixelY[k], 1412 v->BytePerPixelC[k], 1413 v->BytePerPixelDETY[k], 1414 v->BytePerPixelDETC[k], 1415 (enum dm_rotation_angle) mode_lib->vba.SourceScan[k], 1416 /* Output */ 1417 &v->DCCYMaxUncompressedBlock[k], 1418 &v->DCCCMaxUncompressedBlock[k], 1419 &v->DCCYMaxCompressedBlock[k], 1420 &v->DCCCMaxCompressedBlock[k], 1421 &v->DCCYIndependentBlock[k], 1422 &v->DCCCIndependentBlock[k]); 1423 } 1424 1425 // VStartup Adjustment 1426 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 1427 bool isInterlaceTiming; 1428 double Tvstartup_margin = (v->MaxVStartupLines[k] - v->VStartup[k]) * mode_lib->vba.HTotal[k] 1429 / mode_lib->vba.PixelClock[k]; 1430 #ifdef __DML_VBA_DEBUG__ 1431 dml_print("DML::%s: k=%d, MinTTUVBlank = %f (before vstartup margin)\n", __func__, k, 1432 v->MinTTUVBlank[k]); 1433 #endif 1434 1435 v->MinTTUVBlank[k] = v->MinTTUVBlank[k] + Tvstartup_margin; 1436 1437 #ifdef __DML_VBA_DEBUG__ 1438 dml_print("DML::%s: k=%d, Tvstartup_margin = %f\n", __func__, k, Tvstartup_margin); 1439 dml_print("DML::%s: k=%d, MaxVStartupLines = %d\n", __func__, k, v->MaxVStartupLines[k]); 1440 dml_print("DML::%s: k=%d, VStartup = %d\n", __func__, k, v->VStartup[k]); 1441 dml_print("DML::%s: k=%d, MinTTUVBlank = %f\n", __func__, k, v->MinTTUVBlank[k]); 1442 #endif 1443 1444 v->Tdmdl[k] = v->Tdmdl[k] + Tvstartup_margin; 1445 if (mode_lib->vba.DynamicMetadataEnable[k] && mode_lib->vba.DynamicMetadataVMEnabled) 1446 v->Tdmdl_vm[k] = v->Tdmdl_vm[k] + Tvstartup_margin; 1447 1448 isInterlaceTiming = (mode_lib->vba.Interlace[k] && 1449 !mode_lib->vba.ProgressiveToInterlaceUnitInOPP); 1450 1451 v->MIN_DST_Y_NEXT_START[k] = ((isInterlaceTiming ? dml_floor((mode_lib->vba.VTotal[k] - 1452 mode_lib->vba.VFrontPorch[k]) / 2.0, 1.0) : 1453 mode_lib->vba.VTotal[k]) - mode_lib->vba.VFrontPorch[k]) 1454 + dml_max(1.0, 1455 dml_ceil(v->WritebackDelay[mode_lib->vba.VoltageLevel][k] 1456 / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]), 1.0)) 1457 + dml_floor(4.0 * v->TSetup[k] / (mode_lib->vba.HTotal[k] 1458 / mode_lib->vba.PixelClock[k]), 1.0) / 4.0; 1459 1460 v->VStartup[k] = (isInterlaceTiming ? (2 * v->MaxVStartupLines[k]) : v->MaxVStartupLines[k]); 1461 1462 if (((v->VUpdateOffsetPix[k] + v->VUpdateWidthPix[k] + v->VReadyOffsetPix[k]) 1463 / mode_lib->vba.HTotal[k]) <= (isInterlaceTiming ? dml_floor((mode_lib->vba.VTotal[k] 1464 - mode_lib->vba.VActive[k] - mode_lib->vba.VFrontPorch[k] - v->VStartup[k]) / 2.0, 1.0) : 1465 (int) (mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k] 1466 - mode_lib->vba.VFrontPorch[k] - v->VStartup[k]))) { 1467 v->VREADY_AT_OR_AFTER_VSYNC[k] = true; 1468 } else { 1469 v->VREADY_AT_OR_AFTER_VSYNC[k] = false; 1470 } 1471 #ifdef __DML_VBA_DEBUG__ 1472 dml_print("DML::%s: k=%d, VStartup = %d (max)\n", __func__, k, v->VStartup[k]); 1473 dml_print("DML::%s: k=%d, VUpdateOffsetPix = %d\n", __func__, k, v->VUpdateOffsetPix[k]); 1474 dml_print("DML::%s: k=%d, VUpdateWidthPix = %d\n", __func__, k, v->VUpdateWidthPix[k]); 1475 dml_print("DML::%s: k=%d, VReadyOffsetPix = %d\n", __func__, k, v->VReadyOffsetPix[k]); 1476 dml_print("DML::%s: k=%d, HTotal = %d\n", __func__, k, mode_lib->vba.HTotal[k]); 1477 dml_print("DML::%s: k=%d, VTotal = %d\n", __func__, k, mode_lib->vba.VTotal[k]); 1478 dml_print("DML::%s: k=%d, VActive = %d\n", __func__, k, mode_lib->vba.VActive[k]); 1479 dml_print("DML::%s: k=%d, VFrontPorch = %d\n", __func__, k, mode_lib->vba.VFrontPorch[k]); 1480 dml_print("DML::%s: k=%d, VStartup = %d\n", __func__, k, v->VStartup[k]); 1481 dml_print("DML::%s: k=%d, TSetup = %f\n", __func__, k, v->TSetup[k]); 1482 dml_print("DML::%s: k=%d, MIN_DST_Y_NEXT_START = %f\n", __func__, k, v->MIN_DST_Y_NEXT_START[k]); 1483 dml_print("DML::%s: k=%d, VREADY_AT_OR_AFTER_VSYNC = %d\n", __func__, k, 1484 v->VREADY_AT_OR_AFTER_VSYNC[k]); 1485 #endif 1486 } 1487 1488 { 1489 //Maximum Bandwidth Used 1490 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 1491 if (mode_lib->vba.WritebackEnable[k] == true 1492 && mode_lib->vba.WritebackPixelFormat[k] == dm_444_32) { 1493 WRBandwidth = mode_lib->vba.WritebackDestinationWidth[k] 1494 * mode_lib->vba.WritebackDestinationHeight[k] 1495 / (mode_lib->vba.HTotal[k] * mode_lib->vba.WritebackSourceHeight[k] 1496 / mode_lib->vba.PixelClock[k]) * 4; 1497 } else if (mode_lib->vba.WritebackEnable[k] == true) { 1498 WRBandwidth = mode_lib->vba.WritebackDestinationWidth[k] 1499 * mode_lib->vba.WritebackDestinationHeight[k] 1500 / (mode_lib->vba.HTotal[k] * mode_lib->vba.WritebackSourceHeight[k] 1501 / mode_lib->vba.PixelClock[k]) * 8; 1502 } 1503 TotalWRBandwidth = TotalWRBandwidth + WRBandwidth; 1504 } 1505 1506 v->TotalDataReadBandwidth = 0; 1507 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 1508 v->TotalDataReadBandwidth = v->TotalDataReadBandwidth + v->ReadBandwidthSurfaceLuma[k] 1509 + v->ReadBandwidthSurfaceChroma[k]; 1510 #ifdef __DML_VBA_DEBUG__ 1511 dml_print("DML::%s: k=%d, TotalDataReadBandwidth = %f\n", 1512 __func__, k, v->TotalDataReadBandwidth); 1513 dml_print("DML::%s: k=%d, ReadBandwidthSurfaceLuma = %f\n", 1514 __func__, k, v->ReadBandwidthSurfaceLuma[k]); 1515 dml_print("DML::%s: k=%d, ReadBandwidthSurfaceChroma = %f\n", 1516 __func__, k, v->ReadBandwidthSurfaceChroma[k]); 1517 #endif 1518 } 1519 } 1520 1521 // Stutter Efficiency 1522 dml32_CalculateStutterEfficiency(v->CompressedBufferSizeInkByte, 1523 mode_lib->vba.UsesMALLForPStateChange, 1524 v->UnboundedRequestEnabled, 1525 mode_lib->vba.MetaFIFOSizeInKEntries, 1526 mode_lib->vba.ZeroSizeBufferEntries, 1527 mode_lib->vba.PixelChunkSizeInKByte, 1528 mode_lib->vba.NumberOfActiveSurfaces, 1529 mode_lib->vba.ROBBufferSizeInKByte, 1530 v->TotalDataReadBandwidth, 1531 mode_lib->vba.DCFCLK, 1532 mode_lib->vba.ReturnBW, 1533 v->CompbufReservedSpace64B, 1534 v->CompbufReservedSpaceZs, 1535 mode_lib->vba.SRExitTime, 1536 mode_lib->vba.SRExitZ8Time, 1537 mode_lib->vba.SynchronizeTimingsFinal, 1538 mode_lib->vba.BlendingAndTiming, 1539 v->Watermark.StutterEnterPlusExitWatermark, 1540 v->Watermark.Z8StutterEnterPlusExitWatermark, 1541 mode_lib->vba.ProgressiveToInterlaceUnitInOPP, 1542 mode_lib->vba.Interlace, 1543 v->MinTTUVBlank, mode_lib->vba.DPPPerPlane, 1544 mode_lib->vba.DETBufferSizeY, 1545 v->BytePerPixelY, 1546 v->BytePerPixelDETY, 1547 v->SwathWidthY, 1548 mode_lib->vba.SwathHeightY, 1549 mode_lib->vba.SwathHeightC, 1550 mode_lib->vba.DCCRateLuma, 1551 mode_lib->vba.DCCRateChroma, 1552 mode_lib->vba.DCCFractionOfZeroSizeRequestsLuma, 1553 mode_lib->vba.DCCFractionOfZeroSizeRequestsChroma, 1554 mode_lib->vba.HTotal, mode_lib->vba.VTotal, 1555 mode_lib->vba.PixelClock, 1556 mode_lib->vba.VRatio, 1557 mode_lib->vba.SourceRotation, 1558 v->BlockHeight256BytesY, 1559 v->BlockWidth256BytesY, 1560 v->BlockHeight256BytesC, 1561 v->BlockWidth256BytesC, 1562 v->DCCYMaxUncompressedBlock, 1563 v->DCCCMaxUncompressedBlock, 1564 mode_lib->vba.VActive, 1565 mode_lib->vba.DCCEnable, 1566 mode_lib->vba.WritebackEnable, 1567 v->ReadBandwidthSurfaceLuma, 1568 v->ReadBandwidthSurfaceChroma, 1569 v->meta_row_bw, 1570 v->dpte_row_bw, 1571 /* Output */ 1572 &v->StutterEfficiencyNotIncludingVBlank, 1573 &v->StutterEfficiency, 1574 &v->NumberOfStutterBurstsPerFrame, 1575 &v->Z8StutterEfficiencyNotIncludingVBlank, 1576 &v->Z8StutterEfficiency, 1577 &v->Z8NumberOfStutterBurstsPerFrame, 1578 &v->StutterPeriod, 1579 &v->DCHUBBUB_ARB_CSTATE_MAX_CAP_MODE); 1580 1581 #ifdef __DML_VBA_ALLOW_DELTA__ 1582 { 1583 unsigned int dummy_integer[1]; 1584 1585 // Calculate z8 stutter eff assuming 0 reserved space 1586 dml32_CalculateStutterEfficiency(v->CompressedBufferSizeInkByte, 1587 mode_lib->vba.UsesMALLForPStateChange, 1588 v->UnboundedRequestEnabled, 1589 mode_lib->vba.MetaFIFOSizeInKEntries, 1590 mode_lib->vba.ZeroSizeBufferEntries, 1591 mode_lib->vba.PixelChunkSizeInKByte, 1592 mode_lib->vba.NumberOfActiveSurfaces, 1593 mode_lib->vba.ROBBufferSizeInKByte, 1594 v->TotalDataReadBandwidth, 1595 mode_lib->vba.DCFCLK, 1596 mode_lib->vba.ReturnBW, 1597 0, //CompbufReservedSpace64B, 1598 0, //CompbufReservedSpaceZs, 1599 mode_lib->vba.SRExitTime, 1600 mode_lib->vba.SRExitZ8Time, 1601 mode_lib->vba.SynchronizeTimingsFinal, 1602 mode_lib->vba.BlendingAndTiming, 1603 v->Watermark.StutterEnterPlusExitWatermark, 1604 v->Watermark.Z8StutterEnterPlusExitWatermark, 1605 mode_lib->vba.ProgressiveToInterlaceUnitInOPP, 1606 mode_lib->vba.Interlace, 1607 v->MinTTUVBlank, 1608 mode_lib->vba.DPPPerPlane, 1609 mode_lib->vba.DETBufferSizeY, 1610 v->BytePerPixelY, v->BytePerPixelDETY, 1611 v->SwathWidthY, mode_lib->vba.SwathHeightY, 1612 mode_lib->vba.SwathHeightC, 1613 mode_lib->vba.DCCRateLuma, 1614 mode_lib->vba.DCCRateChroma, 1615 mode_lib->vba.DCCFractionOfZeroSizeRequestsLuma, 1616 mode_lib->vba.DCCFractionOfZeroSizeRequestsChroma, 1617 mode_lib->vba.HTotal, 1618 mode_lib->vba.VTotal, 1619 mode_lib->vba.PixelClock, 1620 mode_lib->vba.VRatio, 1621 mode_lib->vba.SourceRotation, 1622 v->BlockHeight256BytesY, 1623 v->BlockWidth256BytesY, 1624 v->BlockHeight256BytesC, 1625 v->BlockWidth256BytesC, 1626 v->DCCYMaxUncompressedBlock, 1627 v->DCCCMaxUncompressedBlock, 1628 mode_lib->vba.VActive, 1629 mode_lib->vba.DCCEnable, 1630 mode_lib->vba.WritebackEnable, 1631 v->ReadBandwidthSurfaceLuma, 1632 v->ReadBandwidthSurfaceChroma, 1633 v->meta_row_bw, v->dpte_row_bw, 1634 1635 /* Output */ 1636 &v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_single[0], 1637 &v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_single[1], 1638 &dummy_integer[0], 1639 &v->Z8StutterEfficiencyNotIncludingVBlankBestCase, 1640 &v->Z8StutterEfficiencyBestCase, 1641 &v->Z8NumberOfStutterBurstsPerFrameBestCase, 1642 &v->StutterPeriodBestCase, 1643 &v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.dummy_boolean); 1644 } 1645 #else 1646 v->Z8StutterEfficiencyNotIncludingVBlankBestCase = v->Z8StutterEfficiencyNotIncludingVBlank; 1647 v->Z8StutterEfficiencyBestCase = v->Z8StutterEfficiency; 1648 v->Z8NumberOfStutterBurstsPerFrameBestCase = v->Z8NumberOfStutterBurstsPerFrame; 1649 v->StutterPeriodBestCase = v->StutterPeriod; 1650 #endif 1651 1652 #ifdef __DML_VBA_DEBUG__ 1653 dml_print("DML::%s: --- END ---\n", __func__); 1654 #endif 1655 } 1656 1657 static void mode_support_configuration(struct vba_vars_st *v, 1658 struct display_mode_lib *mode_lib) 1659 { 1660 int i, j; 1661 1662 for (i = v->soc.num_states - 1; i >= 0; i--) { 1663 for (j = 0; j < 2; j++) { 1664 if (mode_lib->vba.ScaleRatioAndTapsSupport == true 1665 && mode_lib->vba.SourceFormatPixelAndScanSupport == true 1666 && mode_lib->vba.ViewportSizeSupport[i][j] == true 1667 && !mode_lib->vba.LinkRateDoesNotMatchDPVersion 1668 && !mode_lib->vba.LinkRateForMultistreamNotIndicated 1669 && !mode_lib->vba.BPPForMultistreamNotIndicated 1670 && !mode_lib->vba.MultistreamWithHDMIOreDP 1671 && !mode_lib->vba.ExceededMultistreamSlots[i] 1672 && !mode_lib->vba.MSOOrODMSplitWithNonDPLink 1673 && !mode_lib->vba.NotEnoughLanesForMSO 1674 && mode_lib->vba.LinkCapacitySupport[i] == true && !mode_lib->vba.P2IWith420 1675 && !mode_lib->vba.DSCOnlyIfNecessaryWithBPP 1676 && !mode_lib->vba.DSC422NativeNotSupported 1677 && !mode_lib->vba.MPCCombineMethodIncompatible 1678 && mode_lib->vba.ODMCombine2To1SupportCheckOK[i] == true 1679 && mode_lib->vba.ODMCombine4To1SupportCheckOK[i] == true 1680 && mode_lib->vba.NotEnoughDSCUnits[i] == false 1681 && !mode_lib->vba.NotEnoughDSCSlices[i] 1682 && !mode_lib->vba.ImmediateFlipOrHostVMAndPStateWithMALLFullFrameOrPhantomPipe 1683 && !mode_lib->vba.InvalidCombinationOfMALLUseForPStateAndStaticScreen 1684 && mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] == false 1685 && mode_lib->vba.PixelsPerLinePerDSCUnitSupport[i] 1686 && mode_lib->vba.DTBCLKRequiredMoreThanSupported[i] == false 1687 && !mode_lib->vba.InvalidCombinationOfMALLUseForPState 1688 && !mode_lib->vba.ImmediateFlipRequiredButTheRequirementForEachSurfaceIsNotSpecified 1689 && mode_lib->vba.ROBSupport[i][j] == true 1690 && mode_lib->vba.DISPCLK_DPPCLK_Support[i][j] == true 1691 && mode_lib->vba.TotalAvailablePipesSupport[i][j] == true 1692 && mode_lib->vba.NumberOfOTGSupport == true 1693 && mode_lib->vba.NumberOfHDMIFRLSupport == true 1694 && mode_lib->vba.EnoughWritebackUnits == true 1695 && mode_lib->vba.WritebackLatencySupport == true 1696 && mode_lib->vba.WritebackScaleRatioAndTapsSupport == true 1697 && mode_lib->vba.CursorSupport == true && mode_lib->vba.PitchSupport == true 1698 && mode_lib->vba.ViewportExceedsSurface == false 1699 && mode_lib->vba.PrefetchSupported[i][j] == true 1700 && mode_lib->vba.VActiveBandwithSupport[i][j] == true 1701 && mode_lib->vba.DynamicMetadataSupported[i][j] == true 1702 && mode_lib->vba.TotalVerticalActiveBandwidthSupport[i][j] == true 1703 && mode_lib->vba.VRatioInPrefetchSupported[i][j] == true 1704 && mode_lib->vba.PTEBufferSizeNotExceeded[i][j] == true 1705 && mode_lib->vba.DCCMetaBufferSizeNotExceeded[i][j] == true 1706 && mode_lib->vba.NonsupportedDSCInputBPC == false 1707 && !mode_lib->vba.ExceededMALLSize 1708 && ((mode_lib->vba.HostVMEnable == false 1709 && !mode_lib->vba.ImmediateFlipRequiredFinal) 1710 || mode_lib->vba.ImmediateFlipSupportedForState[i][j]) 1711 && (!mode_lib->vba.DRAMClockChangeRequirementFinal 1712 || i == v->soc.num_states - 1 1713 || mode_lib->vba.DRAMClockChangeSupport[i][j] != dm_dram_clock_change_unsupported) 1714 && (!mode_lib->vba.FCLKChangeRequirementFinal || i == v->soc.num_states - 1 1715 || mode_lib->vba.FCLKChangeSupport[i][j] != dm_fclock_change_unsupported) 1716 && (!mode_lib->vba.USRRetrainingRequiredFinal 1717 || mode_lib->vba.USRRetrainingSupport[i][j])) { 1718 mode_lib->vba.ModeSupport[i][j] = true; 1719 } else { 1720 mode_lib->vba.ModeSupport[i][j] = false; 1721 } 1722 } 1723 } 1724 } 1725 1726 void dml32_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_lib) 1727 { 1728 struct vba_vars_st *v = &mode_lib->vba; 1729 int i, j; 1730 unsigned int k, m; 1731 unsigned int MaximumMPCCombine; 1732 unsigned int NumberOfNonCombinedSurfaceOfMaximumBandwidth; 1733 unsigned int TotalSlots; 1734 bool CompBufReservedSpaceNeedAdjustment; 1735 bool CompBufReservedSpaceNeedAdjustmentSingleDPP; 1736 1737 #ifdef __DML_VBA_DEBUG__ 1738 dml_print("DML::%s: called\n", __func__); 1739 #endif 1740 1741 /*MODE SUPPORT, VOLTAGE STATE AND SOC CONFIGURATION*/ 1742 1743 /*Scale Ratio, taps Support Check*/ 1744 1745 mode_lib->vba.ScaleRatioAndTapsSupport = true; 1746 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 1747 if (mode_lib->vba.ScalerEnabled[k] == false 1748 && ((mode_lib->vba.SourcePixelFormat[k] != dm_444_64 1749 && mode_lib->vba.SourcePixelFormat[k] != dm_444_32 1750 && mode_lib->vba.SourcePixelFormat[k] != dm_444_16 1751 && mode_lib->vba.SourcePixelFormat[k] != dm_mono_16 1752 && mode_lib->vba.SourcePixelFormat[k] != dm_mono_8 1753 && mode_lib->vba.SourcePixelFormat[k] != dm_rgbe 1754 && mode_lib->vba.SourcePixelFormat[k] != dm_rgbe_alpha) 1755 || mode_lib->vba.HRatio[k] != 1.0 || mode_lib->vba.htaps[k] != 1.0 1756 || mode_lib->vba.VRatio[k] != 1.0 || mode_lib->vba.vtaps[k] != 1.0)) { 1757 mode_lib->vba.ScaleRatioAndTapsSupport = false; 1758 } else if (mode_lib->vba.vtaps[k] < 1.0 || mode_lib->vba.vtaps[k] > 8.0 || mode_lib->vba.htaps[k] < 1.0 1759 || mode_lib->vba.htaps[k] > 8.0 1760 || (mode_lib->vba.htaps[k] > 1.0 && (mode_lib->vba.htaps[k] % 2) == 1) 1761 || mode_lib->vba.HRatio[k] > mode_lib->vba.MaxHSCLRatio 1762 || mode_lib->vba.VRatio[k] > mode_lib->vba.MaxVSCLRatio 1763 || mode_lib->vba.HRatio[k] > mode_lib->vba.htaps[k] 1764 || mode_lib->vba.VRatio[k] > mode_lib->vba.vtaps[k] 1765 || (mode_lib->vba.SourcePixelFormat[k] != dm_444_64 1766 && mode_lib->vba.SourcePixelFormat[k] != dm_444_32 1767 && mode_lib->vba.SourcePixelFormat[k] != dm_444_16 1768 && mode_lib->vba.SourcePixelFormat[k] != dm_mono_16 1769 && mode_lib->vba.SourcePixelFormat[k] != dm_mono_8 1770 && mode_lib->vba.SourcePixelFormat[k] != dm_rgbe 1771 && (mode_lib->vba.VTAPsChroma[k] < 1 1772 || mode_lib->vba.VTAPsChroma[k] > 8 1773 || mode_lib->vba.HTAPsChroma[k] < 1 1774 || mode_lib->vba.HTAPsChroma[k] > 8 1775 || (mode_lib->vba.HTAPsChroma[k] > 1 1776 && mode_lib->vba.HTAPsChroma[k] % 2 1777 == 1) 1778 || mode_lib->vba.HRatioChroma[k] 1779 > mode_lib->vba.MaxHSCLRatio 1780 || mode_lib->vba.VRatioChroma[k] 1781 > mode_lib->vba.MaxVSCLRatio 1782 || mode_lib->vba.HRatioChroma[k] 1783 > mode_lib->vba.HTAPsChroma[k] 1784 || mode_lib->vba.VRatioChroma[k] 1785 > mode_lib->vba.VTAPsChroma[k]))) { 1786 mode_lib->vba.ScaleRatioAndTapsSupport = false; 1787 } 1788 } 1789 1790 /*Source Format, Pixel Format and Scan Support Check*/ 1791 mode_lib->vba.SourceFormatPixelAndScanSupport = true; 1792 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 1793 if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear 1794 && (!(!IsVertical((enum dm_rotation_angle) mode_lib->vba.SourceScan[k])) 1795 || mode_lib->vba.DCCEnable[k] == true)) { 1796 mode_lib->vba.SourceFormatPixelAndScanSupport = false; 1797 } 1798 } 1799 1800 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 1801 dml32_CalculateBytePerPixelAndBlockSizes( 1802 mode_lib->vba.SourcePixelFormat[k], 1803 mode_lib->vba.SurfaceTiling[k], 1804 1805 /* Output */ 1806 &mode_lib->vba.BytePerPixelY[k], 1807 &mode_lib->vba.BytePerPixelC[k], 1808 &mode_lib->vba.BytePerPixelInDETY[k], 1809 &mode_lib->vba.BytePerPixelInDETC[k], 1810 &mode_lib->vba.Read256BlockHeightY[k], 1811 &mode_lib->vba.Read256BlockHeightC[k], 1812 &mode_lib->vba.Read256BlockWidthY[k], 1813 &mode_lib->vba.Read256BlockWidthC[k], 1814 &mode_lib->vba.MicroTileHeightY[k], 1815 &mode_lib->vba.MicroTileHeightC[k], 1816 &mode_lib->vba.MicroTileWidthY[k], 1817 &mode_lib->vba.MicroTileWidthC[k]); 1818 } 1819 1820 /*Bandwidth Support Check*/ 1821 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 1822 if (!IsVertical(mode_lib->vba.SourceRotation[k])) { 1823 v->SwathWidthYSingleDPP[k] = mode_lib->vba.ViewportWidth[k]; 1824 v->SwathWidthCSingleDPP[k] = mode_lib->vba.ViewportWidthChroma[k]; 1825 } else { 1826 v->SwathWidthYSingleDPP[k] = mode_lib->vba.ViewportHeight[k]; 1827 v->SwathWidthCSingleDPP[k] = mode_lib->vba.ViewportHeightChroma[k]; 1828 } 1829 } 1830 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 1831 v->ReadBandwidthLuma[k] = v->SwathWidthYSingleDPP[k] * dml_ceil(v->BytePerPixelInDETY[k], 1.0) 1832 / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * mode_lib->vba.VRatio[k]; 1833 v->ReadBandwidthChroma[k] = v->SwathWidthYSingleDPP[k] / 2 * dml_ceil(v->BytePerPixelInDETC[k], 2.0) 1834 / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * mode_lib->vba.VRatio[k] 1835 / 2.0; 1836 } 1837 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 1838 if (mode_lib->vba.WritebackEnable[k] == true && mode_lib->vba.WritebackPixelFormat[k] == dm_444_64) { 1839 v->WriteBandwidth[k] = mode_lib->vba.WritebackDestinationWidth[k] 1840 * mode_lib->vba.WritebackDestinationHeight[k] 1841 / (mode_lib->vba.WritebackSourceHeight[k] * mode_lib->vba.HTotal[k] 1842 / mode_lib->vba.PixelClock[k]) * 8.0; 1843 } else if (mode_lib->vba.WritebackEnable[k] == true) { 1844 v->WriteBandwidth[k] = mode_lib->vba.WritebackDestinationWidth[k] 1845 * mode_lib->vba.WritebackDestinationHeight[k] 1846 / (mode_lib->vba.WritebackSourceHeight[k] * mode_lib->vba.HTotal[k] 1847 / mode_lib->vba.PixelClock[k]) * 4.0; 1848 } else { 1849 v->WriteBandwidth[k] = 0.0; 1850 } 1851 } 1852 1853 /*Writeback Latency support check*/ 1854 1855 mode_lib->vba.WritebackLatencySupport = true; 1856 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 1857 if (mode_lib->vba.WritebackEnable[k] == true 1858 && (v->WriteBandwidth[k] 1859 > mode_lib->vba.WritebackInterfaceBufferSize * 1024 1860 / mode_lib->vba.WritebackLatency)) { 1861 mode_lib->vba.WritebackLatencySupport = false; 1862 } 1863 } 1864 1865 /*Writeback Mode Support Check*/ 1866 mode_lib->vba.EnoughWritebackUnits = true; 1867 mode_lib->vba.TotalNumberOfActiveWriteback = 0; 1868 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 1869 if (mode_lib->vba.WritebackEnable[k] == true) 1870 mode_lib->vba.TotalNumberOfActiveWriteback = mode_lib->vba.TotalNumberOfActiveWriteback + 1; 1871 } 1872 1873 if (mode_lib->vba.TotalNumberOfActiveWriteback > mode_lib->vba.MaxNumWriteback) 1874 mode_lib->vba.EnoughWritebackUnits = false; 1875 1876 /*Writeback Scale Ratio and Taps Support Check*/ 1877 mode_lib->vba.WritebackScaleRatioAndTapsSupport = true; 1878 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 1879 if (mode_lib->vba.WritebackEnable[k] == true) { 1880 if (mode_lib->vba.WritebackHRatio[k] > mode_lib->vba.WritebackMaxHSCLRatio 1881 || mode_lib->vba.WritebackVRatio[k] > mode_lib->vba.WritebackMaxVSCLRatio 1882 || mode_lib->vba.WritebackHRatio[k] < mode_lib->vba.WritebackMinHSCLRatio 1883 || mode_lib->vba.WritebackVRatio[k] < mode_lib->vba.WritebackMinVSCLRatio 1884 || mode_lib->vba.WritebackHTaps[k] > mode_lib->vba.WritebackMaxHSCLTaps 1885 || mode_lib->vba.WritebackVTaps[k] > mode_lib->vba.WritebackMaxVSCLTaps 1886 || mode_lib->vba.WritebackHRatio[k] > mode_lib->vba.WritebackHTaps[k] 1887 || mode_lib->vba.WritebackVRatio[k] > mode_lib->vba.WritebackVTaps[k] 1888 || (mode_lib->vba.WritebackHTaps[k] > 2.0 1889 && ((mode_lib->vba.WritebackHTaps[k] % 2) == 1))) { 1890 mode_lib->vba.WritebackScaleRatioAndTapsSupport = false; 1891 } 1892 if (2.0 * mode_lib->vba.WritebackDestinationWidth[k] * (mode_lib->vba.WritebackVTaps[k] - 1) 1893 * 57 > mode_lib->vba.WritebackLineBufferSize) { 1894 mode_lib->vba.WritebackScaleRatioAndTapsSupport = false; 1895 } 1896 } 1897 } 1898 1899 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 1900 dml32_CalculateSinglePipeDPPCLKAndSCLThroughput(mode_lib->vba.HRatio[k], mode_lib->vba.HRatioChroma[k], 1901 mode_lib->vba.VRatio[k], mode_lib->vba.VRatioChroma[k], 1902 mode_lib->vba.MaxDCHUBToPSCLThroughput, mode_lib->vba.MaxPSCLToLBThroughput, 1903 mode_lib->vba.PixelClock[k], mode_lib->vba.SourcePixelFormat[k], 1904 mode_lib->vba.htaps[k], mode_lib->vba.HTAPsChroma[k], mode_lib->vba.vtaps[k], 1905 mode_lib->vba.VTAPsChroma[k], 1906 /* Output */ 1907 &mode_lib->vba.PSCL_FACTOR[k], &mode_lib->vba.PSCL_FACTOR_CHROMA[k], 1908 &mode_lib->vba.MinDPPCLKUsingSingleDPP[k]); 1909 } 1910 1911 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 1912 1913 if (mode_lib->vba.SurfaceTiling[k] == dm_sw_linear) { 1914 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma = 8192; 1915 } else if (!IsVertical(mode_lib->vba.SourceRotation[k]) && v->BytePerPixelC[k] > 0 1916 && mode_lib->vba.SourcePixelFormat[k] != dm_rgbe_alpha) { 1917 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma = 7680; 1918 } else if (IsVertical(mode_lib->vba.SourceRotation[k]) && v->BytePerPixelC[k] > 0 1919 && mode_lib->vba.SourcePixelFormat[k] != dm_rgbe_alpha) { 1920 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma = 4320; 1921 } else if (mode_lib->vba.SourcePixelFormat[k] == dm_rgbe_alpha) { 1922 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma = 3840; 1923 } else if (IsVertical(mode_lib->vba.SourceRotation[k]) && v->BytePerPixelY[k] == 8 && 1924 mode_lib->vba.DCCEnable[k] == true) { 1925 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma = 3072; 1926 } else { 1927 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma = 6144; 1928 } 1929 1930 if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8 || mode_lib->vba.SourcePixelFormat[k] == dm_420_10 1931 || mode_lib->vba.SourcePixelFormat[k] == dm_420_12) { 1932 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportChroma = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma / 2.0; 1933 } else { 1934 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportChroma = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma; 1935 } 1936 v->MaximumSwathWidthInLineBufferLuma = mode_lib->vba.LineBufferSizeFinal 1937 * dml_max(mode_lib->vba.HRatio[k], 1.0) / mode_lib->vba.LBBitPerPixel[k] 1938 / (mode_lib->vba.vtaps[k] + dml_max(dml_ceil(mode_lib->vba.VRatio[k], 1.0) - 2, 0.0)); 1939 if (v->BytePerPixelC[k] == 0.0) { 1940 v->MaximumSwathWidthInLineBufferChroma = 0; 1941 } else { 1942 v->MaximumSwathWidthInLineBufferChroma = mode_lib->vba.LineBufferSizeFinal 1943 * dml_max(mode_lib->vba.HRatioChroma[k], 1.0) / mode_lib->vba.LBBitPerPixel[k] 1944 / (mode_lib->vba.VTAPsChroma[k] 1945 + dml_max(dml_ceil(mode_lib->vba.VRatioChroma[k], 1.0) - 2, 1946 0.0)); 1947 } 1948 v->MaximumSwathWidthLuma[k] = dml_min(v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportLuma, 1949 v->MaximumSwathWidthInLineBufferLuma); 1950 v->MaximumSwathWidthChroma[k] = dml_min(v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaximumSwathWidthSupportChroma, 1951 v->MaximumSwathWidthInLineBufferChroma); 1952 } 1953 1954 dml32_CalculateSwathAndDETConfiguration( 1955 &v->dummy_vars.dml32_CalculateSwathAndDETConfiguration, 1956 mode_lib->vba.DETSizeOverride, 1957 mode_lib->vba.UsesMALLForPStateChange, 1958 mode_lib->vba.ConfigReturnBufferSizeInKByte, 1959 mode_lib->vba.MaxTotalDETInKByte, 1960 mode_lib->vba.MinCompressedBufferSizeInKByte, 1961 1, /* ForceSingleDPP */ 1962 mode_lib->vba.NumberOfActiveSurfaces, 1963 mode_lib->vba.nomDETInKByte, 1964 mode_lib->vba.UseUnboundedRequesting, 1965 mode_lib->vba.DisableUnboundRequestIfCompBufReservedSpaceNeedAdjustment, 1966 mode_lib->vba.ip.pixel_chunk_size_kbytes, 1967 mode_lib->vba.ip.rob_buffer_size_kbytes, 1968 mode_lib->vba.CompressedBufferSegmentSizeInkByteFinal, 1969 mode_lib->vba.Output, 1970 mode_lib->vba.ReadBandwidthLuma, 1971 mode_lib->vba.ReadBandwidthChroma, 1972 mode_lib->vba.MaximumSwathWidthLuma, 1973 mode_lib->vba.MaximumSwathWidthChroma, 1974 mode_lib->vba.SourceRotation, 1975 mode_lib->vba.ViewportStationary, 1976 mode_lib->vba.SourcePixelFormat, 1977 mode_lib->vba.SurfaceTiling, 1978 mode_lib->vba.ViewportWidth, 1979 mode_lib->vba.ViewportHeight, 1980 mode_lib->vba.ViewportXStartY, 1981 mode_lib->vba.ViewportYStartY, 1982 mode_lib->vba.ViewportXStartC, 1983 mode_lib->vba.ViewportYStartC, 1984 mode_lib->vba.SurfaceWidthY, 1985 mode_lib->vba.SurfaceWidthC, 1986 mode_lib->vba.SurfaceHeightY, 1987 mode_lib->vba.SurfaceHeightC, 1988 mode_lib->vba.Read256BlockHeightY, 1989 mode_lib->vba.Read256BlockHeightC, 1990 mode_lib->vba.Read256BlockWidthY, 1991 mode_lib->vba.Read256BlockWidthC, 1992 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_odm_mode, 1993 mode_lib->vba.BlendingAndTiming, 1994 mode_lib->vba.BytePerPixelY, 1995 mode_lib->vba.BytePerPixelC, 1996 mode_lib->vba.BytePerPixelInDETY, 1997 mode_lib->vba.BytePerPixelInDETC, 1998 mode_lib->vba.HActive, 1999 mode_lib->vba.HRatio, 2000 mode_lib->vba.HRatioChroma, 2001 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[0], /* Integer DPPPerSurface[] */ 2002 2003 /* Output */ 2004 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[1], /* Long swath_width_luma_ub[] */ 2005 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[2], /* Long swath_width_chroma_ub[] */ 2006 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_double_array[0], /* Long SwathWidth[] */ 2007 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_double_array[1], /* Long SwathWidthChroma[] */ 2008 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[3], /* Integer SwathHeightY[] */ 2009 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[4], /* Integer SwathHeightC[] */ 2010 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[5], /* Long DETBufferSizeInKByte[] */ 2011 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[6], /* Long DETBufferSizeY[] */ 2012 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[7], /* Long DETBufferSizeC[] */ 2013 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_boolean_array[0][0], /* bool *UnboundedRequestEnabled */ 2014 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[0][0], /* Long *CompressedBufferSizeInkByte */ 2015 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[1][0], /* Long *CompBufReservedSpaceKBytes */ 2016 &CompBufReservedSpaceNeedAdjustmentSingleDPP, 2017 mode_lib->vba.SingleDPPViewportSizeSupportPerSurface,/* bool ViewportSizeSupportPerSurface[] */ 2018 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_boolean_array[1][0]); /* bool *ViewportSizeSupport */ 2019 2020 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MPCCombineMethodAsNeededForPStateChangeAndVoltage = false; 2021 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MPCCombineMethodAsPossible = false; 2022 2023 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2024 if (mode_lib->vba.MPCCombineUse[k] == dm_mpc_reduce_voltage_and_clocks) 2025 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MPCCombineMethodAsNeededForPStateChangeAndVoltage = true; 2026 if (mode_lib->vba.MPCCombineUse[k] == dm_mpc_always_when_possible) 2027 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MPCCombineMethodAsPossible = true; 2028 } 2029 mode_lib->vba.MPCCombineMethodIncompatible = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MPCCombineMethodAsNeededForPStateChangeAndVoltage 2030 && v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MPCCombineMethodAsPossible; 2031 2032 for (i = 0; i < v->soc.num_states; i++) { 2033 for (j = 0; j < 2; j++) { 2034 mode_lib->vba.TotalNumberOfActiveDPP[i][j] = 0; 2035 mode_lib->vba.TotalAvailablePipesSupport[i][j] = true; 2036 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeNoDSC = dm_odm_combine_mode_disabled; 2037 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeDSC = dm_odm_combine_mode_disabled; 2038 2039 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2040 dml32_CalculateODMMode( 2041 mode_lib->vba.MaximumPixelsPerLinePerDSCUnit, 2042 mode_lib->vba.HActive[k], 2043 mode_lib->vba.Output[k], 2044 mode_lib->vba.ODMUse[k], 2045 mode_lib->vba.MaxDispclk[i], 2046 mode_lib->vba.MaxDispclk[v->soc.num_states - 1], 2047 false, 2048 mode_lib->vba.TotalNumberOfActiveDPP[i][j], 2049 mode_lib->vba.MaxNumDPP, 2050 mode_lib->vba.PixelClock[k], 2051 mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading, 2052 mode_lib->vba.DISPCLKRampingMargin, 2053 mode_lib->vba.DISPCLKDPPCLKVCOSpeed, 2054 2055 /* Output */ 2056 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalAvailablePipesSupportNoDSC, 2057 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NumberOfDPPNoDSC, 2058 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeNoDSC, 2059 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.RequiredDISPCLKPerSurfaceNoDSC); 2060 2061 dml32_CalculateODMMode( 2062 mode_lib->vba.MaximumPixelsPerLinePerDSCUnit, 2063 mode_lib->vba.HActive[k], 2064 mode_lib->vba.Output[k], 2065 mode_lib->vba.ODMUse[k], 2066 mode_lib->vba.MaxDispclk[i], 2067 mode_lib->vba.MaxDispclk[v->soc.num_states - 1], 2068 true, 2069 mode_lib->vba.TotalNumberOfActiveDPP[i][j], 2070 mode_lib->vba.MaxNumDPP, 2071 mode_lib->vba.PixelClock[k], 2072 mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading, 2073 mode_lib->vba.DISPCLKRampingMargin, 2074 mode_lib->vba.DISPCLKDPPCLKVCOSpeed, 2075 2076 /* Output */ 2077 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalAvailablePipesSupportDSC, 2078 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NumberOfDPPDSC, 2079 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeDSC, 2080 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.RequiredDISPCLKPerSurfaceDSC); 2081 2082 dml32_CalculateOutputLink( 2083 mode_lib->vba.PHYCLKPerState[i], 2084 mode_lib->vba.PHYCLKD18PerState[i], 2085 mode_lib->vba.PHYCLKD32PerState[i], 2086 mode_lib->vba.Downspreading, 2087 (mode_lib->vba.BlendingAndTiming[k] == k), 2088 mode_lib->vba.Output[k], 2089 mode_lib->vba.OutputFormat[k], 2090 mode_lib->vba.HTotal[k], 2091 mode_lib->vba.HActive[k], 2092 mode_lib->vba.PixelClockBackEnd[k], 2093 mode_lib->vba.ForcedOutputLinkBPP[k], 2094 mode_lib->vba.DSCInputBitPerComponent[k], 2095 mode_lib->vba.NumberOfDSCSlices[k], 2096 mode_lib->vba.AudioSampleRate[k], 2097 mode_lib->vba.AudioSampleLayout[k], 2098 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeNoDSC, 2099 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeDSC, 2100 mode_lib->vba.DSCEnable[k], 2101 mode_lib->vba.OutputLinkDPLanes[k], 2102 mode_lib->vba.OutputLinkDPRate[k], 2103 2104 /* Output */ 2105 &mode_lib->vba.RequiresDSC[i][k], 2106 &mode_lib->vba.RequiresFEC[i][k], 2107 &mode_lib->vba.OutputBppPerState[i][k], 2108 &mode_lib->vba.OutputTypePerState[i][k], 2109 &mode_lib->vba.OutputRatePerState[i][k], 2110 &mode_lib->vba.RequiredSlots[i][k]); 2111 2112 if (mode_lib->vba.RequiresDSC[i][k] == false) { 2113 mode_lib->vba.ODMCombineEnablePerState[i][k] = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeNoDSC; 2114 mode_lib->vba.RequiredDISPCLKPerSurface[i][j][k] = 2115 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.RequiredDISPCLKPerSurfaceNoDSC; 2116 if (!v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalAvailablePipesSupportNoDSC) 2117 mode_lib->vba.TotalAvailablePipesSupport[i][j] = false; 2118 mode_lib->vba.TotalNumberOfActiveDPP[i][j] = 2119 mode_lib->vba.TotalNumberOfActiveDPP[i][j] + v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NumberOfDPPNoDSC; 2120 } else { 2121 mode_lib->vba.ODMCombineEnablePerState[i][k] = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ODMModeDSC; 2122 mode_lib->vba.RequiredDISPCLKPerSurface[i][j][k] = 2123 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.RequiredDISPCLKPerSurfaceDSC; 2124 if (!v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalAvailablePipesSupportDSC) 2125 mode_lib->vba.TotalAvailablePipesSupport[i][j] = false; 2126 mode_lib->vba.TotalNumberOfActiveDPP[i][j] = 2127 mode_lib->vba.TotalNumberOfActiveDPP[i][j] + v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NumberOfDPPDSC; 2128 } 2129 } 2130 2131 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2132 if (mode_lib->vba.ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_4to1) { 2133 mode_lib->vba.MPCCombine[i][j][k] = false; 2134 mode_lib->vba.NoOfDPP[i][j][k] = 4; 2135 } else if (mode_lib->vba.ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_2to1) { 2136 mode_lib->vba.MPCCombine[i][j][k] = false; 2137 mode_lib->vba.NoOfDPP[i][j][k] = 2; 2138 } else if (mode_lib->vba.MPCCombineUse[k] == dm_mpc_never) { 2139 mode_lib->vba.MPCCombine[i][j][k] = false; 2140 mode_lib->vba.NoOfDPP[i][j][k] = 1; 2141 } else if (dml32_RoundToDFSGranularity( 2142 mode_lib->vba.MinDPPCLKUsingSingleDPP[k] 2143 * (1 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading 2144 / 100), 1, 2145 mode_lib->vba.DISPCLKDPPCLKVCOSpeed) <= mode_lib->vba.MaxDppclk[i] && 2146 mode_lib->vba.SingleDPPViewportSizeSupportPerSurface[k] == true) { 2147 mode_lib->vba.MPCCombine[i][j][k] = false; 2148 mode_lib->vba.NoOfDPP[i][j][k] = 1; 2149 } else if (mode_lib->vba.TotalNumberOfActiveDPP[i][j] < mode_lib->vba.MaxNumDPP) { 2150 mode_lib->vba.MPCCombine[i][j][k] = true; 2151 mode_lib->vba.NoOfDPP[i][j][k] = 2; 2152 mode_lib->vba.TotalNumberOfActiveDPP[i][j] = 2153 mode_lib->vba.TotalNumberOfActiveDPP[i][j] + 1; 2154 } else { 2155 mode_lib->vba.MPCCombine[i][j][k] = false; 2156 mode_lib->vba.NoOfDPP[i][j][k] = 1; 2157 mode_lib->vba.TotalAvailablePipesSupport[i][j] = false; 2158 } 2159 } 2160 2161 mode_lib->vba.TotalNumberOfSingleDPPSurfaces[i][j] = 0; 2162 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NoChroma = true; 2163 2164 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2165 if (mode_lib->vba.NoOfDPP[i][j][k] == 1) 2166 mode_lib->vba.TotalNumberOfSingleDPPSurfaces[i][j] = 2167 mode_lib->vba.TotalNumberOfSingleDPPSurfaces[i][j] + 1; 2168 if (mode_lib->vba.SourcePixelFormat[k] == dm_420_8 2169 || mode_lib->vba.SourcePixelFormat[k] == dm_420_10 2170 || mode_lib->vba.SourcePixelFormat[k] == dm_420_12 2171 || mode_lib->vba.SourcePixelFormat[k] == dm_rgbe_alpha) { 2172 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NoChroma = false; 2173 } 2174 } 2175 2176 // if TotalNumberOfActiveDPP is > 1, then there should be no unbounded req mode (hw limitation), the comp buf reserved adjustment is not needed regardless 2177 // if TotalNumberOfActiveDPP is == 1, then will use the SingleDPP version of unbounded_req for the decision 2178 CompBufReservedSpaceNeedAdjustment = (mode_lib->vba.TotalNumberOfActiveDPP[i][j] > 1) ? 0 : CompBufReservedSpaceNeedAdjustmentSingleDPP; 2179 2180 2181 2182 if (j == 1 && !dml32_UnboundedRequest(mode_lib->vba.UseUnboundedRequesting, 2183 mode_lib->vba.TotalNumberOfActiveDPP[i][j], v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NoChroma, 2184 mode_lib->vba.Output[0], 2185 mode_lib->vba.SurfaceTiling[0], 2186 CompBufReservedSpaceNeedAdjustment, 2187 mode_lib->vba.DisableUnboundRequestIfCompBufReservedSpaceNeedAdjustment)) { 2188 while (!(mode_lib->vba.TotalNumberOfActiveDPP[i][j] >= mode_lib->vba.MaxNumDPP 2189 || mode_lib->vba.TotalNumberOfSingleDPPSurfaces[i][j] == 0)) { 2190 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.BWOfNonCombinedSurfaceOfMaximumBandwidth = 0; 2191 NumberOfNonCombinedSurfaceOfMaximumBandwidth = 0; 2192 2193 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2194 if (mode_lib->vba.MPCCombineUse[k] 2195 != dm_mpc_never && 2196 mode_lib->vba.MPCCombineUse[k] != dm_mpc_reduce_voltage && 2197 mode_lib->vba.ReadBandwidthLuma[k] + 2198 mode_lib->vba.ReadBandwidthChroma[k] > 2199 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.BWOfNonCombinedSurfaceOfMaximumBandwidth && 2200 (mode_lib->vba.ODMCombineEnablePerState[i][k] != 2201 dm_odm_combine_mode_2to1 && 2202 mode_lib->vba.ODMCombineEnablePerState[i][k] != 2203 dm_odm_combine_mode_4to1) && 2204 mode_lib->vba.MPCCombine[i][j][k] == false) { 2205 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.BWOfNonCombinedSurfaceOfMaximumBandwidth = 2206 mode_lib->vba.ReadBandwidthLuma[k] 2207 + mode_lib->vba.ReadBandwidthChroma[k]; 2208 NumberOfNonCombinedSurfaceOfMaximumBandwidth = k; 2209 } 2210 } 2211 mode_lib->vba.MPCCombine[i][j][NumberOfNonCombinedSurfaceOfMaximumBandwidth] = 2212 true; 2213 mode_lib->vba.NoOfDPP[i][j][NumberOfNonCombinedSurfaceOfMaximumBandwidth] = 2; 2214 mode_lib->vba.TotalNumberOfActiveDPP[i][j] = 2215 mode_lib->vba.TotalNumberOfActiveDPP[i][j] + 1; 2216 mode_lib->vba.TotalNumberOfSingleDPPSurfaces[i][j] = 2217 mode_lib->vba.TotalNumberOfSingleDPPSurfaces[i][j] - 1; 2218 } 2219 } 2220 2221 //DISPCLK/DPPCLK 2222 mode_lib->vba.WritebackRequiredDISPCLK = 0; 2223 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2224 if (mode_lib->vba.WritebackEnable[k]) { 2225 mode_lib->vba.WritebackRequiredDISPCLK = dml_max( 2226 mode_lib->vba.WritebackRequiredDISPCLK, 2227 dml32_CalculateWriteBackDISPCLK( 2228 mode_lib->vba.WritebackPixelFormat[k], 2229 mode_lib->vba.PixelClock[k], 2230 mode_lib->vba.WritebackHRatio[k], 2231 mode_lib->vba.WritebackVRatio[k], 2232 mode_lib->vba.WritebackHTaps[k], 2233 mode_lib->vba.WritebackVTaps[k], 2234 mode_lib->vba.WritebackSourceWidth[k], 2235 mode_lib->vba.WritebackDestinationWidth[k], 2236 mode_lib->vba.HTotal[k], 2237 mode_lib->vba.WritebackLineBufferSize, 2238 mode_lib->vba.DISPCLKDPPCLKVCOSpeed)); 2239 } 2240 } 2241 2242 mode_lib->vba.RequiredDISPCLK[i][j] = mode_lib->vba.WritebackRequiredDISPCLK; 2243 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2244 mode_lib->vba.RequiredDISPCLK[i][j] = dml_max(mode_lib->vba.RequiredDISPCLK[i][j], 2245 mode_lib->vba.RequiredDISPCLKPerSurface[i][j][k]); 2246 } 2247 2248 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) 2249 mode_lib->vba.NoOfDPPThisState[k] = mode_lib->vba.NoOfDPP[i][j][k]; 2250 2251 dml32_CalculateDPPCLK(mode_lib->vba.NumberOfActiveSurfaces, 2252 mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading, 2253 mode_lib->vba.DISPCLKDPPCLKVCOSpeed, mode_lib->vba.MinDPPCLKUsingSingleDPP, 2254 mode_lib->vba.NoOfDPPThisState, 2255 /* Output */ 2256 &mode_lib->vba.GlobalDPPCLK, mode_lib->vba.RequiredDPPCLKThisState); 2257 2258 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) 2259 mode_lib->vba.RequiredDPPCLK[i][j][k] = mode_lib->vba.RequiredDPPCLKThisState[k]; 2260 2261 mode_lib->vba.DISPCLK_DPPCLK_Support[i][j] = !((mode_lib->vba.RequiredDISPCLK[i][j] 2262 > mode_lib->vba.MaxDispclk[i]) 2263 || (mode_lib->vba.GlobalDPPCLK > mode_lib->vba.MaxDppclk[i])); 2264 2265 if (mode_lib->vba.TotalNumberOfActiveDPP[i][j] > mode_lib->vba.MaxNumDPP) 2266 mode_lib->vba.TotalAvailablePipesSupport[i][j] = false; 2267 } // j 2268 } // i (VOLTAGE_STATE) 2269 2270 /* Total Available OTG, HDMIFRL, DP Support Check */ 2271 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveOTG = 0; 2272 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveHDMIFRL = 0; 2273 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0 = 0; 2274 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0Outputs = 0; 2275 2276 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2277 if (mode_lib->vba.BlendingAndTiming[k] == k) { 2278 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveOTG = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveOTG + 1; 2279 if (mode_lib->vba.Output[k] == dm_dp2p0) { 2280 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0 = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0 + 1; 2281 if (mode_lib->vba.OutputMultistreamId[k] 2282 == k || mode_lib->vba.OutputMultistreamEn[k] == false) { 2283 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0Outputs = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0Outputs + 1; 2284 } 2285 } 2286 } 2287 } 2288 2289 mode_lib->vba.NumberOfOTGSupport = (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveOTG <= mode_lib->vba.MaxNumOTG); 2290 mode_lib->vba.NumberOfHDMIFRLSupport = (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveHDMIFRL <= mode_lib->vba.MaxNumHDMIFRLOutputs); 2291 mode_lib->vba.NumberOfDP2p0Support = (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0 <= mode_lib->vba.MaxNumDP2p0Streams 2292 && v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalNumberOfActiveDP2p0Outputs <= mode_lib->vba.MaxNumDP2p0Outputs); 2293 2294 /* Display IO and DSC Support Check */ 2295 mode_lib->vba.NonsupportedDSCInputBPC = false; 2296 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 2297 if (!(mode_lib->vba.DSCInputBitPerComponent[k] == 12.0 2298 || mode_lib->vba.DSCInputBitPerComponent[k] == 10.0 2299 || mode_lib->vba.DSCInputBitPerComponent[k] == 8.0 2300 || mode_lib->vba.DSCInputBitPerComponent[k] > 2301 mode_lib->vba.MaximumDSCBitsPerComponent)) { 2302 mode_lib->vba.NonsupportedDSCInputBPC = true; 2303 } 2304 } 2305 2306 for (i = 0; i < v->soc.num_states; ++i) { 2307 mode_lib->vba.ExceededMultistreamSlots[i] = false; 2308 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2309 if (mode_lib->vba.OutputMultistreamEn[k] == true && mode_lib->vba.OutputMultistreamId[k] == k) { 2310 TotalSlots = mode_lib->vba.RequiredSlots[i][k]; 2311 for (j = 0; j < mode_lib->vba.NumberOfActiveSurfaces; ++j) { 2312 if (mode_lib->vba.OutputMultistreamId[j] == k) 2313 TotalSlots = TotalSlots + mode_lib->vba.RequiredSlots[i][j]; 2314 } 2315 if (mode_lib->vba.Output[k] == dm_dp && TotalSlots > 63) 2316 mode_lib->vba.ExceededMultistreamSlots[i] = true; 2317 if (mode_lib->vba.Output[k] == dm_dp2p0 && TotalSlots > 64) 2318 mode_lib->vba.ExceededMultistreamSlots[i] = true; 2319 } 2320 } 2321 mode_lib->vba.LinkCapacitySupport[i] = true; 2322 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2323 if (mode_lib->vba.BlendingAndTiming[k] == k 2324 && (mode_lib->vba.Output[k] == dm_dp || mode_lib->vba.Output[k] == dm_dp2p0 2325 || mode_lib->vba.Output[k] == dm_edp 2326 || mode_lib->vba.Output[k] == dm_hdmi) 2327 && mode_lib->vba.OutputBppPerState[i][k] == 0) { 2328 mode_lib->vba.LinkCapacitySupport[i] = false; 2329 } 2330 } 2331 } 2332 2333 mode_lib->vba.P2IWith420 = false; 2334 mode_lib->vba.DSCOnlyIfNecessaryWithBPP = false; 2335 mode_lib->vba.DSC422NativeNotSupported = false; 2336 mode_lib->vba.LinkRateDoesNotMatchDPVersion = false; 2337 mode_lib->vba.LinkRateForMultistreamNotIndicated = false; 2338 mode_lib->vba.BPPForMultistreamNotIndicated = false; 2339 mode_lib->vba.MultistreamWithHDMIOreDP = false; 2340 mode_lib->vba.MSOOrODMSplitWithNonDPLink = false; 2341 mode_lib->vba.NotEnoughLanesForMSO = false; 2342 2343 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2344 if (mode_lib->vba.BlendingAndTiming[k] == k 2345 && (mode_lib->vba.Output[k] == dm_dp || mode_lib->vba.Output[k] == dm_dp2p0 2346 || mode_lib->vba.Output[k] == dm_edp 2347 || mode_lib->vba.Output[k] == dm_hdmi)) { 2348 if (mode_lib->vba.OutputFormat[k] 2349 == dm_420 && mode_lib->vba.Interlace[k] == 1 && 2350 mode_lib->vba.ProgressiveToInterlaceUnitInOPP == true) 2351 mode_lib->vba.P2IWith420 = true; 2352 2353 if (mode_lib->vba.DSCEnable[k] && mode_lib->vba.ForcedOutputLinkBPP[k] != 0) 2354 mode_lib->vba.DSCOnlyIfNecessaryWithBPP = true; 2355 if ((mode_lib->vba.DSCEnable[k] || mode_lib->vba.DSCEnable[k]) 2356 && mode_lib->vba.OutputFormat[k] == dm_n422 2357 && !mode_lib->vba.DSC422NativeSupport) 2358 mode_lib->vba.DSC422NativeNotSupported = true; 2359 2360 if (((mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_hbr 2361 || mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_hbr2 2362 || mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_hbr3) 2363 && mode_lib->vba.Output[k] != dm_dp && mode_lib->vba.Output[k] != dm_edp) 2364 || ((mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_uhbr10 2365 || mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_uhbr13p5 2366 || mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_uhbr20) 2367 && mode_lib->vba.Output[k] != dm_dp2p0)) 2368 mode_lib->vba.LinkRateDoesNotMatchDPVersion = true; 2369 2370 if (mode_lib->vba.OutputMultistreamEn[k] == true) { 2371 if (mode_lib->vba.OutputMultistreamId[k] == k 2372 && mode_lib->vba.OutputLinkDPRate[k] == dm_dp_rate_na) 2373 mode_lib->vba.LinkRateForMultistreamNotIndicated = true; 2374 if (mode_lib->vba.OutputMultistreamId[k] == k && mode_lib->vba.ForcedOutputLinkBPP[k] == 0) 2375 mode_lib->vba.BPPForMultistreamNotIndicated = true; 2376 for (j = 0; j < mode_lib->vba.NumberOfActiveSurfaces; ++j) { 2377 if (mode_lib->vba.OutputMultistreamId[k] == j && mode_lib->vba.OutputMultistreamEn[k] 2378 && mode_lib->vba.ForcedOutputLinkBPP[k] == 0) 2379 mode_lib->vba.BPPForMultistreamNotIndicated = true; 2380 } 2381 } 2382 2383 if ((mode_lib->vba.Output[k] == dm_edp || mode_lib->vba.Output[k] == dm_hdmi)) { 2384 if (mode_lib->vba.OutputMultistreamId[k] == k && mode_lib->vba.OutputMultistreamEn[k]) 2385 mode_lib->vba.MultistreamWithHDMIOreDP = true; 2386 2387 for (j = 0; j < mode_lib->vba.NumberOfActiveSurfaces; ++j) { 2388 if (mode_lib->vba.OutputMultistreamEn[k] == true && mode_lib->vba.OutputMultistreamId[k] == j) 2389 mode_lib->vba.MultistreamWithHDMIOreDP = true; 2390 } 2391 } 2392 2393 if (mode_lib->vba.Output[k] != dm_dp 2394 && (mode_lib->vba.ODMUse[k] == dm_odm_split_policy_1to2 2395 || mode_lib->vba.ODMUse[k] == dm_odm_mso_policy_1to2 2396 || mode_lib->vba.ODMUse[k] == dm_odm_mso_policy_1to4)) 2397 mode_lib->vba.MSOOrODMSplitWithNonDPLink = true; 2398 2399 if ((mode_lib->vba.ODMUse[k] == dm_odm_mso_policy_1to2 2400 && mode_lib->vba.OutputLinkDPLanes[k] < 2) 2401 || (mode_lib->vba.ODMUse[k] == dm_odm_mso_policy_1to4 2402 && mode_lib->vba.OutputLinkDPLanes[k] < 4)) 2403 mode_lib->vba.NotEnoughLanesForMSO = true; 2404 } 2405 } 2406 2407 for (i = 0; i < v->soc.num_states; ++i) { 2408 mode_lib->vba.DTBCLKRequiredMoreThanSupported[i] = false; 2409 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2410 if (mode_lib->vba.BlendingAndTiming[k] == k 2411 && dml32_RequiredDTBCLK(mode_lib->vba.RequiresDSC[i][k], 2412 mode_lib->vba.PixelClockBackEnd[k], 2413 mode_lib->vba.OutputFormat[k], 2414 mode_lib->vba.OutputBppPerState[i][k], 2415 mode_lib->vba.NumberOfDSCSlices[k], mode_lib->vba.HTotal[k], 2416 mode_lib->vba.HActive[k], mode_lib->vba.AudioSampleRate[k], 2417 mode_lib->vba.AudioSampleLayout[k]) 2418 > mode_lib->vba.DTBCLKPerState[i]) { 2419 mode_lib->vba.DTBCLKRequiredMoreThanSupported[i] = true; 2420 } 2421 } 2422 } 2423 2424 for (i = 0; i < v->soc.num_states; ++i) { 2425 mode_lib->vba.ODMCombine2To1SupportCheckOK[i] = true; 2426 mode_lib->vba.ODMCombine4To1SupportCheckOK[i] = true; 2427 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2428 if (mode_lib->vba.BlendingAndTiming[k] == k 2429 && mode_lib->vba.ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_2to1 2430 && mode_lib->vba.Output[k] == dm_hdmi) { 2431 mode_lib->vba.ODMCombine2To1SupportCheckOK[i] = false; 2432 } 2433 if (mode_lib->vba.BlendingAndTiming[k] == k 2434 && mode_lib->vba.ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_4to1 2435 && (mode_lib->vba.Output[k] == dm_dp || mode_lib->vba.Output[k] == dm_edp 2436 || mode_lib->vba.Output[k] == dm_hdmi)) { 2437 mode_lib->vba.ODMCombine4To1SupportCheckOK[i] = false; 2438 } 2439 } 2440 } 2441 2442 for (i = 0; i < v->soc.num_states; i++) { 2443 mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] = false; 2444 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 2445 if (mode_lib->vba.BlendingAndTiming[k] == k) { 2446 if (mode_lib->vba.Output[k] == dm_dp || mode_lib->vba.Output[k] == dm_dp2p0 2447 || mode_lib->vba.Output[k] == dm_edp) { 2448 if (mode_lib->vba.OutputFormat[k] == dm_420) { 2449 mode_lib->vba.DSCFormatFactor = 2; 2450 } else if (mode_lib->vba.OutputFormat[k] == dm_444) { 2451 mode_lib->vba.DSCFormatFactor = 1; 2452 } else if (mode_lib->vba.OutputFormat[k] == dm_n422) { 2453 mode_lib->vba.DSCFormatFactor = 2; 2454 } else { 2455 mode_lib->vba.DSCFormatFactor = 1; 2456 } 2457 if (mode_lib->vba.RequiresDSC[i][k] == true) { 2458 if (mode_lib->vba.ODMCombineEnablePerState[i][k] 2459 == dm_odm_combine_mode_4to1) { 2460 if (mode_lib->vba.PixelClockBackEnd[k] / 12.0 / mode_lib->vba.DSCFormatFactor > (1.0 - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0) * mode_lib->vba.MaxDSCCLK[i]) 2461 mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] = true; 2462 } else if (mode_lib->vba.ODMCombineEnablePerState[i][k] 2463 == dm_odm_combine_mode_2to1) { 2464 if (mode_lib->vba.PixelClockBackEnd[k] / 6.0 / mode_lib->vba.DSCFormatFactor > (1.0 - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0) * mode_lib->vba.MaxDSCCLK[i]) 2465 mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] = true; 2466 } else { 2467 if (mode_lib->vba.PixelClockBackEnd[k] / 3.0 / mode_lib->vba.DSCFormatFactor > (1.0 - mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0) * mode_lib->vba.MaxDSCCLK[i]) 2468 mode_lib->vba.DSCCLKRequiredMoreThanSupported[i] = true; 2469 } 2470 } 2471 } 2472 } 2473 } 2474 } 2475 2476 /* Check DSC Unit and Slices Support */ 2477 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired = 0; 2478 2479 for (i = 0; i < v->soc.num_states; ++i) { 2480 mode_lib->vba.NotEnoughDSCUnits[i] = false; 2481 mode_lib->vba.NotEnoughDSCSlices[i] = false; 2482 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired = 0; 2483 mode_lib->vba.PixelsPerLinePerDSCUnitSupport[i] = true; 2484 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2485 if (mode_lib->vba.RequiresDSC[i][k] == true) { 2486 if (mode_lib->vba.ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_4to1) { 2487 if (mode_lib->vba.HActive[k] 2488 > 4 * mode_lib->vba.MaximumPixelsPerLinePerDSCUnit) 2489 mode_lib->vba.PixelsPerLinePerDSCUnitSupport[i] = false; 2490 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired + 4; 2491 if (mode_lib->vba.NumberOfDSCSlices[k] > 16) 2492 mode_lib->vba.NotEnoughDSCSlices[i] = true; 2493 } else if (mode_lib->vba.ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_2to1) { 2494 if (mode_lib->vba.HActive[k] 2495 > 2 * mode_lib->vba.MaximumPixelsPerLinePerDSCUnit) 2496 mode_lib->vba.PixelsPerLinePerDSCUnitSupport[i] = false; 2497 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired + 2; 2498 if (mode_lib->vba.NumberOfDSCSlices[k] > 8) 2499 mode_lib->vba.NotEnoughDSCSlices[i] = true; 2500 } else { 2501 if (mode_lib->vba.HActive[k] > mode_lib->vba.MaximumPixelsPerLinePerDSCUnit) 2502 mode_lib->vba.PixelsPerLinePerDSCUnitSupport[i] = false; 2503 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired + 1; 2504 if (mode_lib->vba.NumberOfDSCSlices[k] > 4) 2505 mode_lib->vba.NotEnoughDSCSlices[i] = true; 2506 } 2507 } 2508 } 2509 if (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.TotalDSCUnitsRequired > mode_lib->vba.NumberOfDSC) 2510 mode_lib->vba.NotEnoughDSCUnits[i] = true; 2511 } 2512 2513 /*DSC Delay per state*/ 2514 for (i = 0; i < v->soc.num_states; ++i) { 2515 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2516 mode_lib->vba.DSCDelayPerState[i][k] = dml32_DSCDelayRequirement( 2517 mode_lib->vba.RequiresDSC[i][k], mode_lib->vba.ODMCombineEnablePerState[i][k], 2518 mode_lib->vba.DSCInputBitPerComponent[k], 2519 mode_lib->vba.OutputBppPerState[i][k], mode_lib->vba.HActive[k], 2520 mode_lib->vba.HTotal[k], mode_lib->vba.NumberOfDSCSlices[k], 2521 mode_lib->vba.OutputFormat[k], mode_lib->vba.Output[k], 2522 mode_lib->vba.PixelClock[k], mode_lib->vba.PixelClockBackEnd[k]); 2523 } 2524 2525 m = 0; 2526 2527 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 2528 for (m = 0; m <= mode_lib->vba.NumberOfActiveSurfaces - 1; m++) { 2529 for (j = 0; j <= mode_lib->vba.NumberOfActiveSurfaces - 1; j++) { 2530 if (mode_lib->vba.BlendingAndTiming[k] == m && 2531 mode_lib->vba.RequiresDSC[i][m] == true) { 2532 mode_lib->vba.DSCDelayPerState[i][k] = 2533 mode_lib->vba.DSCDelayPerState[i][m]; 2534 } 2535 } 2536 } 2537 } 2538 } 2539 2540 //Calculate Swath, DET Configuration, DCFCLKDeepSleep 2541 // 2542 for (i = 0; i < (int) v->soc.num_states; ++i) { 2543 for (j = 0; j <= 1; ++j) { 2544 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2545 mode_lib->vba.RequiredDPPCLKThisState[k] = mode_lib->vba.RequiredDPPCLK[i][j][k]; 2546 mode_lib->vba.NoOfDPPThisState[k] = mode_lib->vba.NoOfDPP[i][j][k]; 2547 mode_lib->vba.ODMCombineEnableThisState[k] = 2548 mode_lib->vba.ODMCombineEnablePerState[i][k]; 2549 } 2550 2551 dml32_CalculateSwathAndDETConfiguration( 2552 &v->dummy_vars.dml32_CalculateSwathAndDETConfiguration, 2553 mode_lib->vba.DETSizeOverride, 2554 mode_lib->vba.UsesMALLForPStateChange, 2555 mode_lib->vba.ConfigReturnBufferSizeInKByte, 2556 mode_lib->vba.MaxTotalDETInKByte, 2557 mode_lib->vba.MinCompressedBufferSizeInKByte, 2558 false, /* ForceSingleDPP */ 2559 mode_lib->vba.NumberOfActiveSurfaces, 2560 mode_lib->vba.nomDETInKByte, 2561 mode_lib->vba.UseUnboundedRequesting, 2562 mode_lib->vba.DisableUnboundRequestIfCompBufReservedSpaceNeedAdjustment, 2563 mode_lib->vba.ip.pixel_chunk_size_kbytes, 2564 mode_lib->vba.ip.rob_buffer_size_kbytes, 2565 mode_lib->vba.CompressedBufferSegmentSizeInkByteFinal, 2566 mode_lib->vba.Output, 2567 mode_lib->vba.ReadBandwidthLuma, 2568 mode_lib->vba.ReadBandwidthChroma, 2569 mode_lib->vba.MaximumSwathWidthLuma, 2570 mode_lib->vba.MaximumSwathWidthChroma, 2571 mode_lib->vba.SourceRotation, 2572 mode_lib->vba.ViewportStationary, 2573 mode_lib->vba.SourcePixelFormat, 2574 mode_lib->vba.SurfaceTiling, 2575 mode_lib->vba.ViewportWidth, 2576 mode_lib->vba.ViewportHeight, 2577 mode_lib->vba.ViewportXStartY, 2578 mode_lib->vba.ViewportYStartY, 2579 mode_lib->vba.ViewportXStartC, 2580 mode_lib->vba.ViewportYStartC, 2581 mode_lib->vba.SurfaceWidthY, 2582 mode_lib->vba.SurfaceWidthC, 2583 mode_lib->vba.SurfaceHeightY, 2584 mode_lib->vba.SurfaceHeightC, 2585 mode_lib->vba.Read256BlockHeightY, 2586 mode_lib->vba.Read256BlockHeightC, 2587 mode_lib->vba.Read256BlockWidthY, 2588 mode_lib->vba.Read256BlockWidthC, 2589 mode_lib->vba.ODMCombineEnableThisState, 2590 mode_lib->vba.BlendingAndTiming, 2591 mode_lib->vba.BytePerPixelY, 2592 mode_lib->vba.BytePerPixelC, 2593 mode_lib->vba.BytePerPixelInDETY, 2594 mode_lib->vba.BytePerPixelInDETC, 2595 mode_lib->vba.HActive, 2596 mode_lib->vba.HRatio, 2597 mode_lib->vba.HRatioChroma, 2598 mode_lib->vba.NoOfDPPThisState, 2599 /* Output */ 2600 mode_lib->vba.swath_width_luma_ub_this_state, 2601 mode_lib->vba.swath_width_chroma_ub_this_state, 2602 mode_lib->vba.SwathWidthYThisState, 2603 mode_lib->vba.SwathWidthCThisState, 2604 mode_lib->vba.SwathHeightYThisState, 2605 mode_lib->vba.SwathHeightCThisState, 2606 mode_lib->vba.DETBufferSizeInKByteThisState, 2607 mode_lib->vba.DETBufferSizeYThisState, 2608 mode_lib->vba.DETBufferSizeCThisState, 2609 &mode_lib->vba.UnboundedRequestEnabledThisState, 2610 &mode_lib->vba.CompressedBufferSizeInkByteThisState, 2611 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer[0], /* Long CompBufReservedSpaceKBytes */ 2612 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_boolean[0], /* bool CompBufReservedSpaceNeedAdjustment */ 2613 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_boolean_array[0], 2614 &mode_lib->vba.ViewportSizeSupport[i][j]); 2615 2616 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2617 mode_lib->vba.swath_width_luma_ub_all_states[i][j][k] = 2618 mode_lib->vba.swath_width_luma_ub_this_state[k]; 2619 mode_lib->vba.swath_width_chroma_ub_all_states[i][j][k] = 2620 mode_lib->vba.swath_width_chroma_ub_this_state[k]; 2621 mode_lib->vba.SwathWidthYAllStates[i][j][k] = mode_lib->vba.SwathWidthYThisState[k]; 2622 mode_lib->vba.SwathWidthCAllStates[i][j][k] = mode_lib->vba.SwathWidthCThisState[k]; 2623 mode_lib->vba.SwathHeightYAllStates[i][j][k] = mode_lib->vba.SwathHeightYThisState[k]; 2624 mode_lib->vba.SwathHeightCAllStates[i][j][k] = mode_lib->vba.SwathHeightCThisState[k]; 2625 mode_lib->vba.UnboundedRequestEnabledAllStates[i][j] = 2626 mode_lib->vba.UnboundedRequestEnabledThisState; 2627 mode_lib->vba.CompressedBufferSizeInkByteAllStates[i][j] = 2628 mode_lib->vba.CompressedBufferSizeInkByteThisState; 2629 mode_lib->vba.DETBufferSizeInKByteAllStates[i][j][k] = 2630 mode_lib->vba.DETBufferSizeInKByteThisState[k]; 2631 mode_lib->vba.DETBufferSizeYAllStates[i][j][k] = 2632 mode_lib->vba.DETBufferSizeYThisState[k]; 2633 mode_lib->vba.DETBufferSizeCAllStates[i][j][k] = 2634 mode_lib->vba.DETBufferSizeCThisState[k]; 2635 } 2636 } 2637 } 2638 2639 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2640 mode_lib->vba.cursor_bw[k] = mode_lib->vba.NumberOfCursors[k] * mode_lib->vba.CursorWidth[k][0] 2641 * mode_lib->vba.CursorBPP[k][0] / 8.0 2642 / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * mode_lib->vba.VRatio[k]; 2643 } 2644 2645 dml32_CalculateSurfaceSizeInMall( 2646 mode_lib->vba.NumberOfActiveSurfaces, 2647 mode_lib->vba.MALLAllocatedForDCNFinal, 2648 mode_lib->vba.UseMALLForStaticScreen, 2649 mode_lib->vba.DCCEnable, 2650 mode_lib->vba.ViewportStationary, 2651 mode_lib->vba.ViewportXStartY, 2652 mode_lib->vba.ViewportYStartY, 2653 mode_lib->vba.ViewportXStartC, 2654 mode_lib->vba.ViewportYStartC, 2655 mode_lib->vba.ViewportWidth, 2656 mode_lib->vba.ViewportHeight, 2657 mode_lib->vba.BytePerPixelY, 2658 mode_lib->vba.ViewportWidthChroma, 2659 mode_lib->vba.ViewportHeightChroma, 2660 mode_lib->vba.BytePerPixelC, 2661 mode_lib->vba.SurfaceWidthY, 2662 mode_lib->vba.SurfaceWidthC, 2663 mode_lib->vba.SurfaceHeightY, 2664 mode_lib->vba.SurfaceHeightC, 2665 mode_lib->vba.Read256BlockWidthY, 2666 mode_lib->vba.Read256BlockWidthC, 2667 mode_lib->vba.Read256BlockHeightY, 2668 mode_lib->vba.Read256BlockHeightC, 2669 mode_lib->vba.MicroTileWidthY, 2670 mode_lib->vba.MicroTileWidthC, 2671 mode_lib->vba.MicroTileHeightY, 2672 mode_lib->vba.MicroTileHeightC, 2673 2674 /* Output */ 2675 mode_lib->vba.SurfaceSizeInMALL, 2676 &mode_lib->vba.ExceededMALLSize); 2677 2678 for (i = 0; i < v->soc.num_states; i++) { 2679 for (j = 0; j < 2; j++) { 2680 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 2681 mode_lib->vba.swath_width_luma_ub_this_state[k] = 2682 mode_lib->vba.swath_width_luma_ub_all_states[i][j][k]; 2683 mode_lib->vba.swath_width_chroma_ub_this_state[k] = 2684 mode_lib->vba.swath_width_chroma_ub_all_states[i][j][k]; 2685 mode_lib->vba.SwathWidthYThisState[k] = mode_lib->vba.SwathWidthYAllStates[i][j][k]; 2686 mode_lib->vba.SwathWidthCThisState[k] = mode_lib->vba.SwathWidthCAllStates[i][j][k]; 2687 mode_lib->vba.SwathHeightYThisState[k] = mode_lib->vba.SwathHeightYAllStates[i][j][k]; 2688 mode_lib->vba.SwathHeightCThisState[k] = mode_lib->vba.SwathHeightCAllStates[i][j][k]; 2689 mode_lib->vba.DETBufferSizeInKByteThisState[k] = 2690 mode_lib->vba.DETBufferSizeInKByteAllStates[i][j][k]; 2691 mode_lib->vba.DETBufferSizeYThisState[k] = 2692 mode_lib->vba.DETBufferSizeYAllStates[i][j][k]; 2693 mode_lib->vba.DETBufferSizeCThisState[k] = 2694 mode_lib->vba.DETBufferSizeCAllStates[i][j][k]; 2695 mode_lib->vba.RequiredDPPCLKThisState[k] = mode_lib->vba.RequiredDPPCLK[i][j][k]; 2696 mode_lib->vba.NoOfDPPThisState[k] = mode_lib->vba.NoOfDPP[i][j][k]; 2697 } 2698 2699 mode_lib->vba.TotalNumberOfDCCActiveDPP[i][j] = 0; 2700 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2701 if (mode_lib->vba.DCCEnable[k] == true) { 2702 mode_lib->vba.TotalNumberOfDCCActiveDPP[i][j] = 2703 mode_lib->vba.TotalNumberOfDCCActiveDPP[i][j] 2704 + mode_lib->vba.NoOfDPP[i][j][k]; 2705 } 2706 } 2707 2708 2709 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2710 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].PixelClock = mode_lib->vba.PixelClock[k]; 2711 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].DPPPerSurface = mode_lib->vba.NoOfDPP[i][j][k]; 2712 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].SourceRotation = mode_lib->vba.SourceRotation[k]; 2713 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportHeight = mode_lib->vba.ViewportHeight[k]; 2714 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportHeightChroma = mode_lib->vba.ViewportHeightChroma[k]; 2715 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockWidth256BytesY = mode_lib->vba.Read256BlockWidthY[k]; 2716 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockHeight256BytesY = mode_lib->vba.Read256BlockHeightY[k]; 2717 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockWidth256BytesC = mode_lib->vba.Read256BlockWidthC[k]; 2718 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockHeight256BytesC = mode_lib->vba.Read256BlockHeightC[k]; 2719 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockWidthY = mode_lib->vba.MicroTileWidthY[k]; 2720 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockHeightY = mode_lib->vba.MicroTileHeightY[k]; 2721 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockWidthC = mode_lib->vba.MicroTileWidthC[k]; 2722 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BlockHeightC = mode_lib->vba.MicroTileHeightC[k]; 2723 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].InterlaceEnable = mode_lib->vba.Interlace[k]; 2724 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].HTotal = mode_lib->vba.HTotal[k]; 2725 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].DCCEnable = mode_lib->vba.DCCEnable[k]; 2726 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].SourcePixelFormat = mode_lib->vba.SourcePixelFormat[k]; 2727 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].SurfaceTiling = mode_lib->vba.SurfaceTiling[k]; 2728 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BytePerPixelY = mode_lib->vba.BytePerPixelY[k]; 2729 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].BytePerPixelC = mode_lib->vba.BytePerPixelC[k]; 2730 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ProgressiveToInterlaceUnitInOPP = 2731 mode_lib->vba.ProgressiveToInterlaceUnitInOPP; 2732 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].VRatio = mode_lib->vba.VRatio[k]; 2733 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].VRatioChroma = mode_lib->vba.VRatioChroma[k]; 2734 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].VTaps = mode_lib->vba.vtaps[k]; 2735 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].VTapsChroma = mode_lib->vba.VTAPsChroma[k]; 2736 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].PitchY = mode_lib->vba.PitchY[k]; 2737 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].DCCMetaPitchY = mode_lib->vba.DCCMetaPitchY[k]; 2738 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].PitchC = mode_lib->vba.PitchC[k]; 2739 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].DCCMetaPitchC = mode_lib->vba.DCCMetaPitchC[k]; 2740 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportStationary = mode_lib->vba.ViewportStationary[k]; 2741 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportXStart = mode_lib->vba.ViewportXStartY[k]; 2742 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportYStart = mode_lib->vba.ViewportYStartY[k]; 2743 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportXStartC = mode_lib->vba.ViewportXStartC[k]; 2744 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].ViewportYStartC = mode_lib->vba.ViewportYStartC[k]; 2745 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].FORCE_ONE_ROW_FOR_FRAME = mode_lib->vba.ForceOneRowForFrame[k]; 2746 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].SwathHeightY = mode_lib->vba.SwathHeightYThisState[k]; 2747 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters[k].SwathHeightC = mode_lib->vba.SwathHeightCThisState[k]; 2748 } 2749 2750 { 2751 dml32_CalculateVMRowAndSwath( 2752 &v->dummy_vars.dml32_CalculateVMRowAndSwath, 2753 mode_lib->vba.NumberOfActiveSurfaces, 2754 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SurfParameters, 2755 mode_lib->vba.SurfaceSizeInMALL, 2756 mode_lib->vba.PTEBufferSizeInRequestsLuma, 2757 mode_lib->vba.PTEBufferSizeInRequestsChroma, 2758 mode_lib->vba.DCCMetaBufferSizeBytes, 2759 mode_lib->vba.UseMALLForStaticScreen, 2760 mode_lib->vba.UsesMALLForPStateChange, 2761 mode_lib->vba.MALLAllocatedForDCNFinal, 2762 mode_lib->vba.SwathWidthYThisState, 2763 mode_lib->vba.SwathWidthCThisState, 2764 mode_lib->vba.GPUVMEnable, 2765 mode_lib->vba.HostVMEnable, 2766 mode_lib->vba.HostVMMaxNonCachedPageTableLevels, 2767 mode_lib->vba.GPUVMMaxPageTableLevels, 2768 mode_lib->vba.GPUVMMinPageSizeKBytes, 2769 mode_lib->vba.HostVMMinPageSize, 2770 2771 /* Output */ 2772 mode_lib->vba.PTEBufferSizeNotExceededPerState, 2773 mode_lib->vba.DCCMetaBufferSizeNotExceededPerState, 2774 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[0], 2775 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[1], 2776 mode_lib->vba.dpte_row_height, 2777 mode_lib->vba.dpte_row_height_chroma, 2778 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[2], 2779 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[3], 2780 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[4], 2781 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[5], 2782 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[6], 2783 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[7], 2784 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[8], 2785 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[9], 2786 mode_lib->vba.meta_row_height, 2787 mode_lib->vba.meta_row_height_chroma, 2788 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[10], 2789 mode_lib->vba.dpte_group_bytes, 2790 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[11], 2791 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[12], 2792 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[13], 2793 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[14], 2794 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[15], 2795 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[16], 2796 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[17], 2797 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[18], 2798 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[19], 2799 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[20], 2800 mode_lib->vba.PrefetchLinesYThisState, 2801 mode_lib->vba.PrefetchLinesCThisState, 2802 mode_lib->vba.PrefillY, 2803 mode_lib->vba.PrefillC, 2804 mode_lib->vba.MaxNumSwY, 2805 mode_lib->vba.MaxNumSwC, 2806 mode_lib->vba.meta_row_bandwidth_this_state, 2807 mode_lib->vba.dpte_row_bandwidth_this_state, 2808 mode_lib->vba.DPTEBytesPerRowThisState, 2809 mode_lib->vba.PDEAndMetaPTEBytesPerFrameThisState, 2810 mode_lib->vba.MetaRowBytesThisState, 2811 mode_lib->vba.use_one_row_for_frame_this_state, 2812 mode_lib->vba.use_one_row_for_frame_flip_this_state, 2813 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_boolean_array[0], // Boolean UsesMALLForStaticScreen[] 2814 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_boolean_array[1], // Boolean PTE_BUFFER_MODE[] 2815 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer_array[21]); // Long BIGK_FRAGMENT_SIZE[] 2816 } 2817 2818 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2819 mode_lib->vba.PrefetchLinesY[i][j][k] = mode_lib->vba.PrefetchLinesYThisState[k]; 2820 mode_lib->vba.PrefetchLinesC[i][j][k] = mode_lib->vba.PrefetchLinesCThisState[k]; 2821 mode_lib->vba.meta_row_bandwidth[i][j][k] = 2822 mode_lib->vba.meta_row_bandwidth_this_state[k]; 2823 mode_lib->vba.dpte_row_bandwidth[i][j][k] = 2824 mode_lib->vba.dpte_row_bandwidth_this_state[k]; 2825 mode_lib->vba.DPTEBytesPerRow[i][j][k] = mode_lib->vba.DPTEBytesPerRowThisState[k]; 2826 mode_lib->vba.PDEAndMetaPTEBytesPerFrame[i][j][k] = 2827 mode_lib->vba.PDEAndMetaPTEBytesPerFrameThisState[k]; 2828 mode_lib->vba.MetaRowBytes[i][j][k] = mode_lib->vba.MetaRowBytesThisState[k]; 2829 mode_lib->vba.use_one_row_for_frame[i][j][k] = 2830 mode_lib->vba.use_one_row_for_frame_this_state[k]; 2831 mode_lib->vba.use_one_row_for_frame_flip[i][j][k] = 2832 mode_lib->vba.use_one_row_for_frame_flip_this_state[k]; 2833 } 2834 2835 mode_lib->vba.PTEBufferSizeNotExceeded[i][j] = true; 2836 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2837 if (mode_lib->vba.PTEBufferSizeNotExceededPerState[k] == false) 2838 mode_lib->vba.PTEBufferSizeNotExceeded[i][j] = false; 2839 } 2840 2841 mode_lib->vba.DCCMetaBufferSizeNotExceeded[i][j] = true; 2842 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2843 if (mode_lib->vba.DCCMetaBufferSizeNotExceededPerState[k] == false) 2844 mode_lib->vba.DCCMetaBufferSizeNotExceeded[i][j] = false; 2845 } 2846 2847 mode_lib->vba.UrgLatency[i] = dml32_CalculateUrgentLatency( 2848 mode_lib->vba.UrgentLatencyPixelDataOnly, 2849 mode_lib->vba.UrgentLatencyPixelMixedWithVMData, 2850 mode_lib->vba.UrgentLatencyVMDataOnly, mode_lib->vba.DoUrgentLatencyAdjustment, 2851 mode_lib->vba.UrgentLatencyAdjustmentFabricClockComponent, 2852 mode_lib->vba.UrgentLatencyAdjustmentFabricClockReference, 2853 mode_lib->vba.FabricClockPerState[i]); 2854 2855 //bool NotUrgentLatencyHiding[DC__NUM_DPP__MAX]; 2856 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2857 dml32_CalculateUrgentBurstFactor( 2858 mode_lib->vba.UsesMALLForPStateChange[k], 2859 mode_lib->vba.swath_width_luma_ub_this_state[k], 2860 mode_lib->vba.swath_width_chroma_ub_this_state[k], 2861 mode_lib->vba.SwathHeightYThisState[k], 2862 mode_lib->vba.SwathHeightCThisState[k], 2863 (double) mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k], 2864 mode_lib->vba.UrgLatency[i], 2865 mode_lib->vba.CursorBufferSize, 2866 mode_lib->vba.CursorWidth[k][0], 2867 mode_lib->vba.CursorBPP[k][0], 2868 mode_lib->vba.VRatio[k], 2869 mode_lib->vba.VRatioChroma[k], 2870 mode_lib->vba.BytePerPixelInDETY[k], 2871 mode_lib->vba.BytePerPixelInDETC[k], 2872 mode_lib->vba.DETBufferSizeYThisState[k], 2873 mode_lib->vba.DETBufferSizeCThisState[k], 2874 /* Output */ 2875 &mode_lib->vba.UrgentBurstFactorCursor[k], 2876 &mode_lib->vba.UrgentBurstFactorLuma[k], 2877 &mode_lib->vba.UrgentBurstFactorChroma[k], 2878 &mode_lib->vba.NoUrgentLatencyHiding[k]); 2879 } 2880 2881 dml32_CalculateDCFCLKDeepSleep( 2882 mode_lib->vba.NumberOfActiveSurfaces, 2883 mode_lib->vba.BytePerPixelY, 2884 mode_lib->vba.BytePerPixelC, 2885 mode_lib->vba.VRatio, 2886 mode_lib->vba.VRatioChroma, 2887 mode_lib->vba.SwathWidthYThisState, 2888 mode_lib->vba.SwathWidthCThisState, 2889 mode_lib->vba.NoOfDPPThisState, 2890 mode_lib->vba.HRatio, 2891 mode_lib->vba.HRatioChroma, 2892 mode_lib->vba.PixelClock, 2893 mode_lib->vba.PSCL_FACTOR, 2894 mode_lib->vba.PSCL_FACTOR_CHROMA, 2895 mode_lib->vba.RequiredDPPCLKThisState, 2896 mode_lib->vba.ReadBandwidthLuma, 2897 mode_lib->vba.ReadBandwidthChroma, 2898 mode_lib->vba.ReturnBusWidth, 2899 2900 /* Output */ 2901 &mode_lib->vba.ProjectedDCFCLKDeepSleep[i][j]); 2902 } 2903 } 2904 2905 m = 0; 2906 2907 //Calculate Return BW 2908 for (i = 0; i < (int) v->soc.num_states; ++i) { 2909 for (j = 0; j <= 1; ++j) { 2910 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 2911 if (mode_lib->vba.BlendingAndTiming[k] == k) { 2912 if (mode_lib->vba.WritebackEnable[k] == true) { 2913 mode_lib->vba.WritebackDelayTime[k] = 2914 mode_lib->vba.WritebackLatency 2915 + dml32_CalculateWriteBackDelay( 2916 mode_lib->vba.WritebackPixelFormat[k], 2917 mode_lib->vba.WritebackHRatio[k], 2918 mode_lib->vba.WritebackVRatio[k], 2919 mode_lib->vba.WritebackVTaps[k], 2920 mode_lib->vba.WritebackDestinationWidth[k], 2921 mode_lib->vba.WritebackDestinationHeight[k], 2922 mode_lib->vba.WritebackSourceHeight[k], 2923 mode_lib->vba.HTotal[k]) 2924 / mode_lib->vba.RequiredDISPCLK[i][j]; 2925 } else { 2926 mode_lib->vba.WritebackDelayTime[k] = 0.0; 2927 } 2928 for (m = 0; m <= mode_lib->vba.NumberOfActiveSurfaces - 1; m++) { 2929 if (mode_lib->vba.BlendingAndTiming[m] 2930 == k && mode_lib->vba.WritebackEnable[m] == true) { 2931 mode_lib->vba.WritebackDelayTime[k] = 2932 dml_max(mode_lib->vba.WritebackDelayTime[k], 2933 mode_lib->vba.WritebackLatency 2934 + dml32_CalculateWriteBackDelay( 2935 mode_lib->vba.WritebackPixelFormat[m], 2936 mode_lib->vba.WritebackHRatio[m], 2937 mode_lib->vba.WritebackVRatio[m], 2938 mode_lib->vba.WritebackVTaps[m], 2939 mode_lib->vba.WritebackDestinationWidth[m], 2940 mode_lib->vba.WritebackDestinationHeight[m], 2941 mode_lib->vba.WritebackSourceHeight[m], 2942 mode_lib->vba.HTotal[m]) / 2943 mode_lib->vba.RequiredDISPCLK[i][j]); 2944 } 2945 } 2946 } 2947 } 2948 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 2949 for (m = 0; m <= mode_lib->vba.NumberOfActiveSurfaces - 1; m++) { 2950 if (mode_lib->vba.BlendingAndTiming[k] == m) { 2951 mode_lib->vba.WritebackDelayTime[k] = 2952 mode_lib->vba.WritebackDelayTime[m]; 2953 } 2954 } 2955 } 2956 mode_lib->vba.MaxMaxVStartup[i][j] = 0; 2957 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 2958 mode_lib->vba.MaximumVStartup[i][j][k] = ((mode_lib->vba.Interlace[k] && 2959 !mode_lib->vba.ProgressiveToInterlaceUnitInOPP) ? 2960 dml_floor((mode_lib->vba.VTotal[k] - 2961 mode_lib->vba.VActive[k]) / 2.0, 1.0) : 2962 mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k]) 2963 - dml_max(1.0, dml_ceil(1.0 * 2964 mode_lib->vba.WritebackDelayTime[k] / 2965 (mode_lib->vba.HTotal[k] / 2966 mode_lib->vba.PixelClock[k]), 1.0)); 2967 2968 // Clamp to max OTG vstartup register limit 2969 if (mode_lib->vba.MaximumVStartup[i][j][k] > 1023) 2970 mode_lib->vba.MaximumVStartup[i][j][k] = 1023; 2971 2972 mode_lib->vba.MaxMaxVStartup[i][j] = dml_max(mode_lib->vba.MaxMaxVStartup[i][j], 2973 mode_lib->vba.MaximumVStartup[i][j][k]); 2974 } 2975 } 2976 } 2977 2978 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ReorderingBytes = mode_lib->vba.NumberOfChannels 2979 * dml_max3(mode_lib->vba.UrgentOutOfOrderReturnPerChannelPixelDataOnly, 2980 mode_lib->vba.UrgentOutOfOrderReturnPerChannelPixelMixedWithVMData, 2981 mode_lib->vba.UrgentOutOfOrderReturnPerChannelVMDataOnly); 2982 2983 dml32_CalculateMinAndMaxPrefetchMode(mode_lib->vba.AllowForPStateChangeOrStutterInVBlankFinal, 2984 &mode_lib->vba.MinPrefetchMode, 2985 &mode_lib->vba.MaxPrefetchMode); 2986 2987 for (i = 0; i < (int) v->soc.num_states; ++i) { 2988 for (j = 0; j <= 1; ++j) 2989 mode_lib->vba.DCFCLKState[i][j] = mode_lib->vba.DCFCLKPerState[i]; 2990 } 2991 2992 /* Immediate Flip and MALL parameters */ 2993 mode_lib->vba.ImmediateFlipRequiredFinal = false; 2994 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 2995 mode_lib->vba.ImmediateFlipRequiredFinal = mode_lib->vba.ImmediateFlipRequiredFinal 2996 || (mode_lib->vba.ImmediateFlipRequirement[k] == dm_immediate_flip_required); 2997 } 2998 2999 mode_lib->vba.ImmediateFlipRequiredButTheRequirementForEachSurfaceIsNotSpecified = false; 3000 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 3001 mode_lib->vba.ImmediateFlipRequiredButTheRequirementForEachSurfaceIsNotSpecified = 3002 mode_lib->vba.ImmediateFlipRequiredButTheRequirementForEachSurfaceIsNotSpecified 3003 || ((mode_lib->vba.ImmediateFlipRequirement[k] 3004 != dm_immediate_flip_required) 3005 && (mode_lib->vba.ImmediateFlipRequirement[k] 3006 != dm_immediate_flip_not_required)); 3007 } 3008 mode_lib->vba.ImmediateFlipRequiredButTheRequirementForEachSurfaceIsNotSpecified = 3009 mode_lib->vba.ImmediateFlipRequiredButTheRequirementForEachSurfaceIsNotSpecified 3010 && mode_lib->vba.ImmediateFlipRequiredFinal; 3011 3012 mode_lib->vba.ImmediateFlipOrHostVMAndPStateWithMALLFullFrameOrPhantomPipe = false; 3013 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 3014 mode_lib->vba.ImmediateFlipOrHostVMAndPStateWithMALLFullFrameOrPhantomPipe = 3015 mode_lib->vba.ImmediateFlipOrHostVMAndPStateWithMALLFullFrameOrPhantomPipe || 3016 ((mode_lib->vba.HostVMEnable == true || mode_lib->vba.ImmediateFlipRequirement[k] != 3017 dm_immediate_flip_not_required) && 3018 (mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_full_frame || 3019 mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_phantom_pipe)); 3020 } 3021 3022 mode_lib->vba.InvalidCombinationOfMALLUseForPStateAndStaticScreen = false; 3023 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 3024 mode_lib->vba.InvalidCombinationOfMALLUseForPStateAndStaticScreen = 3025 mode_lib->vba.InvalidCombinationOfMALLUseForPStateAndStaticScreen 3026 || ((mode_lib->vba.UseMALLForStaticScreen[k] == dm_use_mall_static_screen_enable 3027 || mode_lib->vba.UseMALLForStaticScreen[k] == dm_use_mall_static_screen_optimize) 3028 && (mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_phantom_pipe)) 3029 || ((mode_lib->vba.UseMALLForStaticScreen[k] == dm_use_mall_static_screen_disable 3030 || mode_lib->vba.UseMALLForStaticScreen[k] == dm_use_mall_static_screen_optimize) 3031 && (mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_full_frame)); 3032 } 3033 3034 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.FullFrameMALLPStateMethod = false; 3035 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SubViewportMALLPStateMethod = false; 3036 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.PhantomPipeMALLPStateMethod = false; 3037 3038 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 3039 if (mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_full_frame) 3040 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.FullFrameMALLPStateMethod = true; 3041 if (mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_sub_viewport) 3042 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SubViewportMALLPStateMethod = true; 3043 if (mode_lib->vba.UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_phantom_pipe) 3044 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.PhantomPipeMALLPStateMethod = true; 3045 } 3046 mode_lib->vba.InvalidCombinationOfMALLUseForPState = (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SubViewportMALLPStateMethod 3047 != v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.PhantomPipeMALLPStateMethod) || (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.SubViewportMALLPStateMethod && v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.FullFrameMALLPStateMethod); 3048 3049 if (mode_lib->vba.UseMinimumRequiredDCFCLK == true) { 3050 dml32_UseMinimumDCFCLK( 3051 mode_lib->vba.UsesMALLForPStateChange, 3052 mode_lib->vba.DRRDisplay, 3053 mode_lib->vba.SynchronizeDRRDisplaysForUCLKPStateChangeFinal, 3054 mode_lib->vba.MaxInterDCNTileRepeaters, 3055 mode_lib->vba.MaxPrefetchMode, 3056 mode_lib->vba.DRAMClockChangeLatency, 3057 mode_lib->vba.FCLKChangeLatency, 3058 mode_lib->vba.SREnterPlusExitTime, 3059 mode_lib->vba.ReturnBusWidth, 3060 mode_lib->vba.RoundTripPingLatencyCycles, 3061 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ReorderingBytes, 3062 mode_lib->vba.PixelChunkSizeInKByte, 3063 mode_lib->vba.MetaChunkSize, 3064 mode_lib->vba.GPUVMEnable, 3065 mode_lib->vba.GPUVMMaxPageTableLevels, 3066 mode_lib->vba.HostVMEnable, 3067 mode_lib->vba.NumberOfActiveSurfaces, 3068 mode_lib->vba.HostVMMinPageSize, 3069 mode_lib->vba.HostVMMaxNonCachedPageTableLevels, 3070 mode_lib->vba.DynamicMetadataVMEnabled, 3071 mode_lib->vba.ImmediateFlipRequiredFinal, 3072 mode_lib->vba.ProgressiveToInterlaceUnitInOPP, 3073 mode_lib->vba.MaxAveragePercentOfIdealSDPPortBWDisplayCanUseInNormalSystemOperation, 3074 mode_lib->vba.PercentOfIdealFabricAndSDPPortBWReceivedAfterUrgLatency, 3075 mode_lib->vba.VTotal, 3076 mode_lib->vba.VActive, 3077 mode_lib->vba.DynamicMetadataTransmittedBytes, 3078 mode_lib->vba.DynamicMetadataLinesBeforeActiveRequired, 3079 mode_lib->vba.Interlace, 3080 mode_lib->vba.RequiredDPPCLK, 3081 mode_lib->vba.RequiredDISPCLK, 3082 mode_lib->vba.UrgLatency, 3083 mode_lib->vba.NoOfDPP, 3084 mode_lib->vba.ProjectedDCFCLKDeepSleep, 3085 mode_lib->vba.MaximumVStartup, 3086 mode_lib->vba.TotalNumberOfActiveDPP, 3087 mode_lib->vba.TotalNumberOfDCCActiveDPP, 3088 mode_lib->vba.dpte_group_bytes, 3089 mode_lib->vba.PrefetchLinesY, 3090 mode_lib->vba.PrefetchLinesC, 3091 mode_lib->vba.swath_width_luma_ub_all_states, 3092 mode_lib->vba.swath_width_chroma_ub_all_states, 3093 mode_lib->vba.BytePerPixelY, 3094 mode_lib->vba.BytePerPixelC, 3095 mode_lib->vba.HTotal, 3096 mode_lib->vba.PixelClock, 3097 mode_lib->vba.PDEAndMetaPTEBytesPerFrame, 3098 mode_lib->vba.DPTEBytesPerRow, 3099 mode_lib->vba.MetaRowBytes, 3100 mode_lib->vba.DynamicMetadataEnable, 3101 mode_lib->vba.ReadBandwidthLuma, 3102 mode_lib->vba.ReadBandwidthChroma, 3103 mode_lib->vba.DCFCLKPerState, 3104 3105 /* Output */ 3106 mode_lib->vba.DCFCLKState); 3107 } // UseMinimumRequiredDCFCLK == true 3108 3109 for (i = 0; i < (int) v->soc.num_states; ++i) { 3110 for (j = 0; j <= 1; ++j) { 3111 mode_lib->vba.ReturnBWPerState[i][j] = dml32_get_return_bw_mbps(&mode_lib->vba.soc, i, 3112 mode_lib->vba.HostVMEnable, mode_lib->vba.DCFCLKState[i][j], 3113 mode_lib->vba.FabricClockPerState[i], mode_lib->vba.DRAMSpeedPerState[i]); 3114 } 3115 } 3116 3117 //Re-ordering Buffer Support Check 3118 for (i = 0; i < (int) v->soc.num_states; ++i) { 3119 for (j = 0; j <= 1; ++j) { 3120 if ((mode_lib->vba.ROBBufferSizeInKByte - mode_lib->vba.PixelChunkSizeInKByte) * 1024 3121 / mode_lib->vba.ReturnBWPerState[i][j] 3122 > (mode_lib->vba.RoundTripPingLatencyCycles + 32) 3123 / mode_lib->vba.DCFCLKState[i][j] 3124 + v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ReorderingBytes / mode_lib->vba.ReturnBWPerState[i][j]) { 3125 mode_lib->vba.ROBSupport[i][j] = true; 3126 } else { 3127 mode_lib->vba.ROBSupport[i][j] = false; 3128 } 3129 } 3130 } 3131 3132 //Vertical Active BW support check 3133 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaxTotalVActiveRDBandwidth = 0; 3134 3135 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 3136 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaxTotalVActiveRDBandwidth += mode_lib->vba.ReadBandwidthLuma[k] 3137 + mode_lib->vba.ReadBandwidthChroma[k]; 3138 } 3139 3140 for (i = 0; i < (int) v->soc.num_states; ++i) { 3141 for (j = 0; j <= 1; ++j) { 3142 mode_lib->vba.MaxTotalVerticalActiveAvailableBandwidth[i][j] = 3143 dml_min3(mode_lib->vba.ReturnBusWidth * mode_lib->vba.DCFCLKState[i][j] 3144 * mode_lib->vba.MaxAveragePercentOfIdealSDPPortBWDisplayCanUseInNormalSystemOperation / 100, 3145 mode_lib->vba.FabricClockPerState[i] 3146 * mode_lib->vba.FabricDatapathToDCNDataReturn 3147 * mode_lib->vba.MaxAveragePercentOfIdealFabricBWDisplayCanUseInNormalSystemOperation / 100, 3148 mode_lib->vba.DRAMSpeedPerState[i] 3149 * mode_lib->vba.NumberOfChannels 3150 * mode_lib->vba.DRAMChannelWidth 3151 * (i < 2 ? mode_lib->vba.MaxAveragePercentOfIdealDRAMBWDisplayCanUseInNormalSystemOperationSTROBE : mode_lib->vba.MaxAveragePercentOfIdealDRAMBWDisplayCanUseInNormalSystemOperation) / 100); 3152 3153 if (v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.MaxTotalVActiveRDBandwidth 3154 <= mode_lib->vba.MaxTotalVerticalActiveAvailableBandwidth[i][j]) { 3155 mode_lib->vba.TotalVerticalActiveBandwidthSupport[i][j] = true; 3156 } else { 3157 mode_lib->vba.TotalVerticalActiveBandwidthSupport[i][j] = false; 3158 } 3159 } 3160 } 3161 3162 /* Prefetch Check */ 3163 3164 for (i = 0; i < (int) v->soc.num_states; ++i) { 3165 for (j = 0; j <= 1; ++j) { 3166 3167 mode_lib->vba.TimeCalc = 24 / mode_lib->vba.ProjectedDCFCLKDeepSleep[i][j]; 3168 3169 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 3170 mode_lib->vba.NoOfDPPThisState[k] = mode_lib->vba.NoOfDPP[i][j][k]; 3171 mode_lib->vba.swath_width_luma_ub_this_state[k] = 3172 mode_lib->vba.swath_width_luma_ub_all_states[i][j][k]; 3173 mode_lib->vba.swath_width_chroma_ub_this_state[k] = 3174 mode_lib->vba.swath_width_chroma_ub_all_states[i][j][k]; 3175 mode_lib->vba.SwathWidthYThisState[k] = mode_lib->vba.SwathWidthYAllStates[i][j][k]; 3176 mode_lib->vba.SwathWidthCThisState[k] = mode_lib->vba.SwathWidthCAllStates[i][j][k]; 3177 mode_lib->vba.SwathHeightYThisState[k] = mode_lib->vba.SwathHeightYAllStates[i][j][k]; 3178 mode_lib->vba.SwathHeightCThisState[k] = mode_lib->vba.SwathHeightCAllStates[i][j][k]; 3179 mode_lib->vba.UnboundedRequestEnabledThisState = 3180 mode_lib->vba.UnboundedRequestEnabledAllStates[i][j]; 3181 mode_lib->vba.CompressedBufferSizeInkByteThisState = 3182 mode_lib->vba.CompressedBufferSizeInkByteAllStates[i][j]; 3183 mode_lib->vba.DETBufferSizeInKByteThisState[k] = 3184 mode_lib->vba.DETBufferSizeInKByteAllStates[i][j][k]; 3185 mode_lib->vba.DETBufferSizeYThisState[k] = 3186 mode_lib->vba.DETBufferSizeYAllStates[i][j][k]; 3187 mode_lib->vba.DETBufferSizeCThisState[k] = 3188 mode_lib->vba.DETBufferSizeCAllStates[i][j][k]; 3189 } 3190 3191 mode_lib->vba.VActiveBandwithSupport[i][j] = dml32_CalculateVActiveBandwithSupport( 3192 mode_lib->vba.NumberOfActiveSurfaces, 3193 mode_lib->vba.ReturnBWPerState[i][j], 3194 mode_lib->vba.NoUrgentLatencyHiding, 3195 mode_lib->vba.ReadBandwidthLuma, 3196 mode_lib->vba.ReadBandwidthChroma, 3197 mode_lib->vba.cursor_bw, 3198 mode_lib->vba.meta_row_bandwidth_this_state, 3199 mode_lib->vba.dpte_row_bandwidth_this_state, 3200 mode_lib->vba.NoOfDPPThisState, 3201 mode_lib->vba.UrgentBurstFactorLuma, 3202 mode_lib->vba.UrgentBurstFactorChroma, 3203 mode_lib->vba.UrgentBurstFactorCursor); 3204 3205 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.VMDataOnlyReturnBWPerState = dml32_get_return_bw_mbps_vm_only(&mode_lib->vba.soc, i, 3206 mode_lib->vba.DCFCLKState[i][j], mode_lib->vba.FabricClockPerState[i], 3207 mode_lib->vba.DRAMSpeedPerState[i]); 3208 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.HostVMInefficiencyFactor = 1; 3209 3210 if (mode_lib->vba.GPUVMEnable && mode_lib->vba.HostVMEnable) 3211 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.HostVMInefficiencyFactor = mode_lib->vba.ReturnBWPerState[i][j] 3212 / v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.VMDataOnlyReturnBWPerState; 3213 3214 mode_lib->vba.ExtraLatency = dml32_CalculateExtraLatency( 3215 mode_lib->vba.RoundTripPingLatencyCycles, v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.ReorderingBytes, 3216 mode_lib->vba.DCFCLKState[i][j], mode_lib->vba.TotalNumberOfActiveDPP[i][j], 3217 mode_lib->vba.PixelChunkSizeInKByte, 3218 mode_lib->vba.TotalNumberOfDCCActiveDPP[i][j], mode_lib->vba.MetaChunkSize, 3219 mode_lib->vba.ReturnBWPerState[i][j], mode_lib->vba.GPUVMEnable, 3220 mode_lib->vba.HostVMEnable, mode_lib->vba.NumberOfActiveSurfaces, 3221 mode_lib->vba.NoOfDPPThisState, mode_lib->vba.dpte_group_bytes, 3222 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.HostVMInefficiencyFactor, mode_lib->vba.HostVMMinPageSize, 3223 mode_lib->vba.HostVMMaxNonCachedPageTableLevels); 3224 3225 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NextPrefetchModeState = mode_lib->vba.MinPrefetchMode; 3226 3227 mode_lib->vba.NextMaxVStartup = mode_lib->vba.MaxMaxVStartup[i][j]; 3228 3229 do { 3230 mode_lib->vba.PrefetchModePerState[i][j] = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NextPrefetchModeState; 3231 mode_lib->vba.MaxVStartup = mode_lib->vba.NextMaxVStartup; 3232 3233 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 3234 mode_lib->vba.TWait = dml32_CalculateTWait( 3235 mode_lib->vba.PrefetchModePerState[i][j], 3236 mode_lib->vba.UsesMALLForPStateChange[k], 3237 mode_lib->vba.SynchronizeDRRDisplaysForUCLKPStateChangeFinal, 3238 mode_lib->vba.DRRDisplay[k], 3239 mode_lib->vba.DRAMClockChangeLatency, 3240 mode_lib->vba.FCLKChangeLatency, mode_lib->vba.UrgLatency[i], 3241 mode_lib->vba.SREnterPlusExitTime); 3242 3243 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.Dppclk = mode_lib->vba.RequiredDPPCLK[i][j][k]; 3244 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.Dispclk = mode_lib->vba.RequiredDISPCLK[i][j]; 3245 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.PixelClock = mode_lib->vba.PixelClock[k]; 3246 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.DCFClkDeepSleep = mode_lib->vba.ProjectedDCFCLKDeepSleep[i][j]; 3247 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.DPPPerSurface = mode_lib->vba.NoOfDPP[i][j][k]; 3248 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.ScalerEnabled = mode_lib->vba.ScalerEnabled[k]; 3249 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.SourceRotation = mode_lib->vba.SourceRotation[k]; 3250 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.BlockWidth256BytesY = mode_lib->vba.Read256BlockWidthY[k]; 3251 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.BlockHeight256BytesY = mode_lib->vba.Read256BlockHeightY[k]; 3252 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.BlockWidth256BytesC = mode_lib->vba.Read256BlockWidthC[k]; 3253 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.BlockHeight256BytesC = mode_lib->vba.Read256BlockHeightC[k]; 3254 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.InterlaceEnable = mode_lib->vba.Interlace[k]; 3255 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.NumberOfCursors = mode_lib->vba.NumberOfCursors[k]; 3256 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.VBlank = mode_lib->vba.VTotal[k] - mode_lib->vba.VActive[k]; 3257 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.HTotal = mode_lib->vba.HTotal[k]; 3258 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.HActive = mode_lib->vba.HActive[k]; 3259 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.DCCEnable = mode_lib->vba.DCCEnable[k]; 3260 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.ODMMode = mode_lib->vba.ODMCombineEnablePerState[i][k]; 3261 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.SourcePixelFormat = mode_lib->vba.SourcePixelFormat[k]; 3262 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.BytePerPixelY = mode_lib->vba.BytePerPixelY[k]; 3263 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.BytePerPixelC = mode_lib->vba.BytePerPixelC[k]; 3264 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe.ProgressiveToInterlaceUnitInOPP = 3265 mode_lib->vba.ProgressiveToInterlaceUnitInOPP; 3266 3267 mode_lib->vba.NoTimeForPrefetch[i][j][k] = 3268 dml32_CalculatePrefetchSchedule( 3269 &v->dummy_vars.dml32_CalculatePrefetchSchedule, 3270 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.HostVMInefficiencyFactor, 3271 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe, 3272 mode_lib->vba.DSCDelayPerState[i][k], 3273 mode_lib->vba.DPPCLKDelaySubtotal + 3274 mode_lib->vba.DPPCLKDelayCNVCFormater, 3275 mode_lib->vba.DPPCLKDelaySCL, 3276 mode_lib->vba.DPPCLKDelaySCLLBOnly, 3277 mode_lib->vba.DPPCLKDelayCNVCCursor, 3278 mode_lib->vba.DISPCLKDelaySubtotal, 3279 mode_lib->vba.SwathWidthYThisState[k] / 3280 mode_lib->vba.HRatio[k], 3281 mode_lib->vba.OutputFormat[k], 3282 mode_lib->vba.MaxInterDCNTileRepeaters, 3283 dml_min(mode_lib->vba.MaxVStartup, 3284 mode_lib->vba.MaximumVStartup[i][j][k]), 3285 mode_lib->vba.MaximumVStartup[i][j][k], 3286 mode_lib->vba.GPUVMMaxPageTableLevels, 3287 mode_lib->vba.GPUVMEnable, mode_lib->vba.HostVMEnable, 3288 mode_lib->vba.HostVMMaxNonCachedPageTableLevels, 3289 mode_lib->vba.HostVMMinPageSize, 3290 mode_lib->vba.DynamicMetadataEnable[k], 3291 mode_lib->vba.DynamicMetadataVMEnabled, 3292 mode_lib->vba.DynamicMetadataLinesBeforeActiveRequired[k], 3293 mode_lib->vba.DynamicMetadataTransmittedBytes[k], 3294 mode_lib->vba.UrgLatency[i], 3295 mode_lib->vba.ExtraLatency, 3296 mode_lib->vba.TimeCalc, 3297 mode_lib->vba.PDEAndMetaPTEBytesPerFrame[i][j][k], 3298 mode_lib->vba.MetaRowBytes[i][j][k], 3299 mode_lib->vba.DPTEBytesPerRow[i][j][k], 3300 mode_lib->vba.PrefetchLinesY[i][j][k], 3301 mode_lib->vba.SwathWidthYThisState[k], 3302 mode_lib->vba.PrefillY[k], 3303 mode_lib->vba.MaxNumSwY[k], 3304 mode_lib->vba.PrefetchLinesC[i][j][k], 3305 mode_lib->vba.SwathWidthCThisState[k], 3306 mode_lib->vba.PrefillC[k], 3307 mode_lib->vba.MaxNumSwC[k], 3308 mode_lib->vba.swath_width_luma_ub_this_state[k], 3309 mode_lib->vba.swath_width_chroma_ub_this_state[k], 3310 mode_lib->vba.SwathHeightYThisState[k], 3311 mode_lib->vba.SwathHeightCThisState[k], mode_lib->vba.TWait, 3312 3313 /* Output */ 3314 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.DSTXAfterScaler[k], 3315 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.DSTYAfterScaler[k], 3316 &mode_lib->vba.LineTimesForPrefetch[k], 3317 &mode_lib->vba.PrefetchBW[k], 3318 &mode_lib->vba.LinesForMetaPTE[k], 3319 &mode_lib->vba.LinesForMetaAndDPTERow[k], 3320 &mode_lib->vba.VRatioPreY[i][j][k], 3321 &mode_lib->vba.VRatioPreC[i][j][k], 3322 &mode_lib->vba.RequiredPrefetchPixelDataBWLuma[0][0][k], 3323 &mode_lib->vba.RequiredPrefetchPixelDataBWChroma[0][0][k], 3324 &mode_lib->vba.NoTimeForDynamicMetadata[i][j][k], 3325 &mode_lib->vba.Tno_bw[k], 3326 &mode_lib->vba.prefetch_vmrow_bw[k], 3327 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[0], // double *Tdmdl_vm 3328 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[1], // double *Tdmdl 3329 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[2], // double *TSetup 3330 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer[0], // unsigned int *VUpdateOffsetPix 3331 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[3], // unsigned int *VUpdateWidthPix 3332 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[4]); // unsigned int *VReadyOffsetPix 3333 } 3334 3335 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 3336 dml32_CalculateUrgentBurstFactor( 3337 mode_lib->vba.UsesMALLForPStateChange[k], 3338 mode_lib->vba.swath_width_luma_ub_this_state[k], 3339 mode_lib->vba.swath_width_chroma_ub_this_state[k], 3340 mode_lib->vba.SwathHeightYThisState[k], 3341 mode_lib->vba.SwathHeightCThisState[k], 3342 mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k], 3343 mode_lib->vba.UrgLatency[i], mode_lib->vba.CursorBufferSize, 3344 mode_lib->vba.CursorWidth[k][0], mode_lib->vba.CursorBPP[k][0], 3345 mode_lib->vba.VRatioPreY[i][j][k], 3346 mode_lib->vba.VRatioPreC[i][j][k], 3347 mode_lib->vba.BytePerPixelInDETY[k], 3348 mode_lib->vba.BytePerPixelInDETC[k], 3349 mode_lib->vba.DETBufferSizeYThisState[k], 3350 mode_lib->vba.DETBufferSizeCThisState[k], 3351 /* Output */ 3352 &mode_lib->vba.UrgentBurstFactorCursorPre[k], 3353 &mode_lib->vba.UrgentBurstFactorLumaPre[k], 3354 &mode_lib->vba.UrgentBurstFactorChroma[k], 3355 &mode_lib->vba.NotUrgentLatencyHidingPre[k]); 3356 } 3357 3358 { 3359 dml32_CalculatePrefetchBandwithSupport( 3360 mode_lib->vba.NumberOfActiveSurfaces, 3361 mode_lib->vba.ReturnBWPerState[i][j], 3362 mode_lib->vba.NotUrgentLatencyHidingPre, 3363 mode_lib->vba.ReadBandwidthLuma, 3364 mode_lib->vba.ReadBandwidthChroma, 3365 mode_lib->vba.RequiredPrefetchPixelDataBWLuma[0][0], 3366 mode_lib->vba.RequiredPrefetchPixelDataBWChroma[0][0], 3367 mode_lib->vba.cursor_bw, 3368 mode_lib->vba.meta_row_bandwidth_this_state, 3369 mode_lib->vba.dpte_row_bandwidth_this_state, 3370 mode_lib->vba.cursor_bw_pre, 3371 mode_lib->vba.prefetch_vmrow_bw, 3372 mode_lib->vba.NoOfDPPThisState, 3373 mode_lib->vba.UrgentBurstFactorLuma, 3374 mode_lib->vba.UrgentBurstFactorChroma, 3375 mode_lib->vba.UrgentBurstFactorCursor, 3376 mode_lib->vba.UrgentBurstFactorLumaPre, 3377 mode_lib->vba.UrgentBurstFactorChromaPre, 3378 mode_lib->vba.UrgentBurstFactorCursorPre, 3379 3380 /* output */ 3381 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[0], // Single *PrefetchBandwidth 3382 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[1], // Single *FractionOfUrgentBandwidth 3383 &mode_lib->vba.PrefetchSupported[i][j]); 3384 } 3385 3386 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 3387 if (mode_lib->vba.LineTimesForPrefetch[k] 3388 < 2.0 || mode_lib->vba.LinesForMetaPTE[k] >= 32.0 3389 || mode_lib->vba.LinesForMetaAndDPTERow[k] >= 16.0 3390 || mode_lib->vba.NoTimeForPrefetch[i][j][k] == true) { 3391 mode_lib->vba.PrefetchSupported[i][j] = false; 3392 } 3393 } 3394 3395 mode_lib->vba.DynamicMetadataSupported[i][j] = true; 3396 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 3397 if (mode_lib->vba.NoTimeForDynamicMetadata[i][j][k] == true) 3398 mode_lib->vba.DynamicMetadataSupported[i][j] = false; 3399 } 3400 3401 mode_lib->vba.VRatioInPrefetchSupported[i][j] = true; 3402 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 3403 if (mode_lib->vba.VRatioPreY[i][j][k] > __DML_MAX_VRATIO_PRE__ 3404 || mode_lib->vba.VRatioPreC[i][j][k] > __DML_MAX_VRATIO_PRE__ 3405 || mode_lib->vba.NoTimeForPrefetch[i][j][k] == true) { 3406 mode_lib->vba.VRatioInPrefetchSupported[i][j] = false; 3407 } 3408 } 3409 mode_lib->vba.AnyLinesForVMOrRowTooLarge = false; 3410 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 3411 if (mode_lib->vba.LinesForMetaAndDPTERow[k] >= 16 3412 || mode_lib->vba.LinesForMetaPTE[k] >= 32) { 3413 mode_lib->vba.AnyLinesForVMOrRowTooLarge = true; 3414 } 3415 } 3416 3417 if (mode_lib->vba.PrefetchSupported[i][j] == true 3418 && mode_lib->vba.VRatioInPrefetchSupported[i][j] == true) { 3419 mode_lib->vba.BandwidthAvailableForImmediateFlip = 3420 dml32_CalculateBandwidthAvailableForImmediateFlip( 3421 mode_lib->vba.NumberOfActiveSurfaces, 3422 mode_lib->vba.ReturnBWPerState[i][j], 3423 mode_lib->vba.ReadBandwidthLuma, 3424 mode_lib->vba.ReadBandwidthChroma, 3425 mode_lib->vba.RequiredPrefetchPixelDataBWLuma[0][0], 3426 mode_lib->vba.RequiredPrefetchPixelDataBWChroma[0][0], 3427 mode_lib->vba.cursor_bw, 3428 mode_lib->vba.cursor_bw_pre, 3429 mode_lib->vba.NoOfDPPThisState, 3430 mode_lib->vba.UrgentBurstFactorLuma, 3431 mode_lib->vba.UrgentBurstFactorChroma, 3432 mode_lib->vba.UrgentBurstFactorCursor, 3433 mode_lib->vba.UrgentBurstFactorLumaPre, 3434 mode_lib->vba.UrgentBurstFactorChromaPre, 3435 mode_lib->vba.UrgentBurstFactorCursorPre); 3436 3437 mode_lib->vba.TotImmediateFlipBytes = 0.0; 3438 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 3439 if (!(mode_lib->vba.ImmediateFlipRequirement[k] == 3440 dm_immediate_flip_not_required)) { 3441 mode_lib->vba.TotImmediateFlipBytes = 3442 mode_lib->vba.TotImmediateFlipBytes 3443 + mode_lib->vba.NoOfDPP[i][j][k] 3444 * mode_lib->vba.PDEAndMetaPTEBytesPerFrame[i][j][k] 3445 + mode_lib->vba.MetaRowBytes[i][j][k]; 3446 if (mode_lib->vba.use_one_row_for_frame_flip[i][j][k]) { 3447 mode_lib->vba.TotImmediateFlipBytes = 3448 mode_lib->vba.TotImmediateFlipBytes + 2 3449 * mode_lib->vba.DPTEBytesPerRow[i][j][k]; 3450 } else { 3451 mode_lib->vba.TotImmediateFlipBytes = 3452 mode_lib->vba.TotImmediateFlipBytes 3453 + mode_lib->vba.DPTEBytesPerRow[i][j][k]; 3454 } 3455 } 3456 } 3457 3458 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 3459 dml32_CalculateFlipSchedule(v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.HostVMInefficiencyFactor, 3460 mode_lib->vba.ExtraLatency, 3461 mode_lib->vba.UrgLatency[i], 3462 mode_lib->vba.GPUVMMaxPageTableLevels, 3463 mode_lib->vba.HostVMEnable, 3464 mode_lib->vba.HostVMMaxNonCachedPageTableLevels, 3465 mode_lib->vba.GPUVMEnable, 3466 mode_lib->vba.HostVMMinPageSize, 3467 mode_lib->vba.PDEAndMetaPTEBytesPerFrame[i][j][k], 3468 mode_lib->vba.MetaRowBytes[i][j][k], 3469 mode_lib->vba.DPTEBytesPerRow[i][j][k], 3470 mode_lib->vba.BandwidthAvailableForImmediateFlip, 3471 mode_lib->vba.TotImmediateFlipBytes, 3472 mode_lib->vba.SourcePixelFormat[k], 3473 (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]), 3474 mode_lib->vba.VRatio[k], 3475 mode_lib->vba.VRatioChroma[k], 3476 mode_lib->vba.Tno_bw[k], 3477 mode_lib->vba.DCCEnable[k], 3478 mode_lib->vba.dpte_row_height[k], 3479 mode_lib->vba.meta_row_height[k], 3480 mode_lib->vba.dpte_row_height_chroma[k], 3481 mode_lib->vba.meta_row_height_chroma[k], 3482 mode_lib->vba.use_one_row_for_frame_flip[i][j][k], // 24 3483 3484 /* Output */ 3485 &mode_lib->vba.DestinationLinesToRequestVMInImmediateFlip[k], 3486 &mode_lib->vba.DestinationLinesToRequestRowInImmediateFlip[k], 3487 &mode_lib->vba.final_flip_bw[k], 3488 &mode_lib->vba.ImmediateFlipSupportedForPipe[k]); 3489 } 3490 3491 { 3492 dml32_CalculateImmediateFlipBandwithSupport(mode_lib->vba.NumberOfActiveSurfaces, 3493 mode_lib->vba.ReturnBWPerState[i][j], 3494 mode_lib->vba.ImmediateFlipRequirement, 3495 mode_lib->vba.final_flip_bw, 3496 mode_lib->vba.ReadBandwidthLuma, 3497 mode_lib->vba.ReadBandwidthChroma, 3498 mode_lib->vba.RequiredPrefetchPixelDataBWLuma[0][0], 3499 mode_lib->vba.RequiredPrefetchPixelDataBWChroma[0][0], 3500 mode_lib->vba.cursor_bw, 3501 mode_lib->vba.meta_row_bandwidth_this_state, 3502 mode_lib->vba.dpte_row_bandwidth_this_state, 3503 mode_lib->vba.cursor_bw_pre, 3504 mode_lib->vba.prefetch_vmrow_bw, 3505 mode_lib->vba.DPPPerPlane, 3506 mode_lib->vba.UrgentBurstFactorLuma, 3507 mode_lib->vba.UrgentBurstFactorChroma, 3508 mode_lib->vba.UrgentBurstFactorCursor, 3509 mode_lib->vba.UrgentBurstFactorLumaPre, 3510 mode_lib->vba.UrgentBurstFactorChromaPre, 3511 mode_lib->vba.UrgentBurstFactorCursorPre, 3512 3513 /* output */ 3514 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[0], // Single *TotalBandwidth 3515 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single[1], // Single *FractionOfUrgentBandwidth 3516 &mode_lib->vba.ImmediateFlipSupportedForState[i][j]); // Boolean *ImmediateFlipBandwidthSupport 3517 } 3518 3519 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 3520 if (!(mode_lib->vba.ImmediateFlipRequirement[k] 3521 == dm_immediate_flip_not_required) 3522 && (mode_lib->vba.ImmediateFlipSupportedForPipe[k] 3523 == false)) 3524 mode_lib->vba.ImmediateFlipSupportedForState[i][j] = false; 3525 } 3526 } else { // if prefetch not support, assume iflip not supported 3527 mode_lib->vba.ImmediateFlipSupportedForState[i][j] = false; 3528 } 3529 3530 if (mode_lib->vba.MaxVStartup <= __DML_VBA_MIN_VSTARTUP__ 3531 || mode_lib->vba.AnyLinesForVMOrRowTooLarge == false) { 3532 mode_lib->vba.NextMaxVStartup = mode_lib->vba.MaxMaxVStartup[i][j]; 3533 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NextPrefetchModeState = v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NextPrefetchModeState + 1; 3534 } else { 3535 mode_lib->vba.NextMaxVStartup = mode_lib->vba.NextMaxVStartup - 1; 3536 } 3537 } while (!((mode_lib->vba.PrefetchSupported[i][j] == true 3538 && mode_lib->vba.DynamicMetadataSupported[i][j] == true 3539 && mode_lib->vba.VRatioInPrefetchSupported[i][j] == true && 3540 // consider flip support is okay if when there is no hostvm and the 3541 // user does't require a iflip OR the flip bw is ok 3542 // If there is hostvm, DCN needs to support iflip for invalidation 3543 ((mode_lib->vba.HostVMEnable == false 3544 && !mode_lib->vba.ImmediateFlipRequiredFinal) 3545 || mode_lib->vba.ImmediateFlipSupportedForState[i][j] == true)) 3546 || (mode_lib->vba.NextMaxVStartup == mode_lib->vba.MaxMaxVStartup[i][j] 3547 && v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.NextPrefetchModeState > mode_lib->vba.MaxPrefetchMode))); 3548 3549 for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) { 3550 mode_lib->vba.use_one_row_for_frame_this_state[k] = 3551 mode_lib->vba.use_one_row_for_frame[i][j][k]; 3552 } 3553 3554 3555 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.UrgentLatency = mode_lib->vba.UrgLatency[i]; 3556 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.ExtraLatency = mode_lib->vba.ExtraLatency; 3557 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.WritebackLatency = mode_lib->vba.WritebackLatency; 3558 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.DRAMClockChangeLatency = mode_lib->vba.DRAMClockChangeLatency; 3559 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.FCLKChangeLatency = mode_lib->vba.FCLKChangeLatency; 3560 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.SRExitTime = mode_lib->vba.SRExitTime; 3561 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.SREnterPlusExitTime = mode_lib->vba.SREnterPlusExitTime; 3562 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.SRExitZ8Time = mode_lib->vba.SRExitZ8Time; 3563 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.SREnterPlusExitZ8Time = mode_lib->vba.SREnterPlusExitZ8Time; 3564 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.USRRetrainingLatency = mode_lib->vba.USRRetrainingLatency; 3565 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters.SMNLatency = mode_lib->vba.SMNLatency; 3566 3567 { 3568 dml32_CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport( 3569 &v->dummy_vars.dml32_CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport, 3570 mode_lib->vba.USRRetrainingRequiredFinal, 3571 mode_lib->vba.UsesMALLForPStateChange, 3572 mode_lib->vba.PrefetchModePerState[i][j], 3573 mode_lib->vba.NumberOfActiveSurfaces, 3574 mode_lib->vba.MaxLineBufferLines, 3575 mode_lib->vba.LineBufferSizeFinal, 3576 mode_lib->vba.WritebackInterfaceBufferSize, 3577 mode_lib->vba.DCFCLKState[i][j], 3578 mode_lib->vba.ReturnBWPerState[i][j], 3579 mode_lib->vba.SynchronizeTimingsFinal, 3580 mode_lib->vba.SynchronizeDRRDisplaysForUCLKPStateChangeFinal, 3581 mode_lib->vba.DRRDisplay, 3582 mode_lib->vba.dpte_group_bytes, 3583 mode_lib->vba.meta_row_height, 3584 mode_lib->vba.meta_row_height_chroma, 3585 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.mSOCParameters, 3586 mode_lib->vba.WritebackChunkSize, 3587 mode_lib->vba.SOCCLKPerState[i], 3588 mode_lib->vba.ProjectedDCFCLKDeepSleep[i][j], 3589 mode_lib->vba.DETBufferSizeYThisState, 3590 mode_lib->vba.DETBufferSizeCThisState, 3591 mode_lib->vba.SwathHeightYThisState, 3592 mode_lib->vba.SwathHeightCThisState, 3593 mode_lib->vba.LBBitPerPixel, 3594 mode_lib->vba.SwathWidthYThisState, // 24 3595 mode_lib->vba.SwathWidthCThisState, 3596 mode_lib->vba.HRatio, 3597 mode_lib->vba.HRatioChroma, 3598 mode_lib->vba.vtaps, 3599 mode_lib->vba.VTAPsChroma, 3600 mode_lib->vba.VRatio, 3601 mode_lib->vba.VRatioChroma, 3602 mode_lib->vba.HTotal, 3603 mode_lib->vba.VTotal, 3604 mode_lib->vba.VActive, 3605 mode_lib->vba.PixelClock, 3606 mode_lib->vba.BlendingAndTiming, 3607 mode_lib->vba.NoOfDPPThisState, 3608 mode_lib->vba.BytePerPixelInDETY, 3609 mode_lib->vba.BytePerPixelInDETC, 3610 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.DSTXAfterScaler, 3611 v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.DSTYAfterScaler, 3612 mode_lib->vba.WritebackEnable, 3613 mode_lib->vba.WritebackPixelFormat, 3614 mode_lib->vba.WritebackDestinationWidth, 3615 mode_lib->vba.WritebackDestinationHeight, 3616 mode_lib->vba.WritebackSourceHeight, 3617 mode_lib->vba.UnboundedRequestEnabledThisState, 3618 mode_lib->vba.CompressedBufferSizeInkByteThisState, 3619 3620 /* Output */ 3621 &mode_lib->vba.Watermark, // Store the values in vba 3622 &mode_lib->vba.DRAMClockChangeSupport[i][j], 3623 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single2[0], // double *MaxActiveDRAMClockChangeLatencySupported 3624 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_integer[0], // Long SubViewportLinesNeededInMALL[] 3625 &mode_lib->vba.FCLKChangeSupport[i][j], 3626 &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.dummy_single2[1], // double *MinActiveFCLKChangeLatencySupported 3627 &mode_lib->vba.USRRetrainingSupport[i][j], 3628 mode_lib->vba.ActiveDRAMClockChangeLatencyMargin); 3629 } 3630 } 3631 } // End of Prefetch Check 3632 3633 /*Cursor Support Check*/ 3634 mode_lib->vba.CursorSupport = true; 3635 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 3636 if (mode_lib->vba.CursorWidth[k][0] > 0.0) { 3637 if (mode_lib->vba.CursorBPP[k][0] == 64 && mode_lib->vba.Cursor64BppSupport == false) 3638 mode_lib->vba.CursorSupport = false; 3639 } 3640 } 3641 3642 /*Valid Pitch Check*/ 3643 mode_lib->vba.PitchSupport = true; 3644 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 3645 mode_lib->vba.AlignedYPitch[k] = dml_ceil( 3646 dml_max(mode_lib->vba.PitchY[k], mode_lib->vba.SurfaceWidthY[k]), 3647 mode_lib->vba.MacroTileWidthY[k]); 3648 if (mode_lib->vba.DCCEnable[k] == true) { 3649 mode_lib->vba.AlignedDCCMetaPitchY[k] = dml_ceil( 3650 dml_max(mode_lib->vba.DCCMetaPitchY[k], mode_lib->vba.SurfaceWidthY[k]), 3651 64.0 * mode_lib->vba.Read256BlockWidthY[k]); 3652 } else { 3653 mode_lib->vba.AlignedDCCMetaPitchY[k] = mode_lib->vba.DCCMetaPitchY[k]; 3654 } 3655 if (mode_lib->vba.SourcePixelFormat[k] != dm_444_64 && mode_lib->vba.SourcePixelFormat[k] != dm_444_32 3656 && mode_lib->vba.SourcePixelFormat[k] != dm_444_16 3657 && mode_lib->vba.SourcePixelFormat[k] != dm_mono_16 3658 && mode_lib->vba.SourcePixelFormat[k] != dm_rgbe 3659 && mode_lib->vba.SourcePixelFormat[k] != dm_mono_8) { 3660 mode_lib->vba.AlignedCPitch[k] = dml_ceil( 3661 dml_max(mode_lib->vba.PitchC[k], mode_lib->vba.SurfaceWidthC[k]), 3662 mode_lib->vba.MacroTileWidthC[k]); 3663 if (mode_lib->vba.DCCEnable[k] == true) { 3664 mode_lib->vba.AlignedDCCMetaPitchC[k] = dml_ceil( 3665 dml_max(mode_lib->vba.DCCMetaPitchC[k], 3666 mode_lib->vba.SurfaceWidthC[k]), 3667 64.0 * mode_lib->vba.Read256BlockWidthC[k]); 3668 } else { 3669 mode_lib->vba.AlignedDCCMetaPitchC[k] = mode_lib->vba.DCCMetaPitchC[k]; 3670 } 3671 } else { 3672 mode_lib->vba.AlignedCPitch[k] = mode_lib->vba.PitchC[k]; 3673 mode_lib->vba.AlignedDCCMetaPitchC[k] = mode_lib->vba.DCCMetaPitchC[k]; 3674 } 3675 if (mode_lib->vba.AlignedYPitch[k] > mode_lib->vba.PitchY[k] 3676 || mode_lib->vba.AlignedCPitch[k] > mode_lib->vba.PitchC[k] 3677 || mode_lib->vba.AlignedDCCMetaPitchY[k] > mode_lib->vba.DCCMetaPitchY[k] 3678 || mode_lib->vba.AlignedDCCMetaPitchC[k] > mode_lib->vba.DCCMetaPitchC[k]) { 3679 mode_lib->vba.PitchSupport = false; 3680 } 3681 } 3682 3683 mode_lib->vba.ViewportExceedsSurface = false; 3684 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 3685 if (mode_lib->vba.ViewportWidth[k] > mode_lib->vba.SurfaceWidthY[k] 3686 || mode_lib->vba.ViewportHeight[k] > mode_lib->vba.SurfaceHeightY[k]) { 3687 mode_lib->vba.ViewportExceedsSurface = true; 3688 if (mode_lib->vba.SourcePixelFormat[k] != dm_444_64 3689 && mode_lib->vba.SourcePixelFormat[k] != dm_444_32 3690 && mode_lib->vba.SourcePixelFormat[k] != dm_444_16 3691 && mode_lib->vba.SourcePixelFormat[k] != dm_444_16 3692 && mode_lib->vba.SourcePixelFormat[k] != dm_444_8 3693 && mode_lib->vba.SourcePixelFormat[k] != dm_rgbe) { 3694 if (mode_lib->vba.ViewportWidthChroma[k] > mode_lib->vba.SurfaceWidthC[k] 3695 || mode_lib->vba.ViewportHeightChroma[k] 3696 > mode_lib->vba.SurfaceHeightC[k]) { 3697 mode_lib->vba.ViewportExceedsSurface = true; 3698 } 3699 } 3700 } 3701 } 3702 3703 /*Mode Support, Voltage State and SOC Configuration*/ 3704 mode_support_configuration(v, mode_lib); 3705 3706 MaximumMPCCombine = 0; 3707 3708 for (i = v->soc.num_states; i >= 0; i--) { 3709 if (i == v->soc.num_states || mode_lib->vba.ModeSupport[i][0] == true || 3710 mode_lib->vba.ModeSupport[i][1] == true) { 3711 mode_lib->vba.VoltageLevel = i; 3712 mode_lib->vba.ModeIsSupported = mode_lib->vba.ModeSupport[i][0] == true 3713 || mode_lib->vba.ModeSupport[i][1] == true; 3714 3715 if (mode_lib->vba.ModeSupport[i][0] == true) { 3716 MaximumMPCCombine = 0; 3717 } else { 3718 MaximumMPCCombine = 1; 3719 } 3720 } 3721 } 3722 3723 mode_lib->vba.ImmediateFlipSupport = 3724 mode_lib->vba.ImmediateFlipSupportedForState[mode_lib->vba.VoltageLevel][MaximumMPCCombine]; 3725 mode_lib->vba.UnboundedRequestEnabled = 3726 mode_lib->vba.UnboundedRequestEnabledAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine]; 3727 mode_lib->vba.CompressedBufferSizeInkByte = 3728 mode_lib->vba.CompressedBufferSizeInkByteAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine]; // Not used, informational 3729 3730 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 3731 mode_lib->vba.MPCCombineEnable[k] = 3732 mode_lib->vba.MPCCombine[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k]; 3733 mode_lib->vba.DPPPerPlane[k] = mode_lib->vba.NoOfDPP[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k]; 3734 mode_lib->vba.SwathHeightY[k] = 3735 mode_lib->vba.SwathHeightYAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k]; 3736 mode_lib->vba.SwathHeightC[k] = 3737 mode_lib->vba.SwathHeightCAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k]; 3738 mode_lib->vba.DETBufferSizeInKByte[k] = 3739 mode_lib->vba.DETBufferSizeInKByteAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k]; 3740 mode_lib->vba.DETBufferSizeY[k] = 3741 mode_lib->vba.DETBufferSizeYAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k]; 3742 mode_lib->vba.DETBufferSizeC[k] = 3743 mode_lib->vba.DETBufferSizeCAllStates[mode_lib->vba.VoltageLevel][MaximumMPCCombine][k]; 3744 mode_lib->vba.OutputType[k] = mode_lib->vba.OutputTypePerState[mode_lib->vba.VoltageLevel][k]; 3745 mode_lib->vba.OutputRate[k] = mode_lib->vba.OutputRatePerState[mode_lib->vba.VoltageLevel][k]; 3746 } 3747 3748 mode_lib->vba.DCFCLK = mode_lib->vba.DCFCLKState[mode_lib->vba.VoltageLevel][MaximumMPCCombine]; 3749 mode_lib->vba.DRAMSpeed = mode_lib->vba.DRAMSpeedPerState[mode_lib->vba.VoltageLevel]; 3750 mode_lib->vba.FabricClock = mode_lib->vba.FabricClockPerState[mode_lib->vba.VoltageLevel]; 3751 mode_lib->vba.SOCCLK = mode_lib->vba.SOCCLKPerState[mode_lib->vba.VoltageLevel]; 3752 mode_lib->vba.ReturnBW = mode_lib->vba.ReturnBWPerState[mode_lib->vba.VoltageLevel][MaximumMPCCombine]; 3753 mode_lib->vba.DISPCLK = mode_lib->vba.RequiredDISPCLK[mode_lib->vba.VoltageLevel][MaximumMPCCombine]; 3754 mode_lib->vba.maxMpcComb = MaximumMPCCombine; 3755 3756 for (k = 0; k <= mode_lib->vba.NumberOfActiveSurfaces - 1; k++) { 3757 if (mode_lib->vba.BlendingAndTiming[k] == k) { 3758 mode_lib->vba.ODMCombineEnabled[k] = 3759 mode_lib->vba.ODMCombineEnablePerState[mode_lib->vba.VoltageLevel][k]; 3760 } else { 3761 mode_lib->vba.ODMCombineEnabled[k] = dm_odm_combine_mode_disabled; 3762 } 3763 3764 mode_lib->vba.DSCEnabled[k] = mode_lib->vba.RequiresDSC[mode_lib->vba.VoltageLevel][k]; 3765 mode_lib->vba.FECEnable[k] = mode_lib->vba.RequiresFEC[mode_lib->vba.VoltageLevel][k]; 3766 mode_lib->vba.OutputBpp[k] = mode_lib->vba.OutputBppPerState[mode_lib->vba.VoltageLevel][k]; 3767 } 3768 3769 mode_lib->vba.UrgentWatermark = mode_lib->vba.Watermark.UrgentWatermark; 3770 mode_lib->vba.StutterEnterPlusExitWatermark = mode_lib->vba.Watermark.StutterEnterPlusExitWatermark; 3771 mode_lib->vba.StutterExitWatermark = mode_lib->vba.Watermark.StutterExitWatermark; 3772 mode_lib->vba.WritebackDRAMClockChangeWatermark = mode_lib->vba.Watermark.WritebackDRAMClockChangeWatermark; 3773 mode_lib->vba.DRAMClockChangeWatermark = mode_lib->vba.Watermark.DRAMClockChangeWatermark; 3774 mode_lib->vba.UrgentLatency = mode_lib->vba.UrgLatency[mode_lib->vba.VoltageLevel]; 3775 mode_lib->vba.DCFCLKDeepSleep = mode_lib->vba.ProjectedDCFCLKDeepSleep[mode_lib->vba.VoltageLevel][MaximumMPCCombine]; 3776 3777 /* VBA has Error type to Error Msg output here, but not necessary for DML-C */ 3778 } // ModeSupportAndSystemConfigurationFull 3779