On 12/2/25 09:29, Alex Hung wrote:


On 12/2/25 03:21, Chenyu Chen wrote:
From: Alex Hung <[email protected]>

[WHAT]
When compiling Linux kernel with clang, the following warning / error
messages pops up:

drivers/gpu/drm/amd/amdgpu/../dal-dev/dc/dml2_0/ display_mode_core.c:6853:12:
error: stack frame size (2120) exceeds limit (2056) in
'dml_core_mode_support' [-Werror,-Wframe-larger-than]
  6853 | dml_bool_t dml_core_mode_support(struct display_mode_lib_st
*mode_lib)

[HOW]
Refactoring CalculateVMRowAndSwath_params assignments to a new function
helps reduce the stack frame size in dml_core_mode_support.

Hi Chenyu,

A bug seems to be related. Can you add a buglink? Thanks.

Buglink: https://gitlab.freedesktop.org/drm/amd/-/issues/4733

Correction, Add "Closes" instead of "Buglink"


Reviewed-by: Austin Zheng <[email protected]>
Reviewed-by: Aurabindo Pillai <[email protected]>
Signed-off-by: Alex Hung <[email protected]>
Signed-off-by: Chenyu Chen <[email protected]>
---
  .../amd/display/dc/dml2_0/display_mode_core.c | 134 ++++++++++--------
  1 file changed, 71 insertions(+), 63 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dml2_0/display_mode_core.c b/drivers/gpu/drm/amd/display/dc/dml2_0/display_mode_core.c
index c468f492b876..09303c282495 100644
--- a/drivers/gpu/drm/amd/display/dc/dml2_0/display_mode_core.c
+++ b/drivers/gpu/drm/amd/display/dc/dml2_0/display_mode_core.c
@@ -6711,6 +6711,76 @@ static noinline_for_stack void dml_prefetch_check(struct display_mode_lib_st *mo
      } // for j
  }
+static noinline_for_stack void set_vm_row_and_swath_parameters(struct display_mode_lib_st *mode_lib)
+{
+    struct CalculateVMRowAndSwath_params_st *CalculateVMRowAndSwath_params = &mode_lib- >scratch.CalculateVMRowAndSwath_params; +    struct dml_core_mode_support_locals_st *s = &mode_lib- >scratch.dml_core_mode_support_locals;
+
+    CalculateVMRowAndSwath_params->NumberOfActiveSurfaces = mode_lib- >ms.num_active_planes;
+    CalculateVMRowAndSwath_params->myPipe = s->SurfParameters;
+    CalculateVMRowAndSwath_params->SurfaceSizeInMALL = mode_lib- >ms.SurfaceSizeInMALL; +    CalculateVMRowAndSwath_params->PTEBufferSizeInRequestsLuma = mode_lib->ms.ip.dpte_buffer_size_in_pte_reqs_luma; +    CalculateVMRowAndSwath_params->PTEBufferSizeInRequestsChroma = mode_lib->ms.ip.dpte_buffer_size_in_pte_reqs_chroma; +    CalculateVMRowAndSwath_params->DCCMetaBufferSizeBytes = mode_lib- >ms.ip.dcc_meta_buffer_size_bytes; +    CalculateVMRowAndSwath_params->UseMALLForStaticScreen = mode_lib- >ms.cache_display_cfg.plane.UseMALLForStaticScreen; +    CalculateVMRowAndSwath_params->UseMALLForPStateChange = mode_lib- >ms.cache_display_cfg.plane.UseMALLForPStateChange; +    CalculateVMRowAndSwath_params->MALLAllocatedForDCN = mode_lib- >ms.soc.mall_allocated_for_dcn_mbytes; +    CalculateVMRowAndSwath_params->SwathWidthY = mode_lib- >ms.SwathWidthYThisState; +    CalculateVMRowAndSwath_params->SwathWidthC = mode_lib- >ms.SwathWidthCThisState; +    CalculateVMRowAndSwath_params->GPUVMEnable = mode_lib- >ms.cache_display_cfg.plane.GPUVMEnable; +    CalculateVMRowAndSwath_params->HostVMEnable = mode_lib- >ms.cache_display_cfg.plane.HostVMEnable; +    CalculateVMRowAndSwath_params->HostVMMaxNonCachedPageTableLevels = mode_lib->ms.cache_display_cfg.plane.HostVMMaxPageTableLevels; +    CalculateVMRowAndSwath_params->GPUVMMaxPageTableLevels = mode_lib->ms.cache_display_cfg.plane.GPUVMMaxPageTableLevels; +    CalculateVMRowAndSwath_params->GPUVMMinPageSizeKBytes = mode_lib- >ms.cache_display_cfg.plane.GPUVMMinPageSizeKBytes; +    CalculateVMRowAndSwath_params->HostVMMinPageSize = mode_lib- >ms.soc.hostvm_min_page_size_kbytes * 1024; +    CalculateVMRowAndSwath_params->PTEBufferModeOverrideEn = mode_lib->ms.cache_display_cfg.plane.PTEBufferModeOverrideEn; +    CalculateVMRowAndSwath_params->PTEBufferModeOverrideVal = mode_lib->ms.cache_display_cfg.plane.PTEBufferMode; +    CalculateVMRowAndSwath_params->PTEBufferSizeNotExceeded = mode_lib->ms.PTEBufferSizeNotExceededPerState; +    CalculateVMRowAndSwath_params->DCCMetaBufferSizeNotExceeded = mode_lib->ms.DCCMetaBufferSizeNotExceededPerState; +    CalculateVMRowAndSwath_params->dpte_row_width_luma_ub = s- >dummy_integer_array[0]; +    CalculateVMRowAndSwath_params->dpte_row_width_chroma_ub = s- >dummy_integer_array[1]; +    CalculateVMRowAndSwath_params->dpte_row_height_luma = mode_lib- >ms.dpte_row_height; +    CalculateVMRowAndSwath_params->dpte_row_height_chroma = mode_lib- >ms.dpte_row_height_chroma; +    CalculateVMRowAndSwath_params->dpte_row_height_linear_luma = s- >dummy_integer_array[2]; // VBA_DELTA +    CalculateVMRowAndSwath_params->dpte_row_height_linear_chroma = s- >dummy_integer_array[3]; // VBA_DELTA +    CalculateVMRowAndSwath_params->meta_req_width = s- >dummy_integer_array[4]; +    CalculateVMRowAndSwath_params->meta_req_width_chroma = s- >dummy_integer_array[5]; +    CalculateVMRowAndSwath_params->meta_req_height = s- >dummy_integer_array[6]; +    CalculateVMRowAndSwath_params->meta_req_height_chroma = s- >dummy_integer_array[7]; +    CalculateVMRowAndSwath_params->meta_row_width = s- >dummy_integer_array[8]; +    CalculateVMRowAndSwath_params->meta_row_width_chroma = s- >dummy_integer_array[9]; +    CalculateVMRowAndSwath_params->meta_row_height = mode_lib- >ms.meta_row_height; +    CalculateVMRowAndSwath_params->meta_row_height_chroma = mode_lib- >ms.meta_row_height_chroma; +    CalculateVMRowAndSwath_params->vm_group_bytes = s- >dummy_integer_array[10]; +    CalculateVMRowAndSwath_params->dpte_group_bytes = mode_lib- >ms.dpte_group_bytes; +    CalculateVMRowAndSwath_params->PixelPTEReqWidthY = s- >dummy_integer_array[11]; +    CalculateVMRowAndSwath_params->PixelPTEReqHeightY = s- >dummy_integer_array[12]; +    CalculateVMRowAndSwath_params->PTERequestSizeY = s- >dummy_integer_array[13]; +    CalculateVMRowAndSwath_params->PixelPTEReqWidthC = s- >dummy_integer_array[14]; +    CalculateVMRowAndSwath_params->PixelPTEReqHeightC = s- >dummy_integer_array[15]; +    CalculateVMRowAndSwath_params->PTERequestSizeC = s- >dummy_integer_array[16]; +    CalculateVMRowAndSwath_params->dpde0_bytes_per_frame_ub_l = s- >dummy_integer_array[17]; +    CalculateVMRowAndSwath_params->meta_pte_bytes_per_frame_ub_l = s- >dummy_integer_array[18]; +    CalculateVMRowAndSwath_params->dpde0_bytes_per_frame_ub_c = s- >dummy_integer_array[19]; +    CalculateVMRowAndSwath_params->meta_pte_bytes_per_frame_ub_c = s- >dummy_integer_array[20]; +    CalculateVMRowAndSwath_params->PrefetchSourceLinesY = mode_lib- >ms.PrefetchLinesYThisState; +    CalculateVMRowAndSwath_params->PrefetchSourceLinesC = mode_lib- >ms.PrefetchLinesCThisState; +    CalculateVMRowAndSwath_params->VInitPreFillY = mode_lib- >ms.PrefillY; +    CalculateVMRowAndSwath_params->VInitPreFillC = mode_lib- >ms.PrefillC; +    CalculateVMRowAndSwath_params->MaxNumSwathY = mode_lib- >ms.MaxNumSwY; +    CalculateVMRowAndSwath_params->MaxNumSwathC = mode_lib- >ms.MaxNumSwC; +    CalculateVMRowAndSwath_params->meta_row_bw = mode_lib- >ms.meta_row_bandwidth_this_state; +    CalculateVMRowAndSwath_params->dpte_row_bw = mode_lib- >ms.dpte_row_bandwidth_this_state; +    CalculateVMRowAndSwath_params->PixelPTEBytesPerRow = mode_lib- >ms.DPTEBytesPerRowThisState; +    CalculateVMRowAndSwath_params->PDEAndMetaPTEBytesFrame = mode_lib->ms.PDEAndMetaPTEBytesPerFrameThisState; +    CalculateVMRowAndSwath_params->MetaRowByte = mode_lib- >ms.MetaRowBytesThisState; +    CalculateVMRowAndSwath_params->use_one_row_for_frame = mode_lib- >ms.use_one_row_for_frame_this_state; +    CalculateVMRowAndSwath_params->use_one_row_for_frame_flip = mode_lib->ms.use_one_row_for_frame_flip_this_state; +    CalculateVMRowAndSwath_params->UsesMALLForStaticScreen = s- >dummy_boolean_array[0]; +    CalculateVMRowAndSwath_params->PTE_BUFFER_MODE = s- >dummy_boolean_array[1]; +    CalculateVMRowAndSwath_params->BIGK_FRAGMENT_SIZE = s- >dummy_integer_array[21];
+}
+
  /// @brief The Mode Support function.
  dml_bool_t dml_core_mode_support(struct display_mode_lib_st *mode_lib)
  {
@@ -7683,69 +7753,7 @@ dml_bool_t dml_core_mode_support(struct display_mode_lib_st *mode_lib)               s->SurfParameters[k].SwathHeightC = mode_lib- >ms.SwathHeightCThisState[k];
          }
-        CalculateVMRowAndSwath_params->NumberOfActiveSurfaces = mode_lib->ms.num_active_planes;
-        CalculateVMRowAndSwath_params->myPipe = s->SurfParameters;
-        CalculateVMRowAndSwath_params->SurfaceSizeInMALL = mode_lib- >ms.SurfaceSizeInMALL; -        CalculateVMRowAndSwath_params->PTEBufferSizeInRequestsLuma = mode_lib->ms.ip.dpte_buffer_size_in_pte_reqs_luma; -        CalculateVMRowAndSwath_params->PTEBufferSizeInRequestsChroma = mode_lib->ms.ip.dpte_buffer_size_in_pte_reqs_chroma; -        CalculateVMRowAndSwath_params->DCCMetaBufferSizeBytes = mode_lib->ms.ip.dcc_meta_buffer_size_bytes; -        CalculateVMRowAndSwath_params->UseMALLForStaticScreen = mode_lib->ms.cache_display_cfg.plane.UseMALLForStaticScreen; -        CalculateVMRowAndSwath_params->UseMALLForPStateChange = mode_lib->ms.cache_display_cfg.plane.UseMALLForPStateChange; -        CalculateVMRowAndSwath_params->MALLAllocatedForDCN = mode_lib->ms.soc.mall_allocated_for_dcn_mbytes; -        CalculateVMRowAndSwath_params->SwathWidthY = mode_lib- >ms.SwathWidthYThisState; -        CalculateVMRowAndSwath_params->SwathWidthC = mode_lib- >ms.SwathWidthCThisState; -        CalculateVMRowAndSwath_params->GPUVMEnable = mode_lib- >ms.cache_display_cfg.plane.GPUVMEnable; -        CalculateVMRowAndSwath_params->HostVMEnable = mode_lib- >ms.cache_display_cfg.plane.HostVMEnable; -        CalculateVMRowAndSwath_params- >HostVMMaxNonCachedPageTableLevels = mode_lib- >ms.cache_display_cfg.plane.HostVMMaxPageTableLevels; -        CalculateVMRowAndSwath_params->GPUVMMaxPageTableLevels = mode_lib->ms.cache_display_cfg.plane.GPUVMMaxPageTableLevels; -        CalculateVMRowAndSwath_params->GPUVMMinPageSizeKBytes = mode_lib->ms.cache_display_cfg.plane.GPUVMMinPageSizeKBytes; -        CalculateVMRowAndSwath_params->HostVMMinPageSize = mode_lib- >ms.soc.hostvm_min_page_size_kbytes * 1024; -        CalculateVMRowAndSwath_params->PTEBufferModeOverrideEn = mode_lib->ms.cache_display_cfg.plane.PTEBufferModeOverrideEn; -        CalculateVMRowAndSwath_params->PTEBufferModeOverrideVal = mode_lib->ms.cache_display_cfg.plane.PTEBufferMode; -        CalculateVMRowAndSwath_params->PTEBufferSizeNotExceeded = mode_lib->ms.PTEBufferSizeNotExceededPerState; -        CalculateVMRowAndSwath_params->DCCMetaBufferSizeNotExceeded = mode_lib->ms.DCCMetaBufferSizeNotExceededPerState; -        CalculateVMRowAndSwath_params->dpte_row_width_luma_ub = s- >dummy_integer_array[0]; -        CalculateVMRowAndSwath_params->dpte_row_width_chroma_ub = s- >dummy_integer_array[1]; -        CalculateVMRowAndSwath_params->dpte_row_height_luma = mode_lib->ms.dpte_row_height; -        CalculateVMRowAndSwath_params->dpte_row_height_chroma = mode_lib->ms.dpte_row_height_chroma; -        CalculateVMRowAndSwath_params->dpte_row_height_linear_luma = s->dummy_integer_array[2]; // VBA_DELTA -        CalculateVMRowAndSwath_params->dpte_row_height_linear_chroma = s->dummy_integer_array[3]; // VBA_DELTA -        CalculateVMRowAndSwath_params->meta_req_width = s- >dummy_integer_array[4]; -        CalculateVMRowAndSwath_params->meta_req_width_chroma = s- >dummy_integer_array[5]; -        CalculateVMRowAndSwath_params->meta_req_height = s- >dummy_integer_array[6]; -        CalculateVMRowAndSwath_params->meta_req_height_chroma = s- >dummy_integer_array[7]; -        CalculateVMRowAndSwath_params->meta_row_width = s- >dummy_integer_array[8]; -        CalculateVMRowAndSwath_params->meta_row_width_chroma = s- >dummy_integer_array[9]; -        CalculateVMRowAndSwath_params->meta_row_height = mode_lib- >ms.meta_row_height; -        CalculateVMRowAndSwath_params->meta_row_height_chroma = mode_lib->ms.meta_row_height_chroma; -        CalculateVMRowAndSwath_params->vm_group_bytes = s- >dummy_integer_array[10]; -        CalculateVMRowAndSwath_params->dpte_group_bytes = mode_lib- >ms.dpte_group_bytes; -        CalculateVMRowAndSwath_params->PixelPTEReqWidthY = s- >dummy_integer_array[11]; -        CalculateVMRowAndSwath_params->PixelPTEReqHeightY = s- >dummy_integer_array[12]; -        CalculateVMRowAndSwath_params->PTERequestSizeY = s- >dummy_integer_array[13]; -        CalculateVMRowAndSwath_params->PixelPTEReqWidthC = s- >dummy_integer_array[14]; -        CalculateVMRowAndSwath_params->PixelPTEReqHeightC = s- >dummy_integer_array[15]; -        CalculateVMRowAndSwath_params->PTERequestSizeC = s- >dummy_integer_array[16]; -        CalculateVMRowAndSwath_params->dpde0_bytes_per_frame_ub_l = s->dummy_integer_array[17]; -        CalculateVMRowAndSwath_params->meta_pte_bytes_per_frame_ub_l = s->dummy_integer_array[18]; -        CalculateVMRowAndSwath_params->dpde0_bytes_per_frame_ub_c = s->dummy_integer_array[19]; -        CalculateVMRowAndSwath_params->meta_pte_bytes_per_frame_ub_c = s->dummy_integer_array[20]; -        CalculateVMRowAndSwath_params->PrefetchSourceLinesY = mode_lib->ms.PrefetchLinesYThisState; -        CalculateVMRowAndSwath_params->PrefetchSourceLinesC = mode_lib->ms.PrefetchLinesCThisState; -        CalculateVMRowAndSwath_params->VInitPreFillY = mode_lib- >ms.PrefillY; -        CalculateVMRowAndSwath_params->VInitPreFillC = mode_lib- >ms.PrefillC; -        CalculateVMRowAndSwath_params->MaxNumSwathY = mode_lib- >ms.MaxNumSwY; -        CalculateVMRowAndSwath_params->MaxNumSwathC = mode_lib- >ms.MaxNumSwC; -        CalculateVMRowAndSwath_params->meta_row_bw = mode_lib- >ms.meta_row_bandwidth_this_state; -        CalculateVMRowAndSwath_params->dpte_row_bw = mode_lib- >ms.dpte_row_bandwidth_this_state; -        CalculateVMRowAndSwath_params->PixelPTEBytesPerRow = mode_lib->ms.DPTEBytesPerRowThisState; -        CalculateVMRowAndSwath_params->PDEAndMetaPTEBytesFrame = mode_lib->ms.PDEAndMetaPTEBytesPerFrameThisState; -        CalculateVMRowAndSwath_params->MetaRowByte = mode_lib- >ms.MetaRowBytesThisState; -        CalculateVMRowAndSwath_params->use_one_row_for_frame = mode_lib->ms.use_one_row_for_frame_this_state; -        CalculateVMRowAndSwath_params->use_one_row_for_frame_flip = mode_lib->ms.use_one_row_for_frame_flip_this_state; -        CalculateVMRowAndSwath_params->UsesMALLForStaticScreen = s- >dummy_boolean_array[0]; -        CalculateVMRowAndSwath_params->PTE_BUFFER_MODE = s- >dummy_boolean_array[1]; -        CalculateVMRowAndSwath_params->BIGK_FRAGMENT_SIZE = s- >dummy_integer_array[21];
+        set_vm_row_and_swath_parameters(mode_lib);
          CalculateVMRowAndSwath(&mode_lib->scratch,
              CalculateVMRowAndSwath_params);


Reply via email to