dm: regmap: Disable range checks in SPL
authorSimon Glass <sjg@chromium.org>
Sat, 15 Oct 2022 14:08:54 +0000 (08:08 -0600)
committerSimon Glass <sjg@chromium.org>
Tue, 18 Oct 2022 03:17:12 +0000 (21:17 -0600)
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@chromium.org>
Fixes: 947d4f132b4 ("regmap: fix range checks")

drivers/core/regmap.c

index 5ccbf9a..e33bb9d 100644 (file)
@@ -4,6 +4,8 @@
  * Written by Simon Glass <sjg@chromium.org>
  */
 
+#define LOG_CATEGORY   LOGC_DM
+
 #include <common.h>
 #include <dm.h>
 #include <errno.h>
@@ -37,6 +39,22 @@ 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.
  *
  * @count: Number of ranges to be allocated for the regmap.
@@ -391,7 +409,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 +417,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;
        }