From nobody Thu Apr 9 13:30:34 2026 Received: from mail-pg1-f176.google.com (mail-pg1-f176.google.com [209.85.215.176]) (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 247A631B130 for ; Sun, 8 Mar 2026 07:07:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772953628; cv=none; b=SEOgv+Rr/AMFugup+CrixkzF80SgDAjFqpxgSQxD447MpBjNB3voGl5Eadr8hFPmLAChiJ0/aCFIsJ1HThUuSMve5KADr60PcIB9PkqAV0fy/C/hmcWPIDX4mEydhHV58Kg5XlzfgPPCCK3wRQ9GLOC9QUYOXFYyRx5gM4+RQ9U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772953628; c=relaxed/simple; bh=d/aIafMJCdEMM7WRjiEliPE5eNxA6uu0vaLDPne0sb0=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=KAhCFT3PLE8hk3TPE5ZVUuHsD5DsYqU78nkuOS8yZ0EZHFH8zr4x+H0eG9lsS5b+akwKpbk6xmXYa+sUPqs4k6HKu9Lsrv0J5q816gZcKfT8yhCFdFlTDUJHy75wOarYWjNA8qUS3F+r2UxrN6Q1b5CGLufoX9ba+ZO+N4zm7Fg= 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=MpAKOAcL; arc=none smtp.client-ip=209.85.215.176 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="MpAKOAcL" Received: by mail-pg1-f176.google.com with SMTP id 41be03b00d2f7-c6e3e4e7388so4242659a12.1 for ; Sat, 07 Mar 2026 23:07:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772953626; x=1773558426; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=GFLfW5Q1Ig6hjSxU05JacS616Nm8ZTLRMtzhmvCENQY=; b=MpAKOAcLwPs7zoIJaMS3By/tsr3nM0z7Bmz1sBpEMRFj67A+tzZ+uAPJSNQXofdYJG ZM8QzIuQEMSDXmRxGUspYrRkxXLsy4CI9wvVoQZTlyiLz3APffcXZChRFCtT7l8R+t4P 553SsG/Md2pdo7FSEn3fIVAFbSuMaVtiMcralNnrXMJr9/nUO3/C2zh+Yb9WolLw6Xzn pMksLShQlr+vn7g7EKTVZSPIc8I0PSvcXWvvDvY9EfL7TENlpj0XsSZpbPfoSb3GF4Bj JXEw1kBsML0JqWMnXkMbZhtoYe2U1G6NfTWbcF+WXTPp7xxNKv0JSYU1Ic8LGwkGFZiO m4zg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772953626; x=1773558426; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=GFLfW5Q1Ig6hjSxU05JacS616Nm8ZTLRMtzhmvCENQY=; b=bsmX/4AnhGQG6w84rt01MmWwHGEB0JqM7gj0VZJSe2fcB5ypQHkIo9OQgp8ZVR/78v HoZeLjZFWpe2YZmaV3m/HWjz+/aRYxyUh7bEIEbWzf4RwmS7UZ2P+6DsKI8Si8Hn6Ijx b89hl5ni49ck0R13XELeDfpwFjU1x366wRhGZ9MhUJ+RKQ8OrCSLfV3mQk36/Z3aa+8l Gg80O3RhIPykZP9kDez2hzbLs1eLBRCwcSU4SeZGzAasvpXfufqptr5os7c8VfqcOKLx xrYwlByDIM14WK7dNEGh4T5/4y6G8O7RvhQ/OjQWa7o14ZsEzoeC4ST6iiO42d8SQjOH 5N6A== X-Forwarded-Encrypted: i=1; AJvYcCWvFvYMA4p5/rwf7rI8cM+WibXDVl5T8wgmMRw+KXDfxroJDZM8usB0G/iTH+rizTpqImBK02Yzz+/ek/Q=@vger.kernel.org X-Gm-Message-State: AOJu0YzRKCNYFDWqs2Kmu0PhSGi4bFTwO6D+x57AsTIbnZFXZpWqd/QA WxDlAg/5iMRBX7mBzmye1D3lItI4vKn9hlx1ymUuV1mm8KUw7IDvUW0T X-Gm-Gg: ATEYQzzCA1J8QahESZMZANKRQjOOpKZkJ0Hy3u2d44DYdU8O/KAZ2Bw6LfyVxmNi24V PdD0FXbr9+HLMrFVK0/hfw0zsz2LV4H3wHTv6Opl6FLdFjwcqZ8USyLF0aVMQ8McaY6TxeJycP3 H/tQstN9x1h+wwEHwn/smRKWQFMJ+n9h05QfaYC41cj0afOS0RdojviavVtDn/cHIVAe6wUweQ+ wxiHXQ3fTyHJlViQtC/IwsB3q0oxK8+n3FlkTpKvhPiX3Ydj0SXvojwmbqVoxrbxPWh1S5B3U0R wfdwkCFdXx0xWK/JCBBSDicBwYSrUvDNDrYUIReM1z6NG+uUohgLuDcPrz/boRQjOxKAgWAnciL ZE/8GSu9Odxuxu+kbPKwNDbeWuXu//r0nxAAQsuP7cSgSrG6meATRiel5n0GH28Up/YqMVaipcy XqUrVFOtxXfsyVck3eX1oXGh7+yDnn X-Received: by 2002:a05:6a21:6f16:b0:38d:ee4a:e82f with SMTP id adf61e73a8af0-398590d62b0mr6919892637.63.1772953626562; Sat, 07 Mar 2026 23:07:06 -0800 (PST) Received: from nuvole ([109.166.36.159]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c739e0a7156sm6048604a12.2.2026.03.07.23.07.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 07 Mar 2026 23:07:06 -0800 (PST) From: Pengyu Luo To: Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter Cc: Pengyu Luo , Dmitry Baryshkov , linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] drm/msm/dsi: fix pclk calculation for bonded dsi Date: Sun, 8 Mar 2026 15:06:27 +0800 Message-ID: <20260308070628.482527-1-mitltlatltl@gmail.com> X-Mailer: git-send-email 2.53.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Recently, we round up new_hdisplay once at most, for bonded dsi, we may need twice, since they are independent links, we should round up each half separately. This also aligns with the hdisplay we program later in dsi_timing_setup() Example: full_hdisplay =3D 1904, dsc_bpp =3D 8, bpc =3D 8 new_full_hdisplay =3D DIV_ROUND_UP(1904 * 8, 8 * 3) =3D 635 if we use half display new_half_hdisplay =3D DIV_ROUND_UP(952 * 8, 8 * 3) =3D 318 new_full_display =3D 636 Fixes: 7c9e4a554d4a ("drm/msm/dsi: Reduce pclk rate for compression") Signed-off-by: Pengyu Luo Reviewed-by: Dmitry Baryshkov --- v2: add a parameter desciption to the function doc (kernel test robot) --- drivers/gpu/drm/msm/dsi/dsi_host.c | 32 +++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/d= si_host.c index e8e83ee61e..06f094fc32 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_host.c +++ b/drivers/gpu/drm/msm/dsi/dsi_host.c @@ -569,6 +569,7 @@ void dsi_link_clk_disable_v2(struct msm_dsi_host *msm_h= ost) * dsi_adjust_pclk_for_compression() - Adjust the pclk rate for compressio= n case * @mode: The selected mode for the DSI output * @dsc: DRM DSC configuration for this DSI output + * @is_bonded_dsi: True if two DSI controllers are bonded * * Adjust the pclk rate by calculating a new hdisplay proportional to * the compression ratio such that: @@ -584,13 +585,30 @@ void dsi_link_clk_disable_v2(struct msm_dsi_host *msm= _host) * FIXME: Reconsider this if/when CMD mode handling is rewritten to use * transfer time and data overhead as a starting point of the calculation= s. */ -static unsigned long dsi_adjust_pclk_for_compression(const struct drm_disp= lay_mode *mode, - const struct drm_dsc_config *dsc) +static unsigned long +dsi_adjust_pclk_for_compression(const struct drm_display_mode *mode, + const struct drm_dsc_config *dsc, + bool is_bonded_dsi) { - int new_hdisplay =3D DIV_ROUND_UP(mode->hdisplay * drm_dsc_get_bpp_int(ds= c), - dsc->bits_per_component * 3); + int hdisplay, new_hdisplay, new_htotal; =20 - int new_htotal =3D mode->htotal - mode->hdisplay + new_hdisplay; + /* + * For bonded DSI, split hdisplay across two links and round up each + * half separately, passing the full hdisplay would only round up once. + * This also aligns with the hdisplay we program later in + * dsi_timing_setup() + */ + hdisplay =3D mode->hdisplay; + if (is_bonded_dsi) + hdisplay /=3D 2; + + new_hdisplay =3D DIV_ROUND_UP(hdisplay * drm_dsc_get_bpp_int(dsc), + dsc->bits_per_component * 3); + + if (is_bonded_dsi) + new_hdisplay *=3D 2; + + new_htotal =3D mode->htotal - mode->hdisplay + new_hdisplay; =20 return mult_frac(mode->clock * 1000u, new_htotal, mode->htotal); } @@ -603,12 +621,12 @@ static unsigned long dsi_get_pclk_rate(const struct d= rm_display_mode *mode, pclk_rate =3D mode->clock * 1000u; =20 if (dsc) - pclk_rate =3D dsi_adjust_pclk_for_compression(mode, dsc); + pclk_rate =3D dsi_adjust_pclk_for_compression(mode, dsc, is_bonded_dsi); =20 /* * For bonded DSI mode, the current DRM mode has the complete width of the * panel. Since, the complete panel is driven by two DSI controllers, - * the clock rates have to be split between the two dsi controllers. + * the clock rates have to be split between the two DSI controllers. * Adjust the byte and pixel clock rates for each dsi host accordingly. */ if (is_bonded_dsi) --=20 2.53.0