drm/amd/display: Account for Subvp Phantoms in DML MALL surface calculations
authorDillon Varone <Dillon.Varone@amd.com>
Thu, 8 Dec 2022 18:55:13 +0000 (13:55 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 17 Jan 2023 20:37:52 +0000 (15:37 -0500)
DML does not explicitly consider support for space in MALL required for
subvp phantom pipes. This adds a check to make sure portion of phantom
surface can fit in MALL.

Tested-by: Daniel Wheeler <Daniel.Wheeler@amd.com>
Reviewed-by: Alvin Lee <Alvin.Lee2@amd.com>
Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Dillon Varone <Dillon.Varone@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c
drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.c
drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.h

index 8376500..6c5ab5c 100644 (file)
@@ -387,6 +387,7 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
                                mode_lib->vba.NumberOfActiveSurfaces,
                                mode_lib->vba.MALLAllocatedForDCNFinal,
                                mode_lib->vba.UseMALLForStaticScreen,
+                               mode_lib->vba.UsesMALLForPStateChange,
                                mode_lib->vba.DCCEnable,
                                mode_lib->vba.ViewportStationary,
                                mode_lib->vba.ViewportXStartY,
@@ -2628,6 +2629,7 @@ void dml32_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
                        mode_lib->vba.NumberOfActiveSurfaces,
                        mode_lib->vba.MALLAllocatedForDCNFinal,
                        mode_lib->vba.UseMALLForStaticScreen,
+                       mode_lib->vba.UsesMALLForPStateChange,
                        mode_lib->vba.DCCEnable,
                        mode_lib->vba.ViewportStationary,
                        mode_lib->vba.ViewportXStartY,
index 4279cd4..ba23b19 100644 (file)
@@ -1772,6 +1772,7 @@ void dml32_CalculateSurfaceSizeInMall(
                unsigned int NumberOfActiveSurfaces,
                unsigned int MALLAllocatedForDCN,
                enum dm_use_mall_for_static_screen_mode UseMALLForStaticScreen[],
+               enum dm_use_mall_for_pstate_change_mode UsesMALLForPStateChange[],
                bool DCCEnable[],
                bool ViewportStationary[],
                unsigned int ViewportXStartY[],
@@ -1803,8 +1804,10 @@ void dml32_CalculateSurfaceSizeInMall(
                unsigned int    SurfaceSizeInMALL[],
                bool *ExceededMALLSize)
 {
-       unsigned int TotalSurfaceSizeInMALL  = 0;
        unsigned int k;
+       unsigned int TotalSurfaceSizeInMALLForSS = 0;
+       unsigned int TotalSurfaceSizeInMALLForSubVP = 0;
+       unsigned int MALLAllocatedForDCNInBytes = MALLAllocatedForDCN * 1024 * 1024;
 
        for (k = 0; k < NumberOfActiveSurfaces; ++k) {
                if (ViewportStationary[k]) {
@@ -1896,10 +1899,14 @@ void dml32_CalculateSurfaceSizeInMall(
        }
 
        for (k = 0; k < NumberOfActiveSurfaces; ++k) {
-               if (UseMALLForStaticScreen[k] == dm_use_mall_static_screen_enable)
-                       TotalSurfaceSizeInMALL = TotalSurfaceSizeInMALL + SurfaceSizeInMALL[k];
+               /* SS and Subvp counted separate as they are never used at the same time */
+               if (UsesMALLForPStateChange[k] == dm_use_mall_pstate_change_phantom_pipe)
+                       TotalSurfaceSizeInMALLForSubVP = TotalSurfaceSizeInMALLForSubVP + SurfaceSizeInMALL[k];
+               else if (UseMALLForStaticScreen[k] == dm_use_mall_static_screen_enable)
+                       TotalSurfaceSizeInMALLForSS = TotalSurfaceSizeInMALLForSS + SurfaceSizeInMALL[k];
        }
-       *ExceededMALLSize =  (TotalSurfaceSizeInMALL > MALLAllocatedForDCN * 1024 * 1024);
+       *ExceededMALLSize =  (TotalSurfaceSizeInMALLForSS > MALLAllocatedForDCNInBytes) ||
+                                                       (TotalSurfaceSizeInMALLForSubVP > MALLAllocatedForDCNInBytes);
 } // CalculateSurfaceSizeInMall
 
 void dml32_CalculateVMRowAndSwath(
index 83edfce..5c7196d 100644 (file)
@@ -334,6 +334,7 @@ void dml32_CalculateSurfaceSizeInMall(
                unsigned int NumberOfActiveSurfaces,
                unsigned int MALLAllocatedForDCN,
                enum dm_use_mall_for_static_screen_mode UseMALLForStaticScreen[],
+               enum dm_use_mall_for_pstate_change_mode UsesMALLForPStateChange[],
                bool DCCEnable[],
                bool ViewportStationary[],
                unsigned int ViewportXStartY[],