[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