From: Thomas Zimmermann <tzimmermann@suse.de>
To: Yongbang Shi <shiyongbang@huawei.com>,
dmitry.baryshkov@oss.qualcomm.com, tiantao6@hisilicon.com,
xinliang.liu@linaro.org, maarten.lankhorst@linux.intel.com,
mripard@kernel.org, airlied@gmail.com, daniel@ffwll.ch,
kong.kongxinwei@hisilicon.com
Cc: liangjian010@huawei.com, chenjianmin@huawei.com,
fengsheng5@huawei.com, helin52@h-partners.com,
shenjian15@huawei.com, shaojijie@huawei.com,
dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH for drm-misc-fixes v5 4/4] drm/hisilicon/hibmc: use clock to look up the PLL value
Date: Mon, 27 Apr 2026 09:35:14 +0200 [thread overview]
Message-ID: <c5d2b5cd-df8b-4bbd-a0cc-4d7e3ad61da3@suse.de> (raw)
In-Reply-To: <20260423063233.1267631-5-shiyongbang@huawei.com>
Hi
Am 23.04.26 um 08:32 schrieb Yongbang Shi:
> From: Lin He <helin52@huawei.com>
>
> In the past, we use width and height to look up our PLL value.
> But actually the actual clock check is also necessnary. There are
> some resolutions that width and height same, but its clock different.
> Add the clock check when using pll_table to determine the PLL value.
>
> Fixes: da52605eea8f ("drm/hisilicon/hibmc: Add support for display engine")
> Signed-off-by: Lin He <helin52@huawei.com>
> Signed-off-by: Yongbang Shi <shiyongbang@huawei.com>
> ---
> ChangeLog:
> v2 -> v3:
> - remove unused macro CLOCK_TOLERANCE.
> v1 -> v2:
> - remove tag "Reviewed-by: Tao Tian <tiantao6@hisilicon.com>", witch will
> be given in public.
> - add 'drm-misc-fixes' in subject prefix.
> ---
> .../gpu/drm/hisilicon/hibmc/hibmc_drm_de.c | 78 +++++++++++--------
> 1 file changed, 44 insertions(+), 34 deletions(-)
>
> diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
> index 89bed78f1466..1a07e8146eee 100644
> --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
> @@ -32,26 +32,43 @@ struct hibmc_display_panel_pll {
> struct hibmc_dislay_pll_config {
> u64 hdisplay;
> u64 vdisplay;
> + int clock;
> u32 pll1_config_value;
> u32 pll2_config_value;
> };
>
> static const struct hibmc_dislay_pll_config hibmc_pll_table[] = {
> - {640, 480, CRT_PLL1_HS_25MHZ, CRT_PLL2_HS_25MHZ},
> - {800, 600, CRT_PLL1_HS_40MHZ, CRT_PLL2_HS_40MHZ},
> - {1024, 768, CRT_PLL1_HS_65MHZ, CRT_PLL2_HS_65MHZ},
> - {1152, 864, CRT_PLL1_HS_80MHZ_1152, CRT_PLL2_HS_80MHZ},
> - {1280, 768, CRT_PLL1_HS_80MHZ, CRT_PLL2_HS_80MHZ},
> - {1280, 720, CRT_PLL1_HS_74MHZ, CRT_PLL2_HS_74MHZ},
> - {1280, 960, CRT_PLL1_HS_108MHZ, CRT_PLL2_HS_108MHZ},
> - {1280, 1024, CRT_PLL1_HS_108MHZ, CRT_PLL2_HS_108MHZ},
> - {1440, 900, CRT_PLL1_HS_106MHZ, CRT_PLL2_HS_106MHZ},
> - {1600, 900, CRT_PLL1_HS_108MHZ, CRT_PLL2_HS_108MHZ},
> - {1600, 1200, CRT_PLL1_HS_162MHZ, CRT_PLL2_HS_162MHZ},
> - {1920, 1080, CRT_PLL1_HS_148MHZ, CRT_PLL2_HS_148MHZ},
> - {1920, 1200, CRT_PLL1_HS_193MHZ, CRT_PLL2_HS_193MHZ},
> + {640, 480, 25000, CRT_PLL1_HS_25MHZ, CRT_PLL2_HS_25MHZ},
> + {800, 600, 40000, CRT_PLL1_HS_40MHZ, CRT_PLL2_HS_40MHZ},
> + {1024, 768, 65000, CRT_PLL1_HS_65MHZ, CRT_PLL2_HS_65MHZ},
> + {1152, 864, 78750, CRT_PLL1_HS_80MHZ_1152, CRT_PLL2_HS_80MHZ},
> + {1280, 768, 80000, CRT_PLL1_HS_80MHZ, CRT_PLL2_HS_80MHZ},
> + {1280, 720, 74375, CRT_PLL1_HS_74MHZ, CRT_PLL2_HS_74MHZ},
> + {1280, 960, 108000, CRT_PLL1_HS_108MHZ, CRT_PLL2_HS_108MHZ},
> + {1280, 1024, 108000, CRT_PLL1_HS_108MHZ, CRT_PLL2_HS_108MHZ},
> + {1440, 900, 105952, CRT_PLL1_HS_106MHZ, CRT_PLL2_HS_106MHZ},
> + {1600, 900, 108000, CRT_PLL1_HS_108MHZ, CRT_PLL2_HS_108MHZ},
> + {1600, 1200, 162500, CRT_PLL1_HS_162MHZ, CRT_PLL2_HS_162MHZ},
> + {1920, 1080, 148750, CRT_PLL1_HS_148MHZ, CRT_PLL2_HS_148MHZ},
> + {1920, 1200, 193750, CRT_PLL1_HS_193MHZ, CRT_PLL2_HS_193MHZ},
> };
>
> +static int hibmc_get_best_clock_idx(const struct drm_display_mode *mode)
> +{
> + int i, diff;
> +
> + for (i = 0; i < ARRAY_SIZE(hibmc_pll_table); i++) {
> + if (hibmc_pll_table[i].hdisplay == mode->hdisplay &&
> + hibmc_pll_table[i].vdisplay == mode->vdisplay) {
> + diff = abs(mode->clock - hibmc_pll_table[i].clock);
> + if (diff < mode->clock / 100) /* tolerance 1/100 */
> + return i;
> + }
> + }
> +
> + return -EOPNOTSUPP;
This errno code is for sockets.
Rather return -MODE_CLOCK_RANGE here, which you can then return from
.mode_valid as well.
Best regards
Thomas
> +}
> +
> static int hibmc_plane_atomic_check(struct drm_plane *plane,
> struct drm_atomic_state *state)
> {
> @@ -214,17 +231,13 @@ static enum drm_mode_status
> hibmc_crtc_mode_valid(struct drm_crtc *crtc,
> const struct drm_display_mode *mode)
> {
> - size_t i = 0;
> int vrefresh = drm_mode_vrefresh(mode);
>
> if (vrefresh < 59 || vrefresh > 61)
> return MODE_NOCLOCK;
>
> - for (i = 0; i < ARRAY_SIZE(hibmc_pll_table); i++) {
> - if (hibmc_pll_table[i].hdisplay == mode->hdisplay &&
> - hibmc_pll_table[i].vdisplay == mode->vdisplay)
> - return MODE_OK;
> - }
> + if (hibmc_get_best_clock_idx(mode) >= 0)
> + return MODE_OK;
>
> return MODE_BAD;
> }
> @@ -281,23 +294,20 @@ static void set_vclock_hisilicon(struct drm_device *dev, u64 pll)
> writel(val, priv->mmio + CRT_PLL1_HS);
> }
>
> -static void get_pll_config(u64 x, u64 y, u32 *pll1, u32 *pll2)
> +static void get_pll_config(struct drm_display_mode *mode, u32 *pll1, u32 *pll2)
> {
> - size_t i;
> - size_t count = ARRAY_SIZE(hibmc_pll_table);
> -
> - for (i = 0; i < count; i++) {
> - if (hibmc_pll_table[i].hdisplay == x &&
> - hibmc_pll_table[i].vdisplay == y) {
> - *pll1 = hibmc_pll_table[i].pll1_config_value;
> - *pll2 = hibmc_pll_table[i].pll2_config_value;
> - return;
> - }
> + int idx;
> +
> + idx = hibmc_get_best_clock_idx(mode);
> + if (idx < 0) {
> + /* if found none, we use default value */
> + *pll1 = CRT_PLL1_HS_25MHZ;
> + *pll2 = CRT_PLL2_HS_25MHZ;
> + return;
> }
>
> - /* if found none, we use default value */
> - *pll1 = CRT_PLL1_HS_25MHZ;
> - *pll2 = CRT_PLL2_HS_25MHZ;
> + *pll1 = hibmc_pll_table[idx].pll1_config_value;
> + *pll2 = hibmc_pll_table[idx].pll2_config_value;
> }
>
> /*
> @@ -319,7 +329,7 @@ static u32 display_ctrl_adjust(struct drm_device *dev,
> x = mode->hdisplay;
> y = mode->vdisplay;
>
> - get_pll_config(x, y, &pll1, &pll2);
> + get_pll_config(mode, &pll1, &pll2);
> writel(pll2, priv->mmio + CRT_PLL2_HS);
> set_vclock_hisilicon(dev, pll1);
>
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstr. 146, 90461 Nürnberg, Germany, www.suse.com
GF: Jochen Jaser, Andrew McDonald, Werner Knoblich, (HRB 36809, AG Nürnberg)
next prev parent reply other threads:[~2026-04-27 7:35 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-23 6:32 [PATCH for drm-misc-fixes v5 0/4] Fix some bugs in the hibmc driver Yongbang Shi
2026-04-23 6:32 ` [PATCH for drm-misc-fixes v5 1/4] drm/hisilicon/hibmc: add updating link cap in DP detect() Yongbang Shi
2026-04-23 6:32 ` [PATCH for drm-misc-fixes v5 2/4] drm/hisilicon/hibmc: fix no showing when no connectors connected Yongbang Shi
2026-04-27 7:20 ` Thomas Zimmermann
2026-04-28 3:58 ` Yongbang Shi
2026-04-28 6:25 ` Thomas Zimmermann
2026-04-28 12:53 ` Yongbang Shi
2026-05-05 7:45 ` Thomas Zimmermann
2026-05-06 8:56 ` Yongbang Shi
2026-05-08 6:50 ` Thomas Zimmermann
2026-04-23 6:32 ` [PATCH for drm-misc-fixes v5 3/4] drm/hisilicon/hibmc: move display contrl config to hibmc_probe() Yongbang Shi
2026-04-27 7:26 ` Thomas Zimmermann
2026-04-28 7:55 ` Yongbang Shi
2026-04-28 8:42 ` Thomas Zimmermann
2026-04-23 6:32 ` [PATCH for drm-misc-fixes v5 4/4] drm/hisilicon/hibmc: use clock to look up the PLL value Yongbang Shi
2026-04-27 7:35 ` Thomas Zimmermann [this message]
2026-04-28 6:14 ` Yongbang Shi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=c5d2b5cd-df8b-4bbd-a0cc-4d7e3ad61da3@suse.de \
--to=tzimmermann@suse.de \
--cc=airlied@gmail.com \
--cc=chenjianmin@huawei.com \
--cc=daniel@ffwll.ch \
--cc=dmitry.baryshkov@oss.qualcomm.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=fengsheng5@huawei.com \
--cc=helin52@h-partners.com \
--cc=kong.kongxinwei@hisilicon.com \
--cc=liangjian010@huawei.com \
--cc=linux-kernel@vger.kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=shaojijie@huawei.com \
--cc=shenjian15@huawei.com \
--cc=shiyongbang@huawei.com \
--cc=tiantao6@hisilicon.com \
--cc=xinliang.liu@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox