[PATCH] dm: regmap: Disable range checks in SPL

Simon Glass sjg at chromium.org
Sat Oct 15 20:40:08 CEST 2022


Hi,

On Sat, 15 Oct 2022 at 08:39, Simon Glass <sjg at chromium.org> wrote:
>
> A recent change to regmap breaks building of phycore-rk3288 for me. The
> difference is only a few bytes. Somehow CI seems to pass, even though it
> fails when I run docker locally. But it prevents me from sending any more
> pull requests.
>
> In any case this board is clearly near the limit. We could revert the
> offending change, but it is needed for sandbox tests.
>
> Instead, add a way to drop the range checks in SPL, since they end up
> doing nothing if everything is working as expected.
>
> This makes phycore-rk3288 build again for me and reduces the size of SPL
> slightly for a number of boards.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> Fixes: 947d4f132b4 ("regmap: fix range checks")
> ---
>
>  drivers/core/regmap.c | 22 ++++++++++++++++++++--
>  1 file changed, 20 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/core/regmap.c b/drivers/core/regmap.c
> index 5ccbf9abb8a..ab02ddba443 100644
> --- a/drivers/core/regmap.c
> +++ b/drivers/core/regmap.c
> @@ -4,6 +4,8 @@
>   * Written by Simon Glass <sjg at chromium.org>
>   */
>
> +#define LOG_CATEGORY   LOGC_DM
> +
>  #include <common.h>
>  #include <dm.h>
>  #include <errno.h>
> @@ -36,6 +38,21 @@ struct regmap_field {
>
>  DECLARE_GLOBAL_DATA_PTR;
>
> +/**
> + * do_range_check() - Control whether range checks are done
> + *
> + * Returns: true to do range checks, false to skip
> + *
> + * This is used to reduce code size on SPL where range checks are known not to
> + * be needed
> + *
> + * Add this to the top of the file to enable them: #define LOG_DEBUG
> + */
> +static inline bool do_range_check(void)
> +{
> +       return _LOG_DEBUG || !IS_ENABLED(CONFIG_SPL);
> +}
> +
>  /**
>   * regmap_alloc() - Allocate a regmap with a given number of ranges.
>   *
> @@ -391,7 +408,7 @@ int regmap_raw_read_range(struct regmap *map, uint range_num, uint offset,
>         struct regmap_range *range;
>         void *ptr;
>
> -       if (range_num >= map->range_count) {
> +       if (do_range_check() && range_num >= map->range_count) {
>                 debug("%s: range index %d larger than range count\n",
>                       __func__, range_num);
>                 return -ERANGE;
> @@ -399,7 +416,8 @@ int regmap_raw_read_range(struct regmap *map, uint range_num, uint offset,
>         range = &map->ranges[range_num];
>
>         offset <<= map->reg_offset_shift;
> -       if (offset + val_len > range->size || offset + val_len < offset) {
> +       if (do_range_check() &&
> +           (offset + val_len > range->size || offset + val_len < offset)) {
>                 debug("%s: offset/size combination invalid\n", __func__);
>                 return -ERANGE;
>         }
> --
> 2.38.0.413.g74048e4d9e-goog
>

If no objections, I'll pull this in right away (e.g. Monday) as I am
blocked from doing a pull request due to phycore-rk3288.

Regards,
Simon


More information about the U-Boot mailing list