Commit 86e4863e authored by Alex Deucher's avatar Alex Deucher

drm/amd/display: reduce stack for dml32_CalculatePrefetchSchedule

Move stack variables to dummy structure.
Reviewed-by: default avatarRodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
parent 3c3abac6
...@@ -757,7 +757,9 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman ...@@ -757,7 +757,9 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BytePerPixelY = v->BytePerPixelY[k]; v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BytePerPixelY = v->BytePerPixelY[k];
v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BytePerPixelC = v->BytePerPixelC[k]; v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.BytePerPixelC = v->BytePerPixelC[k];
v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.ProgressiveToInterlaceUnitInOPP = mode_lib->vba.ProgressiveToInterlaceUnitInOPP; v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe.ProgressiveToInterlaceUnitInOPP = mode_lib->vba.ProgressiveToInterlaceUnitInOPP;
v->ErrorResult[k] = dml32_CalculatePrefetchSchedule(v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.HostVMInefficiencyFactor, v->ErrorResult[k] = dml32_CalculatePrefetchSchedule(
&v->dummy_vars.dml32_CalculatePrefetchSchedule,
v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.HostVMInefficiencyFactor,
&v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe, v->DSCDelay[k], &v->dummy_vars.DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation.myPipe, v->DSCDelay[k],
mode_lib->vba.DPPCLKDelaySubtotal + mode_lib->vba.DPPCLKDelayCNVCFormater, mode_lib->vba.DPPCLKDelaySubtotal + mode_lib->vba.DPPCLKDelayCNVCFormater,
mode_lib->vba.DPPCLKDelaySCL, mode_lib->vba.DPPCLKDelaySCL,
...@@ -3195,6 +3197,7 @@ void dml32_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l ...@@ -3195,6 +3197,7 @@ void dml32_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
mode_lib->vba.NoTimeForPrefetch[i][j][k] = mode_lib->vba.NoTimeForPrefetch[i][j][k] =
dml32_CalculatePrefetchSchedule( dml32_CalculatePrefetchSchedule(
&v->dummy_vars.dml32_CalculatePrefetchSchedule,
v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.HostVMInefficiencyFactor, v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.HostVMInefficiencyFactor,
&v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe, &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.myPipe,
mode_lib->vba.DSCDelayPerState[i][k], mode_lib->vba.DSCDelayPerState[i][k],
......
...@@ -3342,6 +3342,7 @@ double dml32_CalculateExtraLatency( ...@@ -3342,6 +3342,7 @@ double dml32_CalculateExtraLatency(
} // CalculateExtraLatency } // CalculateExtraLatency
bool dml32_CalculatePrefetchSchedule( bool dml32_CalculatePrefetchSchedule(
struct dml32_CalculatePrefetchSchedule *st_vars,
double HostVMInefficiencyFactor, double HostVMInefficiencyFactor,
DmlPipe *myPipe, DmlPipe *myPipe,
unsigned int DSCDelay, unsigned int DSCDelay,
...@@ -3405,45 +3406,18 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -3405,45 +3406,18 @@ bool dml32_CalculatePrefetchSchedule(
double *VReadyOffsetPix) double *VReadyOffsetPix)
{ {
bool MyError = false; bool MyError = false;
unsigned int DPPCycles, DISPCLKCycles;
double DSTTotalPixelsAfterScaler; st_vars->TimeForFetchingMetaPTE = 0;
double LineTime; st_vars->TimeForFetchingRowInVBlank = 0;
double dst_y_prefetch_equ; st_vars->LinesToRequestPrefetchPixelData = 0;
double prefetch_bw_oto; st_vars->max_vratio_pre = __DML_MAX_VRATIO_PRE__;
double Tvm_oto; st_vars->Tsw_est1 = 0;
double Tr0_oto; st_vars->Tsw_est3 = 0;
double Tvm_oto_lines;
double Tr0_oto_lines;
double dst_y_prefetch_oto;
double TimeForFetchingMetaPTE = 0;
double TimeForFetchingRowInVBlank = 0;
double LinesToRequestPrefetchPixelData = 0;
unsigned int HostVMDynamicLevelsTrips;
double trip_to_mem;
double Tvm_trips;
double Tr0_trips;
double Tvm_trips_rounded;
double Tr0_trips_rounded;
double Lsw_oto;
double Tpre_rounded;
double prefetch_bw_equ;
double Tvm_equ;
double Tr0_equ;
double Tdmbf;
double Tdmec;
double Tdmsks;
double prefetch_sw_bytes;
double bytes_pp;
double dep_bytes;
unsigned int max_vratio_pre = __DML_MAX_VRATIO_PRE__;
double min_Lsw;
double Tsw_est1 = 0;
double Tsw_est3 = 0;
if (GPUVMEnable == true && HostVMEnable == true) if (GPUVMEnable == true && HostVMEnable == true)
HostVMDynamicLevelsTrips = HostVMMaxNonCachedPageTableLevels; st_vars->HostVMDynamicLevelsTrips = HostVMMaxNonCachedPageTableLevels;
else else
HostVMDynamicLevelsTrips = 0; st_vars->HostVMDynamicLevelsTrips = 0;
#ifdef __DML_VBA_DEBUG__ #ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: GPUVMEnable = %d\n", __func__, GPUVMEnable); dml_print("DML::%s: GPUVMEnable = %d\n", __func__, GPUVMEnable);
dml_print("DML::%s: GPUVMPageTableLevels = %d\n", __func__, GPUVMPageTableLevels); dml_print("DML::%s: GPUVMPageTableLevels = %d\n", __func__, GPUVMPageTableLevels);
...@@ -3466,19 +3440,19 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -3466,19 +3440,19 @@ bool dml32_CalculatePrefetchSchedule(
TSetup, TSetup,
/* output */ /* output */
&Tdmbf, &st_vars->Tdmbf,
&Tdmec, &st_vars->Tdmec,
&Tdmsks, &st_vars->Tdmsks,
VUpdateOffsetPix, VUpdateOffsetPix,
VUpdateWidthPix, VUpdateWidthPix,
VReadyOffsetPix); VReadyOffsetPix);
LineTime = myPipe->HTotal / myPipe->PixelClock; st_vars->LineTime = myPipe->HTotal / myPipe->PixelClock;
trip_to_mem = UrgentLatency; st_vars->trip_to_mem = UrgentLatency;
Tvm_trips = UrgentExtraLatency + trip_to_mem * (GPUVMPageTableLevels * (HostVMDynamicLevelsTrips + 1) - 1); st_vars->Tvm_trips = UrgentExtraLatency + st_vars->trip_to_mem * (GPUVMPageTableLevels * (st_vars->HostVMDynamicLevelsTrips + 1) - 1);
if (DynamicMetadataVMEnabled == true) if (DynamicMetadataVMEnabled == true)
*Tdmdl = TWait + Tvm_trips + trip_to_mem; *Tdmdl = TWait + st_vars->Tvm_trips + st_vars->trip_to_mem;
else else
*Tdmdl = TWait + UrgentExtraLatency; *Tdmdl = TWait + UrgentExtraLatency;
...@@ -3488,15 +3462,15 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -3488,15 +3462,15 @@ bool dml32_CalculatePrefetchSchedule(
#endif #endif
if (DynamicMetadataEnable == true) { if (DynamicMetadataEnable == true) {
if (VStartup * LineTime < *TSetup + *Tdmdl + Tdmbf + Tdmec + Tdmsks) { if (VStartup * st_vars->LineTime < *TSetup + *Tdmdl + st_vars->Tdmbf + st_vars->Tdmec + st_vars->Tdmsks) {
*NotEnoughTimeForDynamicMetadata = true; *NotEnoughTimeForDynamicMetadata = true;
#ifdef __DML_VBA_DEBUG__ #ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: Not Enough Time for Dynamic Meta!\n", __func__); dml_print("DML::%s: Not Enough Time for Dynamic Meta!\n", __func__);
dml_print("DML::%s: Tdmbf: %fus - time for dmd transfer from dchub to dio output buffer\n", dml_print("DML::%s: Tdmbf: %fus - time for dmd transfer from dchub to dio output buffer\n",
__func__, Tdmbf); __func__, st_vars->Tdmbf);
dml_print("DML::%s: Tdmec: %fus - time dio takes to transfer dmd\n", __func__, Tdmec); dml_print("DML::%s: Tdmec: %fus - time dio takes to transfer dmd\n", __func__, st_vars->Tdmec);
dml_print("DML::%s: Tdmsks: %fus - time before active dmd must complete transmission at dio\n", dml_print("DML::%s: Tdmsks: %fus - time before active dmd must complete transmission at dio\n",
__func__, Tdmsks); __func__, st_vars->Tdmsks);
dml_print("DML::%s: Tdmdl: %fus - time for fabric to become ready and fetch dmd\n", dml_print("DML::%s: Tdmdl: %fus - time for fabric to become ready and fetch dmd\n",
__func__, *Tdmdl); __func__, *Tdmdl);
#endif #endif
...@@ -3508,21 +3482,21 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -3508,21 +3482,21 @@ bool dml32_CalculatePrefetchSchedule(
} }
*Tdmdl_vm = (DynamicMetadataEnable == true && DynamicMetadataVMEnabled == true && *Tdmdl_vm = (DynamicMetadataEnable == true && DynamicMetadataVMEnabled == true &&
GPUVMEnable == true ? TWait + Tvm_trips : 0); GPUVMEnable == true ? TWait + st_vars->Tvm_trips : 0);
if (myPipe->ScalerEnabled) if (myPipe->ScalerEnabled)
DPPCycles = DPPCLKDelaySubtotalPlusCNVCFormater + DPPCLKDelaySCL; st_vars->DPPCycles = DPPCLKDelaySubtotalPlusCNVCFormater + DPPCLKDelaySCL;
else else
DPPCycles = DPPCLKDelaySubtotalPlusCNVCFormater + DPPCLKDelaySCLLBOnly; st_vars->DPPCycles = DPPCLKDelaySubtotalPlusCNVCFormater + DPPCLKDelaySCLLBOnly;
DPPCycles = DPPCycles + myPipe->NumberOfCursors * DPPCLKDelayCNVCCursor; st_vars->DPPCycles = st_vars->DPPCycles + myPipe->NumberOfCursors * DPPCLKDelayCNVCCursor;
DISPCLKCycles = DISPCLKDelaySubtotal; st_vars->DISPCLKCycles = DISPCLKDelaySubtotal;
if (myPipe->Dppclk == 0.0 || myPipe->Dispclk == 0.0) if (myPipe->Dppclk == 0.0 || myPipe->Dispclk == 0.0)
return true; return true;
*DSTXAfterScaler = DPPCycles * myPipe->PixelClock / myPipe->Dppclk + DISPCLKCycles * *DSTXAfterScaler = st_vars->DPPCycles * myPipe->PixelClock / myPipe->Dppclk + st_vars->DISPCLKCycles *
myPipe->PixelClock / myPipe->Dispclk + DSCDelay; myPipe->PixelClock / myPipe->Dispclk + DSCDelay;
*DSTXAfterScaler = *DSTXAfterScaler + (myPipe->ODMMode != dm_odm_combine_mode_disabled ? 18 : 0) *DSTXAfterScaler = *DSTXAfterScaler + (myPipe->ODMMode != dm_odm_combine_mode_disabled ? 18 : 0)
...@@ -3532,10 +3506,10 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -3532,10 +3506,10 @@ bool dml32_CalculatePrefetchSchedule(
+ ((myPipe->ODMMode == dm_odm_mode_mso_1to4) ? myPipe->HActive * 3 / 4 : 0); + ((myPipe->ODMMode == dm_odm_mode_mso_1to4) ? myPipe->HActive * 3 / 4 : 0);
#ifdef __DML_VBA_DEBUG__ #ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: DPPCycles: %d\n", __func__, DPPCycles); dml_print("DML::%s: DPPCycles: %d\n", __func__, st_vars->DPPCycles);
dml_print("DML::%s: PixelClock: %f\n", __func__, myPipe->PixelClock); dml_print("DML::%s: PixelClock: %f\n", __func__, myPipe->PixelClock);
dml_print("DML::%s: Dppclk: %f\n", __func__, myPipe->Dppclk); dml_print("DML::%s: Dppclk: %f\n", __func__, myPipe->Dppclk);
dml_print("DML::%s: DISPCLKCycles: %d\n", __func__, DISPCLKCycles); dml_print("DML::%s: DISPCLKCycles: %d\n", __func__, st_vars->DISPCLKCycles);
dml_print("DML::%s: DISPCLK: %f\n", __func__, myPipe->Dispclk); dml_print("DML::%s: DISPCLK: %f\n", __func__, myPipe->Dispclk);
dml_print("DML::%s: DSCDelay: %d\n", __func__, DSCDelay); dml_print("DML::%s: DSCDelay: %d\n", __func__, DSCDelay);
dml_print("DML::%s: ODMMode: %d\n", __func__, myPipe->ODMMode); dml_print("DML::%s: ODMMode: %d\n", __func__, myPipe->ODMMode);
...@@ -3548,9 +3522,9 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -3548,9 +3522,9 @@ bool dml32_CalculatePrefetchSchedule(
else else
*DSTYAfterScaler = 0; *DSTYAfterScaler = 0;
DSTTotalPixelsAfterScaler = *DSTYAfterScaler * myPipe->HTotal + *DSTXAfterScaler; st_vars->DSTTotalPixelsAfterScaler = *DSTYAfterScaler * myPipe->HTotal + *DSTXAfterScaler;
*DSTYAfterScaler = dml_floor(DSTTotalPixelsAfterScaler / myPipe->HTotal, 1); *DSTYAfterScaler = dml_floor(st_vars->DSTTotalPixelsAfterScaler / myPipe->HTotal, 1);
*DSTXAfterScaler = DSTTotalPixelsAfterScaler - ((double) (*DSTYAfterScaler * myPipe->HTotal)); *DSTXAfterScaler = st_vars->DSTTotalPixelsAfterScaler - ((double) (*DSTYAfterScaler * myPipe->HTotal));
#ifdef __DML_VBA_DEBUG__ #ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: DSTXAfterScaler: %d (final)\n", __func__, *DSTXAfterScaler); dml_print("DML::%s: DSTXAfterScaler: %d (final)\n", __func__, *DSTXAfterScaler);
dml_print("DML::%s: DSTYAfterScaler: %d (final)\n", __func__, *DSTYAfterScaler); dml_print("DML::%s: DSTYAfterScaler: %d (final)\n", __func__, *DSTYAfterScaler);
...@@ -3558,132 +3532,132 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -3558,132 +3532,132 @@ bool dml32_CalculatePrefetchSchedule(
MyError = false; MyError = false;
Tr0_trips = trip_to_mem * (HostVMDynamicLevelsTrips + 1); st_vars->Tr0_trips = st_vars->trip_to_mem * (st_vars->HostVMDynamicLevelsTrips + 1);
if (GPUVMEnable == true) { if (GPUVMEnable == true) {
Tvm_trips_rounded = dml_ceil(4.0 * Tvm_trips / LineTime, 1.0) / 4.0 * LineTime; st_vars->Tvm_trips_rounded = dml_ceil(4.0 * st_vars->Tvm_trips / st_vars->LineTime, 1.0) / 4.0 * st_vars->LineTime;
Tr0_trips_rounded = dml_ceil(4.0 * Tr0_trips / LineTime, 1.0) / 4.0 * LineTime; st_vars->Tr0_trips_rounded = dml_ceil(4.0 * st_vars->Tr0_trips / st_vars->LineTime, 1.0) / 4.0 * st_vars->LineTime;
if (GPUVMPageTableLevels >= 3) { if (GPUVMPageTableLevels >= 3) {
*Tno_bw = UrgentExtraLatency + trip_to_mem * *Tno_bw = UrgentExtraLatency + st_vars->trip_to_mem *
(double) ((GPUVMPageTableLevels - 2) * (HostVMDynamicLevelsTrips + 1) - 1); (double) ((GPUVMPageTableLevels - 2) * (st_vars->HostVMDynamicLevelsTrips + 1) - 1);
} else if (GPUVMPageTableLevels == 1 && myPipe->DCCEnable != true) { } else if (GPUVMPageTableLevels == 1 && myPipe->DCCEnable != true) {
Tr0_trips_rounded = dml_ceil(4.0 * UrgentExtraLatency / LineTime, 1.0) / st_vars->Tr0_trips_rounded = dml_ceil(4.0 * UrgentExtraLatency / st_vars->LineTime, 1.0) /
4.0 * LineTime; // VBA_ERROR 4.0 * st_vars->LineTime; // VBA_ERROR
*Tno_bw = UrgentExtraLatency; *Tno_bw = UrgentExtraLatency;
} else { } else {
*Tno_bw = 0; *Tno_bw = 0;
} }
} else if (myPipe->DCCEnable == true) { } else if (myPipe->DCCEnable == true) {
Tvm_trips_rounded = LineTime / 4.0; st_vars->Tvm_trips_rounded = st_vars->LineTime / 4.0;
Tr0_trips_rounded = dml_ceil(4.0 * Tr0_trips / LineTime, 1.0) / 4.0 * LineTime; st_vars->Tr0_trips_rounded = dml_ceil(4.0 * st_vars->Tr0_trips / st_vars->LineTime, 1.0) / 4.0 * st_vars->LineTime;
*Tno_bw = 0; *Tno_bw = 0;
} else { } else {
Tvm_trips_rounded = LineTime / 4.0; st_vars->Tvm_trips_rounded = st_vars->LineTime / 4.0;
Tr0_trips_rounded = LineTime / 2.0; st_vars->Tr0_trips_rounded = st_vars->LineTime / 2.0;
*Tno_bw = 0; *Tno_bw = 0;
} }
Tvm_trips_rounded = dml_max(Tvm_trips_rounded, LineTime / 4.0); st_vars->Tvm_trips_rounded = dml_max(st_vars->Tvm_trips_rounded, st_vars->LineTime / 4.0);
Tr0_trips_rounded = dml_max(Tr0_trips_rounded, LineTime / 4.0); st_vars->Tr0_trips_rounded = dml_max(st_vars->Tr0_trips_rounded, st_vars->LineTime / 4.0);
if (myPipe->SourcePixelFormat == dm_420_8 || myPipe->SourcePixelFormat == dm_420_10 if (myPipe->SourcePixelFormat == dm_420_8 || myPipe->SourcePixelFormat == dm_420_10
|| myPipe->SourcePixelFormat == dm_420_12) { || myPipe->SourcePixelFormat == dm_420_12) {
bytes_pp = myPipe->BytePerPixelY + myPipe->BytePerPixelC / 4; st_vars->bytes_pp = myPipe->BytePerPixelY + myPipe->BytePerPixelC / 4;
} else { } else {
bytes_pp = myPipe->BytePerPixelY + myPipe->BytePerPixelC; st_vars->bytes_pp = myPipe->BytePerPixelY + myPipe->BytePerPixelC;
} }
prefetch_sw_bytes = PrefetchSourceLinesY * swath_width_luma_ub * myPipe->BytePerPixelY st_vars->prefetch_sw_bytes = PrefetchSourceLinesY * swath_width_luma_ub * myPipe->BytePerPixelY
+ PrefetchSourceLinesC * swath_width_chroma_ub * myPipe->BytePerPixelC; + PrefetchSourceLinesC * swath_width_chroma_ub * myPipe->BytePerPixelC;
prefetch_bw_oto = dml_max(bytes_pp * myPipe->PixelClock / myPipe->DPPPerSurface, st_vars->prefetch_bw_oto = dml_max(st_vars->bytes_pp * myPipe->PixelClock / myPipe->DPPPerSurface,
prefetch_sw_bytes / (dml_max(PrefetchSourceLinesY, PrefetchSourceLinesC) * LineTime)); st_vars->prefetch_sw_bytes / (dml_max(PrefetchSourceLinesY, PrefetchSourceLinesC) * st_vars->LineTime));
min_Lsw = dml_max(PrefetchSourceLinesY, PrefetchSourceLinesC) / max_vratio_pre; st_vars->min_Lsw = dml_max(PrefetchSourceLinesY, PrefetchSourceLinesC) / st_vars->max_vratio_pre;
min_Lsw = dml_max(min_Lsw, 1.0); st_vars->min_Lsw = dml_max(st_vars->min_Lsw, 1.0);
Lsw_oto = dml_ceil(4.0 * dml_max(prefetch_sw_bytes / prefetch_bw_oto / LineTime, min_Lsw), 1.0) / 4.0; st_vars->Lsw_oto = dml_ceil(4.0 * dml_max(st_vars->prefetch_sw_bytes / st_vars->prefetch_bw_oto / st_vars->LineTime, st_vars->min_Lsw), 1.0) / 4.0;
if (GPUVMEnable == true) { if (GPUVMEnable == true) {
Tvm_oto = dml_max3( st_vars->Tvm_oto = dml_max3(
Tvm_trips, st_vars->Tvm_trips,
*Tno_bw + PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor / prefetch_bw_oto, *Tno_bw + PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor / st_vars->prefetch_bw_oto,
LineTime / 4.0); st_vars->LineTime / 4.0);
} else } else
Tvm_oto = LineTime / 4.0; st_vars->Tvm_oto = st_vars->LineTime / 4.0;
if ((GPUVMEnable == true || myPipe->DCCEnable == true)) { if ((GPUVMEnable == true || myPipe->DCCEnable == true)) {
Tr0_oto = dml_max4( st_vars->Tr0_oto = dml_max4(
Tr0_trips, st_vars->Tr0_trips,
(MetaRowByte + PixelPTEBytesPerRow * HostVMInefficiencyFactor) / prefetch_bw_oto, (MetaRowByte + PixelPTEBytesPerRow * HostVMInefficiencyFactor) / st_vars->prefetch_bw_oto,
(LineTime - Tvm_oto)/2.0, (st_vars->LineTime - st_vars->Tvm_oto)/2.0,
LineTime / 4.0); st_vars->LineTime / 4.0);
#ifdef __DML_VBA_DEBUG__ #ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: Tr0_oto max0 = %f\n", __func__, dml_print("DML::%s: Tr0_oto max0 = %f\n", __func__,
(MetaRowByte + PixelPTEBytesPerRow * HostVMInefficiencyFactor) / prefetch_bw_oto); (MetaRowByte + PixelPTEBytesPerRow * HostVMInefficiencyFactor) / st_vars->prefetch_bw_oto);
dml_print("DML::%s: Tr0_oto max1 = %f\n", __func__, Tr0_trips); dml_print("DML::%s: Tr0_oto max1 = %f\n", __func__, st_vars->Tr0_trips);
dml_print("DML::%s: Tr0_oto max2 = %f\n", __func__, LineTime - Tvm_oto); dml_print("DML::%s: Tr0_oto max2 = %f\n", __func__, st_vars->LineTime - st_vars->Tvm_oto);
dml_print("DML::%s: Tr0_oto max3 = %f\n", __func__, LineTime / 4); dml_print("DML::%s: Tr0_oto max3 = %f\n", __func__, st_vars->LineTime / 4);
#endif #endif
} else } else
Tr0_oto = (LineTime - Tvm_oto) / 2.0; st_vars->Tr0_oto = (st_vars->LineTime - st_vars->Tvm_oto) / 2.0;
Tvm_oto_lines = dml_ceil(4.0 * Tvm_oto / LineTime, 1) / 4.0; st_vars->Tvm_oto_lines = dml_ceil(4.0 * st_vars->Tvm_oto / st_vars->LineTime, 1) / 4.0;
Tr0_oto_lines = dml_ceil(4.0 * Tr0_oto / LineTime, 1) / 4.0; st_vars->Tr0_oto_lines = dml_ceil(4.0 * st_vars->Tr0_oto / st_vars->LineTime, 1) / 4.0;
dst_y_prefetch_oto = Tvm_oto_lines + 2 * Tr0_oto_lines + Lsw_oto; st_vars->dst_y_prefetch_oto = st_vars->Tvm_oto_lines + 2 * st_vars->Tr0_oto_lines + st_vars->Lsw_oto;
dst_y_prefetch_equ = VStartup - (*TSetup + dml_max(TWait + TCalc, *Tdmdl)) / LineTime - st_vars->dst_y_prefetch_equ = VStartup - (*TSetup + dml_max(TWait + TCalc, *Tdmdl)) / st_vars->LineTime -
(*DSTYAfterScaler + (double) *DSTXAfterScaler / (double) myPipe->HTotal); (*DSTYAfterScaler + (double) *DSTXAfterScaler / (double) myPipe->HTotal);
#ifdef __DML_VBA_DEBUG__ #ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: HTotal = %d\n", __func__, myPipe->HTotal); dml_print("DML::%s: HTotal = %d\n", __func__, myPipe->HTotal);
dml_print("DML::%s: min_Lsw = %f\n", __func__, min_Lsw); dml_print("DML::%s: min_Lsw = %f\n", __func__, st_vars->min_Lsw);
dml_print("DML::%s: *Tno_bw = %f\n", __func__, *Tno_bw); dml_print("DML::%s: *Tno_bw = %f\n", __func__, *Tno_bw);
dml_print("DML::%s: UrgentExtraLatency = %f\n", __func__, UrgentExtraLatency); dml_print("DML::%s: UrgentExtraLatency = %f\n", __func__, UrgentExtraLatency);
dml_print("DML::%s: trip_to_mem = %f\n", __func__, trip_to_mem); dml_print("DML::%s: trip_to_mem = %f\n", __func__, st_vars->trip_to_mem);
dml_print("DML::%s: BytePerPixelY = %d\n", __func__, myPipe->BytePerPixelY); dml_print("DML::%s: BytePerPixelY = %d\n", __func__, myPipe->BytePerPixelY);
dml_print("DML::%s: PrefetchSourceLinesY = %f\n", __func__, PrefetchSourceLinesY); dml_print("DML::%s: PrefetchSourceLinesY = %f\n", __func__, PrefetchSourceLinesY);
dml_print("DML::%s: swath_width_luma_ub = %d\n", __func__, swath_width_luma_ub); dml_print("DML::%s: swath_width_luma_ub = %d\n", __func__, swath_width_luma_ub);
dml_print("DML::%s: BytePerPixelC = %d\n", __func__, myPipe->BytePerPixelC); dml_print("DML::%s: BytePerPixelC = %d\n", __func__, myPipe->BytePerPixelC);
dml_print("DML::%s: PrefetchSourceLinesC = %f\n", __func__, PrefetchSourceLinesC); dml_print("DML::%s: PrefetchSourceLinesC = %f\n", __func__, PrefetchSourceLinesC);
dml_print("DML::%s: swath_width_chroma_ub = %d\n", __func__, swath_width_chroma_ub); dml_print("DML::%s: swath_width_chroma_ub = %d\n", __func__, swath_width_chroma_ub);
dml_print("DML::%s: prefetch_sw_bytes = %f\n", __func__, prefetch_sw_bytes); dml_print("DML::%s: prefetch_sw_bytes = %f\n", __func__, st_vars->prefetch_sw_bytes);
dml_print("DML::%s: bytes_pp = %f\n", __func__, bytes_pp); dml_print("DML::%s: bytes_pp = %f\n", __func__, st_vars->bytes_pp);
dml_print("DML::%s: PDEAndMetaPTEBytesFrame = %d\n", __func__, PDEAndMetaPTEBytesFrame); dml_print("DML::%s: PDEAndMetaPTEBytesFrame = %d\n", __func__, PDEAndMetaPTEBytesFrame);
dml_print("DML::%s: MetaRowByte = %d\n", __func__, MetaRowByte); dml_print("DML::%s: MetaRowByte = %d\n", __func__, MetaRowByte);
dml_print("DML::%s: PixelPTEBytesPerRow = %d\n", __func__, PixelPTEBytesPerRow); dml_print("DML::%s: PixelPTEBytesPerRow = %d\n", __func__, PixelPTEBytesPerRow);
dml_print("DML::%s: HostVMInefficiencyFactor = %f\n", __func__, HostVMInefficiencyFactor); dml_print("DML::%s: HostVMInefficiencyFactor = %f\n", __func__, HostVMInefficiencyFactor);
dml_print("DML::%s: Tvm_trips = %f\n", __func__, Tvm_trips); dml_print("DML::%s: Tvm_trips = %f\n", __func__, st_vars->Tvm_trips);
dml_print("DML::%s: Tr0_trips = %f\n", __func__, Tr0_trips); dml_print("DML::%s: Tr0_trips = %f\n", __func__, st_vars->Tr0_trips);
dml_print("DML::%s: prefetch_bw_oto = %f\n", __func__, prefetch_bw_oto); dml_print("DML::%s: prefetch_bw_oto = %f\n", __func__, st_vars->prefetch_bw_oto);
dml_print("DML::%s: Tr0_oto = %f\n", __func__, Tr0_oto); dml_print("DML::%s: Tr0_oto = %f\n", __func__, st_vars->Tr0_oto);
dml_print("DML::%s: Tvm_oto = %f\n", __func__, Tvm_oto); dml_print("DML::%s: Tvm_oto = %f\n", __func__, st_vars->Tvm_oto);
dml_print("DML::%s: Tvm_oto_lines = %f\n", __func__, Tvm_oto_lines); dml_print("DML::%s: Tvm_oto_lines = %f\n", __func__, st_vars->Tvm_oto_lines);
dml_print("DML::%s: Tr0_oto_lines = %f\n", __func__, Tr0_oto_lines); dml_print("DML::%s: Tr0_oto_lines = %f\n", __func__, st_vars->Tr0_oto_lines);
dml_print("DML::%s: Lsw_oto = %f\n", __func__, Lsw_oto); dml_print("DML::%s: Lsw_oto = %f\n", __func__, st_vars->Lsw_oto);
dml_print("DML::%s: dst_y_prefetch_oto = %f\n", __func__, dst_y_prefetch_oto); dml_print("DML::%s: dst_y_prefetch_oto = %f\n", __func__, st_vars->dst_y_prefetch_oto);
dml_print("DML::%s: dst_y_prefetch_equ = %f\n", __func__, dst_y_prefetch_equ); dml_print("DML::%s: dst_y_prefetch_equ = %f\n", __func__, st_vars->dst_y_prefetch_equ);
#endif #endif
dst_y_prefetch_equ = dml_floor(4.0 * (dst_y_prefetch_equ + 0.125), 1) / 4.0; st_vars->dst_y_prefetch_equ = dml_floor(4.0 * (st_vars->dst_y_prefetch_equ + 0.125), 1) / 4.0;
Tpre_rounded = dst_y_prefetch_equ * LineTime; st_vars->Tpre_rounded = st_vars->dst_y_prefetch_equ * st_vars->LineTime;
#ifdef __DML_VBA_DEBUG__ #ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: dst_y_prefetch_equ: %f (after round)\n", __func__, dst_y_prefetch_equ); dml_print("DML::%s: dst_y_prefetch_equ: %f (after round)\n", __func__, st_vars->dst_y_prefetch_equ);
dml_print("DML::%s: LineTime: %f\n", __func__, LineTime); dml_print("DML::%s: LineTime: %f\n", __func__, st_vars->LineTime);
dml_print("DML::%s: VStartup: %d\n", __func__, VStartup); dml_print("DML::%s: VStartup: %d\n", __func__, VStartup);
dml_print("DML::%s: Tvstartup: %fus - time between vstartup and first pixel of active\n", dml_print("DML::%s: Tvstartup: %fus - time between vstartup and first pixel of active\n",
__func__, VStartup * LineTime); __func__, VStartup * st_vars->LineTime);
dml_print("DML::%s: TSetup: %fus - time from vstartup to vready\n", __func__, *TSetup); dml_print("DML::%s: TSetup: %fus - time from vstartup to vready\n", __func__, *TSetup);
dml_print("DML::%s: TCalc: %fus - time for calculations in dchub starting at vready\n", __func__, TCalc); dml_print("DML::%s: TCalc: %fus - time for calculations in dchub starting at vready\n", __func__, TCalc);
dml_print("DML::%s: Tdmbf: %fus - time for dmd transfer from dchub to dio output buffer\n", __func__, Tdmbf); dml_print("DML::%s: Tdmbf: %fus - time for dmd transfer from dchub to dio output buffer\n", __func__, st_vars->Tdmbf);
dml_print("DML::%s: Tdmec: %fus - time dio takes to transfer dmd\n", __func__, Tdmec); dml_print("DML::%s: Tdmec: %fus - time dio takes to transfer dmd\n", __func__, st_vars->Tdmec);
dml_print("DML::%s: Tdmdl_vm: %fus - time for vm stages of dmd\n", __func__, *Tdmdl_vm); dml_print("DML::%s: Tdmdl_vm: %fus - time for vm stages of dmd\n", __func__, *Tdmdl_vm);
dml_print("DML::%s: Tdmdl: %fus - time for fabric to become ready and fetch dmd\n", __func__, *Tdmdl); dml_print("DML::%s: Tdmdl: %fus - time for fabric to become ready and fetch dmd\n", __func__, *Tdmdl);
dml_print("DML::%s: DSTYAfterScaler: %d lines - number of lines of pipeline and buffer delay after scaler\n", dml_print("DML::%s: DSTYAfterScaler: %d lines - number of lines of pipeline and buffer delay after scaler\n",
__func__, *DSTYAfterScaler); __func__, *DSTYAfterScaler);
#endif #endif
dep_bytes = dml_max(PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor, st_vars->dep_bytes = dml_max(PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor,
MetaRowByte + PixelPTEBytesPerRow * HostVMInefficiencyFactor); MetaRowByte + PixelPTEBytesPerRow * HostVMInefficiencyFactor);
if (prefetch_sw_bytes < dep_bytes) if (st_vars->prefetch_sw_bytes < st_vars->dep_bytes)
prefetch_sw_bytes = 2 * dep_bytes; st_vars->prefetch_sw_bytes = 2 * st_vars->dep_bytes;
*PrefetchBandwidth = 0; *PrefetchBandwidth = 0;
*DestinationLinesToRequestVMInVBlank = 0; *DestinationLinesToRequestVMInVBlank = 0;
...@@ -3691,61 +3665,61 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -3691,61 +3665,61 @@ bool dml32_CalculatePrefetchSchedule(
*VRatioPrefetchY = 0; *VRatioPrefetchY = 0;
*VRatioPrefetchC = 0; *VRatioPrefetchC = 0;
*RequiredPrefetchPixDataBWLuma = 0; *RequiredPrefetchPixDataBWLuma = 0;
if (dst_y_prefetch_equ > 1) { if (st_vars->dst_y_prefetch_equ > 1) {
double PrefetchBandwidth1; double PrefetchBandwidth1;
double PrefetchBandwidth2; double PrefetchBandwidth2;
double PrefetchBandwidth3; double PrefetchBandwidth3;
double PrefetchBandwidth4; double PrefetchBandwidth4;
if (Tpre_rounded - *Tno_bw > 0) { if (st_vars->Tpre_rounded - *Tno_bw > 0) {
PrefetchBandwidth1 = (PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor + 2 * MetaRowByte PrefetchBandwidth1 = (PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor + 2 * MetaRowByte
+ 2 * PixelPTEBytesPerRow * HostVMInefficiencyFactor + 2 * PixelPTEBytesPerRow * HostVMInefficiencyFactor
+ prefetch_sw_bytes) / (Tpre_rounded - *Tno_bw); + st_vars->prefetch_sw_bytes) / (st_vars->Tpre_rounded - *Tno_bw);
Tsw_est1 = prefetch_sw_bytes / PrefetchBandwidth1; st_vars->Tsw_est1 = st_vars->prefetch_sw_bytes / PrefetchBandwidth1;
} else } else
PrefetchBandwidth1 = 0; PrefetchBandwidth1 = 0;
if (VStartup == MaxVStartup && (Tsw_est1 / LineTime < min_Lsw) if (VStartup == MaxVStartup && (st_vars->Tsw_est1 / st_vars->LineTime < st_vars->min_Lsw)
&& Tpre_rounded - min_Lsw * LineTime - 0.75 * LineTime - *Tno_bw > 0) { && st_vars->Tpre_rounded - st_vars->min_Lsw * st_vars->LineTime - 0.75 * st_vars->LineTime - *Tno_bw > 0) {
PrefetchBandwidth1 = (PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor + 2 * MetaRowByte PrefetchBandwidth1 = (PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor + 2 * MetaRowByte
+ 2 * PixelPTEBytesPerRow * HostVMInefficiencyFactor) + 2 * PixelPTEBytesPerRow * HostVMInefficiencyFactor)
/ (Tpre_rounded - min_Lsw * LineTime - 0.75 * LineTime - *Tno_bw); / (st_vars->Tpre_rounded - st_vars->min_Lsw * st_vars->LineTime - 0.75 * st_vars->LineTime - *Tno_bw);
} }
if (Tpre_rounded - *Tno_bw - 2 * Tr0_trips_rounded > 0) if (st_vars->Tpre_rounded - *Tno_bw - 2 * st_vars->Tr0_trips_rounded > 0)
PrefetchBandwidth2 = (PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor + prefetch_sw_bytes) / PrefetchBandwidth2 = (PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor + st_vars->prefetch_sw_bytes) /
(Tpre_rounded - *Tno_bw - 2 * Tr0_trips_rounded); (st_vars->Tpre_rounded - *Tno_bw - 2 * st_vars->Tr0_trips_rounded);
else else
PrefetchBandwidth2 = 0; PrefetchBandwidth2 = 0;
if (Tpre_rounded - Tvm_trips_rounded > 0) { if (st_vars->Tpre_rounded - st_vars->Tvm_trips_rounded > 0) {
PrefetchBandwidth3 = (2 * MetaRowByte + 2 * PixelPTEBytesPerRow * HostVMInefficiencyFactor PrefetchBandwidth3 = (2 * MetaRowByte + 2 * PixelPTEBytesPerRow * HostVMInefficiencyFactor
+ prefetch_sw_bytes) / (Tpre_rounded - Tvm_trips_rounded); + st_vars->prefetch_sw_bytes) / (st_vars->Tpre_rounded - st_vars->Tvm_trips_rounded);
Tsw_est3 = prefetch_sw_bytes / PrefetchBandwidth3; st_vars->Tsw_est3 = st_vars->prefetch_sw_bytes / PrefetchBandwidth3;
} else } else
PrefetchBandwidth3 = 0; PrefetchBandwidth3 = 0;
if (VStartup == MaxVStartup && if (VStartup == MaxVStartup &&
(Tsw_est3 / LineTime < min_Lsw) && Tpre_rounded - min_Lsw * LineTime - 0.75 * (st_vars->Tsw_est3 / st_vars->LineTime < st_vars->min_Lsw) && st_vars->Tpre_rounded - st_vars->min_Lsw * st_vars->LineTime - 0.75 *
LineTime - Tvm_trips_rounded > 0) { st_vars->LineTime - st_vars->Tvm_trips_rounded > 0) {
PrefetchBandwidth3 = (2 * MetaRowByte + 2 * PixelPTEBytesPerRow * HostVMInefficiencyFactor) PrefetchBandwidth3 = (2 * MetaRowByte + 2 * PixelPTEBytesPerRow * HostVMInefficiencyFactor)
/ (Tpre_rounded - min_Lsw * LineTime - 0.75 * LineTime - Tvm_trips_rounded); / (st_vars->Tpre_rounded - st_vars->min_Lsw * st_vars->LineTime - 0.75 * st_vars->LineTime - st_vars->Tvm_trips_rounded);
} }
if (Tpre_rounded - Tvm_trips_rounded - 2 * Tr0_trips_rounded > 0) { if (st_vars->Tpre_rounded - st_vars->Tvm_trips_rounded - 2 * st_vars->Tr0_trips_rounded > 0) {
PrefetchBandwidth4 = prefetch_sw_bytes / PrefetchBandwidth4 = st_vars->prefetch_sw_bytes /
(Tpre_rounded - Tvm_trips_rounded - 2 * Tr0_trips_rounded); (st_vars->Tpre_rounded - st_vars->Tvm_trips_rounded - 2 * st_vars->Tr0_trips_rounded);
} else { } else {
PrefetchBandwidth4 = 0; PrefetchBandwidth4 = 0;
} }
#ifdef __DML_VBA_DEBUG__ #ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: Tpre_rounded: %f\n", __func__, Tpre_rounded); dml_print("DML::%s: Tpre_rounded: %f\n", __func__, st_vars->Tpre_rounded);
dml_print("DML::%s: Tno_bw: %f\n", __func__, *Tno_bw); dml_print("DML::%s: Tno_bw: %f\n", __func__, *Tno_bw);
dml_print("DML::%s: Tvm_trips_rounded: %f\n", __func__, Tvm_trips_rounded); dml_print("DML::%s: Tvm_trips_rounded: %f\n", __func__, st_vars->Tvm_trips_rounded);
dml_print("DML::%s: Tsw_est1: %f\n", __func__, Tsw_est1); dml_print("DML::%s: Tsw_est1: %f\n", __func__, st_vars->Tsw_est1);
dml_print("DML::%s: Tsw_est3: %f\n", __func__, Tsw_est3); dml_print("DML::%s: Tsw_est3: %f\n", __func__, st_vars->Tsw_est3);
dml_print("DML::%s: PrefetchBandwidth1: %f\n", __func__, PrefetchBandwidth1); dml_print("DML::%s: PrefetchBandwidth1: %f\n", __func__, PrefetchBandwidth1);
dml_print("DML::%s: PrefetchBandwidth2: %f\n", __func__, PrefetchBandwidth2); dml_print("DML::%s: PrefetchBandwidth2: %f\n", __func__, PrefetchBandwidth2);
dml_print("DML::%s: PrefetchBandwidth3: %f\n", __func__, PrefetchBandwidth3); dml_print("DML::%s: PrefetchBandwidth3: %f\n", __func__, PrefetchBandwidth3);
...@@ -3758,9 +3732,9 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -3758,9 +3732,9 @@ bool dml32_CalculatePrefetchSchedule(
if (PrefetchBandwidth1 > 0) { if (PrefetchBandwidth1 > 0) {
if (*Tno_bw + PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor / PrefetchBandwidth1 if (*Tno_bw + PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor / PrefetchBandwidth1
>= Tvm_trips_rounded >= st_vars->Tvm_trips_rounded
&& (MetaRowByte + PixelPTEBytesPerRow * HostVMInefficiencyFactor) && (MetaRowByte + PixelPTEBytesPerRow * HostVMInefficiencyFactor)
/ PrefetchBandwidth1 >= Tr0_trips_rounded) { / PrefetchBandwidth1 >= st_vars->Tr0_trips_rounded) {
Case1OK = true; Case1OK = true;
} else { } else {
Case1OK = false; Case1OK = false;
...@@ -3771,9 +3745,9 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -3771,9 +3745,9 @@ bool dml32_CalculatePrefetchSchedule(
if (PrefetchBandwidth2 > 0) { if (PrefetchBandwidth2 > 0) {
if (*Tno_bw + PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor / PrefetchBandwidth2 if (*Tno_bw + PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor / PrefetchBandwidth2
>= Tvm_trips_rounded >= st_vars->Tvm_trips_rounded
&& (MetaRowByte + PixelPTEBytesPerRow * HostVMInefficiencyFactor) && (MetaRowByte + PixelPTEBytesPerRow * HostVMInefficiencyFactor)
/ PrefetchBandwidth2 < Tr0_trips_rounded) { / PrefetchBandwidth2 < st_vars->Tr0_trips_rounded) {
Case2OK = true; Case2OK = true;
} else { } else {
Case2OK = false; Case2OK = false;
...@@ -3784,9 +3758,9 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -3784,9 +3758,9 @@ bool dml32_CalculatePrefetchSchedule(
if (PrefetchBandwidth3 > 0) { if (PrefetchBandwidth3 > 0) {
if (*Tno_bw + PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor / PrefetchBandwidth3 < if (*Tno_bw + PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor / PrefetchBandwidth3 <
Tvm_trips_rounded && (MetaRowByte + PixelPTEBytesPerRow * st_vars->Tvm_trips_rounded && (MetaRowByte + PixelPTEBytesPerRow *
HostVMInefficiencyFactor) / PrefetchBandwidth3 >= HostVMInefficiencyFactor) / PrefetchBandwidth3 >=
Tr0_trips_rounded) { st_vars->Tr0_trips_rounded) {
Case3OK = true; Case3OK = true;
} else { } else {
Case3OK = false; Case3OK = false;
...@@ -3796,80 +3770,80 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -3796,80 +3770,80 @@ bool dml32_CalculatePrefetchSchedule(
} }
if (Case1OK) if (Case1OK)
prefetch_bw_equ = PrefetchBandwidth1; st_vars->prefetch_bw_equ = PrefetchBandwidth1;
else if (Case2OK) else if (Case2OK)
prefetch_bw_equ = PrefetchBandwidth2; st_vars->prefetch_bw_equ = PrefetchBandwidth2;
else if (Case3OK) else if (Case3OK)
prefetch_bw_equ = PrefetchBandwidth3; st_vars->prefetch_bw_equ = PrefetchBandwidth3;
else else
prefetch_bw_equ = PrefetchBandwidth4; st_vars->prefetch_bw_equ = PrefetchBandwidth4;
#ifdef __DML_VBA_DEBUG__ #ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: Case1OK: %d\n", __func__, Case1OK); dml_print("DML::%s: Case1OK: %d\n", __func__, Case1OK);
dml_print("DML::%s: Case2OK: %d\n", __func__, Case2OK); dml_print("DML::%s: Case2OK: %d\n", __func__, Case2OK);
dml_print("DML::%s: Case3OK: %d\n", __func__, Case3OK); dml_print("DML::%s: Case3OK: %d\n", __func__, Case3OK);
dml_print("DML::%s: prefetch_bw_equ: %f\n", __func__, prefetch_bw_equ); dml_print("DML::%s: prefetch_bw_equ: %f\n", __func__, st_vars->prefetch_bw_equ);
#endif #endif
if (prefetch_bw_equ > 0) { if (st_vars->prefetch_bw_equ > 0) {
if (GPUVMEnable == true) { if (GPUVMEnable == true) {
Tvm_equ = dml_max3(*Tno_bw + PDEAndMetaPTEBytesFrame * st_vars->Tvm_equ = dml_max3(*Tno_bw + PDEAndMetaPTEBytesFrame *
HostVMInefficiencyFactor / prefetch_bw_equ, HostVMInefficiencyFactor / st_vars->prefetch_bw_equ,
Tvm_trips, LineTime / 4); st_vars->Tvm_trips, st_vars->LineTime / 4);
} else { } else {
Tvm_equ = LineTime / 4; st_vars->Tvm_equ = st_vars->LineTime / 4;
} }
if ((GPUVMEnable == true || myPipe->DCCEnable == true)) { if ((GPUVMEnable == true || myPipe->DCCEnable == true)) {
Tr0_equ = dml_max4((MetaRowByte + PixelPTEBytesPerRow * st_vars->Tr0_equ = dml_max4((MetaRowByte + PixelPTEBytesPerRow *
HostVMInefficiencyFactor) / prefetch_bw_equ, Tr0_trips, HostVMInefficiencyFactor) / st_vars->prefetch_bw_equ, st_vars->Tr0_trips,
(LineTime - Tvm_equ) / 2, LineTime / 4); (st_vars->LineTime - st_vars->Tvm_equ) / 2, st_vars->LineTime / 4);
} else { } else {
Tr0_equ = (LineTime - Tvm_equ) / 2; st_vars->Tr0_equ = (st_vars->LineTime - st_vars->Tvm_equ) / 2;
} }
} else { } else {
Tvm_equ = 0; st_vars->Tvm_equ = 0;
Tr0_equ = 0; st_vars->Tr0_equ = 0;
#ifdef __DML_VBA_DEBUG__ #ifdef __DML_VBA_DEBUG__
dml_print("DML: prefetch_bw_equ equals 0! %s:%d\n", __FILE__, __LINE__); dml_print("DML: prefetch_bw_equ equals 0! %s:%d\n", __FILE__, __LINE__);
#endif #endif
} }
} }
if (dst_y_prefetch_oto < dst_y_prefetch_equ) { if (st_vars->dst_y_prefetch_oto < st_vars->dst_y_prefetch_equ) {
*DestinationLinesForPrefetch = dst_y_prefetch_oto; *DestinationLinesForPrefetch = st_vars->dst_y_prefetch_oto;
TimeForFetchingMetaPTE = Tvm_oto; st_vars->TimeForFetchingMetaPTE = st_vars->Tvm_oto;
TimeForFetchingRowInVBlank = Tr0_oto; st_vars->TimeForFetchingRowInVBlank = st_vars->Tr0_oto;
*PrefetchBandwidth = prefetch_bw_oto; *PrefetchBandwidth = st_vars->prefetch_bw_oto;
} else { } else {
*DestinationLinesForPrefetch = dst_y_prefetch_equ; *DestinationLinesForPrefetch = st_vars->dst_y_prefetch_equ;
TimeForFetchingMetaPTE = Tvm_equ; st_vars->TimeForFetchingMetaPTE = st_vars->Tvm_equ;
TimeForFetchingRowInVBlank = Tr0_equ; st_vars->TimeForFetchingRowInVBlank = st_vars->Tr0_equ;
*PrefetchBandwidth = prefetch_bw_equ; *PrefetchBandwidth = st_vars->prefetch_bw_equ;
} }
*DestinationLinesToRequestVMInVBlank = dml_ceil(4.0 * TimeForFetchingMetaPTE / LineTime, 1.0) / 4.0; *DestinationLinesToRequestVMInVBlank = dml_ceil(4.0 * st_vars->TimeForFetchingMetaPTE / st_vars->LineTime, 1.0) / 4.0;
*DestinationLinesToRequestRowInVBlank = *DestinationLinesToRequestRowInVBlank =
dml_ceil(4.0 * TimeForFetchingRowInVBlank / LineTime, 1.0) / 4.0; dml_ceil(4.0 * st_vars->TimeForFetchingRowInVBlank / st_vars->LineTime, 1.0) / 4.0;
LinesToRequestPrefetchPixelData = *DestinationLinesForPrefetch - st_vars->LinesToRequestPrefetchPixelData = *DestinationLinesForPrefetch -
*DestinationLinesToRequestVMInVBlank - 2 * *DestinationLinesToRequestRowInVBlank; *DestinationLinesToRequestVMInVBlank - 2 * *DestinationLinesToRequestRowInVBlank;
#ifdef __DML_VBA_DEBUG__ #ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: DestinationLinesForPrefetch = %f\n", __func__, *DestinationLinesForPrefetch); dml_print("DML::%s: DestinationLinesForPrefetch = %f\n", __func__, *DestinationLinesForPrefetch);
dml_print("DML::%s: DestinationLinesToRequestVMInVBlank = %f\n", dml_print("DML::%s: DestinationLinesToRequestVMInVBlank = %f\n",
__func__, *DestinationLinesToRequestVMInVBlank); __func__, *DestinationLinesToRequestVMInVBlank);
dml_print("DML::%s: TimeForFetchingRowInVBlank = %f\n", __func__, TimeForFetchingRowInVBlank); dml_print("DML::%s: TimeForFetchingRowInVBlank = %f\n", __func__, st_vars->TimeForFetchingRowInVBlank);
dml_print("DML::%s: LineTime = %f\n", __func__, LineTime); dml_print("DML::%s: LineTime = %f\n", __func__, st_vars->LineTime);
dml_print("DML::%s: DestinationLinesToRequestRowInVBlank = %f\n", dml_print("DML::%s: DestinationLinesToRequestRowInVBlank = %f\n",
__func__, *DestinationLinesToRequestRowInVBlank); __func__, *DestinationLinesToRequestRowInVBlank);
dml_print("DML::%s: PrefetchSourceLinesY = %f\n", __func__, PrefetchSourceLinesY); dml_print("DML::%s: PrefetchSourceLinesY = %f\n", __func__, PrefetchSourceLinesY);
dml_print("DML::%s: LinesToRequestPrefetchPixelData = %f\n", __func__, LinesToRequestPrefetchPixelData); dml_print("DML::%s: LinesToRequestPrefetchPixelData = %f\n", __func__, st_vars->LinesToRequestPrefetchPixelData);
#endif #endif
if (LinesToRequestPrefetchPixelData >= 1 && prefetch_bw_equ > 0) { if (st_vars->LinesToRequestPrefetchPixelData >= 1 && st_vars->prefetch_bw_equ > 0) {
*VRatioPrefetchY = (double) PrefetchSourceLinesY / LinesToRequestPrefetchPixelData; *VRatioPrefetchY = (double) PrefetchSourceLinesY / st_vars->LinesToRequestPrefetchPixelData;
*VRatioPrefetchY = dml_max(*VRatioPrefetchY, 1.0); *VRatioPrefetchY = dml_max(*VRatioPrefetchY, 1.0);
#ifdef __DML_VBA_DEBUG__ #ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: VRatioPrefetchY = %f\n", __func__, *VRatioPrefetchY); dml_print("DML::%s: VRatioPrefetchY = %f\n", __func__, *VRatioPrefetchY);
...@@ -3877,12 +3851,12 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -3877,12 +3851,12 @@ bool dml32_CalculatePrefetchSchedule(
dml_print("DML::%s: VInitPreFillY = %d\n", __func__, VInitPreFillY); dml_print("DML::%s: VInitPreFillY = %d\n", __func__, VInitPreFillY);
#endif #endif
if ((SwathHeightY > 4) && (VInitPreFillY > 3)) { if ((SwathHeightY > 4) && (VInitPreFillY > 3)) {
if (LinesToRequestPrefetchPixelData > (VInitPreFillY - 3.0) / 2.0) { if (st_vars->LinesToRequestPrefetchPixelData > (VInitPreFillY - 3.0) / 2.0) {
*VRatioPrefetchY = *VRatioPrefetchY =
dml_max((double) PrefetchSourceLinesY / dml_max((double) PrefetchSourceLinesY /
LinesToRequestPrefetchPixelData, st_vars->LinesToRequestPrefetchPixelData,
(double) MaxNumSwathY * SwathHeightY / (double) MaxNumSwathY * SwathHeightY /
(LinesToRequestPrefetchPixelData - (st_vars->LinesToRequestPrefetchPixelData -
(VInitPreFillY - 3.0) / 2.0)); (VInitPreFillY - 3.0) / 2.0));
*VRatioPrefetchY = dml_max(*VRatioPrefetchY, 1.0); *VRatioPrefetchY = dml_max(*VRatioPrefetchY, 1.0);
} else { } else {
...@@ -3896,7 +3870,7 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -3896,7 +3870,7 @@ bool dml32_CalculatePrefetchSchedule(
#endif #endif
} }
*VRatioPrefetchC = (double) PrefetchSourceLinesC / LinesToRequestPrefetchPixelData; *VRatioPrefetchC = (double) PrefetchSourceLinesC / st_vars->LinesToRequestPrefetchPixelData;
*VRatioPrefetchC = dml_max(*VRatioPrefetchC, 1.0); *VRatioPrefetchC = dml_max(*VRatioPrefetchC, 1.0);
#ifdef __DML_VBA_DEBUG__ #ifdef __DML_VBA_DEBUG__
...@@ -3905,11 +3879,11 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -3905,11 +3879,11 @@ bool dml32_CalculatePrefetchSchedule(
dml_print("DML::%s: VInitPreFillC = %d\n", __func__, VInitPreFillC); dml_print("DML::%s: VInitPreFillC = %d\n", __func__, VInitPreFillC);
#endif #endif
if ((SwathHeightC > 4)) { if ((SwathHeightC > 4)) {
if (LinesToRequestPrefetchPixelData > (VInitPreFillC - 3.0) / 2.0) { if (st_vars->LinesToRequestPrefetchPixelData > (VInitPreFillC - 3.0) / 2.0) {
*VRatioPrefetchC = *VRatioPrefetchC =
dml_max(*VRatioPrefetchC, dml_max(*VRatioPrefetchC,
(double) MaxNumSwathC * SwathHeightC / (double) MaxNumSwathC * SwathHeightC /
(LinesToRequestPrefetchPixelData - (st_vars->LinesToRequestPrefetchPixelData -
(VInitPreFillC - 3.0) / 2.0)); (VInitPreFillC - 3.0) / 2.0));
*VRatioPrefetchC = dml_max(*VRatioPrefetchC, 1.0); *VRatioPrefetchC = dml_max(*VRatioPrefetchC, 1.0);
} else { } else {
...@@ -3924,25 +3898,25 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -3924,25 +3898,25 @@ bool dml32_CalculatePrefetchSchedule(
} }
*RequiredPrefetchPixDataBWLuma = (double) PrefetchSourceLinesY *RequiredPrefetchPixDataBWLuma = (double) PrefetchSourceLinesY
/ LinesToRequestPrefetchPixelData * myPipe->BytePerPixelY * swath_width_luma_ub / st_vars->LinesToRequestPrefetchPixelData * myPipe->BytePerPixelY * swath_width_luma_ub
/ LineTime; / st_vars->LineTime;
#ifdef __DML_VBA_DEBUG__ #ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: BytePerPixelY = %d\n", __func__, myPipe->BytePerPixelY); dml_print("DML::%s: BytePerPixelY = %d\n", __func__, myPipe->BytePerPixelY);
dml_print("DML::%s: swath_width_luma_ub = %d\n", __func__, swath_width_luma_ub); dml_print("DML::%s: swath_width_luma_ub = %d\n", __func__, swath_width_luma_ub);
dml_print("DML::%s: LineTime = %f\n", __func__, LineTime); dml_print("DML::%s: LineTime = %f\n", __func__, st_vars->LineTime);
dml_print("DML::%s: RequiredPrefetchPixDataBWLuma = %f\n", dml_print("DML::%s: RequiredPrefetchPixDataBWLuma = %f\n",
__func__, *RequiredPrefetchPixDataBWLuma); __func__, *RequiredPrefetchPixDataBWLuma);
#endif #endif
*RequiredPrefetchPixDataBWChroma = (double) PrefetchSourceLinesC / *RequiredPrefetchPixDataBWChroma = (double) PrefetchSourceLinesC /
LinesToRequestPrefetchPixelData st_vars->LinesToRequestPrefetchPixelData
* myPipe->BytePerPixelC * myPipe->BytePerPixelC
* swath_width_chroma_ub / LineTime; * swath_width_chroma_ub / st_vars->LineTime;
} else { } else {
MyError = true; MyError = true;
#ifdef __DML_VBA_DEBUG__ #ifdef __DML_VBA_DEBUG__
dml_print("DML:%s: MyErr set. LinesToRequestPrefetchPixelData: %f, should be > 0\n", dml_print("DML:%s: MyErr set. LinesToRequestPrefetchPixelData: %f, should be > 0\n",
__func__, LinesToRequestPrefetchPixelData); __func__, st_vars->LinesToRequestPrefetchPixelData);
#endif #endif
*VRatioPrefetchY = 0; *VRatioPrefetchY = 0;
*VRatioPrefetchC = 0; *VRatioPrefetchC = 0;
...@@ -3951,15 +3925,15 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -3951,15 +3925,15 @@ bool dml32_CalculatePrefetchSchedule(
} }
#ifdef __DML_VBA_DEBUG__ #ifdef __DML_VBA_DEBUG__
dml_print("DML: Tpre: %fus - sum of time to request meta pte, 2 x data pte + meta data, swaths\n", dml_print("DML: Tpre: %fus - sum of time to request meta pte, 2 x data pte + meta data, swaths\n",
(double)LinesToRequestPrefetchPixelData * LineTime + (double)st_vars->LinesToRequestPrefetchPixelData * st_vars->LineTime +
2.0*TimeForFetchingRowInVBlank + TimeForFetchingMetaPTE); 2.0*st_vars->TimeForFetchingRowInVBlank + st_vars->TimeForFetchingMetaPTE);
dml_print("DML: Tvm: %fus - time to fetch page tables for meta surface\n", TimeForFetchingMetaPTE); dml_print("DML: Tvm: %fus - time to fetch page tables for meta surface\n", st_vars->TimeForFetchingMetaPTE);
dml_print("DML: To: %fus - time for propagation from scaler to optc\n", dml_print("DML: To: %fus - time for propagation from scaler to optc\n",
(*DSTYAfterScaler + ((double) (*DSTXAfterScaler) / (double) myPipe->HTotal)) * LineTime); (*DSTYAfterScaler + ((double) (*DSTXAfterScaler) / (double) myPipe->HTotal)) * st_vars->LineTime);
dml_print("DML: Tvstartup - TSetup - Tcalc - Twait - Tpre - To > 0\n"); dml_print("DML: Tvstartup - TSetup - Tcalc - Twait - Tpre - To > 0\n");
dml_print("DML: Tslack(pre): %fus - time left over in schedule\n", VStartup * LineTime - dml_print("DML: Tslack(pre): %fus - time left over in schedule\n", VStartup * st_vars->LineTime -
TimeForFetchingMetaPTE - 2*TimeForFetchingRowInVBlank - (*DSTYAfterScaler + st_vars->TimeForFetchingMetaPTE - 2*st_vars->TimeForFetchingRowInVBlank - (*DSTYAfterScaler +
((double) (*DSTXAfterScaler) / (double) myPipe->HTotal)) * LineTime - TWait - TCalc - *TSetup); ((double) (*DSTXAfterScaler) / (double) myPipe->HTotal)) * st_vars->LineTime - TWait - TCalc - *TSetup);
dml_print("DML: row_bytes = dpte_row_bytes (per_pipe) = PixelPTEBytesPerRow = : %d\n", dml_print("DML: row_bytes = dpte_row_bytes (per_pipe) = PixelPTEBytesPerRow = : %d\n",
PixelPTEBytesPerRow); PixelPTEBytesPerRow);
#endif #endif
...@@ -3967,7 +3941,7 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -3967,7 +3941,7 @@ bool dml32_CalculatePrefetchSchedule(
MyError = true; MyError = true;
#ifdef __DML_VBA_DEBUG__ #ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: MyErr set, dst_y_prefetch_equ = %f (should be > 1)\n", dml_print("DML::%s: MyErr set, dst_y_prefetch_equ = %f (should be > 1)\n",
__func__, dst_y_prefetch_equ); __func__, st_vars->dst_y_prefetch_equ);
#endif #endif
} }
...@@ -3983,10 +3957,10 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -3983,10 +3957,10 @@ bool dml32_CalculatePrefetchSchedule(
dml_print("DML::%s: HostVMInefficiencyFactor = %f\n", __func__, HostVMInefficiencyFactor); dml_print("DML::%s: HostVMInefficiencyFactor = %f\n", __func__, HostVMInefficiencyFactor);
dml_print("DML::%s: DestinationLinesToRequestVMInVBlank = %f\n", dml_print("DML::%s: DestinationLinesToRequestVMInVBlank = %f\n",
__func__, *DestinationLinesToRequestVMInVBlank); __func__, *DestinationLinesToRequestVMInVBlank);
dml_print("DML::%s: LineTime = %f\n", __func__, LineTime); dml_print("DML::%s: LineTime = %f\n", __func__, st_vars->LineTime);
#endif #endif
prefetch_vm_bw = PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor / prefetch_vm_bw = PDEAndMetaPTEBytesFrame * HostVMInefficiencyFactor /
(*DestinationLinesToRequestVMInVBlank * LineTime); (*DestinationLinesToRequestVMInVBlank * st_vars->LineTime);
#ifdef __DML_VBA_DEBUG__ #ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: prefetch_vm_bw = %f\n", __func__, prefetch_vm_bw); dml_print("DML::%s: prefetch_vm_bw = %f\n", __func__, prefetch_vm_bw);
#endif #endif
...@@ -4003,7 +3977,7 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -4003,7 +3977,7 @@ bool dml32_CalculatePrefetchSchedule(
prefetch_row_bw = 0; prefetch_row_bw = 0;
} else if (*DestinationLinesToRequestRowInVBlank > 0) { } else if (*DestinationLinesToRequestRowInVBlank > 0) {
prefetch_row_bw = (MetaRowByte + PixelPTEBytesPerRow * HostVMInefficiencyFactor) / prefetch_row_bw = (MetaRowByte + PixelPTEBytesPerRow * HostVMInefficiencyFactor) /
(*DestinationLinesToRequestRowInVBlank * LineTime); (*DestinationLinesToRequestRowInVBlank * st_vars->LineTime);
#ifdef __DML_VBA_DEBUG__ #ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: MetaRowByte = %d\n", __func__, MetaRowByte); dml_print("DML::%s: MetaRowByte = %d\n", __func__, MetaRowByte);
...@@ -4026,12 +4000,12 @@ bool dml32_CalculatePrefetchSchedule( ...@@ -4026,12 +4000,12 @@ bool dml32_CalculatePrefetchSchedule(
if (MyError) { if (MyError) {
*PrefetchBandwidth = 0; *PrefetchBandwidth = 0;
TimeForFetchingMetaPTE = 0; st_vars->TimeForFetchingMetaPTE = 0;
TimeForFetchingRowInVBlank = 0; st_vars->TimeForFetchingRowInVBlank = 0;
*DestinationLinesToRequestVMInVBlank = 0; *DestinationLinesToRequestVMInVBlank = 0;
*DestinationLinesToRequestRowInVBlank = 0; *DestinationLinesToRequestRowInVBlank = 0;
*DestinationLinesForPrefetch = 0; *DestinationLinesForPrefetch = 0;
LinesToRequestPrefetchPixelData = 0; st_vars->LinesToRequestPrefetchPixelData = 0;
*VRatioPrefetchY = 0; *VRatioPrefetchY = 0;
*VRatioPrefetchC = 0; *VRatioPrefetchC = 0;
*RequiredPrefetchPixDataBWLuma = 0; *RequiredPrefetchPixDataBWLuma = 0;
......
...@@ -715,6 +715,7 @@ double dml32_CalculateExtraLatency( ...@@ -715,6 +715,7 @@ double dml32_CalculateExtraLatency(
unsigned int HostVMMaxNonCachedPageTableLevels); unsigned int HostVMMaxNonCachedPageTableLevels);
bool dml32_CalculatePrefetchSchedule( bool dml32_CalculatePrefetchSchedule(
struct dml32_CalculatePrefetchSchedule *st_vars,
double HostVMInefficiencyFactor, double HostVMInefficiencyFactor,
DmlPipe *myPipe, DmlPipe *myPipe,
unsigned int DSCDelay, unsigned int DSCDelay,
......
...@@ -247,6 +247,43 @@ struct dml32_CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport { ...@@ -247,6 +247,43 @@ struct dml32_CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport {
unsigned int LBLatencyHidingSourceLinesC[DC__NUM_DPP__MAX]; unsigned int LBLatencyHidingSourceLinesC[DC__NUM_DPP__MAX];
}; };
struct dml32_CalculatePrefetchSchedule {
unsigned int DPPCycles, DISPCLKCycles;
double DSTTotalPixelsAfterScaler;
double LineTime;
double dst_y_prefetch_equ;
double prefetch_bw_oto;
double Tvm_oto;
double Tr0_oto;
double Tvm_oto_lines;
double Tr0_oto_lines;
double dst_y_prefetch_oto;
double TimeForFetchingMetaPTE;
double TimeForFetchingRowInVBlank;
double LinesToRequestPrefetchPixelData;
unsigned int HostVMDynamicLevelsTrips;
double trip_to_mem;
double Tvm_trips;
double Tr0_trips;
double Tvm_trips_rounded;
double Tr0_trips_rounded;
double Lsw_oto;
double Tpre_rounded;
double prefetch_bw_equ;
double Tvm_equ;
double Tr0_equ;
double Tdmbf;
double Tdmec;
double Tdmsks;
double prefetch_sw_bytes;
double bytes_pp;
double dep_bytes;
unsigned int max_vratio_pre;
double min_Lsw;
double Tsw_est1;
double Tsw_est3;
};
struct DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation { struct DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation {
unsigned int dummy_integer_array[2][DC__NUM_DPP__MAX]; unsigned int dummy_integer_array[2][DC__NUM_DPP__MAX];
double dummy_single_array[2][DC__NUM_DPP__MAX]; double dummy_single_array[2][DC__NUM_DPP__MAX];
...@@ -321,6 +358,7 @@ struct dummy_vars { ...@@ -321,6 +358,7 @@ struct dummy_vars {
struct dml32_CalculateSwathAndDETConfiguration dml32_CalculateSwathAndDETConfiguration; struct dml32_CalculateSwathAndDETConfiguration dml32_CalculateSwathAndDETConfiguration;
struct dml32_CalculateVMRowAndSwath dml32_CalculateVMRowAndSwath; struct dml32_CalculateVMRowAndSwath dml32_CalculateVMRowAndSwath;
struct dml32_CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport dml32_CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport; struct dml32_CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport dml32_CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport;
struct dml32_CalculatePrefetchSchedule dml32_CalculatePrefetchSchedule;
}; };
struct vba_vars_st { struct vba_vars_st {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment