From nobody Thu Apr 2 20:37:56 2026 Received: from mail-pg1-f178.google.com (mail-pg1-f178.google.com [209.85.215.178]) (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 B951F2609E3 for ; Thu, 26 Mar 2026 23:47:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774568866; cv=none; b=Kp+EWRH91NosF4+NWDjtG2kYzgVKAYVR/PgdZuueyDLsDLaUNC9JoRMwNWZObDr7FkIPodKqjo4B+pDedpdS0ZT0WaF4losnEHRj2IjnoLBFNLC4Z3hU1z2PfG621Nl4fNOtDAt8szbrkh8ivzGdqwc0oWOxjFst+KoCn+NJk/s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774568866; c=relaxed/simple; bh=KDqNex0SrS190A1ilN+y9+8TCpjpm9vndDHmyB+HvwU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=q/PIWvfnlFITbUILFnvwzy4IE41ALiUi85fYZZhFOE2XZMEkfYmZJRLkvgwVMsFqcEsSUQhmPNHd4hMYSmsXzEctZpjUvsT5ZLitEGmjm/RlauE6uCe0xcREypE4Jf/qDVVBn8TwY85NoiUTZCZXBEBWKhFllMOoL8DwG3RyaoM= 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=as749G26; arc=none smtp.client-ip=209.85.215.178 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="as749G26" Received: by mail-pg1-f178.google.com with SMTP id 41be03b00d2f7-c7393536e53so635573a12.2 for ; Thu, 26 Mar 2026 16:47:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774568864; x=1775173664; 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=fYskpQzDXhxM4+9VM9RgZDo2+o/dM3+zNnNFKoGgds4=; b=as749G26jr6HMyxyZYIkxxkbc6K0IglSLPdrLyqOkChZaFLZuqjaYv/kjb7/ZjvxPM scd3TuWQ4bMlOtkw/rkkidMHwVZ2sIcHimLnSme0GvsgDtrMISH9TL0HdKvewxOltoXw 4z7dHCujrkiUCxnMX1Kk6tJqPcavewsuOLPV5Otlm5dtzczmNZaswBqzj+rYC/QYfsCC 1/kB9WqX07goIOysjg9FOEoTbg0fwe30sXNicqzA7Ogirm42pLM5yYFa0l5+sd2pA2GR muQaIlsI/GW2OoHepdFX8R9LqOg8/6jZgXydJWX6zgR8ByZEOPBqB7IepXz6fFPyFLgW D1OQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774568864; x=1775173664; 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=fYskpQzDXhxM4+9VM9RgZDo2+o/dM3+zNnNFKoGgds4=; b=EPVbuIWdagNZ7ZoErsIdhWWtMGWHyyjkvVxLjAGcSbG4TAkgW7j/5Cd0oYTdJ0jJLj XWytWcNbbOwkKP5Bb7femOEp8fD3cSKymd44xZPbvVUgmHkdD3Zq1ZaSVmu/wXT2QK1q S12NKOd3wM+9mb3x57U2cJ+5AzJ6fh3BhRX0YrPwMLHXPFkhYjmpk+CAEZ4DLhcJxW3N /BHJi7FS7ry9bWLAO6v6OmUATeuAphl046kYPIWcDLrZ8kRCJjHOOCjFW57PJOGexAcm CK+f/01gL2skUx1Cmo2Mt5NQK5rU1V+KmhHOzYeeAlU+F20OgwplzQ7gJCJCcJZF3xr9 8kEg== X-Forwarded-Encrypted: i=1; AJvYcCXX5r3rbo2P43qIVN1Sq5Oeya1AVBHZxXhb50CnNN4lPb0Zkh4fklA3/S1pxhapQFvHA56vbhBLoWlGSTA=@vger.kernel.org X-Gm-Message-State: AOJu0YyugAoHQ0wskaD8oe2fmUuzVajMP24g3EWr8fYDzXjCOVoKPHZ3 5Tg3sPnSKxgJ/kRFWfK8DJ5MDhPLJR6bYFyNNeKKK9cTAA11JG0N20lp X-Gm-Gg: ATEYQzwyivXyKt8DkP9n9NjlTfB0Ulja7rvu6qB9yfmx5MFzGysDPR4vglY/ISlsAm0 z3r2VhRg4CKeAgmVagI51eR4U9SpWb1Gl/dOqv6RYCtEEzE3EZtGZYSdPqSNVKVAJdnj2Xkv5j+ UxLBQBsa7jGlAylQh191l80pXuW6d/K1Rg5AgJTAnXpH31akz0gC0tetrtQXixYkrgl8muccznH WXOR+n5SpUZrzZjbOyel3hUaFkzCzOtX/30VQvpFXTlv2PK5R8rUxjqYpyuQZmp6X9hQstwQuj6 omtzVKpVCVOv9AruQ0oiEsRyeIgn+HKoN0q/Sd4kWi2dVqsHq2SQ9Nc2hiu8dNE6iGR+ZsL5TCO j/cnImldt+CK671cBR5geT3cDAO9kX2xCJJb3Q7nSiGuKtQQti5NHBWN2KiiVAnoYhGFL6h/9h4 vM4xGIOG8q7k8oWjSTAqxZPYM2Z9BCPyHsGp+GyyyVnu3ZE1Djw82dnfk= X-Received: by 2002:a05:6a20:3d1d:b0:39b:d9f1:6d05 with SMTP id adf61e73a8af0-39c87b30111mr483902637.53.1774568864031; Thu, 26 Mar 2026 16:47:44 -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.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2026 16:47:42 -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 4/9] drm/amd/display: Reject modes with too high pixel clock on DCE6-10 Date: Thu, 26 Mar 2026 16:47:11 -0700 Message-ID: <20260326234716.16723-5-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 118800b0797a046adaa2a8e9dee9b971b78802a7 ] Reject modes with a pixel clock higher than the maximum display clock. Use 400 MHz as a fallback value when the maximum display clock is not known. Pixel clocks that are higher than the display clock just won't work and are not supported. With the addition of the YUV422 fallback, DC can now accidentally select a mode requiring higher pixel clock than actually supported when the DP version supports the required bandwidth but the clock is otherwise too high for the display engine. DCE 6-10 don't support these modes but they don't have a bandwidth calculation to reject them properly. Fixes: db291ed1732e ("drm/amd/display: Add fallback path for YCBCR422") Reviewed-by: Alex Deucher Signed-off-by: Timur Krist=C3=B3f Signed-off-by: Mario Limonciello Signed-off-by: Alex Deucher Signed-off-by: Rosen Penev --- .../drm/amd/display/dc/clk_mgr/dce100/dce_clk_mgr.c | 3 +++ .../drm/amd/display/dc/clk_mgr/dce60/dce60_clk_mgr.c | 5 +++++ drivers/gpu/drm/amd/display/dc/dce60/dce60_resource.c | 10 +++++++++- .../amd/display/dc/resource/dce100/dce100_resource.c | 10 +++++++++- .../drm/amd/display/dc/resource/dce80/dce80_resource.c | 10 +++++++++- 5 files changed, 35 insertions(+), 3 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 b268c367c27c..a2e100aa3cba 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 @@ -460,6 +460,9 @@ void dce_clk_mgr_construct( clk_mgr->max_clks_state =3D DM_PP_CLOCKS_STATE_NOMINAL; clk_mgr->cur_min_clks_state =3D DM_PP_CLOCKS_STATE_INVALID; =20 + base->clks.max_supported_dispclk_khz =3D + clk_mgr->max_clks_by_state[DM_PP_CLOCKS_STATE_PERFORMANCE].display_clk_k= hz; + dce_clock_read_integrated_info(clk_mgr); dce_clock_read_ss_info(clk_mgr); } diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dce60/dce60_clk_mgr.c b= /drivers/gpu/drm/amd/display/dc/clk_mgr/dce60/dce60_clk_mgr.c index a39641a0ff09..69dd80d9f738 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dce60/dce60_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dce60/dce60_clk_mgr.c @@ -147,6 +147,8 @@ void dce60_clk_mgr_construct( struct dc_context *ctx, struct clk_mgr_internal *clk_mgr) { + struct clk_mgr *base =3D &clk_mgr->base; + dce_clk_mgr_construct(ctx, clk_mgr); =20 memcpy(clk_mgr->max_clks_by_state, @@ -157,5 +159,8 @@ void dce60_clk_mgr_construct( clk_mgr->clk_mgr_shift =3D &disp_clk_shift; clk_mgr->clk_mgr_mask =3D &disp_clk_mask; clk_mgr->base.funcs =3D &dce60_funcs; + + base->clks.max_supported_dispclk_khz =3D + clk_mgr->max_clks_by_state[DM_PP_CLOCKS_STATE_PERFORMANCE].display_clk_k= hz; } =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 8db9f7514466..7886a2a55caf 100644 --- a/drivers/gpu/drm/amd/display/dc/dce60/dce60_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dce60/dce60_resource.c @@ -34,6 +34,7 @@ #include "stream_encoder.h" =20 #include "resource.h" +#include "clk_mgr.h" #include "include/irq_service_interface.h" #include "irq/dce60/irq_service_dce60.h" #include "dce110/dce110_timing_generator.h" @@ -870,10 +871,17 @@ static bool dce60_validate_bandwidth( { int i; bool at_least_one_pipe =3D false; + struct dc_stream_state *stream =3D NULL; + const uint32_t max_pix_clk_khz =3D max(dc->clk_mgr->clks.max_supported_di= spclk_khz, 400000); =20 for (i =3D 0; i < dc->res_pool->pipe_count; i++) { - if (context->res_ctx.pipe_ctx[i].stream) + stream =3D context->res_ctx.pipe_ctx[i].stream; + if (stream) { at_least_one_pipe =3D true; + + if (stream->timing.pix_clk_100hz >=3D max_pix_clk_khz * 10) + return DC_FAIL_BANDWIDTH_VALIDATE; + } } =20 if (at_least_one_pipe) { diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource= .c b/drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.c index 53a5f4cb648c..6717ed84a032 100644 --- a/drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.c +++ b/drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.c @@ -29,6 +29,7 @@ #include "stream_encoder.h" =20 #include "resource.h" +#include "clk_mgr.h" #include "include/irq_service_interface.h" #include "virtual/virtual_stream_encoder.h" #include "dce110/dce110_resource.h" @@ -843,10 +844,17 @@ static bool dce100_validate_bandwidth( { int i; bool at_least_one_pipe =3D false; + struct dc_stream_state *stream =3D NULL; + const uint32_t max_pix_clk_khz =3D max(dc->clk_mgr->clks.max_supported_di= spclk_khz, 400000); =20 for (i =3D 0; i < dc->res_pool->pipe_count; i++) { - if (context->res_ctx.pipe_ctx[i].stream) + stream =3D context->res_ctx.pipe_ctx[i].stream; + if (stream) { at_least_one_pipe =3D true; + + if (stream->timing.pix_clk_100hz >=3D max_pix_clk_khz * 10) + return DC_FAIL_BANDWIDTH_VALIDATE; + } } =20 if (at_least_one_pipe) { diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.c= b/drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.c index a73d3c6ef425..af4a45718c7c 100644 --- a/drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.c +++ b/drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.c @@ -32,6 +32,7 @@ #include "stream_encoder.h" =20 #include "resource.h" +#include "clk_mgr.h" #include "include/irq_service_interface.h" #include "irq/dce80/irq_service_dce80.h" #include "dce110/dce110_timing_generator.h" @@ -876,10 +877,17 @@ static bool dce80_validate_bandwidth( { int i; bool at_least_one_pipe =3D false; + struct dc_stream_state *stream =3D NULL; + const uint32_t max_pix_clk_khz =3D max(dc->clk_mgr->clks.max_supported_di= spclk_khz, 400000); =20 for (i =3D 0; i < dc->res_pool->pipe_count; i++) { - if (context->res_ctx.pipe_ctx[i].stream) + stream =3D context->res_ctx.pipe_ctx[i].stream; + if (stream) { at_least_one_pipe =3D true; + + if (stream->timing.pix_clk_100hz >=3D max_pix_clk_khz * 10) + return DC_FAIL_BANDWIDTH_VALIDATE; + } } =20 if (at_least_one_pipe) { --=20 2.53.0