From: sashiko-bot@kernel.org
To: "Enzo Adriano" <enzo.adriano.code@gmail.com>
Cc: linux-sunxi@lists.linux.dev
Subject: Re: [PATCH] clk: sunxi-ng: ccu_mp: fix clocks without P dividers
Date: Wed, 22 Jul 2026 01:09:25 +0000 [thread overview]
Message-ID: <20260722010926.0A8B01F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260722005643.1208942-1-enzo.adriano.code@gmail.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
Pre-existing issues:
- [High] The patch resolves an invalid GENMASK evaluation for 0-width P dividers but fails to apply the same check for 0-width M dividers, leaving a register corruption bug intact.
- [High] When an unreachable low clock rate is requested, `ccu_mp_find_best` fails to find a suitable divider and returns `m = 0` and `p = 0`, leading to integer underflows that severely corrupt the CCU hardware register.
--
--- Patch [1]: [PATCH] clk: sunxi-ng: ccu_mp: fix clocks without P dividers ---
commit e8027d463bc82dfb3ec7ba4b45f1688fa59d1694
Author: Enzo Adriano <enzo.adriano.code@gmail.com>
clk: sunxi-ng: ccu_mp: fix clocks without P dividers
This commit modifies the sunxi-ng MP clock driver to conditionally apply the
P divider mask only when the P field is present. It also ensures the update
bit is set if required by the hardware. This prevents invalid GENMASK
evaluations and missing hardware updates.
Closes: https://lore.kernel.org/r/20260712081341.9D1431F00A3D@smtp.kernel.org
> diff --git a/drivers/clk/sunxi-ng/ccu_mp.c b/drivers/clk/sunxi-ng/ccu_mp.c
> index 7cdb0eedc69b5..aa6cb20447f19 100644
> --- a/drivers/clk/sunxi-ng/ccu_mp.c
> +++ b/drivers/clk/sunxi-ng/ccu_mp.c
> @@ -237,12 +237,17 @@ static int ccu_mp_set_rate(struct clk_hw *hw, unsigned long rate,
>
> reg = readl(cmp->common.base + cmp->common.reg);
> reg &= ~GENMASK(cmp->m.width + cmp->m.shift - 1, cmp->m.shift);
[Severity: High]
This isn't a bug introduced by this patch, but since we are fixing the
invalid GENMASK for 0-width P dividers, should we apply the same check for
M dividers?
If an MP clock has no M divider (m.width == 0), the GENMASK will underflow
and produce an all-ones mask. The ~GENMASK operation then zeroes out the
entire hardware register, clearing critical fields like the clock gate.
> - reg &= ~GENMASK(cmp->p.width + cmp->p.shift - 1, cmp->p.shift);
> + if (cmp->p.width)
> + reg &= ~GENMASK(cmp->p.width + cmp->p.shift - 1, cmp->p.shift);
> + if (cmp->common.features & CCU_FEATURE_UPDATE_BIT)
> + reg |= CCU_SUNXI_UPDATE_BIT;
> reg |= (m - cmp->m.offset) << cmp->m.shift;
[Severity: High]
This is a pre-existing issue, but can this operation corrupt the hardware
register if an extremely low rate is requested?
If a driver or user requests a rate lower than the minimum achievable rate,
ccu_mp_find_best() will skip all rates:
drivers/clk/sunxi-ng/ccu_mp.c:ccu_mp_find_best() {
...
if (tmp_rate > rate)
continue;
...
}
This causes it to return the initial values for m and p as 0. Back in
ccu_mp_set_rate(), an m of 0 will cause m - cmp->m.offset to underflow
(for example, 0 - 1 = 0xFFFFFFFF). This value is then left-shifted and
OR'd into the register, overwriting adjacent hardware fields with 1s.
> - if (shift)
> - reg |= ilog2(p) << cmp->p.shift;
> - else
> - reg |= (p - cmp->p.offset) << cmp->p.shift;
> + if (cmp->p.width) {
> + if (shift)
> + reg |= ilog2(p) << cmp->p.shift;
> + else
> + reg |= (p - cmp->p.offset) << cmp->p.shift;
> + }
>
> writel(reg, cmp->common.base + cmp->common.reg);
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260722005643.1208942-1-enzo.adriano.code@gmail.com?part=1
next prev parent reply other threads:[~2026-07-22 1:09 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-22 0:56 [PATCH] clk: sunxi-ng: ccu_mp: fix clocks without P dividers Enzo Adriano
2026-07-22 1:09 ` sashiko-bot [this message]
2026-07-22 9:24 ` Andre Przywara
2026-07-22 13:27 ` Chen-Yu Tsai
2026-07-22 17:37 ` Enzo Adriano
2026-07-22 17:43 ` Chen-Yu Tsai
2026-07-22 22:48 ` Andre Przywara
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=20260722010926.0A8B01F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=enzo.adriano.code@gmail.com \
--cc=linux-sunxi@lists.linux.dev \
--cc=sashiko-reviews@lists.linux.dev \
/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