Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/display: Fix DSC slice and delay calculations

[why]
There are other factors that determine the number
of DSC slices. The slices should not be determined
in DML but retrieve the value calculated from driver.

[how]
Update the logic to determine DSC slice.
Make DSCDelay per display pipe.

Reviewed-by: Jun Lei <jun.lei@amd.com>
Acked-by: Zaeem Mohamed <zaeem.mohamed@amd.com>
Signed-off-by: Sung Joon Kim <sungjoon.kim@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Sung Joon Kim and committed by
Alex Deucher
df86486d 82b7cde3

+29 -18
+27 -18
drivers/gpu/drm/amd/display/dc/dml2/display_mode_core.c
··· 115 115 dml_float_t DISPCLKDPPCLKDSCCLKDownSpreading, 116 116 dml_float_t DISPCLKRampingMargin, 117 117 dml_float_t DISPCLKDPPCLKVCOSpeed, 118 + dml_uint_t NumberOfDSCSlices, 118 119 119 120 // Output 120 121 dml_bool_t *TotalAvailablePipesSupport, ··· 5517 5516 dml_float_t DISPCLKDPPCLKDSCCLKDownSpreading, 5518 5517 dml_float_t DISPCLKRampingMargin, 5519 5518 dml_float_t DISPCLKDPPCLKVCOSpeed, 5519 + dml_uint_t NumberOfDSCSlices, 5520 5520 5521 5521 // Output 5522 5522 dml_bool_t *TotalAvailablePipesSupport, ··· 5565 5563 *NumberOfDPP = 0; 5566 5564 5567 5565 if (!(Output == dml_hdmi || Output == dml_dp || Output == dml_edp) && (ODMUse == dml_odm_use_policy_combine_4to1 || (ODMUse == dml_odm_use_policy_combine_as_needed && 5568 - (SurfaceRequiredDISPCLKWithODMCombineTwoToOne > StateDispclk || (DSCEnable && (HActive > 2 * MaximumPixelsPerLinePerDSCUnit)))))) { 5566 + (SurfaceRequiredDISPCLKWithODMCombineTwoToOne > StateDispclk || (DSCEnable && (HActive > 2 * MaximumPixelsPerLinePerDSCUnit)) || NumberOfDSCSlices > 8)))) { 5569 5567 if (TotalNumberOfActiveDPP + 4 <= MaxNumDPP) { 5570 5568 *ODMMode = dml_odm_mode_combine_4to1; 5571 5569 *RequiredDISPCLKPerSurface = SurfaceRequiredDISPCLKWithODMCombineFourToOne; ··· 5575 5573 } 5576 5574 } else if (Output != dml_hdmi && (ODMUse == dml_odm_use_policy_combine_2to1 || (ODMUse == dml_odm_use_policy_combine_as_needed && 5577 5575 ((SurfaceRequiredDISPCLKWithoutODMCombine > StateDispclk && SurfaceRequiredDISPCLKWithODMCombineTwoToOne <= StateDispclk) || 5578 - (DSCEnable && (HActive > MaximumPixelsPerLinePerDSCUnit)))))) { 5576 + (DSCEnable && (HActive > MaximumPixelsPerLinePerDSCUnit)) || (NumberOfDSCSlices <= 8 && NumberOfDSCSlices > 4))))) { 5579 5577 if (TotalNumberOfActiveDPP + 2 <= MaxNumDPP) { 5580 5578 *ODMMode = dml_odm_mode_combine_2to1; 5581 5579 *RequiredDISPCLKPerSurface = SurfaceRequiredDISPCLKWithODMCombineTwoToOne; ··· 5882 5880 5883 5881 if (DSCEnabled == true && OutputBpp != 0) { 5884 5882 if (ODMMode == dml_odm_mode_combine_4to1) { 5885 - DSCDelayRequirement_val = 4 * (dscceComputeDelay(DSCInputBitPerComponent, OutputBpp, (dml_uint_t)(dml_ceil((dml_float_t) HActive / (dml_float_t) NumberOfDSCSlices, 1.0)), 5886 - (dml_uint_t) (NumberOfDSCSlices / 4.0), OutputFormat, Output) + dscComputeDelay(OutputFormat, Output)); 5883 + DSCDelayRequirement_val = dscceComputeDelay(DSCInputBitPerComponent, OutputBpp, (dml_uint_t)(dml_ceil((dml_float_t) HActive / (dml_float_t) NumberOfDSCSlices, 1.0)), 5884 + (dml_uint_t) (NumberOfDSCSlices / 4.0), OutputFormat, Output) + dscComputeDelay(OutputFormat, Output); 5887 5885 } else if (ODMMode == dml_odm_mode_combine_2to1) { 5888 - DSCDelayRequirement_val = 2 * (dscceComputeDelay(DSCInputBitPerComponent, OutputBpp, (dml_uint_t)(dml_ceil((dml_float_t) HActive / (dml_float_t) NumberOfDSCSlices, 1.0)), 5889 - (dml_uint_t) (NumberOfDSCSlices / 2.0), OutputFormat, Output) + dscComputeDelay(OutputFormat, Output)); 5886 + DSCDelayRequirement_val = dscceComputeDelay(DSCInputBitPerComponent, OutputBpp, (dml_uint_t)(dml_ceil((dml_float_t) HActive / (dml_float_t) NumberOfDSCSlices, 1.0)), 5887 + (dml_uint_t) (NumberOfDSCSlices / 2.0), OutputFormat, Output) + dscComputeDelay(OutputFormat, Output); 5890 5888 } else { 5891 5889 DSCDelayRequirement_val = dscceComputeDelay(DSCInputBitPerComponent, OutputBpp, (dml_uint_t)((dml_float_t) dml_ceil(HActive / (dml_float_t) NumberOfDSCSlices, 1.0)), 5892 5890 NumberOfDSCSlices, OutputFormat, Output) + dscComputeDelay(OutputFormat, Output); ··· 6940 6938 6941 6939 /*Number Of DSC Slices*/ 6942 6940 for (k = 0; k < mode_lib->ms.num_active_planes; ++k) { 6943 - if (mode_lib->ms.cache_display_cfg.plane.BlendingAndTiming[k] == k) { 6944 - if (mode_lib->ms.cache_display_cfg.output.PixelClockBackEnd[k] > 4800) { 6945 - mode_lib->ms.support.NumberOfDSCSlices[k] = (dml_uint_t)(dml_ceil(mode_lib->ms.cache_display_cfg.output.PixelClockBackEnd[k] / 600, 4)); 6946 - } else if (mode_lib->ms.cache_display_cfg.output.PixelClockBackEnd[k] > 2400) { 6947 - mode_lib->ms.support.NumberOfDSCSlices[k] = 8; 6948 - } else if (mode_lib->ms.cache_display_cfg.output.PixelClockBackEnd[k] > 1200) { 6949 - mode_lib->ms.support.NumberOfDSCSlices[k] = 4; 6950 - } else if (mode_lib->ms.cache_display_cfg.output.PixelClockBackEnd[k] > 340) { 6951 - mode_lib->ms.support.NumberOfDSCSlices[k] = 2; 6952 - } else { 6953 - mode_lib->ms.support.NumberOfDSCSlices[k] = 1; 6941 + if (mode_lib->ms.cache_display_cfg.plane.BlendingAndTiming[k] == k && 6942 + mode_lib->ms.cache_display_cfg.output.DSCEnable[k] != dml_dsc_disable) { 6943 + mode_lib->ms.support.NumberOfDSCSlices[k] = mode_lib->ms.cache_display_cfg.output.DSCSlices[k]; 6944 + 6945 + if (mode_lib->ms.support.NumberOfDSCSlices[k] == 0) { 6946 + if (mode_lib->ms.cache_display_cfg.output.PixelClockBackEnd[k] > 4800) { 6947 + mode_lib->ms.support.NumberOfDSCSlices[k] = (dml_uint_t)(dml_ceil(mode_lib->ms.cache_display_cfg.output.PixelClockBackEnd[k] / 600, 4)); 6948 + } else if (mode_lib->ms.cache_display_cfg.output.PixelClockBackEnd[k] > 2400) { 6949 + mode_lib->ms.support.NumberOfDSCSlices[k] = 8; 6950 + } else if (mode_lib->ms.cache_display_cfg.output.PixelClockBackEnd[k] > 1200) { 6951 + mode_lib->ms.support.NumberOfDSCSlices[k] = 4; 6952 + } else if (mode_lib->ms.cache_display_cfg.output.PixelClockBackEnd[k] > 340) { 6953 + mode_lib->ms.support.NumberOfDSCSlices[k] = 2; 6954 + } else { 6955 + mode_lib->ms.support.NumberOfDSCSlices[k] = 1; 6956 + } 6954 6957 } 6955 6958 } else { 6956 - mode_lib->ms.support.NumberOfDSCSlices[k] = 0; 6959 + mode_lib->ms.support.NumberOfDSCSlices[k] = 1; 6957 6960 } 6958 6961 } 6959 6962 ··· 7057 7050 mode_lib->ms.soc.dcn_downspread_percent, 7058 7051 mode_lib->ms.ip.dispclk_ramp_margin_percent, 7059 7052 mode_lib->ms.soc.dispclk_dppclk_vco_speed_mhz, 7053 + mode_lib->ms.support.NumberOfDSCSlices[k], 7060 7054 7061 7055 /* Output */ 7062 7056 &s->TotalAvailablePipesSupportNoDSC, ··· 7080 7072 mode_lib->ms.soc.dcn_downspread_percent, 7081 7073 mode_lib->ms.ip.dispclk_ramp_margin_percent, 7082 7074 mode_lib->ms.soc.dispclk_dppclk_vco_speed_mhz, 7075 + mode_lib->ms.support.NumberOfDSCSlices[k], 7083 7076 7084 7077 /* Output */ 7085 7078 &s->TotalAvailablePipesSupportDSC,
+1
drivers/gpu/drm/amd/display/dc/dml2/display_mode_core_structs.h
··· 575 575 dml_uint_t AudioSampleRate[__DML_NUM_PLANES__]; 576 576 dml_uint_t AudioSampleLayout[__DML_NUM_PLANES__]; 577 577 dml_bool_t OutputDisabled[__DML_NUM_PLANES__]; 578 + dml_uint_t DSCSlices[__DML_NUM_PLANES__]; 578 579 }; // dml_timing_cfg_st; 579 580 580 581 /// @brief Writeback Setting
+1
drivers/gpu/drm/amd/display/dc/dml2/dml2_translation_helper.c
··· 739 739 out->DSCEnable[location] = (enum dml_dsc_enable)in->timing.flags.DSC; 740 740 out->OutputLinkDPLanes[location] = 4; // As per code in dcn20_resource.c 741 741 out->DSCInputBitPerComponent[location] = 12; // As per code in dcn20_resource.c 742 + out->DSCSlices[location] = in->timing.dsc_cfg.num_slices_h; 742 743 743 744 switch (in->signal) { 744 745 case SIGNAL_TYPE_DISPLAY_PORT_MST: