[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <a0e31542-e77b-4efa-959d-f7f5a8719616@kernel.org>
Date: Tue, 9 Jul 2024 07:59:40 +0200
From: Jiri Slaby <jirislaby@...nel.org>
To: Devarsh Thakkar <devarsht@...com>, mchehab@...nel.org,
hverkuil-cisco@...all.nl, linux-media@...r.kernel.org,
linux-kernel@...r.kernel.org, sebastian.fricke@...labora.com,
andriy.shevchenko@...ux.intel.com, jani.nikula@...el.com, corbet@....net,
broonie@...nel.org, rdunlap@...radead.org, linux-doc@...r.kernel.org
Cc: laurent.pinchart@...asonboard.com, praneeth@...com, nm@...com,
vigneshr@...com, a-bhatia1@...com, j-luthra@...com, b-brnich@...com,
detheridge@...com, p-mantena@...com, vijayp@...com,
andi.shyti@...ux.intel.com, nicolas@...fresne.ca, davidgow@...gle.com,
dlatypov@...gle.com
Subject: Re: [PATCH 1/6] math.h: Add macros for rounding to closest value
On 08. 07. 24, 17:59, Devarsh Thakkar wrote:
> Add below rounding related macros:
>
> round_closest_up(x, y) : Rounds x to closest multiple of y where y is a
> power of 2, with a preference to round up in case two nearest values are
> possible.
>
> round_closest_down(x, y) : Rounds x to closest multiple of y where y is a
> power of 2, with a preference to round down in case two nearest values are
> possible.
>
> roundclosest(x, y) : Rounds x to closest multiple of y, this macro should
> generally be used only when y is not multiple of 2 as otherwise
> round_closest* macros should be used which are much faster.
>
> Examples:
> * round_closest_up(17, 4) = 16
> * round_closest_up(15, 4) = 16
> * round_closest_up(14, 4) = 16
> * round_closest_down(17, 4) = 16
> * round_closest_down(15, 4) = 16
> * round_closest_down(14, 4) = 12
> * roundclosest(21, 5) = 20
With consistency in mind, why is there no underscore?
> * roundclosest(19, 5) = 20
> * roundclosest(17, 5) = 15
>
> Signed-off-by: Devarsh Thakkar <devarsht@...com>
> Acked-by: Andy Shevchenko <andriy.shevchenko@...ux.intel.com>
> ---
> NOTE: This patch is inspired from the Mentor Graphics IPU driver [1]
> which uses similar macro locally and which is updated in further patch
> in the series to use this generic macro instead along with other drivers
> having similar requirements.
>
> Link: https://elixir.bootlin.com/linux/v6.8.9/source/drivers/gpu/ipu-v3/ipu-image-convert.c#L480 [1]
> ---
> include/linux/math.h | 63 ++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 63 insertions(+)
>
> diff --git a/include/linux/math.h b/include/linux/math.h
> index dd4152711de7..79e3dfda77fc 100644
> --- a/include/linux/math.h
> +++ b/include/linux/math.h
> @@ -34,6 +34,52 @@
> */
> #define round_down(x, y) ((x) & ~__round_mask(x, y))
>
> +/**
> + * round_closest_up - round closest to be multiple of specified value (which is
> + * power of 2) with preference to rounding up
> + * @x: the value to round
> + * @y: multiple to round closest to (must be a power of 2)
> + *
> + * Rounds @x to closest multiple of @y (which must be a power of 2).
> + * The value can be either rounded up or rounded down depending upon rounded
> + * value's closeness to the specified value. If there are two closest possible
> + * values, i.e. the difference between the specified value and it's rounded up
> + * and rounded down values is same then preference is given to rounded up
> + * value.
> + *
> + * To perform arbitrary rounding to closest value (not multiple of 2), use
> + * roundclosest().
> + *
> + * Examples:
> + * * round_closest_up(17, 4) = 16
> + * * round_closest_up(15, 4) = 16
> + * * round_closest_up(14, 4) = 16
> + */
> +#define round_closest_up(x, y) round_down((x) + (y) / 2, (y))
> +
> +/**
> + * round_closest_down - round closest to be multiple of specified value (which
> + * is power of 2) with preference to rounding down
> + * @x: the value to round
> + * @y: multiple to round closest to (must be a power of 2)
> + *
> + * Rounds @x to closest multiple of @y (which must be a power of 2).
> + * The value can be either rounded up or rounded down depending upon rounded
> + * value's closeness to the specified value. If there are two closest possible
> + * values, i.e. the difference between the specified value and it's rounded up
> + * and rounded down values is same then preference is given to rounded up
> + * value.
Too heavy sentence. Did you mean "its" not "it's"?
What about:
There can be two closest values. I.e. the difference between the
specified value and its rounded up and down values is the same. In that
case, the rounded up value is preferred.
?
The same for round_closest_up().
> + *
> + * To perform arbitrary rounding to closest value (not multiple of 2), use
> + * roundclosest().
> + *
> + * Examples:
> + * * round_closest_down(17, 4) = 16
> + * * round_closest_down(15, 4) = 16
> + * * round_closest_down(14, 4) = 12
> + */
> +#define round_closest_down(x, y) round_up((x) - (y) / 2, (y))
> +
> #define DIV_ROUND_UP __KERNEL_DIV_ROUND_UP
>
> #define DIV_ROUND_DOWN_ULL(ll, d) \
> @@ -77,6 +123,23 @@
> } \
> )
>
> +/**
> + * roundclosest - round to nearest multiple
> + * @x: the value to round
> + * @y: multiple to round nearest to
> + *
> + * Rounds @x to nearest multiple of @y.
> + * The rounded value can be greater than or less than @x depending
greater or less than
> + * upon it's nearness to @x.
"its"
> If @y will always be a power of 2, consider
If @y is always a power...
> + * using the faster round_closest_up() or round_closest_down().
> + *
> + * Examples:
> + * * roundclosest(21, 5) = 20
> + * * roundclosest(19, 5) = 20
> + * * roundclosest(17, 5) = 15
> + */
> +#define roundclosest(x, y) rounddown((x) + (y) / 2, (y))
> +
> /*
> * Divide positive or negative dividend by positive or negative divisor
> * and round to closest integer. Result is undefined for negative
--
js
Powered by blists - more mailing lists