From nobody Sun Apr 5 13:31:03 2026 Received: from mail-dy1-f173.google.com (mail-dy1-f173.google.com [74.125.82.173]) (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 E52AD1E0B9C for ; Wed, 1 Apr 2026 00:39:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775003986; cv=none; b=I7cR57wremUQenIM77DO3cKMyDzhYfM/FxgNU9dRE0w+T7NEGt69SqHZrZF4UaRv6JGUcee2yiw0QI0x+f58VO6PhzIWKB59yvA0pN/Y7Ai6VJCY33M2ykbgtuY9Gq/RjTbFGFywWOsr233UgrqU8ZCqKRv+0rjdLqurs/81r+0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775003986; c=relaxed/simple; bh=nxNHchBEAgurZmPLW41iEo80XDuWVJCQL7AK7y+NaqE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=UgyBR7X/+a5NSdDDBjYyzB6C8slNp63blHM02InIOMKekxdWT8u2cnpeKwwTsIiuWQRfXo/h94zkRvbLTtT6odCxNasmzwPe9hBSmUOIzHZUeLhmly3+Rdz3JVZfEqjoXgjxaqdFzoimQhEG++lFuCHTzdqt1ZNWs6+sfNijbuI= 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=LVVIIEmG; arc=none smtp.client-ip=74.125.82.173 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="LVVIIEmG" Received: by mail-dy1-f173.google.com with SMTP id 5a478bee46e88-2c160cb021cso6504459eec.1 for ; Tue, 31 Mar 2026 17:39:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775003979; x=1775608779; 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=LVVIIEmGq1etYMNUU31xND/kwspoWRDpMapAYODYlN8WyuOrBOKALYc5fOznjh4i6t EopsPQUFA3guIJFVOotiIQmha+FrBgRQvBHWlVREzwsrGABe7UY5ThuxcMSeDl3PD3Rb NBjzo7UMBuhu07JUQtdBmSjquBu67ioj+eKxcq/VDD/Kz1v3a/B9a2sqZ5dt67Z2ZcLn OG+encsQA4xxdk50FzZfGpIdeCCtL2HB0GVk2ZbNXJZQaoYpV2Si4ZbYbrby1viTwXwH cKOOZJZ2xAPzg+PDnuwyVJyebbk8n3/I2+ZFyMfsW5cHvg52LWb3kuAYjRaPordpEENf 05SQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775003979; x=1775608779; 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=R/BHrIDrtZVlBEDdJXQ+R4CWkaBwZ/3nqkHln9seBhwLk6ATGiBZ0iNxeFzwLmffbB 3Q6oX2j4JF1L6CrNpdJx9xjYEkwmiJkBz1zOA1/PNcxoWpYW4GW3xq0bdfGyeAdLf5v5 o6DMKf8264+rkWIVyF3Iyi4s/yz362KMPfJGsruzgdFnjSgwCHHNbbPN/3xbOUV0qjql 0y6tHvLEko6rwOPHIj7ttVMsMMb5cblwBog054MBQgdVhI/EcOWxfv+ze12JTskpY9oH aRu8lDF/8qSy5qGyKPwLeYFEFI8FjYCz+Zjo3qLhpDDl70LmtV9XmXeWlTeq4Sy3sjOX OwaQ== X-Forwarded-Encrypted: i=1; AJvYcCXjQT7vrrMI1YV1O5OZDWfQFosXsoCu7KFjjTUOWDZXJQgqXo6CJ9Ax03lEz6E0LEd0Vdg5O1Eb8PK8ihk=@vger.kernel.org X-Gm-Message-State: AOJu0YyIvcxnKhxxuJvxX7g2tdWY+Zo3AodPrPp4dPVDz0DJUe5DQlRH q5avWIR84+UwhGW8Jj+bW45KCK+jXUSSDaawUaxlX4eB64Yf8um5EUUp X-Gm-Gg: ATEYQzzjSrj14ZzAxTBZsgKLTIT/VGtIV21GMn14kKFKBsDrxa1D9oSQ3zLs3cx0IeM Tk/bsNcxacn8A0t0iD7bf6HRPA4USlFSaM8Zr8yWlb6/LKMbfd8FGGuoCIn+KYORsnYVKiLRIbI 6lRbftIik4uiXvNGUGK84LLwmDB07hqLFtLlTS0naV8sz63gjhUOT9S/HxE8DVTWWnukmkNEVJG EkonOaFDWLhKvYgBh+6dTZFUvBquyISAdvXaCOQ7RZVyyXL2WzBLvULld8Ar5vIp7pmQWL2XrYF eoGn5uU135AZuuuepczpS8FiZhrV1jgrtox4byhSnKG98yM7n76vnYTxcmRhZnsdAfRGZfSakWG EhgS99lDrDKxEi1hu0GT4ARS1SyCNDc3r1KYS4fVSNNM3un24mtQ12gpreFmC79G/Z7G13lpXvb IaLafqMXdfjuaIPBDhXfxSVP1CIHnjvQk7Ju1w085Qg/fAoHdlUaud1JMjsmlX3jwqDA== X-Received: by 2002:a05:7300:5707:b0:2c7:3a7:c7b1 with SMTP id 5a478bee46e88-2c930b80368mr875953eec.1.1775003979256; Tue, 31 Mar 2026 17:39:39 -0700 (PDT) Received: from ryzen ([2601:644:8000:5b5d::8bd]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2c3c3bd9894sm11543019eec.4.2026.03.31.17.39.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 17:39:38 -0700 (PDT) From: Rosen Penev To: stable@vger.kernel.org Cc: Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Xinhui Pan , David Airlie , Simona Vetter , Harry Wentland , Leo Li , Rodrigo Siqueira , Ray Wu , Wayne Lin , Mario Limonciello , Roman Li , Eric Yang , Tony Cheng , Mauro Rossi , =?UTF-8?q?Timur=20Krist=C3=B3f?= , Alex Hung , 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: [PATCHv2 for 6.12 06/10] drm/amd/display: Fix DCE 6.0 and 6.4 PLL programming. Date: Tue, 31 Mar 2026 17:39:04 -0700 Message-ID: <20260401003908.3438-7-rosenp@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260401003908.3438-1-rosenp@gmail.com> References: <20260401003908.3438-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