svn commit: r364927 - head/sys/arm/allwinner/clkng
Andriy Gapon
avg at FreeBSD.org
Sun Aug 30 20:20:18 UTC 2020
On 28/08/2020 21:25, Emmanuel Vadot wrote:
> Author: manu
> Date: Fri Aug 28 18:25:45 2020
> New Revision: 364927
> URL: https://svnweb.freebsd.org/changeset/base/364927
>
> Log:
> arm: allwinner: clk: Add printfs when we cannot set the correct freq
>
> For some unknown reason this seems to fix this function when we printf
> the best variable. This isn't a delay problem as doing a printf without
> it doesn't solve this problem.
> This is way above my pay grade so add some printf that shouldn't be printed
> in 99% of the case anyway.
> Fix booting on most Allwinner boards as the mmc IP uses a NM clock.
Just so that our IRC conversation does not get lost to time.
I think that the real problem with the code is that it passes a difference
between two uint64_t-s, which is uint64_t itself, to abs() which takes an int
and returns an int.
I am not sure what liberties compilers (especially, clang) can take with that
incorrect code -- and they have some options, because abs() is an inline
function -- and how the magic printf-s affect those liberties, but I think that
it is better to make the code correct.
I think that abs(x - y) can be replaced with a local function like:
static inline uint64_t
distance(uint64_t x, uint64_t y)
{
return (x >= y ? x - y : y - x);
}
> Reported by: Alexander Mishin <mishin at mh.net.ru>
> MFC after: 3 days
> X-MFC-With: 363887
>
> Modified:
> head/sys/arm/allwinner/clkng/aw_clk_nm.c
>
> Modified: head/sys/arm/allwinner/clkng/aw_clk_nm.c
> ==============================================================================
> --- head/sys/arm/allwinner/clkng/aw_clk_nm.c Fri Aug 28 17:55:54 2020 (r364926)
> +++ head/sys/arm/allwinner/clkng/aw_clk_nm.c Fri Aug 28 18:25:45 2020 (r364927)
> @@ -221,11 +221,15 @@ aw_clk_nm_set_freq(struct clknode *clk, uint64_t fpare
> if ((best < *fout) &&
> ((flags & CLK_SET_ROUND_DOWN) == 0)) {
> *stop = 1;
> + printf("best freq (%llu) < requested freq(%llu)\n",
> + best, *fout);
> return (ERANGE);
> }
> if ((best > *fout) &&
> ((flags & CLK_SET_ROUND_UP) == 0)) {
> *stop = 1;
> + printf("best freq (%llu) > requested freq(%llu)\n",
> + best, *fout);
> return (ERANGE);
> }
>
>
--
Andriy Gapon
More information about the svn-src-head
mailing list