[PATCH v2 1/1] lmb: Treat a region which is a subset as equal

Sjoerd Simons sjoerd at collabora.com
Sun Feb 12 16:07:05 CET 2023


In various cases logical memory blocks are coalesced; As a result doing
a strict check whether memory blocks are the same doesn't necessarily
work as a previous addition of a given block might have been merged into
a bigger block.

Fix this by considering a block is already registered if it's a pure
subset of one of the existing blocks.

Signed-off-by: Sjoerd Simons <sjoerd at collabora.com>

---

Changes in v2:
- Adjust calculation to prevent integer overview (fixes lmb tests)

 lib/lmb.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/lib/lmb.c b/lib/lmb.c
index f447c639a60..2444b2a6212 100644
--- a/lib/lmb.c
+++ b/lib/lmb.c
@@ -247,8 +247,10 @@ static long lmb_add_region_flags(struct lmb_region *rgn, phys_addr_t base,
 		phys_addr_t rgnbase = rgn->region[i].base;
 		phys_size_t rgnsize = rgn->region[i].size;
 		phys_size_t rgnflags = rgn->region[i].flags;
+		phys_addr_t end = base + size - 1;
+		phys_addr_t rgnend = rgnbase + rgnsize - 1;
 
-		if (rgnbase == base && rgnsize == size) {
+		if (rgnbase <= base && end <= rgnend) {
 			if (flags == rgnflags)
 				/* Already have this region, so we're done */
 				return 0;
-- 
2.39.1



More information about the U-Boot mailing list