From nobody Thu Apr 2 20:39:33 2026 Received: from mail-pg1-f170.google.com (mail-pg1-f170.google.com [209.85.215.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A830B1946BC for ; Thu, 26 Mar 2026 23:47:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774568870; cv=none; b=tn1FP1OaYRCGBO0x9mkgfFddi6OV9tHNXErf1KKf2Ohy7KrwZpY/bglpdSGwul8FBdqDxfDqfrugvOiw1pVvlrHj0HaySwq58Z9CrgwweiZ5ukENOIwr1ZNtwXLCT/LIUMV9SEKDLBtcfGXowxWyZlNrRHaQ02aHVag+bXh0YsA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774568870; c=relaxed/simple; bh=nxNHchBEAgurZmPLW41iEo80XDuWVJCQL7AK7y+NaqE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=L2+lgRVH21IaavUHfkVlFZl8VIuoi6CnX8WuLIKKpmfdKB2mXZWHubzw4R+LbV1HKFahK7TGzA+44g1Kz3xNGxgEZGY3FNH25LWChA99S2wWA4ytTZCjHs+OiG6BDPWR8DOCOsr9h1dl2MG31HlXloIVWiR64QrpOe3o6bO1t94= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=kIwnNE0K; arc=none smtp.client-ip=209.85.215.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="kIwnNE0K" Received: by mail-pg1-f170.google.com with SMTP id 41be03b00d2f7-c7393536e53so635585a12.2 for ; Thu, 26 Mar 2026 16:47:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774568868; x=1775173668; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=8f7Ntg2BX3ujyAv43r3p8dJoIwxn/3R/KWzzyEF1YhY=; b=kIwnNE0KewhoCVNqV0qTfFIWmST5NNAjTjEn6yAQJvKKUfYopcgZsjfkHdBYrJrIog ZYo/SdeWvegeBl5A/rDOvEzNe77W63mq0rKopnJGnEr3VO4tjIP51FVHpID2Z98FZ1YO ckRZXSxYanL4pX9coCXqeTrAPRCHV0npcqZccHb7ivl18uKknV6zxRuHT9ThKN4WNrWR fH+kZFhpNS82PFcVgfXr07bpALGZDY9KkRL5Ka8GlrVSHENigXkM0CJ5SfvbSuk36nCL MAp4qhjHEHD5Z6jhaF9EXWS0n6jTpfvM/cpkzFMiAVWnNHGlluy9o6J4vE10ZEB1s/il izjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774568868; x=1775173668; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=8f7Ntg2BX3ujyAv43r3p8dJoIwxn/3R/KWzzyEF1YhY=; b=ZWLJx5/sXEAqsU1AW7A2irilvDQdIRltmemABeacD/zatFUNtkNL8OGr6uG6RSG8oW sbPFgd6Nt595svTYgWeqA1+yOYjFImadb0VSAJOhpXCcjEEwhd2m3NFRCqhyLWTlbEjB TeH8rezB0akJQ9L4KmztSAgbr7WfpM42J4tAA3kLwTyqxOj8T4ahiXlpdscJqXtzccLr 6KCo/hdiyFIxHH2k+TUbtbzbFzS0bmG4DJPC7ZomnqETVTwpCz+7whi0xAETGbcLAWK9 LtGH6hIKVVvXLBdFgWj6rSscxD8EKojIKTPmQMXRcLX3QMM8jLIDyRaKN8O6ou9OXwH3 aa2Q== X-Forwarded-Encrypted: i=1; AJvYcCU9grMxXVFbNCVbPpONR0hGZ2ocstt1CS0je8XqRIj/qOSAZoH9zIPgO81mG+SA3lrvC9jmkhXaUrYJRhY=@vger.kernel.org X-Gm-Message-State: AOJu0YydxGATTbx05FoAxEQWgGllzhaSDKSVHzPPADsRJwAB8eDDNlRt L1x6xsEMhYi/m7KCx9e082dCdjIXUmwTgQZ+JoqHEfnkqt5hCIDX2SWV X-Gm-Gg: ATEYQzx1P+7GFhFga1ibSw9W3OMNZqEqdFpWBxFRYP+B7+JzZeALsGqLYHRuoh8SxYY L0+7ivxNncG2zsAZYdq9SQH8cu8o+q2JE37ciR1EFhjkkPHkDsUN4nN2/QqHbABpqmm6XXoSe6M koMlhNrwWIfwK/B7A8EejHxsmvkHRoL2hiGQiXP2+mjuFLp4D+rNlUGiycs9wt/1i6JWAZB8dHy b2RFTRKxLTQFRqOHXvzBMjwAsIZ9AUuv/q+DcWcwRGqDQ98LkTRW9JOWmI7D0MfPCWOPpGaApm7 NOzH1Ck4IZ/o8Unq4Kb24fg6RMcWAg8jebUIsfFR2TaLlXM9w7wc2eL41Wu6RWyG7OLrLLGfdzy Hq4IMn8AxCjmW0H5KVQZBmENrxO2Y19PZ/JN1hR7pl535rdE8+d4UUpDq4c4aI321nAhjdQDpon vK1AvcviCNTXSpOSu1Q3jRzRWBQM0Z4GJvRhvKHtSyqkdwsxt8HT96wck= X-Received: by 2002:a05:6a21:32a4:b0:398:79a8:5bf4 with SMTP id adf61e73a8af0-39c87a364bemr573477637.37.1774568868091; Thu, 26 Mar 2026 16:47:48 -0700 (PDT) Received: from ryzen ([2601:644:8000:5b5d::8bd]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c7673933816sm3201162a12.21.2026.03.26.16.47.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2026 16:47:47 -0700 (PDT) From: Rosen Penev To: stable@vger.kernel.org Cc: Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , "Pan, Xinhui" , David Airlie , Daniel Vetter , Harry Wentland , Leo Li , Greg Kroah-Hartman , Bin Lan , He Zhe , Vitaly Prosyak , Alex Hung , Rodrigo Siqueira , =?UTF-8?q?Timur=20Krist=C3=B3f?= , Mario Limonciello , Ray Wu , Wayne Lin , Roman Li , Eric Yang , Tony Cheng , Mauro Rossi , amd-gfx@lists.freedesktop.org (open list:RADEON and AMDGPU DRM DRIVERS), dri-devel@lists.freedesktop.org (open list:DRM DRIVERS), linux-kernel@vger.kernel.org (open list) Subject: [PATCH for 6.12 6/9] drm/amd/display: Fix DCE 6.0 and 6.4 PLL programming. Date: Thu, 26 Mar 2026 16:47:13 -0700 Message-ID: <20260326234716.16723-7-rosenp@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260326234716.16723-1-rosenp@gmail.com> References: <20260326234716.16723-1-rosenp@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Timur Krist=C3=B3f [ 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 Reviewed-by: Alex Deucher Signed-off-by: Timur Krist=C3=B3f Signed-off-by: Alex Deucher Signed-off-by: Rosen Penev --- .../display/dc/clk_mgr/dce100/dce_clk_mgr.c | 5 +++ .../drm/amd/display/dc/dce60/dce60_resource.c | 34 +++++++++++-------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git 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 index a2e100aa3cba..5dbe89d9b72d 100644 --- 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 =3D requested_clk_khz * 10; pxl_clk_params.pll_id =3D CLOCK_SOURCE_ID_DFS; =20 + /* DCE 6.0, DCE 6.4: engine clock is the same as PLL0 */ + if (clk_mgr_base->ctx->dce_version =3D=3D DCE_VERSION_6_0 || + clk_mgr_base->ctx->dce_version =3D=3D DCE_VERSION_6_4) + pxl_clk_params.pll_id =3D CLOCK_SOURCE_ID_PLL0; + if (clk_mgr_dce->dfs_bypass_active) pxl_clk_params.flags.SET_DISPCLK_DFS_BYPASS =3D true; =20 diff --git a/drivers/gpu/drm/amd/display/dc/dce60/dce60_resource.c b/driver= s/gpu/drm/amd/display/dc/dce60/dce60_resource.c index c4d7fa60d654..978c024c97ba 100644 --- 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_cap =3D { .num_timing_generator =3D 6, .num_audio =3D 6, .num_stream_encoder =3D 6, - .num_pll =3D 2, + .num_pll =3D 3, .num_ddc =3D 6, }; =20 @@ -390,7 +390,7 @@ static const struct resource_caps res_cap_64 =3D { .num_timing_generator =3D 2, .num_audio =3D 2, .num_stream_encoder =3D 2, - .num_pll =3D 2, + .num_pll =3D 3, .num_ddc =3D 2, }; =20 @@ -990,21 +990,24 @@ static bool dce60_construct( =20 if (bp->fw_info_valid && bp->fw_info.external_clock_source_frequency_for_= dp !=3D 0) { pool->base.dp_clock_source =3D - dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, tru= e); + dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true= ); =20 + /* DCE 6.0 and 6.4: PLL0 can only be used with DP. Don't initialize it h= ere. */ pool->base.clock_sources[0] =3D - 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] =3D - 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 =3D 2; =20 } else { pool->base.dp_clock_source =3D - 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); =20 pool->base.clock_sources[0] =3D - dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs= [1], false); - pool->base.clk_src_count =3D 1; + dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[= 1], false); + pool->base.clock_sources[1] =3D + dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[= 2], false); + pool->base.clk_src_count =3D 2; } =20 if (pool->base.dp_clock_source =3D=3D NULL) { @@ -1382,21 +1385,24 @@ static bool dce64_construct( =20 if (bp->fw_info_valid && bp->fw_info.external_clock_source_frequency_for_= dp !=3D 0) { pool->base.dp_clock_source =3D - dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, tru= e); + dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true= ); =20 + /* DCE 6.0 and 6.4: PLL0 can only be used with DP. Don't initialize it h= ere. */ pool->base.clock_sources[0] =3D - 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] =3D - 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 =3D 2; =20 } else { pool->base.dp_clock_source =3D - 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); =20 pool->base.clock_sources[0] =3D - dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs= [1], false); - pool->base.clk_src_count =3D 1; + dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[= 1], false); + pool->base.clock_sources[1] =3D + dce60_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[= 2], false); + pool->base.clk_src_count =3D 2; } =20 if (pool->base.dp_clock_source =3D=3D NULL) { --=20 2.53.0