[PATCH 1/2] drm/amd/display: Reduce stack size for dml31_ModeSupportAndSystemConfigurationFull

Michel Dänzer michel at daenzer.net
Mon Dec 13 09:46:34 UTC 2021


On 2021-12-11 13:20, Rodrigo Siqueira Jordao wrote:
> 
> 
> On 2021-12-09 11:46 a.m., Michel Dänzer wrote:
>> From: Michel Dänzer <mdaenzer at redhat.com>
>>
>> Move code using the Pipe struct to a new helper function.
>>
>> Works around[0] this warning (resulting in failure to build a RHEL debug
>> kernel with Werror enabled):
>>
>> ../drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn31/display_mode_vba_31.c: In function ‘dml31_ModeSupportAndSystemConfigurationFull’:
>> ../drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn31/display_mode_vba_31.c:5740:1: warning: the frame size of 2144 bytes is larger than 2048 bytes [-Wframe-larger-than=]
>>
>> The culprit seems to be the Pipe struct, so pull the relevant block out
>> into its own sub-function. (This is porting
>> a62427ef9b55 "drm/amd/display: Reduce stack size for dml21_ModeSupportAndSystemConfigurationFull"
>> from dml31 to dml21)
>>
>> [0] AFAICT this doesn't actually reduce the total amount of stack which
>> can be used, just moves some of it from
>> dml31_ModeSupportAndSystemConfigurationFull to the new helper function,
>> so the former happens to no longer exceed the limit for a single
>> function.
>>
>> Signed-off-by: Michel Dänzer <mdaenzer at redhat.com>
>> ---
>>   .../dc/dml/dcn31/display_mode_vba_31.c        | 185 ++++++++++--------
>>   1 file changed, 99 insertions(+), 86 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn31/display_mode_vba_31.c b/drivers/gpu/drm/amd/display/dc/dml/dcn31/display_mode_vba_31.c
>> index 7e937bdcea00..8965f9af9d0a 100644
>> --- a/drivers/gpu/drm/amd/display/dc/dml/dcn31/display_mode_vba_31.c
>> +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn31/display_mode_vba_31.c
>> @@ -3949,6 +3949,102 @@ static double TruncToValidBPP(
>>       return BPP_INVALID;
>>   }
>>   +static noinline void CalculatePrefetchSchedulePerPlane(
>> +        struct display_mode_lib *mode_lib,
>> +        double HostVMInefficiencyFactor,
>> +        int i,
>> +        unsigned j,
>> +        unsigned k)
>> +{
>> +    struct vba_vars_st *v = &mode_lib->vba;
>> +    Pipe myPipe;
>> +
>> +    myPipe.DPPCLK = v->RequiredDPPCLK[i][j][k];
>> +    myPipe.DISPCLK = v->RequiredDISPCLK[i][j];
>> +    myPipe.PixelClock = v->PixelClock[k];
>> +    myPipe.DCFCLKDeepSleep = v->ProjectedDCFCLKDeepSleep[i][j];
>> +    myPipe.DPPPerPlane = v->NoOfDPP[i][j][k];
>> +    myPipe.ScalerEnabled = v->ScalerEnabled[k];
>> +    myPipe.SourceScan = v->SourceScan[k];
>> +    myPipe.BlockWidth256BytesY = v->Read256BlockWidthY[k];
>> +    myPipe.BlockHeight256BytesY = v->Read256BlockHeightY[k];
>> +    myPipe.BlockWidth256BytesC = v->Read256BlockWidthC[k];
>> +    myPipe.BlockHeight256BytesC = v->Read256BlockHeightC[k];
>> +    myPipe.InterlaceEnable = v->Interlace[k];
>> +    myPipe.NumberOfCursors = v->NumberOfCursors[k];
>> +    myPipe.VBlank = v->VTotal[k] - v->VActive[k];
>> +    myPipe.HTotal = v->HTotal[k];
>> +    myPipe.DCCEnable = v->DCCEnable[k];
>> +    myPipe.ODMCombineIsEnabled = v->ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_4to1
>> +        || v->ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_2to1;
>> +    myPipe.SourcePixelFormat = v->SourcePixelFormat[k];
>> +    myPipe.BytePerPixelY = v->BytePerPixelY[k];
>> +    myPipe.BytePerPixelC = v->BytePerPixelC[k];
>> +    myPipe.ProgressiveToInterlaceUnitInOPP = v->ProgressiveToInterlaceUnitInOPP;
>> +    v->NoTimeForPrefetch[i][j][k] = CalculatePrefetchSchedule(
>> +        mode_lib,
>> +        HostVMInefficiencyFactor,
>> +        &myPipe,
>> +        v->DSCDelayPerState[i][k],
>> +        v->DPPCLKDelaySubtotal + v->DPPCLKDelayCNVCFormater,
>> +        v->DPPCLKDelaySCL,
>> +        v->DPPCLKDelaySCLLBOnly,
>> +        v->DPPCLKDelayCNVCCursor,
>> +        v->DISPCLKDelaySubtotal,
>> +        v->SwathWidthYThisState[k] / v->HRatio[k],
>> +        v->OutputFormat[k],
>> +        v->MaxInterDCNTileRepeaters,
>> +        dml_min(v->MaxVStartup, v->MaximumVStartup[i][j][k]),
>> +        v->MaximumVStartup[i][j][k],
>> +        v->GPUVMMaxPageTableLevels,
>> +        v->GPUVMEnable,
>> +        v->HostVMEnable,
>> +        v->HostVMMaxNonCachedPageTableLevels,
>> +        v->HostVMMinPageSize,
>> +        v->DynamicMetadataEnable[k],
>> +        v->DynamicMetadataVMEnabled,
>> +        v->DynamicMetadataLinesBeforeActiveRequired[k],
>> +        v->DynamicMetadataTransmittedBytes[k],
>> +        v->UrgLatency[i],
>> +        v->ExtraLatency,
>> +        v->TimeCalc,
>> +        v->PDEAndMetaPTEBytesPerFrame[i][j][k],
>> +        v->MetaRowBytes[i][j][k],
>> +        v->DPTEBytesPerRow[i][j][k],
>> +        v->PrefetchLinesY[i][j][k],
>> +        v->SwathWidthYThisState[k],
>> +        v->PrefillY[k],
>> +        v->MaxNumSwY[k],
>> +        v->PrefetchLinesC[i][j][k],
>> +        v->SwathWidthCThisState[k],
>> +        v->PrefillC[k],
>> +        v->MaxNumSwC[k],
>> +        v->swath_width_luma_ub_this_state[k],
>> +        v->swath_width_chroma_ub_this_state[k],
>> +        v->SwathHeightYThisState[k],
>> +        v->SwathHeightCThisState[k],
>> +        v->TWait,
>> +        &v->DSTXAfterScaler[k],
>> +        &v->DSTYAfterScaler[k],
>> +        &v->LineTimesForPrefetch[k],
>> +        &v->PrefetchBW[k],
>> +        &v->LinesForMetaPTE[k],
>> +        &v->LinesForMetaAndDPTERow[k],
>> +        &v->VRatioPreY[i][j][k],
>> +        &v->VRatioPreC[i][j][k],
>> +        &v->RequiredPrefetchPixelDataBWLuma[i][j][k],
>> +        &v->RequiredPrefetchPixelDataBWChroma[i][j][k],
>> +        &v->NoTimeForDynamicMetadata[i][j][k],
>> +        &v->Tno_bw[k],
>> +        &v->prefetch_vmrow_bw[k],
>> +        &v->dummy7[k],
>> +        &v->dummy8[k],
>> +        &v->dummy13[k],
>> +        &v->VUpdateOffsetPix[k],
>> +        &v->VUpdateWidthPix[k],
>> +        &v->VReadyOffsetPix[k]);
>> +}
>> +
>>   void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_lib)
>>   {
>>       struct vba_vars_st *v = &mode_lib->vba;
>> @@ -5276,92 +5372,9 @@ void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
>>                           v->SREnterPlusExitTime);
>>                     for (k = 0; k < v->NumberOfActivePlanes; k++) {
>> -                    Pipe myPipe;
>> -
>> -                    myPipe.DPPCLK = v->RequiredDPPCLK[i][j][k];
>> -                    myPipe.DISPCLK = v->RequiredDISPCLK[i][j];
>> -                    myPipe.PixelClock = v->PixelClock[k];
>> -                    myPipe.DCFCLKDeepSleep = v->ProjectedDCFCLKDeepSleep[i][j];
>> -                    myPipe.DPPPerPlane = v->NoOfDPP[i][j][k];
>> -                    myPipe.ScalerEnabled = v->ScalerEnabled[k];
>> -                    myPipe.SourceScan = v->SourceScan[k];
>> -                    myPipe.BlockWidth256BytesY = v->Read256BlockWidthY[k];
>> -                    myPipe.BlockHeight256BytesY = v->Read256BlockHeightY[k];
>> -                    myPipe.BlockWidth256BytesC = v->Read256BlockWidthC[k];
>> -                    myPipe.BlockHeight256BytesC = v->Read256BlockHeightC[k];
>> -                    myPipe.InterlaceEnable = v->Interlace[k];
>> -                    myPipe.NumberOfCursors = v->NumberOfCursors[k];
>> -                    myPipe.VBlank = v->VTotal[k] - v->VActive[k];
>> -                    myPipe.HTotal = v->HTotal[k];
>> -                    myPipe.DCCEnable = v->DCCEnable[k];
>> -                    myPipe.ODMCombineIsEnabled = v->ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_4to1
>> -                            || v->ODMCombineEnablePerState[i][k] == dm_odm_combine_mode_2to1;
>> -                    myPipe.SourcePixelFormat = v->SourcePixelFormat[k];
>> -                    myPipe.BytePerPixelY = v->BytePerPixelY[k];
>> -                    myPipe.BytePerPixelC = v->BytePerPixelC[k];
>> -                    myPipe.ProgressiveToInterlaceUnitInOPP = v->ProgressiveToInterlaceUnitInOPP;
>> -                    v->NoTimeForPrefetch[i][j][k] = CalculatePrefetchSchedule(
>> -                            mode_lib,
>> -                            HostVMInefficiencyFactor,
>> -                            &myPipe,
>> -                            v->DSCDelayPerState[i][k],
>> -                            v->DPPCLKDelaySubtotal + v->DPPCLKDelayCNVCFormater,
>> -                            v->DPPCLKDelaySCL,
>> -                            v->DPPCLKDelaySCLLBOnly,
>> -                            v->DPPCLKDelayCNVCCursor,
>> -                            v->DISPCLKDelaySubtotal,
>> -                            v->SwathWidthYThisState[k] / v->HRatio[k],
>> -                            v->OutputFormat[k],
>> -                            v->MaxInterDCNTileRepeaters,
>> -                            dml_min(v->MaxVStartup, v->MaximumVStartup[i][j][k]),
>> -                            v->MaximumVStartup[i][j][k],
>> -                            v->GPUVMMaxPageTableLevels,
>> -                            v->GPUVMEnable,
>> -                            v->HostVMEnable,
>> -                            v->HostVMMaxNonCachedPageTableLevels,
>> -                            v->HostVMMinPageSize,
>> -                            v->DynamicMetadataEnable[k],
>> -                            v->DynamicMetadataVMEnabled,
>> -                            v->DynamicMetadataLinesBeforeActiveRequired[k],
>> -                            v->DynamicMetadataTransmittedBytes[k],
>> -                            v->UrgLatency[i],
>> -                            v->ExtraLatency,
>> -                            v->TimeCalc,
>> -                            v->PDEAndMetaPTEBytesPerFrame[i][j][k],
>> -                            v->MetaRowBytes[i][j][k],
>> -                            v->DPTEBytesPerRow[i][j][k],
>> -                            v->PrefetchLinesY[i][j][k],
>> -                            v->SwathWidthYThisState[k],
>> -                            v->PrefillY[k],
>> -                            v->MaxNumSwY[k],
>> -                            v->PrefetchLinesC[i][j][k],
>> -                            v->SwathWidthCThisState[k],
>> -                            v->PrefillC[k],
>> -                            v->MaxNumSwC[k],
>> -                            v->swath_width_luma_ub_this_state[k],
>> -                            v->swath_width_chroma_ub_this_state[k],
>> -                            v->SwathHeightYThisState[k],
>> -                            v->SwathHeightCThisState[k],
>> -                            v->TWait,
>> -                            &v->DSTXAfterScaler[k],
>> -                            &v->DSTYAfterScaler[k],
>> -                            &v->LineTimesForPrefetch[k],
>> -                            &v->PrefetchBW[k],
>> -                            &v->LinesForMetaPTE[k],
>> -                            &v->LinesForMetaAndDPTERow[k],
>> -                            &v->VRatioPreY[i][j][k],
>> -                            &v->VRatioPreC[i][j][k],
>> -                            &v->RequiredPrefetchPixelDataBWLuma[i][j][k],
>> -                            &v->RequiredPrefetchPixelDataBWChroma[i][j][k],
>> -                            &v->NoTimeForDynamicMetadata[i][j][k],
>> -                            &v->Tno_bw[k],
>> -                            &v->prefetch_vmrow_bw[k],
>> -                            &v->dummy7[k],
>> -                            &v->dummy8[k],
>> -                            &v->dummy13[k],
>> -                            &v->VUpdateOffsetPix[k],
>> -                            &v->VUpdateWidthPix[k],
>> -                            &v->VReadyOffsetPix[k]);
>> +                    CalculatePrefetchSchedulePerPlane(mode_lib,
>> +                                      HostVMInefficiencyFactor,
>> +                                      i, j,    k);
>>                   }
>>                     for (k = 0; k < v->NumberOfActivePlanes; k++) {
>>
> 
> Hi Michel,
> 
> Overwall I think this series is good. I also run it in our internal CI and everything looks fine.
> 
> Reviewed-by: Rodrigo Siqueira <Rodrigo.Siqueira at amd.com>
> 
> And applied to amd-staging-drm-next.

Thanks!

Are there any plans for actually reducing the combined amount of stack used by ModeSupportAndSystemConfigurationFull + CalculatePrefetchSchedulePerPlane?


Also, did you check that UseMinimumDCFCLK now modifying mode_lib->vba.DCFCLKState[i][j] and possibly other values in mode_lib->vba makes sense?


-- 
Earthling Michel Dänzer            |                  https://redhat.com
Libre software enthusiast          |         Mesa and Xwayland developer


More information about the dri-devel mailing list