Skip to content

Commit

Permalink
drm/amd/display: Ensure populate uclk in bb construction
Browse files Browse the repository at this point in the history
[Description]
- For some SKUs, the optimal DCFCLK for each UCLK is less than the
  smallest DCFCLK STA target due to low memory bandwidth. There is
  an assumption that the DCFCLK STA targets will always be less
  than one of the optimal DCFCLK values, but this is not true for
  SKUs that have low memory bandwidth. In this case we need to
  populate the optimal UCLK for each DCFCLK STA targets as the max
  UCLK freq.
- Also fix a bug in DML where start_state is not assigned and used
  correctly.

Reviewed-by: Samson Tam <samson.tam@amd.com>
Reviewed-by: Chaitanya Dhere <chaitanya.dhere@amd.com>
Acked-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Alvin Lee <alvin.lee2@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
  • Loading branch information
Alvin Lee authored and Alex Deucher committed Jan 15, 2024
1 parent 038c532 commit f0ec305
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 8 deletions.
16 changes: 8 additions & 8 deletions drivers/gpu/drm/amd/display/dc/dml/dcn30/display_mode_vba_30.c
Original file line number Diff line number Diff line change
Expand Up @@ -4273,7 +4273,7 @@ void dml30_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l

//Calculate Swath, DET Configuration, DCFCLKDeepSleep
//
for (i = 0; i < mode_lib->soc.num_states; ++i) {
for (i = start_state; i < mode_lib->soc.num_states; ++i) {
for (j = 0; j <= 1; ++j) {
for (k = 0; k < v->NumberOfActivePlanes; ++k) {
v->RequiredDPPCLKThisState[k] = v->RequiredDPPCLK[i][j][k];
Expand Down Expand Up @@ -4576,7 +4576,7 @@ void dml30_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l

//Calculate Return BW

for (i = 0; i < mode_lib->soc.num_states; ++i) {
for (i = start_state; i < mode_lib->soc.num_states; ++i) {
for (j = 0; j <= 1; ++j) {
for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) {
if (v->BlendingAndTiming[k] == k) {
Expand Down Expand Up @@ -4635,7 +4635,7 @@ void dml30_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
v->UrgentOutOfOrderReturnPerChannelVMDataOnly);
v->FinalDRAMClockChangeLatency = (v->DRAMClockChangeLatencyOverride > 0 ? v->DRAMClockChangeLatencyOverride : v->DRAMClockChangeLatency);

for (i = 0; i < mode_lib->soc.num_states; ++i) {
for (i = start_state; i < mode_lib->soc.num_states; ++i) {
for (j = 0; j <= 1; ++j) {
v->DCFCLKState[i][j] = v->DCFCLKPerState[i];
}
Expand All @@ -4646,7 +4646,7 @@ void dml30_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l

if (v->ClampMinDCFCLK) {
/* Clamp calculated values to actual minimum */
for (i = 0; i < mode_lib->soc.num_states; ++i) {
for (i = start_state; i < mode_lib->soc.num_states; ++i) {
for (j = 0; j <= 1; ++j) {
if (v->DCFCLKState[i][j] < mode_lib->soc.min_dcfclk) {
v->DCFCLKState[i][j] = mode_lib->soc.min_dcfclk;
Expand All @@ -4656,7 +4656,7 @@ void dml30_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
}
}

for (i = 0; i < mode_lib->soc.num_states; ++i) {
for (i = start_state; i < mode_lib->soc.num_states; ++i) {
for (j = 0; j <= 1; ++j) {
v->IdealSDPPortBandwidthPerState[i][j] = dml_min3(
v->ReturnBusWidth * v->DCFCLKState[i][j],
Expand All @@ -4674,7 +4674,7 @@ void dml30_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l

//Re-ordering Buffer Support Check

for (i = 0; i < mode_lib->soc.num_states; ++i) {
for (i = start_state; i < mode_lib->soc.num_states; ++i) {
for (j = 0; j <= 1; ++j) {
if ((v->ROBBufferSizeInKByte - v->PixelChunkSizeInKByte) * 1024 / v->ReturnBWPerState[i][j]
> (v->RoundTripPingLatencyCycles + 32) / v->DCFCLKState[i][j] + ReorderingBytes / v->ReturnBWPerState[i][j]) {
Expand All @@ -4692,7 +4692,7 @@ void dml30_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
MaxTotalVActiveRDBandwidth = MaxTotalVActiveRDBandwidth + v->ReadBandwidthLuma[k] + v->ReadBandwidthChroma[k];
}

for (i = 0; i < mode_lib->soc.num_states; ++i) {
for (i = start_state; i < mode_lib->soc.num_states; ++i) {
for (j = 0; j <= 1; ++j) {
v->MaxTotalVerticalActiveAvailableBandwidth[i][j] = dml_min(
v->IdealSDPPortBandwidthPerState[i][j] * v->MaxAveragePercentOfIdealSDPPortBWDisplayCanUseInNormalSystemOperation / 100,
Expand All @@ -4708,7 +4708,7 @@ void dml30_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l

//Prefetch Check

for (i = 0; i < mode_lib->soc.num_states; ++i) {
for (i = start_state; i < mode_lib->soc.num_states; ++i) {
for (j = 0; j <= 1; ++j) {
int NextPrefetchModeState = MinPrefetchMode;

Expand Down
11 changes: 11 additions & 0 deletions drivers/gpu/drm/amd/display/dc/dml/dcn303/dcn303_fpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,17 @@ void dcn303_fpu_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_p
optimal_uclk_for_dcfclk_sta_targets[i] =
bw_params->clk_table.entries[j].memclk_mhz * 16;
break;
} else {
/* condition where (dcfclk_sta_targets[i] >= optimal_dcfclk_for_uclk[j]):
* This is required for dcn303 because it just so happens that the memory
* bandwidth is low enough such that all the optimal DCFCLK for each UCLK
* is lower than the smallest DCFCLK STA target. In this case we need to
* populate the optimal UCLK for each DCFCLK STA target to be the max UCLK.
*/
if (j == num_uclk_states - 1) {
optimal_uclk_for_dcfclk_sta_targets[i] =
bw_params->clk_table.entries[j].memclk_mhz * 16;
}
}
}
}
Expand Down
11 changes: 11 additions & 0 deletions drivers/gpu/drm/amd/display/dc/resource/dcn30/dcn30_resource.c
Original file line number Diff line number Diff line change
Expand Up @@ -2169,6 +2169,17 @@ void dcn30_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params
optimal_uclk_for_dcfclk_sta_targets[i] =
bw_params->clk_table.entries[j].memclk_mhz * 16;
break;
} else {
/* condition where (dcfclk_sta_targets[i] >= optimal_dcfclk_for_uclk[j]):
* If it just so happens that the memory bandwidth is low enough such that
* all the optimal DCFCLK for each UCLK is lower than the smallest DCFCLK STA
* target, we need to populate the optimal UCLK for each DCFCLK STA target to
* be the max UCLK.
*/
if (j == num_uclk_states - 1) {
optimal_uclk_for_dcfclk_sta_targets[i] =
bw_params->clk_table.entries[j].memclk_mhz * 16;
}
}
}
}
Expand Down

0 comments on commit f0ec305

Please sign in to comment.