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

Simon Glass sjg at chromium.org
Sat Oct 15 16:39:19 CEST 2022


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



More information about the U-Boot mailing list