Skip to content
Snippets Groups Projects
Commit 3f9f08cf authored by Gerald Van Baren's avatar Gerald Van Baren
Browse files

Add some utilities to manipulate the reserved memory map.

parent 64dbbd40
No related branches found
No related tags found
No related merge requests found
......@@ -86,6 +86,8 @@ void *fdt_getprop(const void *fdt, int nodeoffset,
uint32_t fdt_next_tag(const void *fdt, int offset,
int *nextoffset, char **namep);
int fdt_num_reservemap(void *fdt, int *used, int *total);
int fdt_get_reservemap(void *fdt, int n, struct fdt_reserve_entry *re);
/* Write-in-place functions */
int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
......@@ -99,6 +101,8 @@ int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
int fdt_nop_property(void *fdt, int nodeoffset, const char *name);
int fdt_nop_node(void *fdt, int nodeoffset);
int fdt_insert_reservemap_entry(void *fdt, int n, uint64_t addr, uint64_t size);
/* Sequential-write functions */
int fdt_create(void *buf, int bufsize);
......@@ -115,6 +119,7 @@ int fdt_property(void *fdt, const char *name, const void *val, int len);
fdt_property(fdt, name, str, strlen(str)+1)
int fdt_end_node(void *fdt);
int fdt_finish(void *fdt);
int fdt_replace_reservemap_entry(void *fdt, int n, uint64_t addr, uint64_t size);
/* Read-write functions */
int fdt_open_into(void *fdt, void *buf, int bufsize);
......
......@@ -329,3 +329,75 @@ uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset, char **namep
return tag;
}
/*
* Return the number of used reserve map entries and total slots available.
*/
int fdt_num_reservemap(void *fdt, int *used, int *total)
{
struct fdt_reserve_entry *re;
int start;
int end;
int err = fdt_check_header(fdt);
if (err != 0)
return err;
start = fdt_off_mem_rsvmap(fdt);
/*
* Convention is that the reserve map is before the dt_struct,
* but it does not have to be.
*/
end = fdt_totalsize(fdt);
if (end > fdt_off_dt_struct(fdt))
end = fdt_off_dt_struct(fdt);
if (end > fdt_off_dt_strings(fdt))
end = fdt_off_dt_strings(fdt);
/*
* Since the reserved area list is zero terminated, you get one fewer.
*/
if (total)
*total = ((end - start) / sizeof(struct fdt_reserve_entry)) - 1;
if (used) {
*used = 0;
while (start < end) {
re = (struct fdt_reserve_entry *)(fdt + start);
if (re->size == 0)
return 0; /* zero size terminates the list */
*used += 1;
start += sizeof(struct fdt_reserve_entry);
}
/*
* If we get here, there was no zero size termination.
*/
return -FDT_ERR_BADLAYOUT;
}
return 0;
}
/*
* Return the nth reserve map entry.
*/
int fdt_get_reservemap(void *fdt, int n, struct fdt_reserve_entry *re)
{
int used;
int total;
int err;
err = fdt_num_reservemap(fdt, &used, &total);
if (err != 0)
return err;
if (n >= total)
return -FDT_ERR_NOSPACE;
if (re) {
*re = *(struct fdt_reserve_entry *)
_fdt_offset_ptr(fdt, n * sizeof(struct fdt_reserve_entry));
}
return 0;
}
......@@ -110,3 +110,29 @@ int fdt_nop_node(void *fdt, int nodeoffset)
nop_region(fdt_offset_ptr(fdt, nodeoffset, 0), endoffset - nodeoffset);
return 0;
}
/*
* Replace a reserve map entry in the nth slot.
*/
int fdt_replace_reservemap_entry(void *fdt, int n, uint64_t addr, uint64_t size)
{
struct fdt_reserve_entry *re;
int used;
int total;
int err;
err = fdt_num_reservemap(fdt, &used, &total);
if (err != 0)
return err;
if (n >= total)
return -FDT_ERR_NOSPACE;
re = (struct fdt_reserve_entry *)
(fdt + fdt_off_mem_rsvmap(fdt) +
(n * sizeof(struct fdt_reserve_entry)));
re->address = cpu_to_fdt64(addr);
re->size = cpu_to_fdt64(size);
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment