Skip to content

Commit

Permalink
common: Add functions to find free RAM
Browse files Browse the repository at this point in the history
The bootm code needs to put the Kernel image and initrd into free
RAM. Add some functions to find free RAM chunks to help this code.

Signed-off-by: Sascha Hauer <[email protected]>
  • Loading branch information
saschahauer committed Apr 4, 2018
1 parent 41dd040 commit d4ff9c4
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 0 deletions.
51 changes: 51 additions & 0 deletions common/memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,57 @@ int release_sdram_region(struct resource *res)
return release_region(res);
}

void memory_bank_find_space(struct memory_bank *bank, resource_size_t *retstart,
resource_size_t *retend)
{
resource_size_t freeptr, size, maxfree = 0;
struct resource *last, *child;

if (list_empty(&bank->res->children)) {
/* No children - return the whole bank */
*retstart = bank->res->start;
*retend = bank->res->end;
return;
}

freeptr = bank->res->start;

list_for_each_entry(child, &bank->res->children, sibling) {
/* Check gaps between child resources */
size = child->start - freeptr;
if (size > maxfree) {
*retstart = freeptr;
*retend = child->start - 1;
maxfree = size;
}
freeptr = child->start + resource_size(child);
}

last = list_last_entry(&bank->res->children, struct resource, sibling);

/* Check gap between last child and end of memory bank */
freeptr = last->start + resource_size(last);
size = bank->res->start + resource_size(bank->res) - freeptr;

if (size > maxfree) {
*retstart = freeptr;
*retend = bank->res->end;
}
}

int memory_bank_first_find_space(resource_size_t *retstart,
resource_size_t *retend)
{
struct memory_bank *bank;

for_each_memory_bank(bank) {
memory_bank_find_space(bank, retstart, retend);
return 0;
}

return -ENOENT;
}

#ifdef CONFIG_OFTREE

static int of_memory_fixup(struct device_node *node, void *unused)
Expand Down
5 changes: 5 additions & 0 deletions include/memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,9 @@ struct resource *request_sdram_region(const char *name, resource_size_t start,
resource_size_t size);
int release_sdram_region(struct resource *res);

void memory_bank_find_space(struct memory_bank *bank, resource_size_t *retstart,
resource_size_t *retend);
int memory_bank_first_find_space(resource_size_t *retstart,
resource_size_t *retend);

#endif

0 comments on commit d4ff9c4

Please sign in to comment.