[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