diff options
author | Patrick Rudolph <patrick.rudolph@9elements.com> | 2018-04-10 09:34:29 +0200 |
---|---|---|
committer | Patrick Georgi <pgeorgi@google.com> | 2018-05-04 10:05:55 +0000 |
commit | c653623d59bc207d035078b63d4bfe1c45e6f58d (patch) | |
tree | 5a071e97ef563c8ff2ad9af2a0625890a02740cb | |
parent | 23d62dd15c39b3628b102cf6417d476e78ffcdaf (diff) |
lib/bootmem: Add method to walk memory tables
Add a method to walk bootmem memory tables and call a function
for each memory range. The tables might not match with OS sight
of view.
Return true if the callback function returned false.
Required for FIT support in coreboot to find a usable RAM region.
Tested on Cavium SoC.
Change-Id: I0004e5ad5fe2289827f370f0d0f9979d3cbd3926
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Reviewed-on: https://review.coreboot.org/25583
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
-rw-r--r-- | src/include/bootmem.h | 13 | ||||
-rw-r--r-- | src/lib/bootmem.c | 14 |
2 files changed, 27 insertions, 0 deletions
diff --git a/src/include/bootmem.h b/src/include/bootmem.h index 4964c18f38..161f482e13 100644 --- a/src/include/bootmem.h +++ b/src/include/bootmem.h @@ -68,6 +68,19 @@ void bootmem_add_range(uint64_t start, uint64_t size, /* Print current range map of boot memory. */ void bootmem_dump_ranges(void); +typedef bool (*range_action_t)(const struct range_entry *r, void *arg); + +/** + * Walk memory tables and call the provided function, for every region. + * The caller has to return false to break out of the loop any time, or + * return true to continue. + * + * @param action The function to call for each memory range. + * @param arg Pointer passed to function @action. Set to NULL if unused. + * @return true if the function 'action' returned false. + */ +bool bootmem_walk(range_action_t action, void *arg); + /* Return 1 if region targets usable RAM, 0 otherwise. */ int bootmem_region_targets_usable_ram(uint64_t start, uint64_t size); diff --git a/src/lib/bootmem.c b/src/lib/bootmem.c index 4fbc4b3a3f..ed45e0f384 100644 --- a/src/lib/bootmem.c +++ b/src/lib/bootmem.c @@ -180,6 +180,20 @@ void bootmem_dump_ranges(void) } } +bool bootmem_walk(range_action_t action, void *arg) +{ + const struct range_entry *r; + + assert(bootmem_is_initialized()); + + memranges_each_entry(r, &bootmem) { + if (!action(r, arg)) + return true; + } + + return false; +} + int bootmem_region_targets_usable_ram(uint64_t start, uint64_t size) { const struct range_entry *r; |