All of lore.kernel.org
 help / color / mirror / Atom feed
From: Frank Oltmanns <frank@oltmanns.dev>
To: Maxime Ripard <maxime@cerno.tech>
Cc: Michael Turquette <mturquette@baylibre.com>,
	Stephen Boyd <sboyd@kernel.org>, Chen-Yu Tsai <wens@csie.org>,
	Jernej Skrabec <jernej.skrabec@gmail.com>,
	Samuel Holland <samuel@sholland.org>,
	Andre Przywara <andre.przywara@arm.com>,
	Roman Beranek <me@crly.cz>,
	linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 5/8] clk: sunxi-ng: nkm: Support finding closest rate
Date: Mon, 03 Jul 2023 10:59:43 +0200	[thread overview]
Message-ID: <87jzvhs740.fsf@oltmanns.dev> (raw)
In-Reply-To: <zvxviyera3zxe2ro5ej52vz2o2vrinu6zo7osddojbys4tuqhd@3f2okcbpf5jr>


On 2023-07-03 at 09:25:59 +0200, Maxime Ripard <maxime@cerno.tech> wrote:
> [[PGP Signed Part:Undecided]]
> On Mon, Jul 03, 2023 at 09:17:43AM +0200, Frank Oltmanns wrote:
>>
>> On 2023-07-02 at 19:55:24 +0200, Frank Oltmanns <frank@oltmanns.dev> wrote:
>> > When finding the best rate for a NKM clock, consider rates that are
>> > higher than the requested rate, if the CCU_FEATURE_CLOSEST_RATE flag is
>> > set.
>> >
>> > Accommodate ccu_mux_helper_determine_rate to this change.
>> >
>> > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev>
>> > ---
>> >  drivers/clk/sunxi-ng/ccu_mux.c | 23 +++++++++++++++-----
>> >  drivers/clk/sunxi-ng/ccu_nkm.c | 48 +++++++++++++++++++++++++++++++-----------
>> >  2 files changed, 54 insertions(+), 17 deletions(-)
>> >
>> > diff --git a/drivers/clk/sunxi-ng/ccu_mux.c b/drivers/clk/sunxi-ng/ccu_mux.c
>> > index 1d557e323169..8594d6a4addd 100644
>> > --- a/drivers/clk/sunxi-ng/ccu_mux.c
>> > +++ b/drivers/clk/sunxi-ng/ccu_mux.c
>> > @@ -113,7 +113,7 @@ int ccu_mux_helper_determine_rate(struct ccu_common *common,
>> >  	}
>> >
>> >  	for (i = 0; i < clk_hw_get_num_parents(hw); i++) {
>> > -		unsigned long tmp_rate, parent_rate;
>> > +		unsigned long tmp_rate, parent_rate, best_diff = ULONG_MAX;
>> >  		struct clk_hw *parent;
>> >
>> >  		parent = clk_hw_get_parent_by_index(hw, i);
>> > @@ -139,10 +139,23 @@ int ccu_mux_helper_determine_rate(struct ccu_common *common,
>> >  			goto out;
>> >  		}
>> >
>> > -		if ((req->rate - tmp_rate) < (req->rate - best_rate)) {
>> > -			best_rate = tmp_rate;
>> > -			best_parent_rate = parent_rate;
>> > -			best_parent = parent;
>> > +		if (common->features & CCU_FEATURE_CLOSEST_RATE) {
>> > +			unsigned long tmp_diff = req->rate > tmp_rate ?
>> > +						 req->rate - tmp_rate :
>> > +						 tmp_rate - req->rate;
>> > +
>> > +			if (tmp_diff < best_diff) {
>> > +				best_rate = tmp_rate;
>> > +				best_parent_rate = parent_rate;
>> > +				best_parent = parent;
>> > +				best_diff = tmp_diff;
>> > +			}
>> > +		} else {
>> > +			if ((req->rate - tmp_rate) < (req->rate - best_rate)) {
>> > +				best_rate = tmp_rate;
>> > +				best_parent_rate = parent_rate;
>> > +				best_parent = parent;
>> > +			}
>> >  		}
>> >  	}
>> >
>> > diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c
>> > index d83843e69c25..36d9e987e4d8 100644
>> > --- a/drivers/clk/sunxi-ng/ccu_nkm.c
>> > +++ b/drivers/clk/sunxi-ng/ccu_nkm.c
>> > @@ -18,9 +18,11 @@ struct _ccu_nkm {
>> >  };
>> >
>> >  static unsigned long ccu_nkm_find_best_with_parent_adj(unsigned long *parent, unsigned long rate,
>> > -						       struct _ccu_nkm *nkm, struct clk_hw *phw)
>> > +						       struct _ccu_nkm *nkm, struct clk_hw *phw,
>> > +						       unsigned long features)
>> >  {
>> > -	unsigned long best_rate = 0, best_parent_rate = *parent, tmp_parent = *parent;
>> > +	unsigned long best_rate = 0, best_parent_rate = 0, tmp_parent = *parent;
>> > +	unsigned long best_diff = ULONG_MAX;
>> >  	unsigned long best_n = 0, best_k = 0, best_m = 0;
>> >  	unsigned long _n, _k, _m;
>> >
>> > @@ -28,16 +30,26 @@ static unsigned long ccu_nkm_find_best_with_parent_adj(unsigned long *parent, un
>> >  		for (_n = nkm->min_n; _n <= nkm->max_n; _n++) {
>> >  			for (_m = nkm->min_m; _m <= nkm->max_m; _m++) {
>> >  				unsigned long tmp_rate;
>> > +				unsigned long tmp_diff;
>> >
>> >  				tmp_parent = clk_hw_round_rate(phw, rate * _m / (_n * _k));
>> >
>> >  				tmp_rate = tmp_parent * _n * _k / _m;
>> > -				if (tmp_rate > rate)
>> > -					continue;
>> >
>> > -				if ((rate - tmp_rate) < (rate - best_rate)) {
>> > +				if (features & CCU_FEATURE_CLOSEST_RATE) {
>> > +					tmp_diff = rate > tmp_rate ?
>> > +						   rate - tmp_rate :
>> > +						   tmp_rate - rate;
>> > +				} else {
>> > +					if (tmp_rate > rate)
>> > +						continue;
>> > +					tmp_diff = rate - tmp_diff;
>>
>> Sorry, this should of course be tmp_diff = rate - tmp_rate. I'll fix
>> that in v4. Also I'll do tests on my phone where
>> CCU_FEATURE_CLOSEST_RATE is not set (i.e., without PATCH 8), so see if
>> it replicates the old behaviour. I'll also look into adding kunit tests,
>> so that this doesn't happen again. I'm not sure if this is feasible, but
>> I'll ask here for advise, if/when I encounter obstacles.
>
> While this would obviously be great, I don't think we have the
> infrastructure just yet to allow to easily add kunit tests for entire
> clocks.

I think, clk_test.c provides a good blueprint. I tried to do that for
clk-fractional-divider [1], but Stephen wanted to go a different route,
so I dropped it. You could look at clk_fd_test_init() in [1]. A similar
approach might work for the sunxi-ng clocks. I don't see any real
blockers, but maybe that's me being naive.

[1]: https://lore.kernel.org/all/20230614185521.477924-3-frank@oltmanns.dev/

Best regards,
  Frank

>
> Maxime
>
> [[End of PGP Signed Part]]

WARNING: multiple messages have this Message-ID (diff)
From: Frank Oltmanns <frank@oltmanns.dev>
To: Maxime Ripard <maxime@cerno.tech>
Cc: Michael Turquette <mturquette@baylibre.com>,
	Stephen Boyd <sboyd@kernel.org>, Chen-Yu Tsai <wens@csie.org>,
	Jernej Skrabec <jernej.skrabec@gmail.com>,
	Samuel Holland <samuel@sholland.org>,
	Andre Przywara <andre.przywara@arm.com>,
	Roman Beranek <me@crly.cz>,
	linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 5/8] clk: sunxi-ng: nkm: Support finding closest rate
Date: Mon, 03 Jul 2023 10:59:43 +0200	[thread overview]
Message-ID: <87jzvhs740.fsf@oltmanns.dev> (raw)
In-Reply-To: <zvxviyera3zxe2ro5ej52vz2o2vrinu6zo7osddojbys4tuqhd@3f2okcbpf5jr>


On 2023-07-03 at 09:25:59 +0200, Maxime Ripard <maxime@cerno.tech> wrote:
> [[PGP Signed Part:Undecided]]
> On Mon, Jul 03, 2023 at 09:17:43AM +0200, Frank Oltmanns wrote:
>>
>> On 2023-07-02 at 19:55:24 +0200, Frank Oltmanns <frank@oltmanns.dev> wrote:
>> > When finding the best rate for a NKM clock, consider rates that are
>> > higher than the requested rate, if the CCU_FEATURE_CLOSEST_RATE flag is
>> > set.
>> >
>> > Accommodate ccu_mux_helper_determine_rate to this change.
>> >
>> > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev>
>> > ---
>> >  drivers/clk/sunxi-ng/ccu_mux.c | 23 +++++++++++++++-----
>> >  drivers/clk/sunxi-ng/ccu_nkm.c | 48 +++++++++++++++++++++++++++++++-----------
>> >  2 files changed, 54 insertions(+), 17 deletions(-)
>> >
>> > diff --git a/drivers/clk/sunxi-ng/ccu_mux.c b/drivers/clk/sunxi-ng/ccu_mux.c
>> > index 1d557e323169..8594d6a4addd 100644
>> > --- a/drivers/clk/sunxi-ng/ccu_mux.c
>> > +++ b/drivers/clk/sunxi-ng/ccu_mux.c
>> > @@ -113,7 +113,7 @@ int ccu_mux_helper_determine_rate(struct ccu_common *common,
>> >  	}
>> >
>> >  	for (i = 0; i < clk_hw_get_num_parents(hw); i++) {
>> > -		unsigned long tmp_rate, parent_rate;
>> > +		unsigned long tmp_rate, parent_rate, best_diff = ULONG_MAX;
>> >  		struct clk_hw *parent;
>> >
>> >  		parent = clk_hw_get_parent_by_index(hw, i);
>> > @@ -139,10 +139,23 @@ int ccu_mux_helper_determine_rate(struct ccu_common *common,
>> >  			goto out;
>> >  		}
>> >
>> > -		if ((req->rate - tmp_rate) < (req->rate - best_rate)) {
>> > -			best_rate = tmp_rate;
>> > -			best_parent_rate = parent_rate;
>> > -			best_parent = parent;
>> > +		if (common->features & CCU_FEATURE_CLOSEST_RATE) {
>> > +			unsigned long tmp_diff = req->rate > tmp_rate ?
>> > +						 req->rate - tmp_rate :
>> > +						 tmp_rate - req->rate;
>> > +
>> > +			if (tmp_diff < best_diff) {
>> > +				best_rate = tmp_rate;
>> > +				best_parent_rate = parent_rate;
>> > +				best_parent = parent;
>> > +				best_diff = tmp_diff;
>> > +			}
>> > +		} else {
>> > +			if ((req->rate - tmp_rate) < (req->rate - best_rate)) {
>> > +				best_rate = tmp_rate;
>> > +				best_parent_rate = parent_rate;
>> > +				best_parent = parent;
>> > +			}
>> >  		}
>> >  	}
>> >
>> > diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c
>> > index d83843e69c25..36d9e987e4d8 100644
>> > --- a/drivers/clk/sunxi-ng/ccu_nkm.c
>> > +++ b/drivers/clk/sunxi-ng/ccu_nkm.c
>> > @@ -18,9 +18,11 @@ struct _ccu_nkm {
>> >  };
>> >
>> >  static unsigned long ccu_nkm_find_best_with_parent_adj(unsigned long *parent, unsigned long rate,
>> > -						       struct _ccu_nkm *nkm, struct clk_hw *phw)
>> > +						       struct _ccu_nkm *nkm, struct clk_hw *phw,
>> > +						       unsigned long features)
>> >  {
>> > -	unsigned long best_rate = 0, best_parent_rate = *parent, tmp_parent = *parent;
>> > +	unsigned long best_rate = 0, best_parent_rate = 0, tmp_parent = *parent;
>> > +	unsigned long best_diff = ULONG_MAX;
>> >  	unsigned long best_n = 0, best_k = 0, best_m = 0;
>> >  	unsigned long _n, _k, _m;
>> >
>> > @@ -28,16 +30,26 @@ static unsigned long ccu_nkm_find_best_with_parent_adj(unsigned long *parent, un
>> >  		for (_n = nkm->min_n; _n <= nkm->max_n; _n++) {
>> >  			for (_m = nkm->min_m; _m <= nkm->max_m; _m++) {
>> >  				unsigned long tmp_rate;
>> > +				unsigned long tmp_diff;
>> >
>> >  				tmp_parent = clk_hw_round_rate(phw, rate * _m / (_n * _k));
>> >
>> >  				tmp_rate = tmp_parent * _n * _k / _m;
>> > -				if (tmp_rate > rate)
>> > -					continue;
>> >
>> > -				if ((rate - tmp_rate) < (rate - best_rate)) {
>> > +				if (features & CCU_FEATURE_CLOSEST_RATE) {
>> > +					tmp_diff = rate > tmp_rate ?
>> > +						   rate - tmp_rate :
>> > +						   tmp_rate - rate;
>> > +				} else {
>> > +					if (tmp_rate > rate)
>> > +						continue;
>> > +					tmp_diff = rate - tmp_diff;
>>
>> Sorry, this should of course be tmp_diff = rate - tmp_rate. I'll fix
>> that in v4. Also I'll do tests on my phone where
>> CCU_FEATURE_CLOSEST_RATE is not set (i.e., without PATCH 8), so see if
>> it replicates the old behaviour. I'll also look into adding kunit tests,
>> so that this doesn't happen again. I'm not sure if this is feasible, but
>> I'll ask here for advise, if/when I encounter obstacles.
>
> While this would obviously be great, I don't think we have the
> infrastructure just yet to allow to easily add kunit tests for entire
> clocks.

I think, clk_test.c provides a good blueprint. I tried to do that for
clk-fractional-divider [1], but Stephen wanted to go a different route,
so I dropped it. You could look at clk_fd_test_init() in [1]. A similar
approach might work for the sunxi-ng clocks. I don't see any real
blockers, but maybe that's me being naive.

[1]: https://lore.kernel.org/all/20230614185521.477924-3-frank@oltmanns.dev/

Best regards,
  Frank

>
> Maxime
>
> [[End of PGP Signed Part]]

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2023-07-03  8:59 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-02 17:55 [PATCH v3 0/8] clk: sunxi-ng: Consider alternative parent rates when determining NKM clock rate Frank Oltmanns
2023-07-02 17:55 ` Frank Oltmanns
2023-07-02 17:55 ` [PATCH v3 1/8] clk: sunxi-ng: nkm: consider alternative parent rates when determining rate Frank Oltmanns
2023-07-02 17:55   ` Frank Oltmanns
2023-07-03  6:47   ` Maxime Ripard
2023-07-03  6:47     ` Maxime Ripard
2023-07-03  8:02     ` Frank Oltmanns
2023-07-03  8:02       ` Frank Oltmanns
2023-07-02 17:55 ` [PATCH v3 2/8] clk: sunxi-ng: a64: allow pll-mipi to set parent's rate Frank Oltmanns
2023-07-02 17:55   ` Frank Oltmanns
2023-07-03  6:47   ` Maxime Ripard
2023-07-03  6:47     ` Maxime Ripard
2023-07-02 17:55 ` [PATCH v3 3/8] clk: sunxi-ng: Add feature to find closest rate Frank Oltmanns
2023-07-02 17:55   ` Frank Oltmanns
2023-07-03  6:48   ` Maxime Ripard
2023-07-03  6:48     ` Maxime Ripard
2023-07-02 17:55 ` [PATCH v3 4/8] clk: sunxi-ng: nm: Support finding " Frank Oltmanns
2023-07-02 17:55   ` Frank Oltmanns
2023-07-03  7:24   ` Maxime Ripard
2023-07-03  7:24     ` Maxime Ripard
2023-07-03  8:46     ` Frank Oltmanns
2023-07-03  8:46       ` Frank Oltmanns
2023-07-02 17:55 ` [PATCH v3 5/8] clk: sunxi-ng: nkm: " Frank Oltmanns
2023-07-02 17:55   ` Frank Oltmanns
2023-07-02 20:06   ` kernel test robot
2023-07-02 20:06     ` kernel test robot
2023-07-03  7:17   ` Frank Oltmanns
2023-07-03  7:17     ` Frank Oltmanns
2023-07-03  7:25     ` Maxime Ripard
2023-07-03  7:25       ` Maxime Ripard
2023-07-03  8:59       ` Frank Oltmanns [this message]
2023-07-03  8:59         ` Frank Oltmanns
2023-07-03 11:36         ` Maxime Ripard
2023-07-03 11:36           ` Maxime Ripard
2023-07-03  7:33   ` Maxime Ripard
2023-07-03  7:33     ` Maxime Ripard
2023-07-02 17:55 ` [PATCH v3 6/8] clk: sunxi-ng: mux: " Frank Oltmanns
2023-07-02 17:55   ` Frank Oltmanns
2023-07-03  7:38   ` Maxime Ripard
2023-07-03  7:38     ` Maxime Ripard
2023-07-03  9:17     ` Frank Oltmanns
2023-07-03  9:17       ` Frank Oltmanns
2023-07-03 11:37       ` Maxime Ripard
2023-07-03 11:37         ` Maxime Ripard
2023-07-02 17:55 ` [PATCH v3 7/8] clk: sunxi-ng: div: " Frank Oltmanns
2023-07-02 17:55   ` Frank Oltmanns
2023-07-03  7:39   ` Maxime Ripard
2023-07-03  7:39     ` Maxime Ripard
2023-07-02 17:55 ` [PATCH v3 8/8] clk: sunxi-ng: a64: select closest rate for pll-video0 Frank Oltmanns
2023-07-02 17:55   ` Frank Oltmanns
2023-07-03  7:50   ` Maxime Ripard
2023-07-03  7:50     ` Maxime Ripard
2023-07-03  9:28     ` Frank Oltmanns
2023-07-03  9:28       ` Frank Oltmanns
2023-07-03  7:51 ` [PATCH v3 0/8] clk: sunxi-ng: Consider alternative parent rates when determining NKM clock rate Maxime Ripard
2023-07-03  7:51   ` Maxime Ripard
2023-07-03  9:36   ` Frank Oltmanns
2023-07-03  9:36     ` Frank Oltmanns
  -- strict thread matches above, loose matches on Subject: below --
2023-07-03 20:19 [PATCH v3 5/8] clk: sunxi-ng: nkm: Support finding closest rate kernel test robot

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=87jzvhs740.fsf@oltmanns.dev \
    --to=frank@oltmanns.dev \
    --cc=andre.przywara@arm.com \
    --cc=jernej.skrabec@gmail.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-sunxi@lists.linux.dev \
    --cc=maxime@cerno.tech \
    --cc=me@crly.cz \
    --cc=mturquette@baylibre.com \
    --cc=samuel@sholland.org \
    --cc=sboyd@kernel.org \
    --cc=wens@csie.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.