mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-21 14:41:31 +00:00
Add some utilities to manipulate the reserved memory map.
This commit is contained in:
parent
64dbbd40c5
commit
3f9f08cf91
3 changed files with 103 additions and 0 deletions
|
@ -86,6 +86,8 @@ void *fdt_getprop(const void *fdt, int nodeoffset,
|
||||||
|
|
||||||
uint32_t fdt_next_tag(const void *fdt, int offset,
|
uint32_t fdt_next_tag(const void *fdt, int offset,
|
||||||
int *nextoffset, char **namep);
|
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 */
|
/* Write-in-place functions */
|
||||||
int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
|
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_property(void *fdt, int nodeoffset, const char *name);
|
||||||
int fdt_nop_node(void *fdt, int nodeoffset);
|
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 */
|
/* Sequential-write functions */
|
||||||
int fdt_create(void *buf, int bufsize);
|
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)
|
fdt_property(fdt, name, str, strlen(str)+1)
|
||||||
int fdt_end_node(void *fdt);
|
int fdt_end_node(void *fdt);
|
||||||
int fdt_finish(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 */
|
/* Read-write functions */
|
||||||
int fdt_open_into(void *fdt, void *buf, int bufsize);
|
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 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);
|
nop_region(fdt_offset_ptr(fdt, nodeoffset, 0), endoffset - nodeoffset);
|
||||||
return 0;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue