This is a note to let you know that I've just added the patch titled

    drm/amd/display: Fix DCE 6.0 and 6.4 PLL programming.

to the 6.12-stable tree which can be found at:
    
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     drm-amd-display-fix-dce-6.0-and-6.4-pll-programming.patch
and it can be found in the queue-6.12 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <[email protected]> know about it.


>From [email protected] Wed Apr  1 02:44:20 
>2026
From: Rosen Penev <[email protected]>
Date: Tue, 31 Mar 2026 17:39:04 -0700
Subject: drm/amd/display: Fix DCE 6.0 and 6.4 PLL programming.
To: [email protected]
Cc: "Alex Deucher" <[email protected]>, "Christian König" 
<[email protected]>, "Xinhui Pan" <[email protected]>, "David Airlie" 
<[email protected]>, "Simona Vetter" <[email protected]>, "Harry Wentland" 
<[email protected]>, "Leo Li" <[email protected]>, "Rodrigo Siqueira" 
<[email protected]>, "Ray Wu" <[email protected]>, "Wayne Lin" 
<[email protected]>, "Mario Limonciello" <[email protected]>, "Roman 
Li" <[email protected]>, "Eric Yang" <[email protected]>, "Tony Cheng" 
<[email protected]>, "Mauro Rossi" <[email protected]>, "Timur Kristóf" 
<[email protected]>, "Alex Hung" <[email protected]>, 
[email protected] (open list:RADEON and AMDGPU DRM DRIVERS), 
[email protected] (open list:DRM DRIVERS), 
[email protected] (open list)
Message-ID: <[email protected]>

From: Timur Kristóf <[email protected]>

[ Upstream commit 35222b5934ec8d762473592ece98659baf6bc48e ]

Apparently, both DCE 6.0 and 6.4 have 3 PLLs, but PLL0 can only
be used for DP. Make sure to initialize the correct amount of PLLs
in DC for these DCE versions and use PLL0 only for DP.

Also, on DCE 6.0 and 6.4, the PLL0 needs to be powered on at
initialization as opposed to DCE 6.1 and 7.x which use a different
clock source for DFS.

The following functions were used as reference from the old
radeon driver implementation of DCE 6.x:
- radeon_atom_pick_pll
- atombios_crtc_set_disp_eng_pll

Reviewed-by: Rodrigo Siqueira <[email protected]>
Reviewed-by: Alex Deucher <[email protected]>
Signed-off-by: Timur Kristóf <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
Signed-off-by: Rosen Penev <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
---
 drivers/gpu/drm/amd/display/dc/clk_mgr/dce100/dce_clk_mgr.c |    5 +
 drivers/gpu/drm/amd/display/dc/dce60/dce60_resource.c       |   34 +++++++-----
 2 files changed, 25 insertions(+), 14 deletions(-)

--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dce100/dce_clk_mgr.c
+++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dce100/dce_clk_mgr.c
@@ -245,6 +245,11 @@ int dce_set_clock(
        pxl_clk_params.target_pixel_clock_100hz = requested_clk_khz * 10;
        pxl_clk_params.pll_id = CLOCK_SOURCE_ID_DFS;
 
+       /* DCE 6.0, DCE 6.4: engine clock is the same as PLL0 */
+       if (clk_mgr_base->ctx->dce_version == DCE_VERSION_6_0 ||
+           clk_mgr_base->ctx->dce_version == DCE_VERSION_6_4)
+               pxl_clk_params.pll_id = CLOCK_SOURCE_ID_PLL0;
+
        if (clk_mgr_dce->dfs_bypass_active)
                pxl_clk_params.flags.SET_DISPCLK_DFS_BYPASS = true;
 
--- a/drivers/gpu/drm/amd/display/dc/dce60/dce60_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dce60/dce60_resource.c
@@ -374,7 +374,7 @@ static const struct resource_caps res_ca
                .num_timing_generator = 6,
                .num_audio = 6,
                .num_stream_encoder = 6,
-               .num_pll = 2,
+               .num_pll = 3,
                .num_ddc = 6,
 };
 
@@ -390,7 +390,7 @@ static const struct resource_caps res_ca
                .num_timing_generator = 2,
                .num_audio = 2,
                .num_stream_encoder = 2,
-               .num_pll = 2,
+               .num_pll = 3,
                .num_ddc = 2,
 };
 
@@ -990,21 +990,24 @@ static bool dce60_construct(
 
        if (bp->fw_info_valid && 
bp->fw_info.external_clock_source_frequency_for_dp != 0) {
                pool->base.dp_clock_source =
-                               dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
+                       dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
 
+               /* DCE 6.0 and 6.4: PLL0 can only be used with DP. Don't 
initialize it here. */
                pool->base.clock_sources[0] =
-                               dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], false);
+                       dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
                pool->base.clock_sources[1] =
-                               dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
+                       dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
                pool->base.clk_src_count = 2;
 
        } else {
                pool->base.dp_clock_source =
-                               dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], true);
+                       dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], true);
 
                pool->base.clock_sources[0] =
-                               dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
-               pool->base.clk_src_count = 1;
+                       dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
+               pool->base.clock_sources[1] =
+                       dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
+               pool->base.clk_src_count = 2;
        }
 
        if (pool->base.dp_clock_source == NULL) {
@@ -1382,21 +1385,24 @@ static bool dce64_construct(
 
        if (bp->fw_info_valid && 
bp->fw_info.external_clock_source_frequency_for_dp != 0) {
                pool->base.dp_clock_source =
-                               dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
+                       dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
 
+               /* DCE 6.0 and 6.4: PLL0 can only be used with DP. Don't 
initialize it here. */
                pool->base.clock_sources[0] =
-                               dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_PLL1, &clk_src_regs[0], false);
+                       dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
                pool->base.clock_sources[1] =
-                               dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_PLL2, &clk_src_regs[1], false);
+                       dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
                pool->base.clk_src_count = 2;
 
        } else {
                pool->base.dp_clock_source =
-                               dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_PLL1, &clk_src_regs[0], true);
+                       dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], true);
 
                pool->base.clock_sources[0] =
-                               dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_PLL2, &clk_src_regs[1], false);
-               pool->base.clk_src_count = 1;
+                       dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
+               pool->base.clock_sources[1] =
+                       dce60_clock_source_create(ctx, bp, 
CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
+               pool->base.clk_src_count = 2;
        }
 
        if (pool->base.dp_clock_source == NULL) {


Patches currently in stable-queue which might be from [email protected] are

queue-6.12/drm-amd-amdgpu-decouple-aspm-with-pcie-dpm.patch
queue-6.12/drm-amd-display-reject-modes-with-too-high-pixel-clock-on-dce6-10.patch
queue-6.12/drm-amd-display-fix-dce-6.0-and-6.4-pll-programming.patch
queue-6.12/drm-amd-display-disable-scaling-on-dce6-for-now.patch
queue-6.12/drm-amd-display-disable-fastboot-on-dce-6-too.patch
queue-6.12/drm-amd-display-correct-logic-check-error-for-fastboot.patch
queue-6.12/drm-amd-amdgpu-disable-aspm-in-some-situations.patch
queue-6.12/drm-amd-display-keep-pll0-running-on-dce-6.0-and-6.4.patch
queue-6.12/drm-amd-display-adjust-dce-8-10-clock-don-t-overclock-by-15.patch
queue-6.12/drm-amd-disable-aspm-on-si.patch

Reply via email to