[PATCH] dm: regmap: Disable range checks in SPL
Simon Glass
sjg at chromium.org
Tue Oct 18 13:29:33 CEST 2022
On Sat, 15 Oct 2022 at 12:40, Simon Glass <sjg at chromium.org> wrote:
>
> 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.
Applied to u-boot-dm.
More information about the U-Boot
mailing list