Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 30 Aug 2020 23:20:08 +0300
From:      Andriy Gapon <avg@FreeBSD.org>
To:        Emmanuel Vadot <manu@freebsd.org>, src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r364927 - head/sys/arm/allwinner/clkng
Message-ID:  <31f105d3-e67a-7b81-8670-55a19237569e@FreeBSD.org>
In-Reply-To: <202008281825.07SIPkBa029646@repo.freebsd.org>
References:  <202008281825.07SIPkBa029646@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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@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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?31f105d3-e67a-7b81-8670-55a19237569e>