]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/amd/display: Fix fractional fb divider in set_pixel_clock_v3
authorTimur Kristóf <timur.kristof@gmail.com>
Thu, 31 Jul 2025 09:43:52 +0000 (11:43 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 18 Aug 2025 22:00:34 +0000 (18:00 -0400)
For later VBIOS versions, the fractional feedback divider is
calculated as the remainder of dividing the feedback divider by
a factor, which is set to 1000000. For reference, see:
- calculate_fb_and_fractional_fb_divider
- calc_pll_max_vco_construct

However, in case of old VBIOS versions that have
set_pixel_clock_v3, they only have 1 byte available for the
fractional feedback divider, and it's expected to be set to the
remainder from dividing the feedback divider by 10.
For reference see the legacy display code:
- amdgpu_pll_compute
- amdgpu_atombios_crtc_program_pll

This commit fixes set_pixel_clock_v3 by dividing the fractional
feedback divider passed to the function by 100000.

Fixes: 4562236b3bc0 ("drm/amd/dc: Add dc display driver (v2)")
Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Rodrigo Siqueira <siqueira@igalia.com>
Reviewed-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 027e7acc7e17802ebf28e1edb88a404836ad50d6)
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/display/dc/bios/command_table.c

index 2bcae0643e61dbeac9c2f216e337e732094a295d..58e88778da7ffd521cd764b44d220cc69058bcf7 100644 (file)
@@ -993,7 +993,7 @@ static enum bp_result set_pixel_clock_v3(
        allocation.sPCLKInput.usFbDiv =
                        cpu_to_le16((uint16_t)bp_params->feedback_divider);
        allocation.sPCLKInput.ucFracFbDiv =
-                       (uint8_t)bp_params->fractional_feedback_divider;
+                       (uint8_t)(bp_params->fractional_feedback_divider / 100000);
        allocation.sPCLKInput.ucPostDiv =
                        (uint8_t)bp_params->pixel_clock_post_divider;