* [PATCH v2 0/2] clk: fractional-divider: Improve approximation when zero based @ 2023-06-13 8:36 Frank Oltmanns 2023-06-13 8:36 ` [PATCH v2 1/2] " Frank Oltmanns 2023-06-13 8:36 ` [PATCH v2 2/2] clk: tests: Add tests for fractional divisor approximation Frank Oltmanns 0 siblings, 2 replies; 9+ messages in thread From: Frank Oltmanns @ 2023-06-13 8:36 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd Cc: Frank Oltmanns, A.s. Dong, Abel Vesa, Fabio Estevam, linux-arm-kernel, linux-clk, linux-kernel, NXP Linux Team, Peng Fan, Pengutronix Kernel Team, Sascha Hauer, Shawn Guo I stumpled upon this, when familiarizing myself with clk drivers. Unfortunately, I have no boards to test this patch. It seems the only user of this flag in mainline is drivers/clk/imx/clk-composite-7ulp.c, therefore I'm cc-ing get_maintainers.pl --git-blame -f drivers/clk/imx/clk-composite-7ulp.c in the hopes of a wider audience. V1: https://lore.kernel.org/lkml/20230529133433.56215-1-frank@oltmanns.dev/ Changes since V1: - Added test case as requested by Stephen Boyd - Fixed commit message as the Cc: was missing a closing bracket, so that the original mail unfortunately did not go out to A. s. Dong. Thank you for considering this contribution, Frank Frank Oltmanns (2): clk: fractional-divider: Improve approximation when zero based clk: tests: Add tests for fractional divisor approximation drivers/clk/clk-fractional-divider.c | 26 ++++++++--- drivers/clk/clk_test.c | 69 +++++++++++++++++++++++++++- 2 files changed, 87 insertions(+), 8 deletions(-) -- 2.41.0 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 1/2] clk: fractional-divider: Improve approximation when zero based 2023-06-13 8:36 [PATCH v2 0/2] clk: fractional-divider: Improve approximation when zero based Frank Oltmanns @ 2023-06-13 8:36 ` Frank Oltmanns 2023-06-13 8:36 ` [PATCH v2 2/2] clk: tests: Add tests for fractional divisor approximation Frank Oltmanns 1 sibling, 0 replies; 9+ messages in thread From: Frank Oltmanns @ 2023-06-13 8:36 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd Cc: Frank Oltmanns, A . s . Dong, Abel Vesa, Fabio Estevam, linux-arm-kernel, linux-clk, linux-kernel, NXP Linux Team, Peng Fan, Pengutronix Kernel Team, Sascha Hauer, Shawn Guo Consider the CLK_FRAC_DIVIDER_ZERO_BASED flag when finding the best approximation for m and n. By doing so, increase the range of valid values for the numerator and denominator by 1. Cc: A.s. Dong <aisheng.dong@nxp.com> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> --- drivers/clk/clk-fractional-divider.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/drivers/clk/clk-fractional-divider.c b/drivers/clk/clk-fractional-divider.c index 479297763e70..7da21cd2bdb1 100644 --- a/drivers/clk/clk-fractional-divider.c +++ b/drivers/clk/clk-fractional-divider.c @@ -123,6 +123,7 @@ void clk_fractional_divider_general_approximation(struct clk_hw *hw, unsigned long *m, unsigned long *n) { struct clk_fractional_divider *fd = to_clk_fd(hw); + unsigned long max_m, max_n; /* * Get rate closer to *parent_rate to guarantee there is no overflow @@ -138,9 +139,15 @@ void clk_fractional_divider_general_approximation(struct clk_hw *hw, rate <<= scale - fd->nwidth; } - rational_best_approximation(rate, *parent_rate, - GENMASK(fd->mwidth - 1, 0), GENMASK(fd->nwidth - 1, 0), - m, n); + if (fd->flags & CLK_FRAC_DIVIDER_ZERO_BASED) { + max_m = 1 << fd->mwidth; + max_n = 1 << fd->nwidth; + } else { + max_m = GENMASK(fd->mwidth - 1, 0); + max_n = GENMASK(fd->nwidth - 1, 0); + } + + rational_best_approximation(rate, *parent_rate, max_m, max_n, m, n); } static long clk_fd_round_rate(struct clk_hw *hw, unsigned long rate, @@ -169,13 +176,18 @@ static int clk_fd_set_rate(struct clk_hw *hw, unsigned long rate, { struct clk_fractional_divider *fd = to_clk_fd(hw); unsigned long flags = 0; - unsigned long m, n; + unsigned long m, n, max_m, max_n; u32 mmask, nmask; u32 val; - rational_best_approximation(rate, parent_rate, - GENMASK(fd->mwidth - 1, 0), GENMASK(fd->nwidth - 1, 0), - &m, &n); + if (fd->flags & CLK_FRAC_DIVIDER_ZERO_BASED) { + max_m = 1 << fd->mwidth; + max_n = 1 << fd->nwidth; + } else { + max_m = GENMASK(fd->mwidth - 1, 0); + max_n = GENMASK(fd->nwidth - 1, 0); + } + rational_best_approximation(rate, parent_rate, max_m, max_n, &m, &n); if (fd->flags & CLK_FRAC_DIVIDER_ZERO_BASED) { m--; -- 2.41.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 2/2] clk: tests: Add tests for fractional divisor approximation 2023-06-13 8:36 [PATCH v2 0/2] clk: fractional-divider: Improve approximation when zero based Frank Oltmanns 2023-06-13 8:36 ` [PATCH v2 1/2] " Frank Oltmanns @ 2023-06-13 8:36 ` Frank Oltmanns 2023-06-13 8:49 ` Frank Oltmanns ` (2 more replies) 1 sibling, 3 replies; 9+ messages in thread From: Frank Oltmanns @ 2023-06-13 8:36 UTC (permalink / raw) To: Michael Turquette, Stephen Boyd Cc: Frank Oltmanns, A.s. Dong, Abel Vesa, Fabio Estevam, linux-arm-kernel, linux-clk, linux-kernel, NXP Linux Team, Peng Fan, Pengutronix Kernel Team, Sascha Hauer, Shawn Guo In light of the recent discovery that the fractional divisor approximation does not utilize the full available range for clocks that are flagged CLK_FRAC_DIVIDER_ZERO_BASED, implement tests for the edge cases of this clock type. Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> Link: https://lore.kernel.org/lkml/20230529133433.56215-1-frank@oltmanns.dev --- drivers/clk/clk_test.c | 69 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/drivers/clk/clk_test.c b/drivers/clk/clk_test.c index f9a5c2964c65..b247ba841cbd 100644 --- a/drivers/clk/clk_test.c +++ b/drivers/clk/clk_test.c @@ -8,6 +8,9 @@ /* Needed for clk_hw_get_clk() */ #include "clk.h" +/* Needed for clk_fractional_divider_general_approximation */ +#include "clk-fractional-divider.h" + #include <kunit/test.h> #define DUMMY_CLOCK_INIT_RATE (42 * 1000 * 1000) @@ -2394,6 +2397,69 @@ static struct kunit_suite clk_mux_notifier_test_suite = { .test_cases = clk_mux_notifier_test_cases, }; + +/* + * Test that clk_fractional_divider_general_approximation will work with the + * highest available numerator and denominator. + */ +static void clk_fd_test_round_rate_max_mn(struct kunit *test) +{ + struct clk_fractional_divider *fd; + struct clk_hw *hw; + unsigned long rate, parent_rate, m, n; + + fd = kunit_kzalloc(test, sizeof(*fd), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, fd); + + fd->mwidth = 3; + fd->nwidth = 3; + + hw = &fd->hw; + + rate = DUMMY_CLOCK_RATE_1; + + // Highest denominator, no flags + parent_rate = 10 * DUMMY_CLOCK_RATE_1; + clk_fractional_divider_general_approximation(hw, rate, &parent_rate, &m, &n); + KUNIT_EXPECT_EQ(test, m, 1); + KUNIT_EXPECT_EQ(test, n, 7); + + // Highest numerator, no flags + parent_rate = DUMMY_CLOCK_RATE_1 / 10; + clk_fractional_divider_general_approximation(hw, rate, &parent_rate, &m, &n); + KUNIT_EXPECT_EQ(test, m, 7); + KUNIT_EXPECT_EQ(test, n, 1); + + // Highest denominator, zero based + parent_rate = 10 * DUMMY_CLOCK_RATE_1; + fd->flags = CLK_FRAC_DIVIDER_ZERO_BASED; + clk_fractional_divider_general_approximation(hw, rate, &parent_rate, &m, &n); + KUNIT_EXPECT_EQ(test, m, 1); + KUNIT_EXPECT_EQ(test, n, 8); + + // Highest numerator, zero based + parent_rate = DUMMY_CLOCK_RATE_1 / 10; + clk_fractional_divider_general_approximation(hw, rate, &parent_rate, &m, &n); + KUNIT_EXPECT_EQ(test, m, 8); + KUNIT_EXPECT_EQ(test, n, 1); +} + +static struct kunit_case clk_fd_test_cases[] = { + KUNIT_CASE(clk_fd_test_round_rate_max_mn), + {} +}; + +/* + * Test suite for a fractional divider clock. + * + * These tests exercise the fractional divider API: clk_recalc_rate, + * clk_set_rate(), clk_round_rate(). + */ +static struct kunit_suite clk_fd_test_suite = { + .name = "clk-fd-test", + .test_cases = clk_fd_test_cases, +}; + kunit_test_suites( &clk_leaf_mux_set_rate_parent_test_suite, &clk_test_suite, @@ -2406,6 +2472,7 @@ kunit_test_suites( &clk_range_maximize_test_suite, &clk_range_minimize_test_suite, &clk_single_parent_mux_test_suite, - &clk_uncached_test_suite + &clk_uncached_test_suite, + &clk_fd_test_suite ); MODULE_LICENSE("GPL v2"); -- 2.41.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 2/2] clk: tests: Add tests for fractional divisor approximation 2023-06-13 8:36 ` [PATCH v2 2/2] clk: tests: Add tests for fractional divisor approximation Frank Oltmanns @ 2023-06-13 8:49 ` Frank Oltmanns 2023-06-13 12:48 ` kernel test robot [not found] ` <83f9ee3ce26e4d4ba7c395aab316cae6.sboyd@kernel.org> 2 siblings, 0 replies; 9+ messages in thread From: Frank Oltmanns @ 2023-06-13 8:49 UTC (permalink / raw) To: Stephen Boyd Cc: Michael Turquette, A.s. Dong, Abel Vesa, Fabio Estevam, linux-arm-kernel, linux-clk, linux-kernel, NXP Linux Team, Peng Fan, Pengutronix Kernel Team, Sascha Hauer, Shawn Guo Hi Stephen, On 2023-06-13 at 10:36:26 +0200, Frank Oltmanns <frank@oltmanns.dev> wrote: > In light of the recent discovery that the fractional divisor > approximation does not utilize the full available range for clocks that > are flagged CLK_FRAC_DIVIDER_ZERO_BASED, implement tests for the edge > cases of this clock type. > > Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> > Link: https://lore.kernel.org/lkml/20230529133433.56215-1-frank@oltmanns.dev > --- > drivers/clk/clk_test.c | 69 +++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 68 insertions(+), 1 deletion(-) > > diff --git a/drivers/clk/clk_test.c b/drivers/clk/clk_test.c > index f9a5c2964c65..b247ba841cbd 100644 > --- a/drivers/clk/clk_test.c > +++ b/drivers/clk/clk_test.c > @@ -8,6 +8,9 @@ > /* Needed for clk_hw_get_clk() */ > #include "clk.h" > > +/* Needed for clk_fractional_divider_general_approximation */ > +#include "clk-fractional-divider.h" > + > #include <kunit/test.h> > > #define DUMMY_CLOCK_INIT_RATE (42 * 1000 * 1000) > @@ -2394,6 +2397,69 @@ static struct kunit_suite clk_mux_notifier_test_suite = { > .test_cases = clk_mux_notifier_test_cases, > }; > > + > +/* > + * Test that clk_fractional_divider_general_approximation will work with the > + * highest available numerator and denominator. > + */ > +static void clk_fd_test_round_rate_max_mn(struct kunit *test) > +{ > + struct clk_fractional_divider *fd; > + struct clk_hw *hw; > + unsigned long rate, parent_rate, m, n; > + > + fd = kunit_kzalloc(test, sizeof(*fd), GFP_KERNEL); > + KUNIT_ASSERT_NOT_NULL(test, fd); > + > + fd->mwidth = 3; > + fd->nwidth = 3; > + > + hw = &fd->hw; > + > + rate = DUMMY_CLOCK_RATE_1; > + > + // Highest denominator, no flags > + parent_rate = 10 * DUMMY_CLOCK_RATE_1; > + clk_fractional_divider_general_approximation(hw, rate, &parent_rate, &m, &n); > + KUNIT_EXPECT_EQ(test, m, 1); > + KUNIT_EXPECT_EQ(test, n, 7); > + > + // Highest numerator, no flags > + parent_rate = DUMMY_CLOCK_RATE_1 / 10; > + clk_fractional_divider_general_approximation(hw, rate, &parent_rate, &m, &n); > + KUNIT_EXPECT_EQ(test, m, 7); > + KUNIT_EXPECT_EQ(test, n, 1); The two calls above aim at proving that the change does not break existing functionality. > + > + // Highest denominator, zero based > + parent_rate = 10 * DUMMY_CLOCK_RATE_1; > + fd->flags = CLK_FRAC_DIVIDER_ZERO_BASED; > + clk_fractional_divider_general_approximation(hw, rate, &parent_rate, &m, &n); > + KUNIT_EXPECT_EQ(test, m, 1); > + KUNIT_EXPECT_EQ(test, n, 8); > + > + // Highest numerator, zero based > + parent_rate = DUMMY_CLOCK_RATE_1 / 10; > + clk_fractional_divider_general_approximation(hw, rate, &parent_rate, &m, &n); > + KUNIT_EXPECT_EQ(test, m, 8); > + KUNIT_EXPECT_EQ(test, n, 1); > +} > + > +static struct kunit_case clk_fd_test_cases[] = { > + KUNIT_CASE(clk_fd_test_round_rate_max_mn), > + {} > +}; > + > +/* > + * Test suite for a fractional divider clock. > + * > + * These tests exercise the fractional divider API: clk_recalc_rate, > + * clk_set_rate(), clk_round_rate(). > + */ > +static struct kunit_suite clk_fd_test_suite = { > + .name = "clk-fd-test", > + .test_cases = clk_fd_test_cases, > +}; Unfortunately, the style of the tests does not really match with the style of the existing tests, because those where all aimed at the framework itself and not at specific functions. Please let me know, if you require any changes. Thanks, Frank > + > kunit_test_suites( > &clk_leaf_mux_set_rate_parent_test_suite, > &clk_test_suite, > @@ -2406,6 +2472,7 @@ kunit_test_suites( > &clk_range_maximize_test_suite, > &clk_range_minimize_test_suite, > &clk_single_parent_mux_test_suite, > - &clk_uncached_test_suite > + &clk_uncached_test_suite, > + &clk_fd_test_suite > ); > MODULE_LICENSE("GPL v2"); ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 2/2] clk: tests: Add tests for fractional divisor approximation 2023-06-13 8:36 ` [PATCH v2 2/2] clk: tests: Add tests for fractional divisor approximation Frank Oltmanns 2023-06-13 8:49 ` Frank Oltmanns @ 2023-06-13 12:48 ` kernel test robot 2023-06-14 8:19 ` Frank Oltmanns [not found] ` <83f9ee3ce26e4d4ba7c395aab316cae6.sboyd@kernel.org> 2 siblings, 1 reply; 9+ messages in thread From: kernel test robot @ 2023-06-13 12:48 UTC (permalink / raw) To: Frank Oltmanns, Michael Turquette, Stephen Boyd Cc: oe-kbuild-all, Frank Oltmanns, A.s. Dong, Abel Vesa, Fabio Estevam, linux-arm-kernel, linux-clk, linux-kernel, NXP Linux Team, Peng Fan, Pengutronix Kernel Team, Sascha Hauer, Shawn Guo Hi Frank, kernel test robot noticed the following build errors: [auto build test ERROR on v6.4-rc6] [also build test ERROR on linus/master] [cannot apply to clk/clk-next next-20230613] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Frank-Oltmanns/clk-fractional-divider-Improve-approximation-when-zero-based/20230613-163903 base: v6.4-rc6 patch link: https://lore.kernel.org/r/20230613083626.227476-3-frank%40oltmanns.dev patch subject: [PATCH v2 2/2] clk: tests: Add tests for fractional divisor approximation config: csky-randconfig-r011-20230612 (https://download.01.org/0day-ci/archive/20230613/202306132038.nUB6hmCv-lkp@intel.com/config) compiler: csky-linux-gcc (GCC) 12.3.0 reproduce (this is a W=1 build): mkdir -p ~/bin wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross git checkout v6.4-rc6 b4 shazam https://lore.kernel.org/r/20230613083626.227476-3-frank@oltmanns.dev # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.3.0 ~/bin/make.cross W=1 O=build_dir ARCH=csky olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.3.0 ~/bin/make.cross W=1 O=build_dir ARCH=csky SHELL=/bin/bash If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202306132038.nUB6hmCv-lkp@intel.com/ All errors (new ones prefixed by >>, old ones prefixed by <<): >> ERROR: modpost: "clk_fractional_divider_general_approximation" [drivers/clk/clk_test.ko] undefined! -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 2/2] clk: tests: Add tests for fractional divisor approximation 2023-06-13 12:48 ` kernel test robot @ 2023-06-14 8:19 ` Frank Oltmanns [not found] ` <aa23f41c0e313e97122ac384d66e2325.sboyd@kernel.org> 0 siblings, 1 reply; 9+ messages in thread From: Frank Oltmanns @ 2023-06-14 8:19 UTC (permalink / raw) To: kernel test robot, Michael Turquette, Stephen Boyd Cc: oe-kbuild-all, A.s. Dong, Abel Vesa, Fabio Estevam, linux-arm-kernel, linux-clk, linux-kernel, NXP Linux Team, Peng Fan, Pengutronix Kernel Team, Sascha Hauer, Shawn Guo Hi, On 2023-06-13 at 20:48:21 +0800, kernel test robot <lkp@intel.com> wrote: > Hi Frank, > > kernel test robot noticed the following build errors: > > [auto build test ERROR on v6.4-rc6] > [also build test ERROR on linus/master] > [cannot apply to clk/clk-next next-20230613] > [If your patch is applied to the wrong git tree, kindly drop us a note. > And when submitting patch, we suggest to use '--base' as documented in > https://git-scm.com/docs/git-format-patch#_base_tree_information] > > url: https://github.com/intel-lab-lkp/linux/commits/Frank-Oltmanns/clk-fractional-divider-Improve-approximation-when-zero-based/20230613-163903 > base: v6.4-rc6 > patch link: https://lore.kernel.org/r/20230613083626.227476-3-frank%40oltmanns.dev > patch subject: [PATCH v2 2/2] clk: tests: Add tests for fractional divisor approximation > config: csky-randconfig-r011-20230612 (https://download.01.org/0day-ci/archive/20230613/202306132038.nUB6hmCv-lkp@intel.com/config) > compiler: csky-linux-gcc (GCC) 12.3.0 > reproduce (this is a W=1 build): > mkdir -p ~/bin > wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross > chmod +x ~/bin/make.cross > git checkout v6.4-rc6 > b4 shazam https://lore.kernel.org/r/20230613083626.227476-3-frank@oltmanns.dev > # save the config file > mkdir build_dir && cp config build_dir/.config > COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.3.0 ~/bin/make.cross W=1 O=build_dir ARCH=csky olddefconfig > COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.3.0 ~/bin/make.cross W=1 O=build_dir ARCH=csky SHELL=/bin/bash > > If you fix the issue in a separate patch/commit (i.e. not just a new version of > the same patch/commit), kindly add following tags > | Reported-by: kernel test robot <lkp@intel.com> > | Closes: https://lore.kernel.org/oe-kbuild-all/202306132038.nUB6hmCv-lkp@intel.com/ > > All errors (new ones prefixed by >>, old ones prefixed by <<): > >>> ERROR: modpost: "clk_fractional_divider_general_approximation" [drivers/clk/clk_test.ko] undefined! The issue seems to be that clk_fractional_divider_general_approximation is not exported as a symbol, while the config builds the clk_test as a module: CONFIG_CLK_KUNIT_TEST=m If I'm not mistaken, this means that I can't test clk_fractional_divider_general_approximation directly. Instead I'd have to test it using clk_fractional_divider_ops.round_rate. Can someone more knowlegdable than me please confirm if my understanding is correct? Thanks, Frank ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <aa23f41c0e313e97122ac384d66e2325.sboyd@kernel.org>]
* Re: [PATCH v2 2/2] clk: tests: Add tests for fractional divisor approximation [not found] ` <aa23f41c0e313e97122ac384d66e2325.sboyd@kernel.org> @ 2023-06-15 5:16 ` Frank Oltmanns [not found] ` <dab61757f0c33453ad19857350117c62.sboyd@kernel.org> 0 siblings, 1 reply; 9+ messages in thread From: Frank Oltmanns @ 2023-06-15 5:16 UTC (permalink / raw) To: Stephen Boyd Cc: Michael Turquette, kernel test robot, oe-kbuild-all, A.s. Dong, Abel Vesa, Fabio Estevam, linux-arm-kernel, linux-clk, linux-kernel, NXP Linux Team, Peng Fan, Pengutronix Kernel Team, Sascha Hauer, Shawn Guo Hi Stephen, On 2023-06-14 at 13:02:24 -0700, Stephen Boyd <sboyd@kernel.org> wrote: > Quoting Frank Oltmanns (2023-06-14 01:19:37) >> Hi, >> >> On 2023-06-13 at 20:48:21 +0800, kernel test robot <lkp@intel.com> wrote: >> > Hi Frank, >> > >> > kernel test robot noticed the following build errors: >> > >> > [auto build test ERROR on v6.4-rc6] >> > [also build test ERROR on linus/master] >> > [cannot apply to clk/clk-next next-20230613] >> > [If your patch is applied to the wrong git tree, kindly drop us a note. >> > And when submitting patch, we suggest to use '--base' as documented in >> > https://git-scm.com/docs/git-format-patch#_base_tree_information] >> > >> > url: https://github.com/intel-lab-lkp/linux/commits/Frank-Oltmanns/clk-fractional-divider-Improve-approximation-when-zero-based/20230613-163903 >> > base: v6.4-rc6 >> > patch link: https://lore.kernel.org/r/20230613083626.227476-3-frank%40oltmanns.dev >> > patch subject: [PATCH v2 2/2] clk: tests: Add tests for fractional divisor approximation >> > config: csky-randconfig-r011-20230612 (https://download.01.org/0day-ci/archive/20230613/202306132038.nUB6hmCv-lkp@intel.com/config) >> > compiler: csky-linux-gcc (GCC) 12.3.0 >> > reproduce (this is a W=1 build): >> > mkdir -p ~/bin >> > wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross >> > chmod +x ~/bin/make.cross >> > git checkout v6.4-rc6 >> > b4 shazam https://lore.kernel.org/r/20230613083626.227476-3-frank@oltmanns.dev >> > # save the config file >> > mkdir build_dir && cp config build_dir/.config >> > COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.3.0 ~/bin/make.cross W=1 O=build_dir ARCH=csky olddefconfig >> > COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.3.0 ~/bin/make.cross W=1 O=build_dir ARCH=csky SHELL=/bin/bash >> > >> > If you fix the issue in a separate patch/commit (i.e. not just a new version of >> > the same patch/commit), kindly add following tags >> > | Reported-by: kernel test robot <lkp@intel.com> >> > | Closes: https://lore.kernel.org/oe-kbuild-all/202306132038.nUB6hmCv-lkp@intel.com/ >> > >> > All errors (new ones prefixed by >>, old ones prefixed by <<): >> > >> >>> ERROR: modpost: "clk_fractional_divider_general_approximation" [drivers/clk/clk_test.ko] undefined! >> >> The issue seems to be that clk_fractional_divider_general_approximation >> is not exported as a symbol, while the config builds the clk_test as a >> module: >> CONFIG_CLK_KUNIT_TEST=m >> >> If I'm not mistaken, this means that I can't test >> clk_fractional_divider_general_approximation directly. Instead I'd have >> to test it using clk_fractional_divider_ops.round_rate. >> >> Can someone more knowlegdable than me please confirm if my understanding >> is correct? > > Export the symbol. Ok. I can do that. Please note that I had already submitted a V3 [1], that went the way of using clk_fractional_divider_ops.round_rate. I apologize for not waiting for your feedback prior to submission. It won't happen again. I liked the approach of calling clk_fd_round_rate directly via the ops, because it might allow me to test the other ops as well using the same blueprint. Of course, I will not add test cases, if you don't want it. (Calling clk_fd_round_rate also had the side effect of teaching me, that fd clocks expect the fraction to be less than or equal to 1.) I don't want to waste your time, but if you could maybe have a chance to look at the approach I took in V3 and tell me if you still want me to export the symbol instead, that would be really helpful. I'll follow your preference. If I don't hear back until the weekend, I will treat your three words above as your preference and prepare a V4 that goes back to calling clk_fractional_divider_general_approximation directly. Thank you, Frank [1]: https://lore.kernel.org/all/20230614185521.477924-3-frank@oltmanns.dev/ ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <dab61757f0c33453ad19857350117c62.sboyd@kernel.org>]
* Re: [PATCH v2 2/2] clk: tests: Add tests for fractional divisor approximation [not found] ` <dab61757f0c33453ad19857350117c62.sboyd@kernel.org> @ 2023-06-17 16:47 ` Frank Oltmanns 0 siblings, 0 replies; 9+ messages in thread From: Frank Oltmanns @ 2023-06-17 16:47 UTC (permalink / raw) To: Stephen Boyd Cc: Michael Turquette, kernel test robot, oe-kbuild-all, A.s. Dong, Abel Vesa, Fabio Estevam, linux-arm-kernel, linux-clk, linux-kernel, NXP Linux Team, Peng Fan, Pengutronix Kernel Team, Sascha Hauer, Shawn Guo Hi Stephen, On 2023-06-16 at 12:33:51 -0700, Stephen Boyd <sboyd@kernel.org> wrote: > Quoting Frank Oltmanns (2023-06-14 22:16:17) >> Hi Stephen, >> >> On 2023-06-14 at 13:02:24 -0700, Stephen Boyd <sboyd@kernel.org> wrote: >> > Quoting Frank Oltmanns (2023-06-14 01:19:37) >> >> Hi, >> >> >> >> On 2023-06-13 at 20:48:21 +0800, kernel test robot <lkp@intel.com> wrote: >> >> Can someone more knowlegdable than me please confirm if my understanding >> >> is correct? >> > >> > Export the symbol. >> >> Ok. I can do that. Please note that I had already submitted a V3 [1], >> that went the way of using clk_fractional_divider_ops.round_rate. I >> apologize for not waiting for your feedback prior to submission. It >> won't happen again. >> >> I liked the approach of calling clk_fd_round_rate directly via the ops, >> because it might allow me to test the other ops as well using the same >> blueprint. Of course, I will not add test cases, if you don't want it. >> (Calling clk_fd_round_rate also had the side effect of teaching me, that >> fd clocks expect the fraction to be less than or equal to 1.) >> >> I don't want to waste your time, but if you could maybe have a chance to >> look at the approach I took in V3 and tell me if you still want me to >> export the symbol instead, that would be really helpful. I'll follow >> your preference. >> >> If I don't hear back until the weekend, I will treat your three words >> above as your preference and prepare a V4 that goes back to calling >> clk_fractional_divider_general_approximation directly. >> > > Just call the API directly. That narrows the test to exactly what we > want to test. If you export the API it will make the rockchip folks > happy too[1]. We of course need to make sure that the registration API > works as well and actually uses the widths that are passed in, but it > doesn't need to fully exercise the approximation algorithm. > > [1] https://lore.kernel.org/r/20230601095512.18029-1-zhangqing@rock-chips.com I've now submitted V5 [1] of this patchset. Unfortunately, V4 [2] had a compiler warning on clang that slipped through the cracks. I'm sorry for the noise. In my opinion V5 is ready for review and hopefully addresses all your previous concerns. Thank you for your patience. Best regards, Frank [1] https://lore.kernel.org/all/20230617131041.18313-1-frank@oltmanns.dev/ [2] https://lore.kernel.org/all/20230617102919.27564-1-frank@oltmanns.dev/ ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <83f9ee3ce26e4d4ba7c395aab316cae6.sboyd@kernel.org>]
* Re: [PATCH v2 2/2] clk: tests: Add tests for fractional divisor approximation [not found] ` <83f9ee3ce26e4d4ba7c395aab316cae6.sboyd@kernel.org> @ 2023-06-14 6:51 ` Frank Oltmanns 0 siblings, 0 replies; 9+ messages in thread From: Frank Oltmanns @ 2023-06-14 6:51 UTC (permalink / raw) To: Stephen Boyd Cc: Michael Turquette, A.s. Dong, Abel Vesa, Fabio Estevam, linux-arm-kernel, linux-clk, linux-kernel, NXP Linux Team, Peng Fan, Pengutronix Kernel Team, Sascha Hauer, Shawn Guo Hi Stephen, Thank you for your feedback. On 2023-06-13 at 12:42:05 -0700, Stephen Boyd <sboyd@kernel.org> wrote: > Quoting Frank Oltmanns (2023-06-13 01:36:26) >> In light of the recent discovery that the fractional divisor >> approximation does not utilize the full available range for clocks that >> are flagged CLK_FRAC_DIVIDER_ZERO_BASED, implement tests for the edge >> cases of this clock type. >> >> Signed-off-by: Frank Oltmanns <frank@oltmanns.dev> >> Link: https://lore.kernel.org/lkml/20230529133433.56215-1-frank@oltmanns.dev > > What is the link for? The intention was to show why the tests were added ("In light of the recent discovery..."). I announced this discovery in the mail I referred to. Since that intention didn't come across: Should I drop the link? > >> --- >> drivers/clk/clk_test.c | 69 +++++++++++++++++++++++++++++++++++++++++- > > Please make a new file, drivers/clk/clk-fractional-divider_test.c > instead. > >> 1 file changed, 68 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/clk/clk_test.c b/drivers/clk/clk_test.c >> index f9a5c2964c65..b247ba841cbd 100644 >> --- a/drivers/clk/clk_test.c >> +++ b/drivers/clk/clk_test.c >> @@ -8,6 +8,9 @@ >> /* Needed for clk_hw_get_clk() */ >> #include "clk.h" >> >> +/* Needed for clk_fractional_divider_general_approximation */ >> +#include "clk-fractional-divider.h" >> + >> #include <kunit/test.h> >> >> #define DUMMY_CLOCK_INIT_RATE (42 * 1000 * 1000) >> @@ -2394,6 +2397,69 @@ static struct kunit_suite clk_mux_notifier_test_suite = { >> .test_cases = clk_mux_notifier_test_cases, >> }; >> >> + >> +/* >> + * Test that clk_fractional_divider_general_approximation will work with the >> + * highest available numerator and denominator. >> + */ >> +static void clk_fd_test_round_rate_max_mn(struct kunit *test) >> +{ >> + struct clk_fractional_divider *fd; >> + struct clk_hw *hw; >> + unsigned long rate, parent_rate, m, n; >> + >> + fd = kunit_kzalloc(test, sizeof(*fd), GFP_KERNEL); >> + KUNIT_ASSERT_NOT_NULL(test, fd); >> + >> + fd->mwidth = 3; >> + fd->nwidth = 3; >> + >> + hw = &fd->hw; >> + >> + rate = DUMMY_CLOCK_RATE_1; >> + >> + // Highest denominator, no flags > > Use /* this for comments */ > >> + parent_rate = 10 * DUMMY_CLOCK_RATE_1; > > Just write out the actual frequency. Don't use DUMMY_CLOCK_RATE_1 at all > in the test. Sure, will do. The idea was to highlight that we want to have the parent running at 10 times the speed, while the divider has a maximum value of 7 (or 8 if zero based). > >> + clk_fractional_divider_general_approximation(hw, rate, &parent_rate, &m, &n); >> + KUNIT_EXPECT_EQ(test, m, 1); >> + KUNIT_EXPECT_EQ(test, n, 7); > > This is a different test case. > >> + >> + // Highest numerator, no flags >> + parent_rate = DUMMY_CLOCK_RATE_1 / 10; >> + clk_fractional_divider_general_approximation(hw, rate, &parent_rate, &m, &n); >> + KUNIT_EXPECT_EQ(test, m, 7); > > Is 7 related to mwidth? Maybe this should be clk_div_mask(fd->mwidth) > instead of 7. Yes, 7 is related to mwidth. I thought about this too, but I'm not sure that's the best move here. The function under test uses: max_m = GENMASK(fd->mwidth - 1, 0); max_n = GENMASK(fd->nwidth - 1, 0); I come from a safety-concerned industry and as a general rule we avoid using functions from the code under test in our tests. I'm doing this here as a hobby, but still I find it to be a good rule that I'd like to stick to unless asked otherwise. If I use the same code to generate the expected values, I'm not really testing my change, but only the underlying best_rational_approximation. Instead, how about I add a comment to the test function that more thoroughly explains its intention? Something along those lines: /* * Introduce a parent that runs at 10 times the frequency of the * requested rate. * m and n are 3 bits wide each. * The clock has no flags set, hence the maximum value that fits in * m and n is 7. * Therefore, expect the highest possible divisor. */ static void clk_fd_test_round_rate_max_m(struct kunit *test) /* * Introduce a parent that runs at 1/10th the frequency of the * requested rate. * m and n are 3 bits wide each. * The clock has no flags set, hence the maximum value that fits in * m and n is 7. * Therefore, expect the highest possible multiplier. */ static void clk_fd_test_round_rate_max_n(struct kunit *test) /* * Introduce a parent that runs at 10 times the frequency of the * requested rate. * m and n are 3 bits wide each. * The clock is zero based, hence the maximum value that fits in * m and n is 8. * Therefore, expect the highest possible divisor. */ static void clk_fd_test_round_rate_max_m_zero_based(struct kunit *test) /* * Introduce a parent that runs at 1/10th the frequency of the * requested rate. * m and n are 3 bits wide each. * The clock is zero based, hence the maximum value that fits in * m and n is 8. * Therefore, expect the highest possible multiplier. */ static void clk_fd_test_round_rate_max_n_zero_based(struct kunit *test) Please note that from your original comment, I wasn't sure, if you wanted a one time test or someting that could become part of the clk-frameworks test suite. Therefore, I sent this test case to test the waters and ask for your comments. It's clear to me now that you want it to be permanent, so I'll spend some time on it to make it ready for inclusion. :) Is there anything else you'd like me to cover in the tests for the fix? Thanks, Frank > >> + KUNIT_EXPECT_EQ(test, n, 1); > > This is a different test case. > >> + >> + // Highest denominator, zero based >> + parent_rate = 10 * DUMMY_CLOCK_RATE_1; >> + fd->flags = CLK_FRAC_DIVIDER_ZERO_BASED; >> + clk_fractional_divider_general_approximation(hw, rate, &parent_rate, &m, &n); >> + KUNIT_EXPECT_EQ(test, m, 1); >> + KUNIT_EXPECT_EQ(test, n, 8); > > This is a different test case. > >> + >> + // Highest numerator, zero based >> + parent_rate = DUMMY_CLOCK_RATE_1 / 10; >> + clk_fractional_divider_general_approximation(hw, rate, &parent_rate, &m, &n); >> + KUNIT_EXPECT_EQ(test, m, 8); >> + KUNIT_EXPECT_EQ(test, n, 1); > > This is a different test case. If it has a meaningful name it will be > easier to understand as well. ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2023-06-17 16:48 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2023-06-13 8:36 [PATCH v2 0/2] clk: fractional-divider: Improve approximation when zero based Frank Oltmanns 2023-06-13 8:36 ` [PATCH v2 1/2] " Frank Oltmanns 2023-06-13 8:36 ` [PATCH v2 2/2] clk: tests: Add tests for fractional divisor approximation Frank Oltmanns 2023-06-13 8:49 ` Frank Oltmanns 2023-06-13 12:48 ` kernel test robot 2023-06-14 8:19 ` Frank Oltmanns [not found] ` <aa23f41c0e313e97122ac384d66e2325.sboyd@kernel.org> 2023-06-15 5:16 ` Frank Oltmanns [not found] ` <dab61757f0c33453ad19857350117c62.sboyd@kernel.org> 2023-06-17 16:47 ` Frank Oltmanns [not found] ` <83f9ee3ce26e4d4ba7c395aab316cae6.sboyd@kernel.org> 2023-06-14 6:51 ` Frank Oltmanns
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).