From 2109dc2a4da592003ec62820f5bdfb6bd0899805 Mon Sep 17 00:00:00 2001 From: Ye Li Date: Tue, 18 Jun 2019 01:24:10 -0700 Subject: [PATCH] MLK-22035-1 lmb: Add lmb_reserve_overlap for fdt reserved memory Previous patch "MLK-21885 lmb: Handle the overlap case for lmb reserve" adds the overlap support to lmb reserve. However, u-boot has some places to use the lmb_reserve when allocating memory in loading images. If we allowed overlap in this function, it means images loading address can overlap each other and cause the address check mechanism not work. So add another function to allow overlap and only use it for fdt reserved-memory nodes. The FDT reserved-memory is ok to merge with other reserved memory, since this won't break image loading address check. Signed-off-by: Ye Li --- common/image-fdt.c | 2 +- include/lmb.h | 1 + lib/lmb.c | 9 ++++++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/common/image-fdt.c b/common/image-fdt.c index 01186aeac7..232e141fbc 100644 --- a/common/image-fdt.c +++ b/common/image-fdt.c @@ -73,7 +73,7 @@ static void boot_fdt_reserve_region(struct lmb *lmb, uint64_t addr, { long ret; - ret = lmb_reserve(lmb, addr, size); + ret = lmb_reserve_overlap(lmb, addr, size); if (ret >= 0) { debug(" reserving fdt memory region: addr=%llx size=%llx\n", (unsigned long long)addr, (unsigned long long)size); diff --git a/include/lmb.h b/include/lmb.h index 3b338dfee0..d02f826e8e 100644 --- a/include/lmb.h +++ b/include/lmb.h @@ -36,6 +36,7 @@ extern void lmb_init_and_reserve_range(struct lmb *lmb, phys_addr_t base, phys_size_t size, void *fdt_blob); extern long lmb_add(struct lmb *lmb, phys_addr_t base, phys_size_t size); extern long lmb_reserve(struct lmb *lmb, phys_addr_t base, phys_size_t size); +extern long lmb_reserve_overlap(struct lmb *lmb, phys_addr_t base, phys_size_t size); extern phys_addr_t lmb_alloc(struct lmb *lmb, phys_size_t size, ulong align); extern phys_addr_t lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align, phys_addr_t max_addr); diff --git a/lib/lmb.c b/lib/lmb.c index 4f8613257e..1550024b49 100644 --- a/lib/lmb.c +++ b/lib/lmb.c @@ -265,6 +265,13 @@ long lmb_free(struct lmb *lmb, phys_addr_t base, phys_size_t size) return lmb_add_region(rgn, end + 1, rgnend - end); } +long lmb_reserve(struct lmb *lmb, phys_addr_t base, phys_size_t size) +{ + struct lmb_region *_rgn = &(lmb->reserved); + + return lmb_add_region(_rgn, base, size); +} + static long lmb_overlaps_region(struct lmb_region *rgn, phys_addr_t base, phys_size_t size) { @@ -280,7 +287,7 @@ static long lmb_overlaps_region(struct lmb_region *rgn, phys_addr_t base, return (i < rgn->cnt) ? i : -1; } -long lmb_reserve(struct lmb *lmb, phys_addr_t base, phys_size_t size) +long lmb_reserve_overlap(struct lmb *lmb, phys_addr_t base, phys_size_t size) { struct lmb_region *_rgn = &(lmb->reserved); long ret = lmb_add_region(_rgn, base, size); -- 2.17.1