Re: [PATCH] drm/amd/display: reduce stack size in dcn32 dml (v2)

2022-07-22 Thread Christian König

Am 20.07.22 um 18:05 schrieb Alex Deucher:

Move additional dummy structures off the stack and into
the dummy vars structure.

Fixes the following:
drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn32/display_mode_vba_32.c: In 
function 
'DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation':
drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn32/display_mode_vba_32.c:1659:1:
 error: the frame size of 2144 bytes is larger than 2048 bytes 
[-Werror=frame-larger-than=]
  1659 | }
   | ^
drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn32/display_mode_vba_32.c: In 
function 'dml32_ModeSupportAndSystemConfigurationFull':
drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn32/display_mode_vba_32.c:3799:1:
 error: the frame size of 2464 bytes is larger than 2048 bytes 
[-Werror=frame-larger-than=]
  3799 | } // ModeSupportAndSystemConfigurationFull
   | ^

v2: more more stuff to dummy structure, fix init order (Alex)

Signed-off-by: Alex Deucher 
Cc: Stephen Rothwell 


Acked-by: Christian König 


---
  .../dc/dml/dcn32/display_mode_vba_32.c| 406 --
  .../drm/amd/display/dc/dml/display_mode_vba.h |  35 ++
  2 files changed, 214 insertions(+), 227 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c 
b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c
index 349e36ae9333..91450a973920 100644
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c
@@ -67,6 +67,12 @@ static void 
DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
int iteration;
double MaxTotalRDBandwidth;
unsigned int NextPrefetchMode;
+   double MaxTotalRDBandwidthNoUrgentBurst = 0.0;
+   bool DestinationLineTimesForPrefetchLessThan2 = false;
+   bool VRatioPrefetchMoreThanMax = false;
+   double TWait;
+   double TotalWRBandwidth = 0;
+   double WRBandwidth = 0;
  
  #ifdef __DML_VBA_DEBUG__

dml_print("DML::%s: --- START ---\n", __func__);
@@ -702,11 +708,6 @@ static void 
DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
NextPrefetchMode = 
mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb];
  
  	do {

-   double MaxTotalRDBandwidthNoUrgentBurst = 0.0;
-   bool DestinationLineTimesForPrefetchLessThan2 = false;
-   bool VRatioPrefetchMoreThanMax = false;
-   double dummy_unit_vector[DC__NUM_DPP__MAX];
-
MaxTotalRDBandwidth = 0;
  #ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: Start loop: VStartup = %d\n", __func__, 
mode_lib->vba.VStartupLines);
@@ -715,41 +716,39 @@ static void 
DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
/* NOTE PerfetchMode variable is invalid in DAL as per 
the input received.
 * Hence the direction is to use PrefetchModePerState.
 */
-   double TWait = dml32_CalculateTWait(
-   
mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb],
-   
mode_lib->vba.UsesMALLForPStateChange[k],
-   
mode_lib->vba.SynchronizeDRRDisplaysForUCLKPStateChangeFinal,
-   mode_lib->vba.DRRDisplay[k],
-   mode_lib->vba.DRAMClockChangeLatency,
-   mode_lib->vba.FCLKChangeLatency, 
v->UrgentLatency,
-   mode_lib->vba.SREnterPlusExitTime);
-
-   DmlPipe myPipe;
-
-   myPipe.Dppclk = mode_lib->vba.DPPCLK[k];
-   myPipe.Dispclk = mode_lib->vba.DISPCLK;
-   myPipe.PixelClock = mode_lib->vba.PixelClock[k];
-   myPipe.DCFClkDeepSleep = v->DCFCLKDeepSleep;
-   myPipe.DPPPerSurface = mode_lib->vba.DPPPerPlane[k];
-   myPipe.ScalerEnabled = mode_lib->vba.ScalerEnabled[k];
-   myPipe.SourceRotation = mode_lib->vba.SourceRotation[k];
-   myPipe.BlockWidth256BytesY = v->BlockWidth256BytesY[k];
-   myPipe.BlockHeight256BytesY = 
v->BlockHeight256BytesY[k];
-   myPipe.BlockWidth256BytesC = v->BlockWidth256BytesC[k];
-   myPipe.BlockHeight256BytesC = 
v->BlockHeight256BytesC[k];
-   myPipe.InterlaceEnable = mode_lib->vba.Interlace[k];
-   myPipe.NumberOfCursors = 
mode_lib->vba.NumberOfCursors[k];
-   myPipe.VBlank = mode_lib->vba.VTotal[k] - 
mode_lib->vba.VActive[k];
-   myPipe.HTotal = mode_lib->vba.HTotal[k];
-   myPipe.HActive = 

[PATCH] drm/amd/display: reduce stack size in dcn32 dml (v2)

2022-07-20 Thread Alex Deucher
Move additional dummy structures off the stack and into
the dummy vars structure.

Fixes the following:
drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn32/display_mode_vba_32.c: In 
function 
'DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation':
drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn32/display_mode_vba_32.c:1659:1:
 error: the frame size of 2144 bytes is larger than 2048 bytes 
[-Werror=frame-larger-than=]
 1659 | }
  | ^
drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn32/display_mode_vba_32.c: In 
function 'dml32_ModeSupportAndSystemConfigurationFull':
drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn32/display_mode_vba_32.c:3799:1:
 error: the frame size of 2464 bytes is larger than 2048 bytes 
[-Werror=frame-larger-than=]
 3799 | } // ModeSupportAndSystemConfigurationFull
  | ^

v2: more more stuff to dummy structure, fix init order (Alex)

Signed-off-by: Alex Deucher 
Cc: Stephen Rothwell 
---
 .../dc/dml/dcn32/display_mode_vba_32.c| 406 --
 .../drm/amd/display/dc/dml/display_mode_vba.h |  35 ++
 2 files changed, 214 insertions(+), 227 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c 
b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c
index 349e36ae9333..91450a973920 100644
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c
@@ -67,6 +67,12 @@ static void 
DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
int iteration;
double MaxTotalRDBandwidth;
unsigned int NextPrefetchMode;
+   double MaxTotalRDBandwidthNoUrgentBurst = 0.0;
+   bool DestinationLineTimesForPrefetchLessThan2 = false;
+   bool VRatioPrefetchMoreThanMax = false;
+   double TWait;
+   double TotalWRBandwidth = 0;
+   double WRBandwidth = 0;
 
 #ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: --- START ---\n", __func__);
@@ -702,11 +708,6 @@ static void 
DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
NextPrefetchMode = 
mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb];
 
do {
-   double MaxTotalRDBandwidthNoUrgentBurst = 0.0;
-   bool DestinationLineTimesForPrefetchLessThan2 = false;
-   bool VRatioPrefetchMoreThanMax = false;
-   double dummy_unit_vector[DC__NUM_DPP__MAX];
-
MaxTotalRDBandwidth = 0;
 #ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: Start loop: VStartup = %d\n", __func__, 
mode_lib->vba.VStartupLines);
@@ -715,41 +716,39 @@ static void 
DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
/* NOTE PerfetchMode variable is invalid in DAL as per 
the input received.
 * Hence the direction is to use PrefetchModePerState.
 */
-   double TWait = dml32_CalculateTWait(
-   
mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb],
-   
mode_lib->vba.UsesMALLForPStateChange[k],
-   
mode_lib->vba.SynchronizeDRRDisplaysForUCLKPStateChangeFinal,
-   mode_lib->vba.DRRDisplay[k],
-   mode_lib->vba.DRAMClockChangeLatency,
-   mode_lib->vba.FCLKChangeLatency, 
v->UrgentLatency,
-   mode_lib->vba.SREnterPlusExitTime);
-
-   DmlPipe myPipe;
-
-   myPipe.Dppclk = mode_lib->vba.DPPCLK[k];
-   myPipe.Dispclk = mode_lib->vba.DISPCLK;
-   myPipe.PixelClock = mode_lib->vba.PixelClock[k];
-   myPipe.DCFClkDeepSleep = v->DCFCLKDeepSleep;
-   myPipe.DPPPerSurface = mode_lib->vba.DPPPerPlane[k];
-   myPipe.ScalerEnabled = mode_lib->vba.ScalerEnabled[k];
-   myPipe.SourceRotation = mode_lib->vba.SourceRotation[k];
-   myPipe.BlockWidth256BytesY = v->BlockWidth256BytesY[k];
-   myPipe.BlockHeight256BytesY = 
v->BlockHeight256BytesY[k];
-   myPipe.BlockWidth256BytesC = v->BlockWidth256BytesC[k];
-   myPipe.BlockHeight256BytesC = 
v->BlockHeight256BytesC[k];
-   myPipe.InterlaceEnable = mode_lib->vba.Interlace[k];
-   myPipe.NumberOfCursors = 
mode_lib->vba.NumberOfCursors[k];
-   myPipe.VBlank = mode_lib->vba.VTotal[k] - 
mode_lib->vba.VActive[k];
-   myPipe.HTotal = mode_lib->vba.HTotal[k];
-   myPipe.HActive = mode_lib->vba.HActive[k];
-   myPipe.DCCEnable = 

Re: [PATCH] drm/amd/display: reduce stack size in dcn32 dml

2022-07-20 Thread Maíra Canal



On 7/19/22 18:14, Alex Deucher wrote:
> Move additional dummy structures off the stack and into
> the dummy vars structure.
> 
> Fixes the following:
> drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn32/display_mode_vba_32.c: In 
> function 
> 'DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation':
> drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn32/display_mode_vba_32.c:1659:1:
>  error: the frame size of 2144 bytes is larger than 2048 bytes 
> [-Werror=frame-larger-than=]
>  1659 | }
>   | ^
> drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn32/display_mode_vba_32.c: In 
> function 'dml32_ModeSupportAndSystemConfigurationFull':
> drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn32/display_mode_vba_32.c:3799:1:
>  error: the frame size of 2464 bytes is larger than 2048 bytes 
> [-Werror=frame-larger-than=]
>  3799 | } // ModeSupportAndSystemConfigurationFull
>   | ^
> 
> Signed-off-by: Alex Deucher 
> Cc: Stephen Rothwell 
> ---

Reviewed-by: Maíra Canal 

I believe dcn20 could also receive the same treatment, as I'm still
getting a similar warning on display_mode_vba_20.c:

drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn20/display_mode_vba_20.c:1085:13:
warning: stack frame size (1356) exceeds limit (1024) in
'dml20_DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation'
[-Wframe-larger-than]
static void
dml20_DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation(
^
drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn20/display_mode_vba_20.c:3286:6:
warning: stack frame size (1484) exceeds limit (1024) in
'dml20_ModeSupportAndSystemConfigurationFull' [-Wframe-larger-than]
void dml20_ModeSupportAndSystemConfigurationFull(struct display_mode_lib
*mode_lib)
 ^
2 warnings generated.

To reproduce it on clang-14, you can run:

make -skj"$(nproc)" LLVM=1 LLVM_IAS=1 i386_defconfig
scripts/config -e DRM_AMDGPU
make -skj"$(nproc)" LLVM=1 LLVM_IAS=1 olddefconfig
drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn20/display_mode_vba_20.o

I believe it is also reproducible on GCC.

Best regards,
- Maíra Canal

>  .../dc/dml/dcn32/display_mode_vba_32.c| 214 --
>  .../drm/amd/display/dc/dml/display_mode_vba.h |   3 +
>  2 files changed, 100 insertions(+), 117 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c 
> b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c
> index 349e36ae9333..441311cb9a86 100644
> --- a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c
> +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c
> @@ -67,6 +67,18 @@ static void 
> DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
>   int iteration;
>   double MaxTotalRDBandwidth;
>   unsigned int NextPrefetchMode;
> + double MaxTotalRDBandwidthNoUrgentBurst = 0.0;
> + bool DestinationLineTimesForPrefetchLessThan2 = false;
> + bool VRatioPrefetchMoreThanMax = false;
> + double dummy_unit_vector[DC__NUM_DPP__MAX];
> + double TWait;
> + double dummy_single[2];
> + bool dummy_boolean[1];
> + enum clock_change_support dummy_dramchange_support;
> + enum dm_fclock_change_support dummy_fclkchange_support;
> + bool dummy_USRRetrainingSupport;
> + double TotalWRBandwidth = 0;
> + double WRBandwidth = 0;
>  
>  #ifdef __DML_VBA_DEBUG__
>   dml_print("DML::%s: --- START ---\n", __func__);
> @@ -702,11 +714,6 @@ static void 
> DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
>   NextPrefetchMode = 
> mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb];
>  
>   do {
> - double MaxTotalRDBandwidthNoUrgentBurst = 0.0;
> - bool DestinationLineTimesForPrefetchLessThan2 = false;
> - bool VRatioPrefetchMoreThanMax = false;
> - double dummy_unit_vector[DC__NUM_DPP__MAX];
> -
>   MaxTotalRDBandwidth = 0;
>  #ifdef __DML_VBA_DEBUG__
>   dml_print("DML::%s: Start loop: VStartup = %d\n", __func__, 
> mode_lib->vba.VStartupLines);
> @@ -715,41 +722,39 @@ static void 
> DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
>   /* NOTE PerfetchMode variable is invalid in DAL as per 
> the input received.
>* Hence the direction is to use PrefetchModePerState.
>*/
> - double TWait = dml32_CalculateTWait(
> - 
> mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb],
> - 
> mode_lib->vba.UsesMALLForPStateChange[k],
> - 
> mode_lib->vba.SynchronizeDRRDisplaysForUCLKPStateChangeFinal,
> - mode_lib->vba.DRRDisplay[k],
> - 

[PATCH] drm/amd/display: reduce stack size in dcn32 dml

2022-07-19 Thread Alex Deucher
Move additional dummy structures off the stack and into
the dummy vars structure.

Fixes the following:
drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn32/display_mode_vba_32.c: In 
function 
'DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation':
drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn32/display_mode_vba_32.c:1659:1:
 error: the frame size of 2144 bytes is larger than 2048 bytes 
[-Werror=frame-larger-than=]
 1659 | }
  | ^
drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn32/display_mode_vba_32.c: In 
function 'dml32_ModeSupportAndSystemConfigurationFull':
drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn32/display_mode_vba_32.c:3799:1:
 error: the frame size of 2464 bytes is larger than 2048 bytes 
[-Werror=frame-larger-than=]
 3799 | } // ModeSupportAndSystemConfigurationFull
  | ^

Signed-off-by: Alex Deucher 
Cc: Stephen Rothwell 
---
 .../dc/dml/dcn32/display_mode_vba_32.c| 214 --
 .../drm/amd/display/dc/dml/display_mode_vba.h |   3 +
 2 files changed, 100 insertions(+), 117 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c 
b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c
index 349e36ae9333..441311cb9a86 100644
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c
@@ -67,6 +67,18 @@ static void 
DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
int iteration;
double MaxTotalRDBandwidth;
unsigned int NextPrefetchMode;
+   double MaxTotalRDBandwidthNoUrgentBurst = 0.0;
+   bool DestinationLineTimesForPrefetchLessThan2 = false;
+   bool VRatioPrefetchMoreThanMax = false;
+   double dummy_unit_vector[DC__NUM_DPP__MAX];
+   double TWait;
+   double dummy_single[2];
+   bool dummy_boolean[1];
+   enum clock_change_support dummy_dramchange_support;
+   enum dm_fclock_change_support dummy_fclkchange_support;
+   bool dummy_USRRetrainingSupport;
+   double TotalWRBandwidth = 0;
+   double WRBandwidth = 0;
 
 #ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: --- START ---\n", __func__);
@@ -702,11 +714,6 @@ static void 
DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
NextPrefetchMode = 
mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb];
 
do {
-   double MaxTotalRDBandwidthNoUrgentBurst = 0.0;
-   bool DestinationLineTimesForPrefetchLessThan2 = false;
-   bool VRatioPrefetchMoreThanMax = false;
-   double dummy_unit_vector[DC__NUM_DPP__MAX];
-
MaxTotalRDBandwidth = 0;
 #ifdef __DML_VBA_DEBUG__
dml_print("DML::%s: Start loop: VStartup = %d\n", __func__, 
mode_lib->vba.VStartupLines);
@@ -715,41 +722,39 @@ static void 
DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
/* NOTE PerfetchMode variable is invalid in DAL as per 
the input received.
 * Hence the direction is to use PrefetchModePerState.
 */
-   double TWait = dml32_CalculateTWait(
-   
mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb],
-   
mode_lib->vba.UsesMALLForPStateChange[k],
-   
mode_lib->vba.SynchronizeDRRDisplaysForUCLKPStateChangeFinal,
-   mode_lib->vba.DRRDisplay[k],
-   mode_lib->vba.DRAMClockChangeLatency,
-   mode_lib->vba.FCLKChangeLatency, 
v->UrgentLatency,
-   mode_lib->vba.SREnterPlusExitTime);
-
-   DmlPipe myPipe;
-
-   myPipe.Dppclk = mode_lib->vba.DPPCLK[k];
-   myPipe.Dispclk = mode_lib->vba.DISPCLK;
-   myPipe.PixelClock = mode_lib->vba.PixelClock[k];
-   myPipe.DCFClkDeepSleep = v->DCFCLKDeepSleep;
-   myPipe.DPPPerSurface = mode_lib->vba.DPPPerPlane[k];
-   myPipe.ScalerEnabled = mode_lib->vba.ScalerEnabled[k];
-   myPipe.SourceRotation = mode_lib->vba.SourceRotation[k];
-   myPipe.BlockWidth256BytesY = v->BlockWidth256BytesY[k];
-   myPipe.BlockHeight256BytesY = 
v->BlockHeight256BytesY[k];
-   myPipe.BlockWidth256BytesC = v->BlockWidth256BytesC[k];
-   myPipe.BlockHeight256BytesC = 
v->BlockHeight256BytesC[k];
-   myPipe.InterlaceEnable = mode_lib->vba.Interlace[k];
-   myPipe.NumberOfCursors = 
mode_lib->vba.NumberOfCursors[k];
-   myPipe.VBlank = mode_lib->vba.VTotal[k] -