Hi Alex, I wiil add it before upstream.
Regards, Chenyu On 12/3/2025 12:31 AM, Alex Hung wrote: > > > 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); >> >
