[bug report] drm/amd/display: DML2.1 resynchronization

Dan Carpenter dan.carpenter at linaro.org
Fri Jul 26 05:00:21 UTC 2024


Hello Chaitanya Dhere,

This is a semi-automatic email about new static checker warnings.

Commit 2563391e57b5 ("drm/amd/display: DML2.1 resynchronization")
from Jul 2, 2024, leads to the following Smatch complaint:

    drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c:3854 CalculateSwathAndDETConfiguration()
    warn: variable dereferenced before check 'p->UnboundedRequestEnabled' (see line 3698)

drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c
  3697	
  3698		*p->UnboundedRequestEnabled = UnboundedRequest(p->display_cfg->overrides.hw.force_unbounded_requesting.enable, p->display_cfg->overrides.hw.force_unbounded_requesting.value, TotalActiveDPP, NoChromaOrLinear);
  3699	
  3700		CalculateDETBufferSize(
  3701			&scratch->CalculateDETBufferSize_locals,
  3702			p->display_cfg,
  3703			p->ForceSingleDPP,
  3704			p->NumberOfActiveSurfaces,
  3705			*p->UnboundedRequestEnabled,
  3706			p->nomDETInKByte,
  3707			p->MaxTotalDETInKByte,
  3708			p->ConfigReturnBufferSizeInKByte,
  3709			p->MinCompressedBufferSizeInKByte,
  3710			p->ConfigReturnBufferSegmentSizeInkByte,
  3711			p->CompressedBufferSegmentSizeInkByte,
  3712			p->ReadBandwidthLuma,
  3713			p->ReadBandwidthChroma,
  3714			p->full_swath_bytes_l,
  3715			p->full_swath_bytes_c,
  3716			p->DPPPerSurface,
  3717	
  3718			// Output
  3719			p->DETBufferSizeInKByte, // per hubp pipe
  3720			p->CompressedBufferSizeInkByte);
  3721	
  3722	#ifdef __DML_VBA_DEBUG__
  3723		dml2_printf("DML::%s: TotalActiveDPP = %u\n", __func__, TotalActiveDPP);
  3724		dml2_printf("DML::%s: nomDETInKByte = %u\n", __func__, p->nomDETInKByte);
  3725		dml2_printf("DML::%s: ConfigReturnBufferSizeInKByte = %u\n", __func__, p->ConfigReturnBufferSizeInKByte);
  3726		dml2_printf("DML::%s: UnboundedRequestEnabled = %u\n", __func__, *p->UnboundedRequestEnabled);
  3727		dml2_printf("DML::%s: CompressedBufferSizeInkByte = %u\n", __func__, *p->CompressedBufferSizeInkByte);
  3728	#endif
  3729	
  3730		*p->ViewportSizeSupport = true;
  3731		for (unsigned int k = 0; k < p->NumberOfActiveSurfaces; ++k) {
  3732	
  3733			DETBufferSizeInKByteForSwathCalculation = (dml_is_phantom_pipe(&p->display_cfg->plane_descriptors[k]) ? 1024 : p->DETBufferSizeInKByte[k]);
  3734	#ifdef __DML_VBA_DEBUG__
  3735			dml2_printf("DML::%s: k=%u DETBufferSizeInKByteForSwathCalculation = %u\n", __func__, k, DETBufferSizeInKByteForSwathCalculation);
  3736	#endif
  3737			if (p->display_cfg->plane_descriptors[k].surface.tiling == dml2_sw_linear) {
  3738				p->SwathHeightY[k] = MaximumSwathHeightY[k];
  3739				p->SwathHeightC[k] = MaximumSwathHeightC[k];
  3740				RoundedUpSwathSizeBytesY[k] = p->full_swath_bytes_l[k];
  3741				RoundedUpSwathSizeBytesC[k] = p->full_swath_bytes_c[k];
  3742	
  3743				if (p->surf_linear128_l[k])
  3744					p->request_size_bytes_luma[k] = 128;
  3745				else
  3746					p->request_size_bytes_luma[k] = 256;
  3747	
  3748				if (p->surf_linear128_c[k])
  3749					p->request_size_bytes_chroma[k] = 128;
  3750				else
  3751					p->request_size_bytes_chroma[k] = 256;
  3752	
  3753			} else if (p->full_swath_bytes_l[k] + p->full_swath_bytes_c[k] <= DETBufferSizeInKByteForSwathCalculation * 1024 / 2) {
  3754				p->SwathHeightY[k] = MaximumSwathHeightY[k];
  3755				p->SwathHeightC[k] = MaximumSwathHeightC[k];
  3756				RoundedUpSwathSizeBytesY[k] = p->full_swath_bytes_l[k];
  3757				RoundedUpSwathSizeBytesC[k] = p->full_swath_bytes_c[k];
  3758				p->request_size_bytes_luma[k] = 256;
  3759				p->request_size_bytes_chroma[k] = 256;
  3760	
  3761			} else if (p->full_swath_bytes_l[k] >= 1.5 * p->full_swath_bytes_c[k] && p->full_swath_bytes_l[k] / 2 + p->full_swath_bytes_c[k] <= DETBufferSizeInKByteForSwathCalculation * 1024 / 2) {
  3762				p->SwathHeightY[k] = MaximumSwathHeightY[k] / 2;
  3763				p->SwathHeightC[k] = MaximumSwathHeightC[k];
  3764				RoundedUpSwathSizeBytesY[k] = p->full_swath_bytes_l[k] / 2;
  3765				RoundedUpSwathSizeBytesC[k] = p->full_swath_bytes_c[k];
  3766				p->request_size_bytes_luma[k] = ((p->BytePerPixY[k] == 2) == dml_is_vertical_rotation(p->display_cfg->plane_descriptors[k].composition.rotation_angle)) ? 128 : 64;
  3767				p->request_size_bytes_chroma[k] = 256;
  3768	
  3769			} else if (p->full_swath_bytes_l[k] < 1.5 * p->full_swath_bytes_c[k] && p->full_swath_bytes_l[k] + p->full_swath_bytes_c[k] / 2 <= DETBufferSizeInKByteForSwathCalculation * 1024 / 2) {
  3770				p->SwathHeightY[k] = MaximumSwathHeightY[k];
  3771				p->SwathHeightC[k] = MaximumSwathHeightC[k] / 2;
  3772				RoundedUpSwathSizeBytesY[k] = p->full_swath_bytes_l[k];
  3773				RoundedUpSwathSizeBytesC[k] = p->full_swath_bytes_c[k] / 2;
  3774				p->request_size_bytes_luma[k] = 256;
  3775				p->request_size_bytes_chroma[k] = ((p->BytePerPixC[k] == 2) == dml_is_vertical_rotation(p->display_cfg->plane_descriptors[k].composition.rotation_angle)) ? 128 : 64;
  3776	
  3777			} else {
  3778				p->SwathHeightY[k] = MaximumSwathHeightY[k] / 2;
  3779				p->SwathHeightC[k] = MaximumSwathHeightC[k] / 2;
  3780				RoundedUpSwathSizeBytesY[k] = p->full_swath_bytes_l[k] / 2;
  3781				RoundedUpSwathSizeBytesC[k] = p->full_swath_bytes_c[k] / 2;
  3782				p->request_size_bytes_luma[k] = ((p->BytePerPixY[k] == 2) == dml_is_vertical_rotation(p->display_cfg->plane_descriptors[k].composition.rotation_angle)) ? 128 : 64;;
  3783				p->request_size_bytes_chroma[k] = ((p->BytePerPixC[k] == 2) == dml_is_vertical_rotation(p->display_cfg->plane_descriptors[k].composition.rotation_angle)) ? 128 : 64;;
  3784			}
  3785	
  3786			if (p->SwathHeightC[k] == 0)
  3787				p->request_size_bytes_chroma[k] = 0;
  3788	
  3789			if ((p->full_swath_bytes_l[k] / 2 + p->full_swath_bytes_c[k] / 2 > DETBufferSizeInKByteForSwathCalculation * 1024 / 2) ||
  3790				p->SwathWidth[k] > p->MaximumSwathWidthLuma[k] || (p->SwathHeightC[k] > 0 && p->SwathWidthChroma[k] > p->MaximumSwathWidthChroma[k])) {
  3791				*p->ViewportSizeSupport = false;
  3792				dml2_printf("DML::%s: k=%u full_swath_bytes_l=%u\n", __func__, k, p->full_swath_bytes_l[k]);
  3793				dml2_printf("DML::%s: k=%u full_swath_bytes_c=%u\n", __func__, k, p->full_swath_bytes_c[k]);
  3794				dml2_printf("DML::%s: k=%u DETBufferSizeInKByteForSwathCalculation=%u\n", __func__, k, DETBufferSizeInKByteForSwathCalculation);
  3795				dml2_printf("DML::%s: k=%u SwathWidth=%u\n", __func__, k, p->SwathWidth[k]);
  3796				dml2_printf("DML::%s: k=%u MaximumSwathWidthLuma=%f\n", __func__, k, p->MaximumSwathWidthLuma[k]);
  3797				dml2_printf("DML::%s: k=%u SwathWidthChroma=%d\n", __func__, k, p->SwathWidthChroma[k]);
  3798				dml2_printf("DML::%s: k=%u MaximumSwathWidthChroma=%f\n", __func__, k, p->MaximumSwathWidthChroma[k]);
  3799				p->ViewportSizeSupportPerSurface[k] = false;
  3800			} else {
  3801				p->ViewportSizeSupportPerSurface[k] = true;
  3802			}
  3803	
  3804			if (p->SwathHeightC[k] == 0) {
  3805	#ifdef __DML_VBA_DEBUG__
  3806				dml2_printf("DML::%s: k=%u, All DET will be used for plane0\n", __func__, k);
  3807	#endif
  3808				p->DETBufferSizeY[k] = p->DETBufferSizeInKByte[k] * 1024;
  3809				p->DETBufferSizeC[k] = 0;
  3810			} else if (RoundedUpSwathSizeBytesY[k] <= 1.5 * RoundedUpSwathSizeBytesC[k]) {
  3811	#ifdef __DML_VBA_DEBUG__
  3812				dml2_printf("DML::%s: k=%u, Half DET will be used for plane0, and half for plane1\n", __func__, k);
  3813	#endif
  3814				p->DETBufferSizeY[k] = p->DETBufferSizeInKByte[k] * 1024 / 2;
  3815				p->DETBufferSizeC[k] = p->DETBufferSizeInKByte[k] * 1024 / 2;
  3816			} else {
  3817	#ifdef __DML_VBA_DEBUG__
  3818				dml2_printf("DML::%s: k=%u, 2/3 DET will be used for plane0, and 1/3 for plane1\n", __func__, k);
  3819	#endif
  3820				p->DETBufferSizeY[k] = (unsigned int)(math_floor2(p->DETBufferSizeInKByte[k] * 1024 * 2 / 3, 1024));
  3821				p->DETBufferSizeC[k] = p->DETBufferSizeInKByte[k] * 1024 - p->DETBufferSizeY[k];
  3822			}
  3823	
  3824	#ifdef __DML_VBA_DEBUG__
  3825			dml2_printf("DML::%s: k=%u SwathHeightY = %u\n", __func__, k, p->SwathHeightY[k]);
  3826			dml2_printf("DML::%s: k=%u SwathHeightC = %u\n", __func__, k, p->SwathHeightC[k]);
  3827			dml2_printf("DML::%s: k=%u full_swath_bytes_l = %u\n", __func__, k, p->full_swath_bytes_l[k]);
  3828			dml2_printf("DML::%s: k=%u full_swath_bytes_c = %u\n", __func__, k, p->full_swath_bytes_c[k]);
  3829			dml2_printf("DML::%s: k=%u RoundedUpSwathSizeBytesY = %u\n", __func__, k, RoundedUpSwathSizeBytesY[k]);
  3830			dml2_printf("DML::%s: k=%u RoundedUpSwathSizeBytesC = %u\n", __func__, k, RoundedUpSwathSizeBytesC[k]);
  3831			dml2_printf("DML::%s: k=%u DETBufferSizeInKByte = %u\n", __func__, k, p->DETBufferSizeInKByte[k]);
  3832			dml2_printf("DML::%s: k=%u DETBufferSizeY = %u\n", __func__, k, p->DETBufferSizeY[k]);
  3833			dml2_printf("DML::%s: k=%u DETBufferSizeC = %u\n", __func__, k, p->DETBufferSizeC[k]);
  3834			dml2_printf("DML::%s: k=%u ViewportSizeSupportPerSurface = %u\n", __func__, k, p->ViewportSizeSupportPerSurface[k]);
  3835	#endif
  3836	
  3837		}
  3838	
  3839		*p->compbuf_reserved_space_64b = 2 * p->pixel_chunk_size_kbytes * 1024 / 64;
  3840		if (*p->UnboundedRequestEnabled) {
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^
Everything check if enabled is true

  3841			*p->compbuf_reserved_space_64b = (unsigned int)math_ceil2(math_max2(*p->compbuf_reserved_space_64b,
  3842				(double)(p->rob_buffer_size_kbytes * 1024 / 64) - (double)(RoundedUpSwathSizeBytesY[SurfaceDoingUnboundedRequest] * TTUFIFODEPTH / (p->mrq_present ? MAXIMUMCOMPRESSION : 1) / 64)), 1.0);
  3843	#ifdef __DML_VBA_DEBUG__
  3844			dml2_printf("DML::%s: RoundedUpSwathSizeBytesY[%d] = %u\n", __func__, SurfaceDoingUnboundedRequest, RoundedUpSwathSizeBytesY[SurfaceDoingUnboundedRequest]);
  3845			dml2_printf("DML::%s: rob_buffer_size_kbytes = %u\n", __func__, p->rob_buffer_size_kbytes);
  3846	#endif
  3847		}
  3848	#ifdef __DML_VBA_DEBUG__
  3849		dml2_printf("DML::%s: compbuf_reserved_space_64b = %u\n", __func__, *p->compbuf_reserved_space_64b);
  3850	#endif
  3851	
  3852		*p->hw_debug5 = false;
  3853		for (unsigned int k = 0; k < p->NumberOfActiveSurfaces; ++k) {
  3854			if (!(p->mrq_present) && (!p->UnboundedRequestEnabled) && (TotalActiveDPP == 1)
                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^
This checks if the pointer to enabled is NULL.  Probably *p was intended.


  3855				&& p->display_cfg->plane_descriptors[k].surface.dcc.enable
  3856				&& ((p->rob_buffer_size_kbytes * 1024 * (p->mrq_present ? MAXIMUMCOMPRESSION : 1)

regards,
dan carpenter


More information about the amd-gfx mailing list