Commit ab5220bb authored by Dmytro Laktyushkin's avatar Dmytro Laktyushkin Committed by Alex Deucher
Browse files

drm/amd/display: fix dcn315 dml detile overestimation



DML does not take the fact that dcn315 does not have enough detile
buffer to max all pipes. This change adds a workaround to apply
the same logic DC does when calculating detile buffer size in DML.

Reviewed-by: default avatarCharlene Liu <Charlene.Liu@amd.com>
Acked-by: default avatarHamza Mahfooz <hamza.mahfooz@amd.com>
Signed-off-by: default avatarDmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent c1969fba
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -739,7 +739,7 @@ void dcn315_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_param
	}

	if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment))
		dml_init_instance(&dc->dml, &dcn3_15_soc, &dcn3_15_ip, DML_PROJECT_DCN31);
		dml_init_instance(&dc->dml, &dcn3_15_soc, &dcn3_15_ip, DML_PROJECT_DCN315);
	else
		dml_init_instance(&dc->dml, &dcn3_15_soc, &dcn3_15_ip, DML_PROJECT_DCN31_FPGA);
}
+15 −0
Original line number Diff line number Diff line
@@ -43,6 +43,8 @@
#define BPP_BLENDED_PIPE 0xffffffff
#define DCN31_MAX_DSC_IMAGE_WIDTH 5184
#define DCN31_MAX_FMT_420_BUFFER_WIDTH 4096
#define DCN3_15_MIN_COMPBUF_SIZE_KB 128
#define DCN3_15_MAX_DET_SIZE 384

// For DML-C changes that hasn't been propagated to VBA yet
//#define __DML_VBA_ALLOW_DELTA__
@@ -3775,6 +3777,17 @@ static noinline void CalculatePrefetchSchedulePerPlane(
		&v->VReadyOffsetPix[k]);
}

static void PatchDETBufferSizeInKByte(unsigned int NumberOfActivePlanes, int NoOfDPPThisState[], unsigned int config_return_buffer_size_in_kbytes, unsigned int *DETBufferSizeInKByte)
{
	int i, total_pipes = 0;
	for (i = 0; i < NumberOfActivePlanes; i++)
		total_pipes += NoOfDPPThisState[i];
	*DETBufferSizeInKByte = ((config_return_buffer_size_in_kbytes - DCN3_15_MIN_COMPBUF_SIZE_KB) / 64 / total_pipes) * 64;
	if (*DETBufferSizeInKByte > DCN3_15_MAX_DET_SIZE)
		*DETBufferSizeInKByte = DCN3_15_MAX_DET_SIZE;
}


void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_lib)
{
	struct vba_vars_st *v = &mode_lib->vba;
@@ -4533,6 +4546,8 @@ void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
				v->ODMCombineEnableThisState[k] = v->ODMCombineEnablePerState[i][k];
			}

			if (v->NumberOfActivePlanes > 1 && mode_lib->project == DML_PROJECT_DCN315)
				PatchDETBufferSizeInKByte(v->NumberOfActivePlanes, v->NoOfDPPThisState, v->ip.config_return_buffer_size_in_kbytes, &v->DETBufferSizeInKByte[0]);
			CalculateSwathAndDETConfiguration(
					false,
					v->NumberOfActivePlanes,
+1 −0
Original line number Diff line number Diff line
@@ -114,6 +114,7 @@ void dml_init_instance(struct display_mode_lib *lib,
		break;
	case DML_PROJECT_DCN31:
	case DML_PROJECT_DCN31_FPGA:
	case DML_PROJECT_DCN315:
		lib->funcs = dml31_funcs;
		break;
	case DML_PROJECT_DCN314:
+1 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ enum dml_project {
	DML_PROJECT_DCN21,
	DML_PROJECT_DCN30,
	DML_PROJECT_DCN31,
	DML_PROJECT_DCN315,
	DML_PROJECT_DCN31_FPGA,
	DML_PROJECT_DCN314,
	DML_PROJECT_DCN32,